From d630cea4d521a3a630c34c61acca021112953f0c Mon Sep 17 00:00:00 2001 From: Kazuhiro Fujieda Date: Sun, 9 Aug 2020 20:38:10 +0900 Subject: [PATCH] =?utf8?q?=E9=81=A0=E5=BE=81=E4=BB=BB=E5=8B=99=E3=81=AE?= =?utf8?q?=E3=82=AB=E3=82=A6=E3=83=B3=E3=82=BF=E3=83=BC=E3=81=AE=E3=83=84?= =?utf8?q?=E3=83=BC=E3=83=AB=E3=83=81=E3=83=83=E3=83=97=E3=81=8C=E8=A1=A8?= =?utf8?q?=E7=A4=BA=E3=81=95=E3=82=8C=E3=81=AA=E3=81=84=E3=81=93=E3=81=A8?= =?utf8?q?=E3=81=8C=E3=81=82=E3=82=8B=E3=81=AE=E3=82=92=E7=9B=B4=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- KancolleSniffer.Test/QuestCounterTest.cs | 37 ++++++++++++++++++++++++-------- KancolleSniffer.Test/QuestInfoTest.cs | 15 ++++++++----- KancolleSniffer/Model/QuestCountList.cs | 18 +++++++++++++--- KancolleSniffer/Model/QuestCounter.cs | 21 +++++++++--------- KancolleSniffer/Model/QuestInfo.cs | 5 +++-- KancolleSniffer/Model/QuestSpec.cs | 1 + KancolleSniffer/Sniffer.cs | 5 ++++- 7 files changed, 72 insertions(+), 30 deletions(-) diff --git a/KancolleSniffer.Test/QuestCounterTest.cs b/KancolleSniffer.Test/QuestCounterTest.cs index c1a6eea..d4ac5d6 100644 --- a/KancolleSniffer.Test/QuestCounterTest.cs +++ b/KancolleSniffer.Test/QuestCounterTest.cs @@ -167,9 +167,25 @@ namespace KancolleSniffer.Test new QuestCount {Id = 284, NowArray = new[] {1, 1, 1, 1}}, new QuestCount {Id = 226, Now = 2}, new QuestCount {Id = 436, NowArray = new[] {1, 0, 1, 1, 1}}, + new QuestCount {Id = 437, NowArray = new[] {1, 0, 1, 1}} } }; - new QuestInfo().LoadState(status); + var countList = new QuestCountList(); + countList.SetMissionNames(new JsonObject(new[] + { + new {api_id = 1, api_name = "練習航海"}, + new {api_id = 2, api_name = "長距離練習航海"}, + new {api_id = 3, api_name = "警備任務"}, + new {api_id = 4, api_name = "対潜警戒任務"}, + new {api_id = 5, api_name = "海上護衛任務"}, + new {api_id = 10, api_name = "強行偵察任務"}, + new {api_id = 101, api_name = "海峡警備行動"}, + new {api_id = 102, api_name = "長時間対潜警戒"}, + new {api_id = 104, api_name = "小笠原沖哨戒線"}, + new {api_id = 105, api_name = "小笠原沖戦闘哨戒"}, + new {api_id = 110, api_name = "南西方面航空偵察作戦"}, + })); + new QuestInfo(countList).LoadState(status); Assert.AreEqual("2/3", status.QuestCountList[0].ToString()); Assert.AreEqual("20/36 7/6 10/24 8/12", status.QuestCountList[1].ToString()); var z = status.QuestCountList[2]; @@ -179,7 +195,7 @@ namespace KancolleSniffer.Test Assert.AreEqual("2-4:0 6-1:0 6-3:0 6-4:0", z.ToToolTip()); var q426 = status.QuestCountList[3]; Assert.AreEqual("1\u200a1\u200a1\u200a1", q426.ToString()); - Assert.AreEqual("警備任務1 対潜警戒任務1 海上護衛任務1 強硬偵察任務1", q426.ToToolTip()); + Assert.AreEqual("警備任務1 対潜警戒任務1 海上護衛任務1 強行偵察任務1", q426.ToToolTip()); var q428 = status.QuestCountList[4]; Assert.AreEqual("対潜警戒任務1 海峡警備行動1 長時間対潜警戒1", q428.ToToolTip()); q428.NowArray = new[] {0, 1, 0}; @@ -212,6 +228,9 @@ namespace KancolleSniffer.Test var q436 = status.QuestCountList.First(q => q.Id == 436); Assert.AreEqual("1\u200a0\u200a1\u200a1\u200a1", q436.ToString()); Assert.AreEqual("練習航海1 長距離練習航海0 警備任務1 対潜警戒任務1 強行偵察任務1", q436.ToToolTip()); + var q437 = status.QuestCountList.First(q => q.Id == 437); + Assert.AreEqual("1\u200a0\u200a1\u200a1", q437.ToString()); + Assert.AreEqual("対潜警戒任務1 小笠原沖哨戒線0 小笠原沖戦闘哨戒1 南西方面航空偵察作戦1", q437.ToToolTip()); } } @@ -309,7 +328,7 @@ namespace KancolleSniffer.Test { _battleInfo = new BattleInfo(null, null, null); _itemInfo = new ItemInfo(new ItemMaster(), new ItemInventory()); - _questInfo = new QuestInfo(() => new DateTime(2015, 1, 1)); + _questInfo = new QuestInfo(new QuestCountList(), () => new DateTime(2015, 1, 1)); _questCounter = new QuestCounter(_questInfo, _itemInfo, _battleInfo); } @@ -1148,7 +1167,7 @@ namespace KancolleSniffer.Test { var count = InjectQuest(904); _battleInfo.InjectResultStatus( - new []{ShipStatus("綾波改二"), ShipStatus("敷波")}, + new[] {ShipStatus("綾波改二"), ShipStatus("敷波")}, new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]); InjectMapNext(25, 5); @@ -1234,7 +1253,7 @@ namespace KancolleSniffer.Test { var count = InjectQuest(912); _battleInfo.InjectResultStatus( - new []{ShipStatus("明石"), ShipStatus(2), ShipStatus(2), ShipStatus(1)}, + new[] {ShipStatus("明石"), ShipStatus(2), ShipStatus(2), ShipStatus(1)}, new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]); InjectMapNext(13, 5); @@ -1283,7 +1302,7 @@ namespace KancolleSniffer.Test { var count = InjectQuest(914); _battleInfo.InjectResultStatus( - new []{ShipStatus(5), ShipStatus(5), ShipStatus(5), ShipStatus(1)}, + new[] {ShipStatus(5), ShipStatus(5), ShipStatus(5), ShipStatus(1)}, new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]); InjectMapNext(41, 5); @@ -1456,7 +1475,7 @@ namespace KancolleSniffer.Test { var count = InjectQuest(337); - _battleInfo.InjectResultStatus(new [] + _battleInfo.InjectResultStatus(new[] { ShipStatus("霰"), ShipStatus("霰"), ShipStatus("陽炎"), ShipStatus("不知火"), @@ -1482,7 +1501,7 @@ namespace KancolleSniffer.Test { var count = InjectQuest(339); - _battleInfo.InjectResultStatus(new [] + _battleInfo.InjectResultStatus(new[] { ShipStatus("磯波"), ShipStatus("浦波"), ShipStatus("綾波"), ShipStatus("敷波"), @@ -1505,7 +1524,7 @@ namespace KancolleSniffer.Test { var count = InjectQuest(342); - _battleInfo.InjectResultStatus(new []{ShipStatus(1), ShipStatus(1),ShipStatus(2), ShipStatus(5)}, + _battleInfo.InjectResultStatus(new[] {ShipStatus(1), ShipStatus(1), ShipStatus(2), ShipStatus(5)}, new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]); InjectPracticeResult("A"); Assert.AreEqual(0, count.Now); diff --git a/KancolleSniffer.Test/QuestInfoTest.cs b/KancolleSniffer.Test/QuestInfoTest.cs index bcaf118..6f9aa26 100644 --- a/KancolleSniffer.Test/QuestInfoTest.cs +++ b/KancolleSniffer.Test/QuestInfoTest.cs @@ -34,7 +34,7 @@ namespace KancolleSniffer.Test new DateTime(2017, 12, 1, 5, 0, 0), new DateTime(2018, 2, 1, 5, 0, 0), new DateTime(2018, 3, 1, 5, 0, 0), new DateTime(2018, 5, 1, 5, 0, 0) }); - var questInfo = new QuestInfo(() => queue.Dequeue()); + var questInfo = MakeQuestInfo(() => queue.Dequeue()); var status = new Status { QuestCountList = new[] @@ -71,7 +71,7 @@ namespace KancolleSniffer.Test { new DateTime(2019, 1, 22, 4, 0, 0) }); - var questInfo = new QuestInfo(() => queue.Dequeue()); + var questInfo = MakeQuestInfo(() => queue.Dequeue()); var status = new Status { QuestCountList = new[] {new QuestCount {Id = 213, Now = 1}}, @@ -91,7 +91,7 @@ namespace KancolleSniffer.Test new DateTime(2019, 1, 27, 10, 0, 0), new DateTime(2019, 1, 28, 5, 0, 0) }); - var questInfo = new QuestInfo(() => queue.Dequeue()); + var questInfo = MakeQuestInfo(() => queue.Dequeue()); var status = new Status { QuestLastReset = new DateTime(2019, 1, 27, 5, 0, 0) @@ -107,7 +107,7 @@ namespace KancolleSniffer.Test [TestMethod] public void NotImplemented() { - var questInfo = new QuestInfo(() => new DateTime(2015, 1, 1)); + var questInfo = MakeQuestInfo(() => new DateTime(2015, 1, 1)); InspectQuestList(questInfo, new[] {679}); PAssert.That(() => questInfo.Quests[0].Count.Spec.Material.Length == 0); } @@ -146,7 +146,7 @@ namespace KancolleSniffer.Test [TestMethod] public void LoadStateNotAppendMaterialList() { - var questInfo = new QuestInfo(() => new DateTime(2015, 1, 1)); + var questInfo = MakeQuestInfo(() => new DateTime(2015, 1, 1)); var status = new Status { QuestList = new[] @@ -168,5 +168,10 @@ namespace KancolleSniffer.Test questInfo.LoadState(status); PAssert.That(() => questInfo.Quests[0].Material.Length == 8); } + + private QuestInfo MakeQuestInfo(Func nowFunc) + { + return new QuestInfo(new QuestCountList(), nowFunc); + } } } \ No newline at end of file diff --git a/KancolleSniffer/Model/QuestCountList.cs b/KancolleSniffer/Model/QuestCountList.cs index 53183f4..5b752bc 100644 --- a/KancolleSniffer/Model/QuestCountList.cs +++ b/KancolleSniffer/Model/QuestCountList.cs @@ -32,7 +32,7 @@ namespace KancolleSniffer.Model /// https://github.com/andanteyk/ElectronicObserver/blob/develop/ElectronicObserver/Data/Quest/QuestProgressManager.cs /// // @formatter:off - private static readonly Dictionary QuestSpecs = new Dictionary + private readonly Dictionary _questSpecs = new Dictionary { {201, new QuestSortie {Interval = Daily, Max = 1, Rank = "B", Material = new[] {0, 0, 1, 0}}}, // 201: 敵艦隊を撃滅せよ! {216, new QuestSortie {Interval = Daily, Max = 1, Rank = "B", Material = new[] {0, 1, 1, 0}}}, // 216: 敵艦隊主力を撃滅せよ! @@ -135,11 +135,23 @@ namespace KancolleSniffer.Model private readonly Dictionary _countDict = new Dictionary(); + public void SetMissionNames(dynamic json) + { + var dict = new Dictionary(); + foreach (var entry in json) + dict[(int)entry.api_id] = entry.api_name; + foreach (var spec in _questSpecs) + { + if (spec.Value is QuestMission mission && mission.Ids != null) + mission.Names = mission.Ids.Select(id => dict.TryGetValue(id, out var name) ? name : "").ToArray(); + } + } + public QuestCount GetCount(int id) { if (_countDict.TryGetValue(id, out var value)) return value; - if (QuestSpecs.TryGetValue(id, out var spec)) + if (_questSpecs.TryGetValue(id, out var spec)) { var nowArray = spec.MaxArray?.Select(x => 0).ToArray(); return _countDict[id] = new QuestCount @@ -175,7 +187,7 @@ namespace KancolleSniffer.Model return; foreach (var count in questCountList) { - count.Spec = QuestSpecs[count.Id]; + count.Spec = _questSpecs[count.Id]; _countDict[count.Id] = count; } } diff --git a/KancolleSniffer/Model/QuestCounter.cs b/KancolleSniffer/Model/QuestCounter.cs index cb736dd..4ae6927 100644 --- a/KancolleSniffer/Model/QuestCounter.cs +++ b/KancolleSniffer/Model/QuestCounter.cs @@ -115,18 +115,19 @@ namespace KancolleSniffer.Model { if (NowArray == null) return ""; - if (Spec is QuestSortie spec && spec.Maps != null && spec.MaxArray != null) + switch (Spec) { - return string.Join(" ", spec.Maps.Zip(NowArray, (map, n) => $"{MapString(map)}:{n}")); + case QuestSortie sortie when sortie.Maps != null && sortie.MaxArray != null: + return string.Join(" ", sortie.Maps.Zip(NowArray, (map, n) => $"{MapString(map)}:{n}")); + case QuestMission mission when mission.Ids != null: + return string.Join(" ", mission.Names.Zip(NowArray, (name, n) => $"{name}{n}")); + default: + return string.Join(" ", (Id switch + { + 688 => new[] {"艦戦", "艦爆", "艦攻", "水偵"}, + _ => new string[0] + }).Zip(NowArray, (entry, n) => $"{entry}{n}")); } - return string.Join(" ", (Id switch - { - 426 => new[] {"警備任務", "対潜警戒任務", "海上護衛任務", "強硬偵察任務"}, - 428 => new[] {"対潜警戒任務", "海峡警備行動", "長時間対潜警戒"}, - 436 => new[] {"練習航海", "長距離練習航海", "警備任務", "対潜警戒任務", "強行偵察任務"}, - 688 => new[] {"艦戦", "艦爆", "艦攻", "水偵"}, - _ => new string[0] - }).Zip(NowArray, (entry, n) => $"{entry}{n}")); } public bool Cleared => NowArray?.Zip(Spec.MaxArray, (n, m) => n >= m).All(x => x) ?? diff --git a/KancolleSniffer/Model/QuestInfo.cs b/KancolleSniffer/Model/QuestInfo.cs index a002d59..10c7c33 100644 --- a/KancolleSniffer/Model/QuestInfo.cs +++ b/KancolleSniffer/Model/QuestInfo.cs @@ -69,7 +69,7 @@ namespace KancolleSniffer.Model public class QuestInfo : IHaveState { - private readonly QuestCountList _countList = new QuestCountList(); + private readonly QuestCountList _countList; private readonly Func _nowFunc = () => DateTime.Now; private DateTime _now; private DateTime _lastReset; @@ -86,8 +86,9 @@ namespace KancolleSniffer.Model public QuestStatus[] Quests => QuestDictionary.Values.ToArray(); - public QuestInfo(Func nowFunc = null) + public QuestInfo(QuestCountList countList, Func nowFunc = null) { + _countList = countList; if (nowFunc != null) _nowFunc = nowFunc; } diff --git a/KancolleSniffer/Model/QuestSpec.cs b/KancolleSniffer/Model/QuestSpec.cs index e200f03..21688a6 100644 --- a/KancolleSniffer/Model/QuestSpec.cs +++ b/KancolleSniffer/Model/QuestSpec.cs @@ -93,6 +93,7 @@ namespace KancolleSniffer.Model public class QuestMission : QuestSpec { public int[] Ids { get; set; } + public string[] Names { get; set; } public bool Count(QuestCount count, int id) { diff --git a/KancolleSniffer/Sniffer.cs b/KancolleSniffer/Sniffer.cs index 460b8b9..4f9f5fa 100644 --- a/KancolleSniffer/Sniffer.cs +++ b/KancolleSniffer/Sniffer.cs @@ -30,8 +30,9 @@ namespace KancolleSniffer private readonly ShipInventory _shipInventory = new ShipInventory(); private readonly ShipInfo _shipInfo; private readonly MaterialInfo _materialInfo = new MaterialInfo(); - private readonly QuestInfo _questInfo = new QuestInfo(); + private readonly QuestInfo _questInfo; private readonly QuestCounter _questCounter; + private readonly QuestCountList _questCountList = new QuestCountList(); private readonly MissionInfo _missionInfo = new MissionInfo(); private readonly ConditionTimer _conditionTimer; private readonly DockInfo _dockInfo; @@ -98,6 +99,7 @@ namespace KancolleSniffer _airBase = new AirBase(_itemInfo); _battleInfo = new BattleInfo(_shipInfo, _itemInfo, _airBase); _logger = new Logger(_shipInfo, _itemInfo, _battleInfo); + _questInfo = new QuestInfo(_questCountList); _questCounter = new QuestCounter(_questInfo, _itemInfo, _battleInfo); _miscTextInfo = new MiscTextInfo(_shipInfo, _itemInfo); _haveState = new List {_achievement, _materialInfo, _conditionTimer, _exMapInfo, _questInfo}; @@ -187,6 +189,7 @@ namespace KancolleSniffer _miscTextInfo.InspectMaster(data); _logger.InspectMapInfoMaster(data.api_mst_mapinfo); SetMapDictionary(data.api_mst_mapinfo); + _questCountList.SetMissionNames(data.api_mst_mission); Started = true; return Update.Start; } -- 2.11.0