{\r
var sniffer = new Sniffer();\r
SniffLogFile(sniffer, "deck_001");\r
- var result = sniffer.GetDeck(0);\r
+ var result = sniffer.Fleets[0].Deck;\r
PAssert.That(() => new[] {756, 17204, 6156, 28806, 1069, -1}.SequenceEqual(result));\r
}\r
\r
{\r
var sniffer = new Sniffer();\r
SniffLogFile(sniffer, "deck_005");\r
- var result = sniffer.GetDeck(0);\r
+ var result = sniffer.Fleets[0].Deck;\r
PAssert.That(() => new[] {57391, 50, 24475, 113, -1, -1}.SequenceEqual(result));\r
}\r
\r
var sniffer = new Sniffer();\r
\r
SniffLogFile(sniffer, "deck_002");\r
- var result0 = sniffer.GetDeck(0);\r
+ var result0 = sniffer.Fleets[0].Deck;\r
PAssert.That(() => new[] {1069, 6156, 756, 3223, -1, -1}.SequenceEqual(result0), "編成で艦隊内で艦娘と交換する");\r
\r
SniffLogFile(sniffer, "deck_003");\r
- var result10 = sniffer.GetDeck(0);\r
- var result11 = sniffer.GetDeck(1);\r
+ var result10 = sniffer.Fleets[0].Deck;\r
+ var result11 = sniffer.Fleets[1].Deck;\r
PAssert.That(() => new[] {1069, 6156, 14258, 3223, -1, -1}.SequenceEqual(result10) &&\r
new[] {101, 4487, 756, 14613, 28806, -1}.SequenceEqual(result11), "002に続いて艦隊をまたがって交換する");\r
\r
SniffLogFile(sniffer, "deck_004");\r
- var result20 = sniffer.GetDeck(0);\r
- var result21 = sniffer.GetDeck(1);\r
+ var result20 = sniffer.Fleets[0].Deck;\r
+ var result21 = sniffer.Fleets[1].Deck;\r
PAssert.That(() => new[] {1069, 6156, 14258, 3223, 756, -1}.SequenceEqual(result20) &&\r
new[] {101, 4487, 14613, 28806, -1, -1}.SequenceEqual(result21),\r
"003に続いて空き番号にほかの艦隊の艦娘を配置する");\r
{\r
var sniffer = new Sniffer();\r
SniffLogFile(sniffer, "preset_001");\r
- var result = sniffer.GetDeck(0);\r
+ var result = sniffer.Fleets[0].Deck;\r
PAssert.That(() => new[] {50510, 632, 39843, 113, 478, 47422}.SequenceEqual(result));\r
}\r
\r
}\r
}\r
\r
+ public enum FleetState\r
+ {\r
+ Port,\r
+ Mission,\r
+ Sortie,\r
+ Practice\r
+ }\r
+\r
+ public class Fleet\r
+ {\r
+ public FleetState State { get; set; }\r
+ public int[] Deck { get; set; } = Enumerable.Repeat(-1, ShipInfo.MemberCount).ToArray();\r
+ }\r
+\r
public class ShipInfo\r
{\r
public const int FleetCount = 4;\r
public const int MemberCount = 6;\r
\r
- private readonly int[][] _decks;\r
+ private readonly Fleet[] _fleets = Enumerable.Range(0, FleetCount).Select(x => new Fleet()).ToArray();\r
private readonly Dictionary<int, ShipStatus> _shipInfo = new Dictionary<int, ShipStatus>();\r
private readonly ShipMaster _shipMaster = new ShipMaster();\r
private readonly ItemInfo _itemInfo;\r
- private readonly bool[] _inMission = new bool[FleetCount];\r
- private readonly bool[] _inSortie = new bool[FleetCount];\r
private int _hqLevel;\r
private readonly List<int> _escapedShips = new List<int>();\r
private int _combinedFleetType;\r
public ShipInfo(ItemInfo itemInfo)\r
{\r
_itemInfo = itemInfo;\r
- _decks = Enumerable.Repeat(Enumerable.Repeat(-1, MemberCount).ToArray(), FleetCount).ToArray();\r
ClearShipInfo();\r
}\r
\r
{\r
ClearShipInfo();\r
for (var i = 0; i < FleetCount; i++)\r
- _inSortie[i] = false;\r
+ _fleets[i].State = FleetState.Port;\r
InspectDeck(json.api_deck_port);\r
InspectShipData(json.api_ship);\r
InspectBasic(json.api_basic);\r
\r
public void SaveBattleResult()\r
{\r
- _battleResult = _decks.Where((deck, i) =>\r
- _inSortie[i] && !GetStatus(deck[0]).Spec.IsRepairShip)\r
- .SelectMany(deck => deck.Select(GetStatus)).ToArray();\r
+ _battleResult = _fleets.Where(fleet =>\r
+ fleet.State >= FleetState.Sortie && !GetStatus(fleet.Deck[0]).Spec.IsRepairShip)\r
+ .SelectMany(fleet => fleet.Deck.Select(GetStatus)).ToArray();\r
}\r
\r
private void VerifyBattleResult()\r
\r
public void SaveBattleStartStatus()\r
{\r
- BattleStartStatus = _decks.Where((deck, i) => _inSortie[i])\r
- .SelectMany(deck => deck.Select(id => (ShipStatus)GetStatus(id).Clone())).ToArray();\r
+ BattleStartStatus = _fleets.Where(fleet => fleet.State >= FleetState.Sortie)\r
+ .SelectMany(fleet => fleet.Deck.Select(id => (ShipStatus)GetStatus(id).Clone())).ToArray();\r
}\r
\r
private void ClearShipInfo()\r
foreach (var entry in json)\r
{\r
var fleet = (int)entry.api_id - 1;\r
- _decks[fleet] = (int[])entry.api_ship;\r
- _inMission[fleet] = (int)entry.api_mission[0] != 0;\r
+ _fleets[fleet].Deck = (int[])entry.api_ship;\r
+ if ((int)entry.api_mission[0] != 0)\r
+ _fleets[fleet].State = FleetState.Mission;\r
}\r
}\r
\r
var ship = int.Parse(values["api_ship_id"]);\r
if (idx == -1)\r
{\r
- var deck = _decks[fleet];\r
+ var deck = _fleets[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 = _decks[fleet][idx];\r
- _decks[fleet][idx] = ship;\r
+ var orig = _fleets[fleet].Deck[idx];\r
+ _fleets[fleet].Deck[idx] = ship;\r
if (of == -1)\r
return;\r
// 入れ替えの場合\r
- if ((_decks[of][oi] = orig) == -1)\r
+ if ((_fleets[of].Deck[oi] = orig) == -1)\r
WithdrowShip(of, oi);\r
}\r
\r
private int FindFleet(int ship, out int idx)\r
{\r
- for (var f = 0; f < _decks.Length; f++)\r
+ for (var f = 0; f < _fleets.Length; f++)\r
{\r
- idx = Array.FindIndex(_decks[f], id => id == ship);\r
+ idx = Array.FindIndex(_fleets[f].Deck, id => id == ship);\r
if (idx < 0)\r
continue;\r
return f;\r
\r
private void WithdrowShip(int fleet, int idx)\r
{\r
- var deck = _decks[fleet];\r
+ var deck = _fleets[fleet].Deck;\r
var j = idx;\r
for (var i = idx + 1; i < deck.Length; i++)\r
{\r
var fleet = int.Parse(values["api_deck_id"]) - 1;\r
if (_combinedFleetType == 0 || fleet > 1)\r
{\r
- _inSortie[fleet] = true;\r
+ _fleets[fleet].State = FleetState.Sortie;\r
}\r
else\r
{\r
- _inSortie[0] = _inSortie[1] = true;\r
+ _fleets[0].State = _fleets[1].State = FleetState.Sortie;\r
}\r
SetBadlyDamagedShips();\r
}\r
\r
+ public void StartPractice(string request)\r
+ {\r
+ var values = HttpUtility.ParseQueryString(request);\r
+ var fleet = int.Parse(values["api_deck_id"]) - 1;\r
+ _fleets[fleet].State = FleetState.Practice;\r
+ }\r
+\r
public void RepairShip(int id)\r
{\r
var s = _shipInfo[id];\r
\r
public ShipStatus[] GetShipStatuses(int fleet)\r
{\r
- return _decks[fleet].Where(id => id != -1).Select(GetStatus).ToArray();\r
+ return _fleets[fleet].Deck.Where(id => id != -1).Select(GetStatus).ToArray();\r
}\r
\r
- public int[] GetDeck(int fleet) => _decks[fleet];\r
+ public Fleet[] Fleets => _fleets;\r
\r
public ShipStatus GetStatus(int id)\r
{\r
\r
public ShipSpec GetSpec(int id) => _shipMaster.GetSpec(id);\r
\r
- public bool[] InMission => _inMission;\r
-\r
- public bool[] InSortie => _inSortie;\r
-\r
public int CombinedFleetType => _combinedFleetType;\r
\r
public ShipStatus[] ShipList => _shipInfo.Keys.Where(id => id != -1).Select(GetStatus).ToArray();\r
\r
public ChargeStatus[] ChargeStatuses\r
- => (from deck in _decks\r
- let flag = new ChargeStatus(_shipInfo[deck[0]])\r
- let others = (from id in deck.Skip(1)\r
+ => (from fleet in _fleets\r
+ let flag = new ChargeStatus(_shipInfo[fleet.Deck[0]])\r
+ let others = (from id in fleet.Deck.Skip(1)\r
select new ChargeStatus(_shipInfo[id]))\r
.Aggregate(\r
(result, next) =>\r
public void SetBadlyDamagedShips()\r
{\r
BadlyDamagedShips =\r
- _inSortie.SelectMany((flag, i) => !flag\r
- ? new ShipStatus[0]\r
- : _combinedFleetType > 0 && i == 1\r
- ? GetShipStatuses(1).Skip(1) // 連合艦隊第二の旗艦を飛ばす\r
- : GetShipStatuses(i))\r
- .Where(s => !s.Escaped && s.DamageLevel == ShipStatus.Damage.Badly)\r
- .Select(s => s.Name)\r
- .ToArray();\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
+ select s.Name).ToArray();\r
}\r
\r
public void ClearBadlyDamagedShips()\r
var id = _shipInfo.Keys.Count + 1;\r
var ships = nowhps.Zip(maxhps,\r
(now, max) => new ShipStatus {Id = id++, NowHp = now, MaxHp = max}).ToArray();\r
- _decks[deck] = (from ship in ships select ship.Id).ToArray();\r
+ _fleets[deck].Deck = (from ship in ships select ship.Id).ToArray();\r
foreach (var ship in ships)\r
_shipInfo[ship.Id] = ship;\r
foreach (var entry in ships.Zip(slots, (ship, slot) =>new {ship, slot}))\r