From: Kazuhiro Fujieda Date: Sat, 25 Jan 2020 11:43:52 +0000 (+0900) Subject: 任務カウンターの編成判定を艦娘名で行う X-Git-Tag: v11.33~3 X-Git-Url: http://git.osdn.net/view?p=kancollesniffer%2FKancolleSniffer.git;a=commitdiff_plain;h=4ea89fe38f90e94782df346a8d035f0a4bef80b0 任務カウンターの編成判定を艦娘名で行う --- diff --git a/KancolleSniffer.Test/QuestCounterTest.cs b/KancolleSniffer.Test/QuestCounterTest.cs index 876b749..015c85e 100644 --- a/KancolleSniffer.Test/QuestCounterTest.cs +++ b/KancolleSniffer.Test/QuestCounterTest.cs @@ -251,6 +251,18 @@ namespace KancolleSniffer.Test return new ShipStatus {NowHp = 1, Spec = new ShipSpec {Id = specId, ShipType = shipType}}; } + private ShipStatus ShipStatus(int shipType, int shipClass, int specId) + { + return new ShipStatus + {NowHp = 1, Spec = new ShipSpec {Id = specId, ShipType = shipType, ShipClass = shipClass}}; + } + + private ShipStatus ShipStatus(string name) + { + return new ShipStatus {NowHp = 1, Spec = new ShipSpec {Name = name}}; + } + + private BattleInfo _battleInfo; private ItemInfo _itemInfo; private QuestInfo _questInfo; @@ -411,8 +423,8 @@ namespace KancolleSniffer.Test _battleInfo.InjectResultStatus(new[] { - ShipStatus(5, 319), ShipStatus(5, 192), ShipStatus(5, 194), - ShipStatus(5, 193), ShipStatus(6, 189), ShipStatus(6, 188) + ShipStatus("妙高改二"), ShipStatus("那智改二"), ShipStatus("羽黒改二"), + ShipStatus("足柄改二"), ShipStatus("筑摩改二"), ShipStatus("利根改二") }, new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]); InjectMapNext(25, 4); @@ -424,11 +436,14 @@ namespace KancolleSniffer.Test Assert.AreEqual(0, count.Now); InjectBattleResult("S"); Assert.AreEqual(1, count.Now); - _questInfo.Quests[0].Count.Now = 0; + + _battleInfo.Result.Friend.Main[3].NowHp = 0; + InjectBattleResult("S"); + Assert.AreEqual(2, count.Now, "足柄改二轟沈"); _battleInfo.Result.Friend.Main[1].NowHp = 0; InjectBattleResult("S"); - Assert.AreEqual(0, count.Now, "那智改二轟沈"); + Assert.AreEqual(2, count.Now, "那智改二轟沈"); } /// @@ -476,9 +491,6 @@ namespace KancolleSniffer.Test Assert.AreEqual(0, count.Now, "駆逐軽巡以外"); } - private ShipStatus ShipStatus(int shipType, int shipClass, int specId) => - new ShipStatus {NowHp = 1, Spec = new ShipSpec {Id = specId, ShipType = shipType, ShipClass = shipClass}}; - /// /// 257: 「水上打撃部隊」南方へ! /// @@ -870,8 +882,8 @@ namespace KancolleSniffer.Test _battleInfo.InjectResultStatus(new[] { - ShipStatus(2, 543), ShipStatus(8, 360), ShipStatus(11, 545), - ShipStatus(18, 467), ShipStatus(11, 261), ShipStatus(2, 344) + ShipStatus("長波改二"), ShipStatus("Iowa改"), ShipStatus("Saratoga Mk.II"), + ShipStatus("瑞鶴改二甲"), ShipStatus("望月改"), ShipStatus("朝霜改") }, new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]); InjectMapNext(54, 4); @@ -889,18 +901,18 @@ namespace KancolleSniffer.Test Assert.AreEqual(1, count.Now, "朝霜改轟沈"); _battleInfo.Result.Friend.Main[5].NowHp = 1; - _battleInfo.Result.Friend.Main[0].Spec.Id = 345; + _battleInfo.Result.Friend.Main[0] = ShipStatus("高波改"); InjectBattleResult("S"); Assert.AreEqual(1, count.Now, "長波改二なし"); - _battleInfo.Result.Friend.Main[0].Spec.Id = 543; + _battleInfo.Result.Friend.Main[0] = ShipStatus("長波改二"); - _battleInfo.Result.Friend.Main[5].Spec.Id = 345; + _battleInfo.Result.Friend.Main[5] = ShipStatus("高波改"); InjectBattleResult("S"); Assert.AreEqual(2, count.Now, "高波改"); - _battleInfo.Result.Friend.Main[5].Spec.Id = 359; + _battleInfo.Result.Friend.Main[5] = ShipStatus("沖波改"); InjectBattleResult("S"); Assert.AreEqual(3, count.Now, "沖波改"); - _battleInfo.Result.Friend.Main[5].Spec.Id = 578; + _battleInfo.Result.Friend.Main[5] = ShipStatus("朝霜改二"); InjectBattleResult("S"); Assert.AreEqual(4, count.Now, "朝霜改二"); } @@ -915,8 +927,8 @@ namespace KancolleSniffer.Test _battleInfo.InjectResultStatus(new[] { - ShipStatus(5, 427), ShipStatus(5, 264), ShipStatus(5, 142), - ShipStatus(5, 417), ShipStatus(2, 144), ShipStatus(2, 195) + ShipStatus("鳥海改二"), ShipStatus("青葉改"), ShipStatus("衣笠改二"), + ShipStatus("加古改二"), ShipStatus("夕立改二"), ShipStatus("綾波改二") }, new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]); InjectMapNext(51, 4); @@ -933,11 +945,11 @@ namespace KancolleSniffer.Test PAssert.That(() => count.NowArray.SequenceEqual(new[] {1, 0, 0}), "轟沈あり"); _battleInfo.Result.Friend.Main[0].NowHp = 1; - _battleInfo.Result.Friend.Main[0].Spec.Id = 319; + _battleInfo.Result.Friend.Main[0] = ShipStatus("妙高改二"); InjectBattleResult("S"); PAssert.That(() => count.NowArray.SequenceEqual(new[] {1, 0, 0}), "三川艦隊3隻"); - _battleInfo.Result.Friend.Main[0].Spec.Id = 427; + _battleInfo.Result.Friend.Main[0] = ShipStatus("夕張改二特"); InjectMapNext(53, 5); InjectBattleResult("S"); PAssert.That(() => count.NowArray.SequenceEqual(new[] {1, 1, 0})); @@ -1169,18 +1181,18 @@ namespace KancolleSniffer.Test _battleInfo.InjectResultStatus(new [] { - ShipStatus(2, 48), ShipStatus(2, 49), - ShipStatus(2, 17), ShipStatus(2, 18), - ShipStatus(2, 19) + ShipStatus("霰"), ShipStatus("霰"), + ShipStatus("陽炎"), ShipStatus("不知火"), + ShipStatus("黒潮") }, new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]); InjectPracticeResult("A"); Assert.AreEqual(0, count.Now, "A"); InjectPracticeResult("S"); Assert.AreEqual(1, count.Now); - _battleInfo.Result.Friend.Main[0] = ShipStatus(2, 47); + _battleInfo.Result.Friend.Main[0] = ShipStatus("涼風"); InjectPracticeResult("S"); Assert.AreEqual(1, count.Now, "霰→涼風"); - _battleInfo.Result.Friend.Main[4] = ShipStatus(2, 464); + _battleInfo.Result.Friend.Main[4] = ShipStatus("霞改二"); InjectPracticeResult("S"); Assert.AreEqual(2, count.Now, "黒潮→霞改二"); } diff --git a/KancolleSniffer/Model/QuestCounter.cs b/KancolleSniffer/Model/QuestCounter.cs index 2f7b0f5..cb4583b 100644 --- a/KancolleSniffer/Model/QuestCounter.cs +++ b/KancolleSniffer/Model/QuestCounter.cs @@ -143,23 +143,43 @@ namespace KancolleSniffer.Model private class ResultShipSpecs { + public ShipSpec[] Specs { get; } + public NameChecker Names { get; } + public int[] Types { get; } + public int[] Classes { get; } + public ShipSpec Flagship { get; } + public int FlagshipType { get; } + + public class NameChecker + { + private readonly string[] _names; + + public NameChecker(ShipSpec[] specs) + { + _names = specs.Select(spec => spec.Name).ToArray(); + } + + public bool Contains(string demand) + { + return _names.Any(name => name.StartsWith(demand)); + } + + public int Count(params string[] demands) + { + return demands.Sum(demand => _names.Count(name => name.StartsWith(demand))); + } + } + public ResultShipSpecs(BattleInfo battleInfo) { Specs = battleInfo.Result?.Friend.Main.Where(s => s.NowHp > 0).Select(ship => ship.Spec).ToArray() ?? new ShipSpec[0]; - Ids = Specs.Select(spec => spec.Id).ToArray(); + Names = new NameChecker(Specs); Types = Specs.Select(spec => spec.ShipType).ToArray(); Classes = Specs.Select(spec => spec.ShipClass).ToArray(); Flagship = Specs.FirstOrDefault(); FlagshipType = Types.FirstOrDefault(); } - - public ShipSpec[] Specs { get; } - public int[] Ids { get; } - public int[] Types { get; } - public int[] Classes { get; } - public ShipSpec Flagship { get; } - public int FlagshipType { get; } } public QuestCounter(QuestInfo questInfo, ItemInfo itemInfo, BattleInfo battleInfo) @@ -250,7 +270,7 @@ namespace KancolleSniffer.Model switch (id) { case 249: - return specs.Ids.Intersect(new[] {62, 63, 64, 265, 266, 268, 319, 192, 194}).Count() == 3; + return specs.Names.Count("妙高", "那智", "羽黒") == 3; case 257: return specs.FlagshipType == 3 && specs.Types.Count(s => s == 3) <= 3 && specs.Types.All(s => s == 2 || s == 3); @@ -277,25 +297,10 @@ namespace KancolleSniffer.Model case 873: return specs.Types.Count(type => type == 3) >= 1; case 875: - return specs.Ids.Contains(543) && - specs.Ids.Intersect(new[] - { - 344, // 朝霜改 - 345, // 高波改 - 359, // 沖波改 - 578 // 朝霜改二 - }).Any(); + return specs.Names.Contains("長波改二") && + specs.Names.Count("朝霜改", "高波改", "沖波改") > 0; case 888: - return specs.Ids.Intersect(new[] - { - 69, 272, 427, // 鳥海 - 61, 264, // 青葉 - 123, 295, 142, // 衣笠 - 59, 262, 416, // 古鷹 - 60, 263, 417, // 加古 - 51, 213, 477, // 天龍 - 115, 293 // 夕張 - }).Count() >= 4; + return specs.Names.Count("鳥海", "青葉", "衣笠", "加古", "天竜", "夕張") >= 4; case 894: return specs.Specs.Any(spec => spec.IsAircraftCarrier); case 318: @@ -305,13 +310,7 @@ namespace KancolleSniffer.Model specs.Specs.Count(spec => spec.IsAircraftCarrier) >= 2 && specs.Types.Count(type => type == 2) >= 2; case 337: - return specs.Ids.Intersect(new[] - { - 17, 225, 566, // 陽炎 - 18, 226, 567, // 不知火 - 48, 198, 252, // 霰 - 49, 253, 464 // 霞 - }).Count() == 4; + return specs.Names.Count("陽炎", "不知火", "霰", "霞") == 4; default: return true; }