public int Id { get; set; }\r
public string Equip { get; set; }\r
public Color Color { get; set; }\r
+ public string Spec { get; set; }\r
\r
public EquipColumn()\r
{\r
private void CreateEquipList(Sniffer sniffer)\r
{\r
var list = new List<EquipColumn>();\r
- var fn = new[] { "第一艦隊", "第二艦隊", "第三艦隊", "第四艦隊" };\r
+ var fn = new[] {"第一艦隊", "第二艦隊", "第三艦隊", "第四艦隊"};\r
for (var f = 0; f < fn.Length; f++)\r
{\r
var drumTotal = 0;\r
if (drum != 0)\r
drumShips++;\r
drumTotal += drum;\r
- ships.Add(new EquipColumn { Ship = s.Name, Id = s.Id });\r
+ var rfp = s.RealFirepower;\r
+ var ras = s.RealAntiSubmarine;\r
+ ships.Add(new EquipColumn\r
+ {\r
+ Ship = s.Name,\r
+ Id = s.Id,\r
+ Spec = (rfp == 0 ? "" : "砲" + rfp) + (ras == 0 ? "" : " 潜" + ras)\r
+ });\r
ships.AddRange(equips);\r
}\r
list.Add(new EquipColumn\r
new ShipLabel {Location = new Point(1, 2), AutoSize = true},\r
new ShipLabel {Location = new Point(10, 2), AutoSize = true},\r
new ShipLabel {Location = new Point(40, 2), AutoSize = true},\r
- new ShipLabel {Location = new Point(37, 2), Size = new Size(4, LabelHeight - 2)}\r
+ new ShipLabel {Location = new Point(37, 2), Size = new Size(4, LabelHeight - 2)},\r
+ new ShipLabel {Location = new Point(217, 2), AutoSize = true, AnchorRight = true}\r
};\r
_labelList.Add(labels);\r
_panelList.Add(lbp);\r
labels[2].Text = e.Equip;\r
labels[3].Visible = e.Equip != "";\r
labels[3].BackColor = e.Color;\r
+ labels[4].Text = e.Spec;\r
lbp.Visible = true;\r
}\r
\r
public int IconType;\r
public int AntiAir;\r
public int LoS;\r
+ public int AntiSubmarine;\r
+ public int Torpedo;\r
+ public int Bomber;\r
\r
public ItemSpec()\r
{\r
}\r
}\r
\r
+ public bool IsSonar\r
+ {\r
+ get\r
+ {\r
+ return Type == 14 || // ソナー\r
+ Type == 40; // 大型ソナー\r
+ }\r
+ }\r
+\r
+ public bool IsDepthCharge\r
+ {\r
+ get { return Type == 15; }\r
+ }\r
+\r
+ public bool IsReconSeaplane\r
+ {\r
+ get { return Type == 10; }\r
+ }\r
+\r
public Color Color\r
{\r
get\r
TypeName = dict[(int)entry.api_type[2]],\r
IconType = (int)entry.api_type[3],\r
AntiAir = (int)entry.api_tyku,\r
- LoS = (int)entry.api_saku\r
+ LoS = (int)entry.api_saku,\r
+ AntiSubmarine = (int)entry.api_tais,\r
+ Torpedo = (int)entry.api_raig,\r
+ Bomber = (int)entry.api_baku\r
};\r
}\r
_itemSpecs[-1] = new ItemSpec();\r
{\r
public class ShipStatus\r
{\r
+ private readonly ItemInfo _itemInfo;\r
public int Id { get; set; }\r
public int Fleet { get; set; } // ShipListだけで使う\r
public ShipSpec Spec { get; set; }\r
public int[] OnSlot { get; set; }\r
public int[] Slot { get; set; }\r
public int LoS { get; set; }\r
+ public int Firepower { get; set; }\r
+ public int AntiSubmarine { get; set; }\r
\r
public Damage DamageLevel\r
{\r
get { return CalcDamage(NowHp, MaxHp); }\r
}\r
\r
- public ShipStatus()\r
+ public ShipStatus(ItemInfo itemInfo = null)\r
{\r
+ _itemInfo = itemInfo;\r
Id = -1;\r
Spec = new ShipSpec();\r
OnSlot = new int[0];\r
fuel = (int)(Spec.FuelMax * 0.2 * 0.16 * damage);\r
steal = (int)(Spec.FuelMax * 0.2 * 0.3 * damage);\r
}\r
+\r
+ public int RealFirepower\r
+ {\r
+ get\r
+ {\r
+ if (Spec.IsSubmarine)\r
+ return 0;\r
+ if (!Spec.IsAircraftCarrier)\r
+ return Firepower + 5;\r
+ var specs = (from id in Slot\r
+ let spec = _itemInfo.ItemDict[id].Spec\r
+ where spec.IsAircraft\r
+ select new {torpedo = spec.Torpedo, bomber = spec.Bomber}).ToArray();\r
+ var torpedo = specs.Sum(s => s.torpedo);\r
+ var bomber = specs.Sum(s => s.bomber);\r
+ if (torpedo == 0 && bomber == 0)\r
+ return 0;\r
+ return (int)((Firepower + torpedo) * 1.5 + bomber * 2 + 55);\r
+ }\r
+ }\r
+\r
+ public int RealAntiSubmarine\r
+ {\r
+ get\r
+ {\r
+ if (!Spec.IsAntiSubmarine)\r
+ return 0;\r
+ if (Spec.IsAircraftCarrier && RealFirepower == 0) // 砲撃戦に参加しない\r
+ return 0;\r
+ var sonar = 0;\r
+ var dc = 0;\r
+ var aircraft = 0;\r
+ var all = 0;\r
+ var vanilla = AntiSubmarine;\r
+ foreach (var spec in Slot.Select(id => _itemInfo.ItemDict[id].Spec))\r
+ {\r
+ vanilla -= spec.AntiSubmarine;\r
+ if (spec.IsReconSeaplane) // 水偵は除外\r
+ continue;\r
+ if (spec.IsSonar)\r
+ sonar += spec.AntiSubmarine;\r
+ else if (spec.IsDepthCharge)\r
+ dc += spec.AntiSubmarine;\r
+ else if (spec.IsAircraft)\r
+ aircraft += spec.AntiSubmarine;\r
+ all += spec.AntiSubmarine;\r
+ }\r
+ if (vanilla == 0 && aircraft == 0) // 素対潜0で航空機なしは対潜攻撃なし\r
+ return 0;\r
+ var bonus = sonar > 0 && dc > 0 ? 1.15 : 1.0;\r
+ return (int)(bonus * (vanilla / 5 + all * 2 + (aircraft > 0 ? 10 : 25)));\r
+ }\r
+ }\r
}\r
\r
public struct ChargeStatus\r
{\r
foreach (var entry in json)\r
{\r
- _shipInfo[(int)entry.api_id] = new ShipStatus\r
+ _shipInfo[(int)entry.api_id] = new ShipStatus(_itemInfo)\r
{\r
Id = (int)entry.api_id,\r
Spec = _shipMaster[(int)entry.api_ship_id],\r
Bull = (int)entry.api_bull,\r
OnSlot = (int[])entry.api_onslot,\r
Slot = (int[])entry.api_slot,\r
- LoS = (int)entry.api_sakuteki[0]\r
+ LoS = (int)entry.api_sakuteki[0],\r
+ Firepower = (int)entry.api_karyoku[0],\r
+ AntiSubmarine = (int)entry.api_taisen[0]\r
};\r
_itemInfo.CountNewItems((int[])entry.api_slot);\r
}\r
public ShipStatus[] GetShipStatuses(int fleet)\r
{\r
return\r
- (from id in _decks[fleet] where id != -1\r
+ (from id in _decks[fleet]\r
+ where id != -1\r
select _escapedShips.Contains(id) ? new ShipStatus() : _shipInfo[id]).ToArray();\r
}\r
\r