}\r
\r
/// <summary>\r
+ /// 904: 精鋭「十九駆」、躍り出る!\r
+ /// </summary>\r
+ [TestMethod]\r
+ public void BattleResult_904()\r
+ {\r
+ var count = InjectQuest(904);\r
+ _battleInfo.InjectResultStatus(\r
+ new []{ShipStatus("綾波改二"), ShipStatus("敷波")},\r
+ new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]);\r
+\r
+ InjectMapNext(25, 5);\r
+ InjectBattleResult("S");\r
+ PAssert.That(() => count.NowArray.SequenceEqual(new[] {0, 0, 0, 0}), "敷波はカウントしない");\r
+\r
+ _battleInfo.Result.Friend.Main[1] = ShipStatus("敷波改二");\r
+ InjectBattleResult("A");\r
+ PAssert.That(() => count.NowArray.SequenceEqual(new[] {0, 0, 0, 0}), "A勝利はカウントしない");\r
+\r
+ InjectBattleResult("S");\r
+ PAssert.That(() => count.NowArray.SequenceEqual(new[] {1, 0, 0, 0}), "2-5");\r
+\r
+ InjectMapNext(34, 4);\r
+ InjectBattleResult("S");\r
+ PAssert.That(() => count.NowArray.SequenceEqual(new[] {1, 0, 0, 0}), "ボス以外はカウントしない");\r
+\r
+ InjectMapNext(34, 5);\r
+ InjectBattleResult("S");\r
+ PAssert.That(() => count.NowArray.SequenceEqual(new[] {1, 1, 0, 0}), "3-4");\r
+\r
+ InjectMapNext(45, 5);\r
+ InjectBattleResult("S");\r
+ PAssert.That(() => count.NowArray.SequenceEqual(new[] {1, 1, 1, 0}), "4-5");\r
+\r
+ InjectMapNext(53, 5);\r
+ InjectBattleResult("S");\r
+ PAssert.That(() => count.NowArray.SequenceEqual(new[] {1, 1, 1, 1}), "5-3");\r
+ }\r
+\r
+ /// <summary>\r
/// 280と854以降を同時に遂行していると854以降がカウントされないことがある\r
/// </summary>\r
[TestMethod]\r
var queue = new Queue<DateTime>(new[]\r
{\r
new DateTime(2017, 11, 1, 5, 0, 0), new DateTime(2017, 11, 6, 5, 0, 0),\r
- new DateTime(2017, 12, 1, 5, 0, 0)\r
+ new DateTime(2017, 12, 1, 5, 0, 0), new DateTime(2018, 2, 1, 5, 0, 0)\r
});\r
var questInfo = new QuestInfo(() => queue.Dequeue());\r
var status = new Status\r
QuestCountList = new[]\r
{\r
new QuestCount {Id = 201, Now = 1}, new QuestCount {Id = 213, Now = 1},\r
- new QuestCount {Id = 265, Now = 1}, new QuestCount {Id = 822, Now = 1}\r
+ new QuestCount {Id = 265, Now = 1}, new QuestCount {Id = 822, Now = 1},\r
+ new QuestCount {Id = 904, NowArray = new[] {1, 1, 1, 1}}\r
},\r
QuestLastReset = new DateTime(2017, 10, 31, 5, 0, 0)\r
};\r
questInfo.InspectQuestList(CreateQuestList(new[] {201}));\r
questInfo.SaveState(status);\r
PAssert.That(() =>\r
- status.QuestCountList.Select(qc => new {qc.Id, qc.Now}).SequenceEqual(new[]\r
- {new {Id = 213, Now = 1}, new {Id = 822, Now = 1}})); // デイリーとマンスリーが消える\r
+ status.QuestCountList.Select(qc => qc.Id).SequenceEqual(new[] {213, 822, 904})); // デイリーとマンスリーが消える\r
questInfo.InspectQuestList(CreateQuestList(new[] {201}));\r
questInfo.SaveState(status);\r
- PAssert.That(() =>\r
- status.QuestCountList.Select(qc => new {qc.Id, qc.Now}).SequenceEqual(new[]\r
- {new {Id = 822, Now = 1}})); // ウィークリーが消える\r
+ PAssert.That(() => status.QuestCountList.Select(qc => qc.Id).SequenceEqual(new[] {822, 904})); // ウィークリーが消える\r
+ questInfo.InspectQuestList(CreateQuestList(new[] {201}));\r
+ questInfo.SaveState(status);\r
+ PAssert.That(() => status.QuestCountList.Select(qc => qc.Id).SequenceEqual(new[] {904})); // クォータリーが消える\r
questInfo.InspectQuestList(CreateQuestList(new[] {201}));\r
questInfo.SaveState(status);\r
- PAssert.That(() => status.QuestCountList.Length == 0); // ã\82¯ã\82©ã\83¼ã\82¿リーが消える\r
+ PAssert.That(() => status.QuestCountList.Length == 0); // ã\82¤ã\83¤ã\83¼リーが消える\r
}\r
\r
[TestMethod]\r
private const QuestInterval Weekly = QuestInterval.Weekly;\r
private const QuestInterval Monthly = QuestInterval.Monthly;\r
private const QuestInterval Quarterly = QuestInterval.Quarterly;\r
+ private const QuestInterval Yearly = QuestInterval.Yearly;\r
\r
/// <summary>\r
/// このテーブルは七四式電子観測儀を参考に作成した。\r
{888, new QuestSortie {Interval = Quarterly, MaxArray = new[] {1, 1, 1}, Rank = "S", Maps = new[] {51, 53, 54}, Material = new[] {0, 0, 0, 0}}}, // 888: 新編成「三川艦隊」、鉄底海峡に突入せよ!\r
{893, new QuestSortie {Interval = Quarterly, MaxArray = new[] {3, 3, 3, 3}, Rank = "S", Maps = new[] {15, 71, 721, 722}, Material = new[] {0, 0, 0, 0}}}, // 893: 泊地周辺海域の安全確保を徹底せよ!\r
{894, new QuestSortie {Interval = Quarterly, MaxArray = new[] {1, 1, 1, 1, 1}, Rank = "S", Maps = new[] {13, 14, 21, 22, 23}, Material = new[] {0, 0, 0, 0}}}, // 894: 空母戦力の投入による兵站線戦闘哨戒\r
+ {904, new QuestSortie {Interval = Yearly, MaxArray = new[] {1, 1, 1, 1}, Rank = "S", Maps = new[] {25, 34, 45, 53}, Material = new[] {0, 8, 10, 4}}}, // 904: 精鋭「十九駆」、躍り出る!\r
\r
{303, new QuestPractice {Interval = Daily, Max = 3, Rank = "E", Material = new[] {1, 0, 0, 0}}}, // 303: 「演習」で練度向上!\r
{304, new QuestPractice {Interval = Daily, Max = 5, Rank = "B", Material = new[] {0, 0, 1, 0}}}, // 304: 「演習」で他提督を圧倒せよ!\r
return specs.Names.Count("陽炎", "不知火", "霰", "霞") == 4;\r
case 339:\r
return specs.Names.Count("磯波", "浦波", "綾波", "敷波") == 4;\r
+ case 904:\r
+ return specs.Names.Count("綾波改二", "敷波改二") == 2;\r
default:\r
return true;\r
}\r
Daily,\r
Weekly,\r
Monthly,\r
- Quarterly\r
+ Quarterly,\r
+ Yearly\r
}\r
\r
public class QuestInfo : IHaveState\r
private readonly QuestInterval[] _intervals =\r
{\r
QuestInterval.Daily, QuestInterval.Weekly, QuestInterval.Monthly,\r
- QuestInterval.Other, QuestInterval.Quarterly\r
+ QuestInterval.Other, QuestInterval.Quarterly, QuestInterval.Yearly\r
};\r
\r
private readonly int[] _progress = {0, 50, 80};\r
private void ResetQuests()\r
{\r
_now = _nowFunc();\r
- if (!CrossBoundary(LastMorning))\r
+ if (!CrossBoundary(QuestInterval.Daily))\r
return;\r
- RemoveQuest(QuestInterval.Daily);\r
- _countList.Remove(QuestInterval.Daily);\r
- ResetWeekly();\r
- ResetMonthly();\r
- ResetQuarterly();\r
+ foreach (var interval in (QuestInterval[])typeof(QuestInterval).GetEnumValues())\r
+ {\r
+ if (!CrossBoundary(interval))\r
+ continue;\r
+ RemoveQuest(interval);\r
+ _countList.Remove(interval);\r
+ }\r
_lastReset = _now;\r
NeedSave = true;\r
}\r
\r
private DateTime LastMorning => _now.Date.AddDays(_now.Hour < 5 ? -1 : 0).AddHours(5);\r
\r
- private void ResetWeekly()\r
+ private bool CrossBoundary(QuestInterval interval)\r
{\r
- if (!CrossBoundary(LastMonday.AddHours(5)))\r
- return;\r
- RemoveQuest(QuestInterval.Weekly);\r
- _countList.Remove(QuestInterval.Weekly);\r
+ return interval switch\r
+ {\r
+ QuestInterval.Other => false,\r
+ QuestInterval.Daily => CrossBoundary(LastMorning),\r
+ QuestInterval.Weekly => CrossBoundary(LastMonday.AddHours(5)),\r
+ QuestInterval.Monthly => CrossBoundary(new DateTime(_now.Year, _now.Month, 1, 5, 0, 0)),\r
+ QuestInterval.Quarterly => CrossBoundary(QuarterlyBoundary.AddHours(5)),\r
+ QuestInterval.Yearly => CrossBoundary(new DateTime(_now.Year, 2, 1, 5, 0, 0)),\r
+ _ => false\r
+ };\r
}\r
\r
private DateTime LastMonday => _now.Date.AddDays(-((6 + (int)_now.DayOfWeek) % 7));\r
\r
- private void ResetMonthly()\r
- {\r
- if (!CrossBoundary(new DateTime(_now.Year, _now.Month, 1, 5, 0, 0)))\r
- return;\r
- RemoveQuest(QuestInterval.Monthly);\r
- _countList.Remove(QuestInterval.Monthly);\r
- }\r
-\r
- private void ResetQuarterly()\r
- {\r
- if (!CrossBoundary(QuarterlyBoundary.AddHours(5)))\r
- return;\r
- RemoveQuest(QuestInterval.Quarterly);\r
- _countList.Remove(QuestInterval.Quarterly);\r
- }\r
-\r
private DateTime QuarterlyBoundary =>\r
_now.Month / 3 == 0\r
? new DateTime(_now.Year - 1, 12, 1)\r
{\r
foreach (var id in\r
(from kv in _quests\r
- where kv.Value.Count.Spec.Interval == interval || // 輸送5と空母3はカウンタを見ないとデイリーにならない\r
- kv.Value.Interval == interval\r
+ where MatchInterval(kv.Value, interval)\r
select kv.Key).ToArray())\r
_quests.Remove(id);\r
}\r
\r
+ private bool MatchInterval(QuestStatus quest, QuestInterval interval)\r
+ {\r
+ var i = quest.Count.Spec.Interval;\r
+ return i == QuestInterval.Other // 定期任務の定義がない\r
+ ? quest.Interval == interval\r
+ : i == interval;\r
+ }\r
+\r
public void InspectStop(string request)\r
{\r
var values = HttpUtility.ParseQueryString(request);\r
}\r
}\r
}\r
-\r
}
\ No newline at end of file