{\r
var sniffer = new Sniffer();\r
SniffLogFile(sniffer, "firepower_001");\r
- var fleet = sniffer.Fleets[0];\r
+ var ships = sniffer.Fleets[0].Ships;\r
+ // ReSharper disable CompareOfFloatsByEqualityOperator\r
+ PAssert.That(() => ships[0].EffectiveFirepower == 93.5);\r
+ PAssert.That(() => ships[1].EffectiveFirepower == 82.5);\r
+ // ReSharper restore CompareOfFloatsByEqualityOperator\r
+ }\r
+\r
+ /// <summary>\r
+ /// 連合艦隊補正の載った火力を計算する\r
+ /// </summary>\r
+ [TestMethod]\r
+ public void CombinedFleetFirepower()\r
+ {\r
+ var sniffer = new Sniffer();\r
+ SniffLogFile(sniffer, "combined_status_001");\r
// ReSharper disable CompareOfFloatsByEqualityOperator\r
- PAssert.That(() => fleet.Ships[0].EffectiveFirepower == 93.5);\r
- PAssert.That(() => fleet.Ships[1].EffectiveFirepower == 82.5);\r
+ PAssert.That(() => sniffer.Fleets[0].Ships[0].EffectiveFirepower == 117.0);\r
+ PAssert.That(() => sniffer.Fleets[1].Ships[0].EffectiveFirepower == 72.0);\r
// ReSharper restore CompareOfFloatsByEqualityOperator\r
}\r
\r
-Subproject commit 6feb341954d3a0f2bcbd7dd62dad3a50ec81112f
+Subproject commit f536d67271f300eb34b6e2bcc1f077ae19d08d8b
\r
public void CheckFleet()\r
{\r
- for (var fleet = 0; fleet < ShipInfo.FleetCount; fleet++)\r
+ foreach (var fleet in _shipInfo.Fleets)\r
CheckFleet(fleet);\r
}\r
\r
- private void CheckFleet(int fleet)\r
+ private void CheckFleet(Fleet fleet)\r
{\r
- var deck = _shipInfo.Fleets[fleet].Deck.ToArray();\r
- var repair = _repairStatuses[fleet];\r
+ var deck = fleet.Deck.ToArray();\r
+ var repair = _repairStatuses[fleet.Number];\r
var fs = _shipInfo.GetStatus(deck[0]);\r
repair.State = State.Continue;\r
if (!fs.Spec.IsRepairShip)\r
{\r
_table.Clear();\r
var fn = new[] {"第一艦隊", "第二艦隊", "第三艦隊", "第四艦隊"};\r
- for (var f = 0; f < fn.Length; f++)\r
+ foreach (var fleet in sniffer.Fleets)\r
{\r
- var ships = sniffer.Fleets[f].Ships;\r
+ var ships = fleet.Ships;\r
var rawForFleet = ships.Sum(ship => ship.EffectiveAntiAirForFleet);\r
var forFleet = new[] {1.0, 1.2, 1.6}.Select(r => (int)(rawForFleet * r) * 2 / 1.3).ToArray();\r
- _table.Add(new Record {Fleet = fn[f] + " : " + string.Join("/", forFleet.Select(x => x.ToString("f1")))});\r
+ _table.Add(new Record {Fleet = fn[fleet.Number] + " : " + string.Join("/", forFleet.Select(x => x.ToString("f1")))});\r
foreach (var ship in ships)\r
{\r
var rate = ship.EffectiveAntiAirForShip / 4.0;\r
var result = new int[ShipInfo.FleetCount];\r
if (prev == DateTime.MinValue)\r
return result;\r
- for (var f = 0; f < result.Length; f++)\r
+ foreach (var fleet in _shipInfo.Fleets)\r
{\r
- if (_shipInfo.Fleets[f].State != FleetState.Port)\r
+ if (fleet.State != FleetState.Port)\r
continue;\r
- var timer = GetTimer(f);\r
+ var timer = GetTimer(fleet.Number);\r
if (timer == DateTime.MinValue || prev < _lastUpdate)\r
continue;\r
if (prev < timer.AddMinutes(-9) && now >= timer.AddMinutes(-9))\r
- result[f] = 40;\r
+ result[fleet.Number] = 40;\r
else if (prev < timer && now >= timer)\r
- result[f] = 49;\r
+ result[fleet.Number] = 49;\r
}\r
return result;\r
}\r
// See the License for the specific language governing permissions and\r
// limitations under the License.\r
\r
-using System.Collections.Generic;\r
using System.Linq;\r
using static System.Math;\r
\r
Practice\r
}\r
\r
+ public enum CombinedType\r
+ {\r
+ None,\r
+ Carrier, // 機動\r
+ Surface, // 水上\r
+ Transport // 輸送\r
+ }\r
+\r
public class Fleet\r
{\r
private readonly ShipInfo _shipInfo;\r
+ public int Number { get; }\r
public FleetState State { get; set; }\r
+ public CombinedType CombinedType { get; set; }\r
public int[] Deck { get; set; } = Enumerable.Repeat(-1, ShipInfo.MemberCount).ToArray();\r
public ShipStatus[] Ships => Deck.Where(id => id != -1).Select(_shipInfo.GetStatus).ToArray();\r
\r
- public Fleet(ShipInfo shipInfo)\r
+ public Fleet(ShipInfo shipInfo, int number)\r
{\r
_shipInfo = shipInfo;\r
+ Number = number;\r
}\r
\r
public ChargeStatus ChargeStatus\r
}\r
\r
public double TransportPoint => Ships.Where(ship => !ship.Escaped).Sum(ship => ship.TransportPoint);\r
+\r
+ public int CombinedFirepowerBonus\r
+ {\r
+ get\r
+ {\r
+ switch (CombinedType)\r
+ {\r
+ case CombinedType.None:\r
+ return 0;\r
+ case CombinedType.Carrier:\r
+ return Number == 0 ? 2 : 10;\r
+ case CombinedType.Surface:\r
+ return Number == 0 ? 10 : -5;\r
+ case CombinedType.Transport:\r
+ return Number == 0 ? -5 : 10;\r
+ default:\r
+ return 0;\r
+ }\r
+ }\r
+ }\r
+\r
+ public int CombinedTorpedoPenalty => CombinedType != 0 && Number == 1 ? -5 : 0;\r
}\r
}
\ No newline at end of file
private void CreateTable(Sniffer sniffer)\r
{\r
var list = new List<Record>();\r
- var fleets = sniffer.Fleets;\r
var fn = new[] {"第一", "第二", "第三", "第四"};\r
- for (var f = 0; f < fn.Length; f++)\r
+ foreach (var fleet in sniffer.Fleets)\r
{\r
var total = new Total();\r
var ships = new List<Record>();\r
- var fleet = fleets[f];\r
foreach (var s in fleet.Ships)\r
{\r
var equips = new List<Record>();\r
}\r
var daihatsu = fleet.DaihatsuBonus;\r
var tp = fleet.TransportPoint;\r
- if (sniffer.CombinedFleetType != 0 && f == 0)\r
- tp += fleets[1].TransportPoint;\r
+ if (sniffer.IsCombinedFleet && fleet.Number == 0)\r
+ tp += sniffer.Fleets[1].TransportPoint;\r
list.Add(new Record\r
{\r
- Fleet = fn[f] + HideIfZero(" Lv", total.Level) +\r
+ Fleet = fn[fleet.Number] + HideIfZero(" Lv", total.Level) +\r
HideIfZero(" ドラム缶", total.Drum) + HideIfZero("(", total.DrumShips, "隻)") +\r
HideIfZero(" 大発", daihatsu * 100, "%"),\r
Fleet2 = "計:" +\r
" 潜" + CutOverFlow(total.AntiSubmarine) +\r
" 索" + CutOverFlow(total.LoS) + "\r\n" +\r
$"戦闘:燃{total.Fuel / 5}弾{total.Bull / 5} 支援:燃{total.Fuel / 2}弾{(int)(total.Bull * 0.8)}" +\r
- (sniffer.CombinedFleetType != 0 && f == 1 ? "" : $"\r\nTP:S{(int)tp} A{(int)(tp * 0.7)}")\r
+ (sniffer.IsCombinedFleet && fleet.Number == 1 ? "" : $"\r\nTP:S{(int)tp} A{(int)(tp * 0.7)}")\r
});\r
list.AddRange(ships);\r
}\r
var ship = byShip.First().Holder;\r
var name = byShip.Key == -1\r
? "未装備x" + byShip.Count()\r
- : (ship.Fleet != -1 ? ship.Fleet + 1 + " " : "") +\r
+ : (ship.Fleet == null ? "" : ship.Fleet.Number + 1 + " ") +\r
ship.Name + (ship.Level > 0 ? "Lv" + ship.Level : "") + "x" + byShip.Count();\r
paramNode.Nodes.Add(name, name);\r
}\r
var ships = fleets[_currentFleet].Ships;\r
panel7Ships.Visible = ships.Length == 7;\r
_mainLabels.SetShipLabels(ships);\r
- if (_sniffer.CombinedFleetType == 0)\r
+ if (!_sniffer.IsCombinedFleet)\r
_combinedFleet = false;\r
labelFleet1.Text = _combinedFleet ? "連合" : "第一";\r
panelCombinedFleet.Visible = _combinedFleet;\r
_toolTip.SetToolTip(labelEnemyFighterPower, text);\r
_toolTip.SetToolTip(labelEnemyFighterPowerCaption, text);\r
}\r
- UpdateFighterPower(_sniffer.CombinedFleetType > 0 && battle.EnemyIsCombined);\r
+ UpdateFighterPower(_sniffer.IsCombinedFleet && battle.EnemyIsCombined);\r
labelFighterPower.ForeColor = new[]\r
{DefaultForeColor, DefaultForeColor, CUDColor.Blue, CUDColor.Green, CUDColor.Orange, CUDColor.Red}[\r
battle.AirControlLevel + 1];\r
{\r
if (fleet > 0)\r
return;\r
- _combinedFleet = _sniffer.CombinedFleetType > 0 && !_combinedFleet;\r
+ _combinedFleet = _sniffer.IsCombinedFleet && !_combinedFleet;\r
UpdatePanelShipInfo();\r
return;\r
}\r
\r
private void labelFleet1_MouseHover(object sender, EventArgs e)\r
{\r
- labelFleet1.Text = _currentFleet == 0 && _sniffer.CombinedFleetType > 0 && !_combinedFleet ? "連合" : "第一";\r
+ labelFleet1.Text = _currentFleet == 0 && _sniffer.IsCombinedFleet && !_combinedFleet ? "連合" : "第一";\r
}\r
\r
private void labelFleet1_MouseLeave(object sender, EventArgs e)\r
private readonly ShipMaster _shipMaster = new ShipMaster();\r
private readonly ItemInfo _itemInfo;\r
private readonly List<int> _escapedShips = new List<int>();\r
- private int _combinedFleetType;\r
private ShipStatus[] _battleResult = new ShipStatus[0];\r
public int HqLevel { get; private set; }\r
public ShipStatusPair[] BattleResultDiff { get; private set; } = new ShipStatusPair[0];\r
\r
public ShipInfo(ItemInfo itemInfo)\r
{\r
- _fleets = Enumerable.Range(0, FleetCount).Select(x => new Fleet(this)).ToArray();\r
+ _fleets = Enumerable.Range(0, FleetCount).Select((x, i) => new Fleet(this, i)).ToArray();\r
_itemInfo = itemInfo;\r
ClearShipInfo();\r
}\r
InspectShipData(json.api_ship);\r
InspectBasic(json.api_basic);\r
if (json.api_combined_flag())\r
- _combinedFleetType = (int)json.api_combined_flag;\r
+ _fleets[0].CombinedType = _fleets[1].CombinedType = (CombinedType)(int)json.api_combined_flag;\r
_itemInfo.NowShips = ((object[])json.api_ship).Length;\r
VerifyBattleResult();\r
}\r
public void InspectChange(string request)\r
{\r
var values = HttpUtility.ParseQueryString(request);\r
- var fleet = int.Parse(values["api_id"]) - 1;\r
+ var fleet = _fleets[int.Parse(values["api_id"]) - 1];\r
var idx = int.Parse(values["api_ship_idx"]);\r
var ship = int.Parse(values["api_ship_id"]);\r
+\r
if (idx == -1)\r
{\r
- var deck = _fleets[fleet].Deck;\r
+ var deck = fleet.Deck;\r
for (var i = 1; i < deck.Length; i++)\r
deck[i] = -1;\r
return;\r
return;\r
}\r
var of = FindFleet(ship, out var oi);\r
- var orig = _fleets[fleet].Deck[idx];\r
- _fleets[fleet].Deck[idx] = ship;\r
- if (of == -1)\r
+ var orig = fleet.Deck[idx];\r
+ fleet.Deck[idx] = ship;\r
+ if (of == null)\r
return;\r
// 入れ替えの場合\r
- if ((_fleets[of].Deck[oi] = orig) == -1)\r
+ if ((of.Deck[oi] = orig) == -1)\r
WithdrowShip(of, oi);\r
}\r
\r
- private int FindFleet(int ship, out int idx)\r
+ private Fleet FindFleet(int ship, out int idx)\r
{\r
- for (var f = 0; f < _fleets.Length; f++)\r
+ foreach (var fleet in _fleets)\r
{\r
- idx = Array.FindIndex(_fleets[f].Deck, id => id == ship);\r
+ idx = Array.FindIndex(fleet.Deck, id => id == ship);\r
if (idx < 0)\r
continue;\r
- return f;\r
+ return fleet;\r
}\r
idx = -1;\r
- return -1;\r
+ return null;\r
}\r
\r
- private void WithdrowShip(int fleet, int idx)\r
+ private void WithdrowShip(Fleet fleet, int idx)\r
{\r
- var deck = _fleets[fleet].Deck;\r
+ var deck = fleet.Deck;\r
var j = idx;\r
for (var i = idx + 1; i < deck.Length; i++)\r
{\r
if (delitem)\r
_itemInfo.DeleteItems(_shipInfo[ship].AllSlot);\r
var of = FindFleet(ship, out var oi);\r
- if (of != -1)\r
+ if (of != null)\r
WithdrowShip(of, oi);\r
_shipInfo.Remove(ship);\r
}\r
public void InspectCombined(string request)\r
{\r
var values = HttpUtility.ParseQueryString(request);\r
- _combinedFleetType = int.Parse(values["api_combined_type"]);\r
+ _fleets[0].CombinedType = _fleets[1].CombinedType = (CombinedType)int.Parse(values["api_combined_type"]);\r
}\r
\r
public void InspectMapStart(string request)\r
{\r
var values = HttpUtility.ParseQueryString(request);\r
var fleet = int.Parse(values["api_deck_id"]) - 1;\r
- if (_combinedFleetType == 0 || fleet > 1)\r
+ if (_fleets[0].CombinedType == 0 || fleet > 1)\r
{\r
_fleets[fleet].State = FleetState.Sortie;\r
}\r
s.Escaped = _escapedShips.Contains(id);\r
s.Fleet = FindFleet(s.Id, out var idx);\r
s.DeckIndex = idx;\r
- s.CombinedFleetType = s.Fleet < 2 ? _combinedFleetType : 0;\r
return s;\r
}\r
\r
\r
public ShipSpec GetSpec(int id) => _shipMaster.GetSpec(id);\r
\r
- public int CombinedFleetType => _combinedFleetType;\r
-\r
public ShipStatus[] ShipList => _shipInfo.Keys.Where(id => id != -1).Select(GetStatus).ToArray();\r
\r
public ShipStatus[] GetRepairList(DockInfo dockInfo)\r
=> (from s in ShipList\r
where s.NowHp < s.MaxHp && !dockInfo.InNDock(s.Id) &&\r
- (s.Fleet == -1 || _fleets[s.Fleet].State != FleetState.Practice)\r
+ (s.Fleet == null || s.Fleet.State != FleetState.Practice)\r
select s).OrderByDescending(s => s.RepairTime).ToArray();\r
\r
public string[] BadlyDamagedShips { get; private set; } = new string[0];\r
(from s in _fleets.Where(fleet => fleet.State == FleetState.Sortie)\r
.SelectMany(fleet => fleet.Deck.Where(id => id != -1).Select(GetStatus))\r
where !s.Escaped && s.DamageLevel == ShipStatus.Damage.Badly &&\r
- !(s.CombinedFleetType > 0 && s.Fleet == 1 && s.DeckIndex == 0) // 第二艦隊の旗艦を除く\r
+ !(s.Fleet.CombinedType != 0 && s.Fleet.Number == 1 && s.DeckIndex == 0) // 第二艦隊の旗艦を除く\r
select s.Name).ToArray();\r
}\r
\r
\r
public void SetFleet(ShipStatus status)\r
{\r
- Text = status == null ? "" : new[] {"", "1", "2", "3", "4"}[status.Fleet + 1];\r
+ Text = status?.Fleet == null ? "" : new[] {"1", "2", "3", "4"}[status.Fleet.Number];\r
}\r
\r
protected override void OnLayout(LayoutEventArgs levent)\r
public class ShipStatus : ICloneable\r
{\r
public int Id { get; set; }\r
- public int Fleet { get; set; }\r
+ public Fleet Fleet { get; set; }\r
public int DeckIndex { get; set; }\r
public ShipSpec Spec { get; set; }\r
\r
\r
public Damage DamageLevel => CalcDamage(NowHp, MaxHp);\r
\r
- public int CombinedFleetType { get; set; }\r
-\r
public IEnumerable<ItemStatus> AllSlot => SlotEx.Id == 0 ? Slot : Slot.Concat(new[] {SlotEx});\r
\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
Slot.Any(item => item.Spec.Type == 8); // 艦攻装備\r
var levelBonus = AllSlot.Sum(item => item.FirepowerLevelBonus);\r
if (!Spec.IsAircraftCarrier && !isRyuseiAttack)\r
- return Firepower + levelBonus + CombinedFleetFirepowerBonus + 5;\r
+ return Firepower + levelBonus + Fleet.CombinedFirepowerBonus + 5;\r
var specs = (from item in Slot where item.Spec.IsAircraft select item.Spec).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 + levelBonus +\r
- (int)(bomber * 1.3) + CombinedFleetFirepowerBonus) * 1.5) + 55;\r
- }\r
- }\r
-\r
- private int CombinedFleetFirepowerBonus\r
- {\r
- get\r
- {\r
- switch (CombinedFleetType)\r
- {\r
- case 0:\r
- return 0;\r
- case 1: // 機動\r
- return Fleet == 0 ? 2 : 10;\r
- case 2: // 水上\r
- return Fleet == 0 ? 10 : -5;\r
- case 3: // 輸送\r
- return Fleet == 0 ? -5 : 10;\r
- default:\r
- return 0;\r
- }\r
+ (int)(bomber * 1.3) + Fleet.CombinedFirepowerBonus) * 1.5) + 55;\r
}\r
}\r
\r
{\r
if (Spec.IsAircraftCarrier || Torpedo == 0)\r
return 0;\r
- return Torpedo + AllSlot.Sum(item => item.TorpedoLevelBonus) + CombinedFleetTorpedoPenalty + 5;\r
+ return Torpedo + AllSlot.Sum(item => item.TorpedoLevelBonus) + Fleet.CombinedTorpedoPenalty + 5;\r
}\r
}\r
\r
- private int CombinedFleetTorpedoPenalty => CombinedFleetType > 0 && Fleet == 1 ? -5 : 0;\r
-\r
public double EffectiveAntiSubmarine\r
{\r
get\r
\r
public ShipStatus[] BattleStartStatus => _shipInfo.BattleStartStatus;\r
\r
- public int CombinedFleetType => _shipInfo.CombinedFleetType;\r
+ public bool IsCombinedFleet => _shipInfo.Fleets[0].CombinedType != 0;\r
\r
public ShipStatus[] RepairList => _shipInfo.GetRepairList(_dockInfo);\r
\r
public static string GenerateDeckBuilderData(Sniffer sniffer)\r
{\r
var sb = new StringBuilder("{\"version\": 4,");\r
- for (var f = 0; f < ShipInfo.FleetCount; f++)\r
+ foreach (var fleet in sniffer.Fleets)\r
{\r
- if (f != 0)\r
+ if (fleet.Number != 0)\r
sb.Append(",");\r
- sb.Append($"\"f{f + 1}\":{{");\r
- var ships = sniffer.Fleets[f].Ships;\r
+ sb.Append($"\"f{fleet.Number + 1}\":{{");\r
+ var ships = fleet.Ships;\r
for (var s = 0; s < ships.Length; s++)\r
{\r
if (s != 0)\r