// limitations under the License.\r
\r
using System;\r
+using System.Linq;\r
using ExpressionToCodeLib;\r
using KancolleSniffer.Model;\r
using KancolleSniffer.Util;\r
[TestClass]\r
public class BattleTest\r
{\r
+ private ItemMaster _itemMaster;\r
+ private ItemInventry _itemInventry;\r
private ItemInfo _itemInfo;\r
+ private ShipMaster _shipMaster;\r
+ private ShipInventry _shipInventry;\r
private ShipInfo _shipInfo;\r
private BattleInfo _battleInfo;\r
\r
return logfile.ReadToEnd().Split(new [] {"\r\n"}, StringSplitOptions.None);\r
}\r
\r
+ public void InjectShips(dynamic battle, dynamic item)\r
+ {\r
+ var deck = (int)battle.api_deck_id - 1;\r
+ InjectShips(deck, (int[])battle.api_f_nowhps, (int[])battle.api_f_maxhps, (int[][])item[0]);\r
+ if (battle.api_f_nowhps_combined())\r
+ InjectShips(1, (int[])battle.api_f_nowhps_combined, (int[])battle.api_f_maxhps_combined,\r
+ (int[][])item[1]);\r
+ foreach (var enemy in (int[])battle.api_ship_ke)\r
+ _shipMaster.InjectSpec(enemy);\r
+ if (battle.api_ship_ke_combined())\r
+ {\r
+ foreach (var enemy in (int[])battle.api_ship_ke_combined)\r
+ _shipMaster.InjectSpec(enemy);\r
+ }\r
+ _itemInfo.InjectItems(((int[][])battle.api_eSlot).SelectMany(x => x));\r
+ if (battle.api_eSlot_combined())\r
+ _itemInfo.InjectItems(((int[][])battle.api_eSlot_combined).SelectMany(x => x));\r
+ }\r
+\r
+ private void InjectShips(int deck, int[] nowhps, int[] maxhps, int[][] slots)\r
+ {\r
+ var id = _shipInventry.MaxId + 1;\r
+ var ships = nowhps.Zip(maxhps,\r
+ (now, max) => new ShipStatus {Id = id++, NowHp = now, MaxHp = max}).ToArray();\r
+ _shipInfo.Fleets[deck].Deck = (from ship in ships select ship.Id).ToArray();\r
+ _shipInventry.Add(ships);\r
+ foreach (var entry in ships.Zip(slots, (ship, slot) => new {ship, slot}))\r
+ {\r
+ entry.ship.Slot = _itemInfo.InjectItems(entry.slot.Take(5));\r
+ if (entry.slot.Length >= 6)\r
+ entry.ship.SlotEx = _itemInfo.InjectItems(entry.slot.Skip(5)).First();\r
+ }\r
+ }\r
+\r
[TestInitialize]\r
public void Initialize()\r
{\r
- _itemInfo = new ItemInfo(new ItemMaster(), new ItemInventry());\r
- _shipInfo = new ShipInfo(new ShipMaster(), new ShipInventry(), _itemInfo);\r
+ _itemMaster = new ItemMaster();\r
+ _itemInventry = new ItemInventry();\r
+ _itemInfo = new ItemInfo(_itemMaster, _itemInventry);\r
+ _shipInventry = new ShipInventry();\r
+ _shipMaster = new ShipMaster();\r
+ _shipInfo = new ShipInfo(_shipMaster, _shipInventry, _itemInventry);\r
_battleInfo = new BattleInfo(_shipInfo, _itemInfo);\r
}\r
\r
var logs = ReadAllLines("damecon_001");\r
var items = JsonParser.Parse("[[[],[],[],[],[43]]]");\r
dynamic battle = JsonParser.Parse(logs[2]);\r
- _shipInfo.InjectShips(battle, items);\r
+ InjectShips(battle, items);\r
_battleInfo.InspectBattle(logs[0], logs[1], battle);\r
dynamic result = JsonParser.Parse(logs[5]);\r
_battleInfo.InspectBattleResult(result);\r
{\r
var logs = ReadAllLines("midnight_002");\r
var battle = JsonParser.Parse(logs[3]);\r
- _shipInfo.InjectShips(battle, JsonParser.Parse(logs[0]));\r
+ InjectShips(battle, JsonParser.Parse(logs[0]));\r
_battleInfo.InspectBattle(logs[1], logs[2], battle);\r
_battleInfo.InspectBattleResult(JsonParser.Parse(logs[6]));\r
PAssert.That(() => _shipInfo.Fleets[0].Ships[3].NowHp == 12);\r
{\r
var logs = ReadAllLines("friendfleet_001");\r
var battle = Data(logs[3]);\r
- _shipInfo.InjectShips(battle, JsonParser.Parse(logs[0]));\r
+ InjectShips(battle, JsonParser.Parse(logs[0]));\r
_battleInfo.InspectBattle(logs[1], logs[2], battle);\r
_battleInfo.InspectBattle(logs[4], logs[5], Data(logs[6]));\r
_battleInfo.InspectBattleResult(Data(logs[9]));\r
{\r
var logs = ReadAllLines("ld_airbattle_001");\r
var battle = Data(logs[3]);\r
- _shipInfo.InjectShips(battle, JsonParser.Parse(logs[0]));\r
+ InjectShips(battle, JsonParser.Parse(logs[0]));\r
_battleInfo.InspectBattle(logs[1], logs[2], battle);\r
_battleInfo.InspectBattleResult(Data(logs[6]));\r
PAssert.That(() => !_battleInfo.DisplayedResultRank.IsError);\r
{\r
var logs = ReadAllLines("ld_airbattle_002");\r
var battle = Data(logs[3]);\r
- _shipInfo.InjectShips(battle, JsonParser.Parse(logs[0]));\r
+ InjectShips(battle, JsonParser.Parse(logs[0]));\r
_battleInfo.InspectBattle(logs[1], logs[2], battle);\r
_battleInfo.InspectBattleResult(Data(logs[6]));\r
PAssert.That(() => !_battleInfo.DisplayedResultRank.IsError);\r
{\r
var logs = ReadAllLines("damecon_002");\r
var battle = Data(logs[3]);\r
- _shipInfo.InjectShips(battle, JsonParser.Parse(logs[0]));\r
+ InjectShips(battle, JsonParser.Parse(logs[0]));\r
_battleInfo.InspectBattle(logs[1], logs[2], battle);\r
_battleInfo.InspectBattle(logs[4], logs[5], Data(logs[6]));\r
_battleInfo.InspectBattleResult(Data(logs[9]));\r
{\r
var sniffer = new Sniffer();\r
SniffLogFile(sniffer, "powerup_002");\r
- PAssert.That(() => sniffer.Item.NowShips == 218);\r
+ PAssert.That(() => sniffer.ShipCounter.Now == 218);\r
}\r
\r
/// <summary>\r
{\r
var sniffer1 = new Sniffer();\r
SniffLogFile(sniffer1, "createitem_001");\r
- PAssert.That(() => sniffer1.Item.NowEquips == 900);\r
+ PAssert.That(() => sniffer1.ItemCounter.Now == 900);\r
var sniffer2 = new Sniffer();\r
SniffLogFile(sniffer2, "createship_001");\r
- PAssert.That(() => sniffer2.Item.NowEquips == 904);\r
+ PAssert.That(() => sniffer2.ItemCounter.Now == 904);\r
}\r
\r
/// <summary>\r
[TestMethod]\r
public void WarnItemCount()\r
{\r
+ Action<int> func = i => { };\r
var sniffer1 = new Sniffer();\r
SniffLogFile(sniffer1, "item_count_001");\r
- PAssert.That(() => sniffer1.Item.AlarmEquips, "出撃から母港に戻ったとき");\r
+ func.Invoke(sniffer1.ItemCounter.Now); // Nowを読まないとAlarmが立たない\r
+ PAssert.That(() => sniffer1.ItemCounter.Alarm, "出撃から母港に戻ったとき");\r
var sniffer2 = new Sniffer();\r
SniffLogFile(sniffer2, "item_count_002");\r
- PAssert.That(() => sniffer2.Item.AlarmEquips, "ログインしたとき");\r
+ func.Invoke(sniffer2.ItemCounter.Now);\r
+ PAssert.That(() => sniffer2.ItemCounter.Alarm, "ログインしたとき");\r
}\r
\r
/// <summary>\r
{\r
var sniffer = new Sniffer();\r
SniffLogFile(sniffer, "destroyship_001");\r
- PAssert.That(() => sniffer.Item.NowShips == 250);\r
- PAssert.That(() => sniffer.Item.NowEquips == 1118);\r
+ PAssert.That(() => sniffer.ShipCounter.Now == 250);\r
+ PAssert.That(() => sniffer.ItemCounter.Now == 1118);\r
PAssert.That(() => sniffer.Material.Current.Take(4).SequenceEqual(new[] {285615, 286250, 291010, 284744}));\r
}\r
\r
{\r
var sniffer = new Sniffer();\r
SniffLogFile(sniffer, "ship2_001");\r
- PAssert.That(() => sniffer.Item.NowShips == 243);\r
+ PAssert.That(() => sniffer.ShipCounter.Now == 243);\r
}\r
\r
/// <summary>\r
var sniffer = new Sniffer();\r
sniffer.AdditionalData.RecordNumEquips(11, "", 1);\r
SniffLogFile(sniffer, "dropship_002");\r
- PAssert.That(() => sniffer.Item.NowShips == 250);\r
- PAssert.That(() => sniffer.Item.NowEquips == 1159);\r
+ PAssert.That(() => sniffer.ShipCounter.Now == 250);\r
+ PAssert.That(() => sniffer.ItemCounter.Now == 1159);\r
}\r
}\r
}
\ No newline at end of file
<ItemGroup>\r
<Compile Include="Model\Achievement.cs" />\r
<Compile Include="Model\AkashiTimer.cs" />\r
+ <Compile Include="Model\AlarmCounter.cs" />\r
<Compile Include="Model\AlarmTimer.cs" />\r
<Compile Include="Model\ItemMaster.cs" />\r
<Compile Include="Model\Inventry.cs" />\r
private void ApplyConfig()\r
{\r
_listForm.TopMost = TopMost = _config.TopMost;\r
- _sniffer.Item.MarginShips = _config.MarginShips;\r
+ _sniffer.ShipCounter.Margin = _config.MarginShips;\r
UpdateNumOfShips();\r
- _sniffer.Item.MarginEquips = _config.MarginEquips;\r
+ _sniffer.ItemCounter.Margin = _config.MarginEquips;\r
UpdateNumOfEquips();\r
_sniffer.Achievement.ResetHours = _config.ResetHours;\r
labelAkashiRepair.Visible = labelAkashiRepairTimer.Visible =\r
\r
private void UpdateNumOfShips()\r
{\r
- var item = _sniffer.Item;\r
- labelNumOfShips.Text = $"{item.NowShips:D}/{item.MaxShips:D}";\r
- labelNumOfShips.ForeColor = item.TooManyShips ? CUDColor.Red : Color.Black;\r
- if (item.AlarmShips)\r
+ var ship = _sniffer.ShipCounter;\r
+ labelNumOfShips.Text = $"{ship.Now:D}/{ship.Max:D}";\r
+ labelNumOfShips.ForeColor = ship.TooMany ? CUDColor.Red : Color.Black;\r
+ if (ship.Alarm)\r
{\r
- var message = $"残り{_sniffer.Item.MaxShips - _sniffer.Item.NowShips:D}隻";\r
+ var message = $"残り{ship.Rest:D}隻";\r
_notificationManager.Enqueue("艦娘数超過", message);\r
- item.AlarmShips = false;\r
+ ship.Alarm = false;\r
}\r
}\r
\r
private void UpdateNumOfEquips()\r
{\r
- var item = _sniffer.Item;\r
- labelNumOfEquips.Text = $"{item.NowEquips:D}/{item.MaxEquips:D}";\r
- labelNumOfEquips.ForeColor = item.TooManyEquips ? CUDColor.Red : Color.Black;\r
- if (item.AlarmEquips)\r
+ var item = _sniffer.ItemCounter;\r
+ labelNumOfEquips.Text = $"{item.Now:D}/{item.Max:D}";\r
+ labelNumOfEquips.ForeColor = item.TooMany ? CUDColor.Red : Color.Black;\r
+ if (item.Alarm)\r
{\r
- var message = $"残り{_sniffer.Item.MaxEquips - _sniffer.Item.NowEquips:D}個";\r
+ var message = $"残り{item.Rest:D}個";\r
_notificationManager.Enqueue("装備数超過", message);\r
- item.AlarmEquips = false;\r
+ item.Alarm = false;\r
}\r
}\r
\r
--- /dev/null
+// Copyright (C) 2018 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
+//\r
+// Licensed under the Apache License, Version 2.0 (the "License");\r
+// you may not use this file except in compliance with the License.\r
+// You may obtain a copy of the License at\r
+//\r
+// http://www.apache.org/licenses/LICENSE-2.0\r
+//\r
+// Unless required by applicable law or agreed to in writing, software\r
+// distributed under the License is distributed on an "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+// See the License for the specific language governing permissions and\r
+// limitations under the License.\r
+\r
+using System;\r
+\r
+namespace KancolleSniffer.Model\r
+{\r
+ public class AlarmCounter\r
+ {\r
+ private readonly Func<int> _getCount;\r
+ private int _now;\r
+\r
+ public AlarmCounter(Func<int> getCount)\r
+ {\r
+ _getCount = getCount;\r
+ }\r
+\r
+ public int Max { get; set; }\r
+ public int Margin { private get; set; }\r
+ public bool Alarm { get; set; }\r
+ public bool TooMany => Max != 0 && Now >= Max - Margin;\r
+ public int Rest => Max == 0 ? 0 : Max - Now;\r
+\r
+ public int Now\r
+ {\r
+ get\r
+ {\r
+ var prev = _now;\r
+ _now = _getCount();\r
+ if (Max == 0)\r
+ return _now;\r
+ var limit = Max - Margin;\r
+ Alarm = Alarm || prev < limit && _now >= limit;\r
+ return _now;\r
+ }\r
+ }\r
+ }\r
+}
\ No newline at end of file
public abstract class Inventry<T>\r
{\r
private readonly Dictionary<int, T> _dict = new Dictionary<int, T>();\r
+ private int _inflated;\r
\r
protected abstract T CreateDummy(int id);\r
\r
{\r
_dict.Clear();\r
_dict[-1] = CreateDummy(-1);\r
+ _inflated = 0;\r
}\r
\r
public virtual T this[int id]\r
public IEnumerable<T> AllItems =>\r
from kv in _dict where kv.Key != -1 select kv.Value;\r
\r
- public int Count => _dict.Count - 1;\r
+ public void InflateCount(int count) => _inflated += count;\r
+\r
+ public int Count => _dict.Count + _inflated - 1;\r
\r
public int MaxId => Math.Max(_dict.Keys.Max(), 0);\r
}\r
{\r
public class ItemInfo\r
{\r
- private int _nowShips, _nowEquips;\r
private readonly ItemMaster _itemMaster;\r
private readonly ItemInventry _itemInventry;\r
- public int MaxShips { get; private set; }\r
- public int MarginShips { get; set; }\r
- public bool AlarmShips { get; set; }\r
- public int MaxEquips { get; private set; }\r
- public int MarginEquips { get; set; }\r
- public bool AlarmEquips { get; set; }\r
-\r
- public int NowShips\r
- {\r
- get => _nowShips;\r
- set\r
- {\r
- if (MaxShips != 0)\r
- {\r
- var limit = MaxShips - MarginShips;\r
- AlarmShips = AlarmShips || _nowShips < limit && value >= limit;\r
- }\r
- _nowShips = value;\r
- }\r
- }\r
-\r
- public bool TooManyShips => MaxShips != 0 && NowShips >= MaxShips - MarginShips;\r
-\r
- public int NowEquips\r
- {\r
- get => _nowEquips;\r
- set\r
- {\r
- if (MaxEquips != 0)\r
- {\r
- var limit = MaxEquips - MarginEquips;\r
- AlarmEquips = AlarmEquips || _nowEquips < limit && value >= limit;\r
- }\r
- _nowEquips = value;\r
- }\r
- }\r
-\r
- public bool TooManyEquips => MaxEquips != 0 && NowEquips >= MaxEquips - MarginEquips;\r
+ public AlarmCounter Counter { get; }\r
\r
public ItemInfo(ItemMaster itemMaster, ItemInventry itemInventry)\r
{\r
_itemMaster = itemMaster;\r
_itemInventry = itemInventry;\r
- MarginShips = 4;\r
- MarginEquips = 10;\r
+ Counter = new AlarmCounter(() => _itemInventry.Count) {Margin = 10};\r
}\r
\r
public void InspectBasic(dynamic json)\r
{\r
- MaxShips = (int)json.api_max_chara;\r
- var check = MaxEquips == 0;\r
- MaxEquips = (int)json.api_max_slotitem;\r
- if (check)\r
- AlarmEquips = NowEquips >= MaxEquips - MarginEquips;\r
+ Counter.Max = (int)json.api_max_slotitem;\r
}\r
\r
public void InspectMaster(dynamic json)\r
Alv = entry.api_alv() ? (int)entry.api_alv : 0\r
};\r
}\r
- NowEquips = _itemInventry.Count;\r
}\r
\r
public void InspectCreateItem(dynamic json)\r
\r
public void InspectGetShip(dynamic json)\r
{\r
- NowShips += 1;\r
if (json.api_slotitem == null) // まるゆにはスロットがない\r
return;\r
InspectSlotItem(json.api_slotitem);\r
private void DeleteItems(IEnumerable<int> ids)\r
{\r
_itemInventry.Remove(ids);\r
- NowEquips = _itemInventry.Count;\r
}\r
\r
public ItemSpec GetSpecByItemId(int id) => _itemMaster[id];\r
private readonly Fleet[] _fleets;\r
private readonly ShipMaster _shipMaster;\r
private readonly ShipInventry _shipInventry;\r
- private readonly ItemInfo _itemInfo;\r
+ private readonly ItemInventry _itemInventry;\r
private readonly List<int> _escapedShips = new List<int>();\r
private ShipStatus[] _battleResult = new ShipStatus[0];\r
private readonly NumEquipsChecker _numEquipsChecker = new NumEquipsChecker();\r
+ public AlarmCounter Counter { get; }\r
public int HqLevel { get; private set; }\r
public ShipStatusPair[] BattleResultDiff { get; private set; } = new ShipStatusPair[0];\r
public bool IsBattleResultError => BattleResultDiff.Length > 0;\r
}\r
}\r
\r
- public ShipInfo(ShipMaster shipMaster, ShipInventry shipInventry, ItemInfo itemInfo)\r
+ public ShipInfo(ShipMaster shipMaster, ShipInventry shipInventry, ItemInventry itemInventry)\r
{\r
_shipMaster = shipMaster;\r
_shipInventry = shipInventry;\r
_fleets = Enumerable.Range(0, FleetCount).Select((x, i) => new Fleet(this, i)).ToArray();\r
- _itemInfo = itemInfo;\r
+ _itemInventry = itemInventry;\r
+ Counter = new AlarmCounter(() => _shipInventry.Count){Margin = 4};\r
}\r
\r
public void InspectMaster(dynamic json)\r
InspectBasic(json.api_basic);\r
if (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
else if (json.api_data()) // ship2\r
// ship_deckでドロップ艦を反映する\r
if (DropShipId != -1)\r
{\r
- _itemInfo.NowShips++;\r
+ _shipInventry.InflateCount(1);\r
var num = _shipMaster.GetSpec(DropShipId).NumEquips;\r
if (num > 0)\r
- _itemInfo.NowEquips += num;\r
+ _itemInventry.InflateCount(num);\r
}\r
}\r
else if (json.api_ship()) // getshipとpowerup\r
private void InspectBasic(dynamic json)\r
{\r
HqLevel = (int)json.api_level;\r
+ Counter.Max = (int)json.api_max_chara;\r
}\r
\r
public void InspectCharge(dynamic json)\r
var ships = values["api_id_items"].Split(',').Select(int.Parse).ToArray();\r
if (!_shipInventry.Contains(ships[0])) // 二重に実行された場合\r
return;\r
- _itemInfo.NowShips -= ships.Length;\r
- _itemInfo.DeleteItems(ships.SelectMany(id => _shipInventry[id].Slot).ToArray());\r
+ _itemInventry.Remove(ships.SelectMany(id => _shipInventry[id].Slot));\r
_shipInventry.Remove(ships);\r
InspectDeck(json.api_deck);\r
InspectShip(json);\r
var delitem = int.Parse(values["api_slot_dest_flag"] ?? "0") == 1;\r
foreach (var id in values["api_ship_id"].Split(',').Select(int.Parse))\r
{\r
- _itemInfo.NowShips--;\r
if (delitem)\r
- _itemInfo.DeleteItems(_shipInventry[id].AllSlot);\r
+ _itemInventry.Remove(_shipInventry[id].AllSlot);\r
var of = FindFleet(id, out var oi);\r
if (of != null)\r
WithdrowShip(of, oi);\r
{\r
if (ship.Empty)\r
return ship;\r
- ship.Slot = ship.Slot.Select(item => _itemInfo.GetStatus(item.Id)).ToArray();\r
- ship.SlotEx = _itemInfo.GetStatus(ship.SlotEx.Id);\r
+ ship.Slot = ship.Slot.Select(item => _itemInventry[item.Id]).ToArray();\r
+ ship.SlotEx = _itemInventry[ship.SlotEx.Id];\r
ship.Escaped = _escapedShips.Contains(ship.Id);\r
ship.Fleet = FindFleet(ship.Id, out var idx);\r
ship.DeckIndex = idx;\r
foreach (var ship in _shipInventry.AllShips)\r
{\r
foreach (var item in ship.Slot)\r
- _itemInfo.GetStatus(item.Id).Holder = ship;\r
- _itemInfo.GetStatus(ship.SlotEx.Id).Holder = ship;\r
+ _itemInventry[item.Id].Holder = ship;\r
+ _itemInventry[ship.SlotEx.Id].Holder = ship;\r
}\r
}\r
\r
{\r
_escapedShips.Clear();\r
}\r
-\r
- public void InjectShips(dynamic battle, dynamic item)\r
- {\r
- var deck = (int)battle.api_deck_id - 1;\r
- InjectShips(deck, (int[])battle.api_f_nowhps, (int[])battle.api_f_maxhps, (int[][])item[0]);\r
- if (battle.api_f_nowhps_combined())\r
- InjectShips(1, (int[])battle.api_f_nowhps_combined, (int[])battle.api_f_maxhps_combined,\r
- (int[][])item[1]);\r
- foreach (var enemy in (int[])battle.api_ship_ke)\r
- _shipMaster.InjectSpec(enemy);\r
- if (battle.api_ship_ke_combined())\r
- {\r
- foreach (var enemy in (int[])battle.api_ship_ke_combined)\r
- _shipMaster.InjectSpec(enemy);\r
- }\r
- _itemInfo.InjectItems(((int[][])battle.api_eSlot).SelectMany(x => x));\r
- if (battle.api_eSlot_combined())\r
- _itemInfo.InjectItems(((int[][])battle.api_eSlot_combined).SelectMany(x => x));\r
- }\r
-\r
- private void InjectShips(int deck, int[] nowhps, int[] maxhps, int[][] slots)\r
- {\r
- var id = _shipInventry.MaxId + 1;\r
- var ships = nowhps.Zip(maxhps,\r
- (now, max) => new ShipStatus {Id = id++, NowHp = now, MaxHp = max}).ToArray();\r
- _fleets[deck].Deck = (from ship in ships select ship.Id).ToArray();\r
- _shipInventry.Add(ships);\r
- foreach (var entry in ships.Zip(slots, (ship, slot) => new {ship, slot}))\r
- {\r
- entry.ship.Slot = _itemInfo.InjectItems(entry.slot.Take(5));\r
- if (entry.slot.Length >= 6)\r
- entry.ship.SlotEx = _itemInfo.InjectItems(entry.slot.Skip(5)).First();\r
- }\r
- }\r
}\r
}
\ No newline at end of file
{\r
_start = start;\r
_itemInfo = new ItemInfo(_itemMaster, _itemInventry);\r
- _shipInfo = new ShipInfo(_shipMaster, _shipInventry, _itemInfo);\r
+ _shipInfo = new ShipInfo(_shipMaster, _shipInventry, _itemInventry);\r
_conditionTimer = new ConditionTimer(_shipInfo);\r
_dockInfo = new DockInfo(_shipInfo, _materialInfo);\r
_akashiTimer = new AkashiTimer(_shipInfo, _dockInfo, _presetDeck);\r
\r
public AlarmTimer[] KDock => _dockInfo.KDock;\r
\r
+ public AlarmCounter ItemCounter => _itemInfo.Counter;\r
+\r
public ItemInfo Item => _itemInfo;\r
\r
public MaterialInfo Material => _materialInfo;\r
\r
public int[] GetConditionNotice(DateTime prev, DateTime now) => _conditionTimer.GetNotice(prev, now);\r
\r
+ public AlarmCounter ShipCounter => _shipInfo.Counter;\r
+\r
public Fleet[] Fleets => _shipInfo.Fleets;\r
\r
public ShipInfo.ShipStatusPair[] BattleResultStatusDiff => _shipInfo.BattleResultDiff;\r