\r
namespace KancolleSniffer\r
{\r
- public class ShipStatus\r
+ public class ShipStatus : ICloneable\r
{\r
public int Id { get; set; }\r
public int Fleet { get; set; }\r
public int Torpedo { get; set; }\r
public int AntiSubmarine { get; set; }\r
public int Lucky { get; set; }\r
+ public bool Locked { get; set; }\r
public bool Escaped { get; set; }\r
\r
public Damage DamageLevel => CalcDamage(NowHp, MaxHp);\r
public ShipStatus()\r
{\r
Id = -1;\r
+ Fleet = -1;\r
Spec = new ShipSpec();\r
OnSlot = new int[0];\r
Slot = new ItemStatus[0];\r
\r
public double TransportPoint\r
=> Spec.TransportPoint + Slot.Sum(item => item.Spec.TransportPoint) + SlotEx.Spec.TransportPoint;\r
+\r
+ public object Clone()\r
+ {\r
+ var r = (ShipStatus)MemberwiseClone();\r
+ r.Slot = r.Slot.ToArray(); // 戦闘中のダメコンの消費が見えないように複製する\r
+ return r;\r
+ }\r
}\r
\r
public struct ChargeStatus\r
private int _hqLevel;\r
private readonly List<int> _escapedShips = new List<int>();\r
private int _combinedFleetType;\r
- private readonly int[][] _presetDeck = new int[8][];\r
\r
public ShipInfo(ItemInfo itemInfo)\r
{\r
InspectDeck(json.api_deck_data);\r
InspectShipData(json.api_ship_data);\r
}\r
- else if (json.api_ship()) // getship\r
+ else if (json.api_ship()) // getshipとpowerup\r
{\r
InspectShipData(new[] {json.api_ship});\r
}\r
Firepower = (int)entry.api_karyoku[0],\r
Torpedo = (int)entry.api_raisou[0],\r
AntiSubmarine = (int)entry.api_taisen[0],\r
- Lucky = (int)entry.api_lucky[0]\r
+ Lucky = (int)entry.api_lucky[0],\r
+ Locked = entry.api_locked() && entry.api_locked == 1\r
};\r
- _itemInfo.CountNewItems((int[])entry.api_slot);\r
}\r
}\r
\r
foreach (var ship in ships)\r
_shipInfo.Remove(int.Parse(ship));\r
InspectDeck(json.api_deck);\r
- InspectShip(json.api_ship);\r
+ InspectShip(json);\r
}\r
\r
public void InspectSlotExchange(string request, dynamic json)\r
_shipInfo.Remove(ship);\r
}\r
\r
- public void InspectPresetDeck(dynamic json)\r
- {\r
- foreach (KeyValuePair<string, dynamic> entry in json.api_deck)\r
- InspectPresetRegister(entry.Value);\r
- }\r
-\r
- public void InspectPresetRegister(dynamic json)\r
- {\r
- var no = (int)json.api_preset_no - 1;\r
- _presetDeck[no] = json.api_ship;\r
- }\r
-\r
- public void InspectPresetDelete(string request)\r
- {\r
- var values = HttpUtility.ParseQueryString(request);\r
- _presetDeck[int.Parse(values["api_preset_no"]) - 1] = null;\r
- }\r
-\r
public void InspectCombined(string request)\r
{\r
var values = HttpUtility.ParseQueryString(request);\r
_combinedFleetType = int.Parse(values["api_combined_type"]);\r
}\r
\r
- public int[][] PresetDeck => _presetDeck;\r
-\r
public void InspectMapStart(string request)\r
{\r
var values = HttpUtility.ParseQueryString(request);\r
return s;\r
}\r
\r
+ public void SetItemHolder()\r
+ {\r
+ foreach (var ship in _shipInfo.Values)\r
+ {\r
+ foreach (var item in ship.Slot)\r
+ _itemInfo.GetStatus(item.Id).Holder = ship;\r
+ _itemInfo.GetStatus(ship.SlotEx.Id).Holder = ship;\r
+ }\r
+ }\r
+\r
public ShipSpec GetSpec(int id) => _shipMaster[id];\r
\r
public bool InMission(int fleet) => _inMission[fleet];\r
public int[] GetFighterPower(int fleet)\r
=> GetShipStatuses(fleet).Where(ship => !ship.Escaped).SelectMany(ship =>\r
ship.Slot.Zip(ship.OnSlot, (slot, onslot) =>\r
- !slot.Spec.CanAirCombat || onslot == 0\r
- ? new[] {0, 0}\r
- : new[]\r
- {\r
- (int)(slot.Spec.AntiAir * Sqrt(onslot) + slot.AlvBonus[0]),\r
- (int)(slot.Spec.AntiAir * Sqrt(onslot) + slot.AlvBonus[1])\r
- }))\r
+ {\r
+ if (!slot.Spec.CanAirCombat || onslot == 0)\r
+ return new[] {0, 0};\r
+ var unskilled = (slot.Spec.AntiAir + slot.FighterPowerLevelBonus) * Sqrt(onslot);\r
+ return new[] {(int)(unskilled + slot.AlvBonus[0]), (int)(unskilled + slot.AlvBonus[1])};\r
+ }))\r
.Aggregate(new[] {0, 0}, (prev, fp) => new[] {prev[0] + fp[0], prev[1] + fp[1]});\r
\r
public double GetContactTriggerRate(int fleet)\r
ship.Slot.Zip(ship.OnSlot, (slot, onslot) =>\r
slot.Spec.ContactTriggerRate * slot.Spec.LoS * Sqrt(onslot))).Sum();\r
\r
- public ShipStatus[] GetDamagedShipList(DockInfo dockInfo)\r
+ public ShipStatus[] GetRepairList(DockInfo dockInfo)\r
=> (from s in ShipList\r
where s.NowHp < s.MaxHp && !dockInfo.InNDock(s.Id)\r
select s).OrderByDescending(s => s.RepairTime).ToArray();\r