From ff82d290e0bc44b555f254a0ead764219615a179 Mon Sep 17 00:00:00 2001 From: Paul Campbell Date: Thu, 28 Nov 2024 09:37:20 -0500 Subject: [PATCH] event quest: Implement Christmas seasonal event quest Implemented the 2018 Christmas quests. --- .../QuestGetCycleContentsStateListHandler.cs | 1 + ...UnisonAreaChangeBeginRecruitmentHandler.cs | 3 - .../Quests/GenericQuest.cs | 9 +- Arrowgene.Ddon.GameServer/Quests/Quest.cs | 8 + .../AssetReader/QuestAssetDeserializer.cs | 6 + .../Files/Assets/EventDrops.json | 10 + .../Files/Assets/quests/q20085004.json | 8 +- .../Files/Assets/quests/q21014012.json | 56 +++--- .../Files/Assets/quests/q21017014.json | 36 ++-- .../Files/Assets/quests/q60200022.json | 22 +++ .../Files/Assets/quests/q60301055.json | 177 +++++++++++++++++ .../Files/Assets/quests/q60301056.json | 182 ++++++++++++++++++ .../Files/Assets/quests/q60301057.json | 46 +++++ .../Model/Quest/QuestNpcOrder.cs | 1 + docs/quests/holiday_personal_quests.md | 33 +++- 15 files changed, 541 insertions(+), 57 deletions(-) create mode 100644 Arrowgene.Ddon.Shared/Files/Assets/quests/q60200022.json create mode 100644 Arrowgene.Ddon.Shared/Files/Assets/quests/q60301055.json create mode 100644 Arrowgene.Ddon.Shared/Files/Assets/quests/q60301056.json create mode 100644 Arrowgene.Ddon.Shared/Files/Assets/quests/q60301057.json diff --git a/Arrowgene.Ddon.GameServer/Handler/QuestGetCycleContentsStateListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/QuestGetCycleContentsStateListHandler.cs index 45a3c99a4..9e39b79bd 100644 --- a/Arrowgene.Ddon.GameServer/Handler/QuestGetCycleContentsStateListHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/QuestGetCycleContentsStateListHandler.cs @@ -1,5 +1,6 @@ using Arrowgene.Ddon.GameServer.Characters; using Arrowgene.Ddon.GameServer.Dump; +using Arrowgene.Ddon.GameServer.Quests; using Arrowgene.Ddon.Server; using Arrowgene.Ddon.Shared.Entity; using Arrowgene.Ddon.Shared.Entity.PacketStructure; diff --git a/Arrowgene.Ddon.GameServer/Handler/StageUnisonAreaChangeBeginRecruitmentHandler.cs b/Arrowgene.Ddon.GameServer/Handler/StageUnisonAreaChangeBeginRecruitmentHandler.cs index 14fde8495..b36c0bc5c 100644 --- a/Arrowgene.Ddon.GameServer/Handler/StageUnisonAreaChangeBeginRecruitmentHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/StageUnisonAreaChangeBeginRecruitmentHandler.cs @@ -1,10 +1,7 @@ using Arrowgene.Ddon.GameServer.Characters; using Arrowgene.Ddon.Server; using Arrowgene.Ddon.Shared.Entity.PacketStructure; -using Arrowgene.Ddon.Shared.Entity.Structure; -using Arrowgene.Ddon.Shared.Model.EpitaphRoad; using Arrowgene.Logging; -using System.IO; namespace Arrowgene.Ddon.GameServer.Handler { diff --git a/Arrowgene.Ddon.GameServer/Quests/GenericQuest.cs b/Arrowgene.Ddon.GameServer/Quests/GenericQuest.cs index 917bfddcf..a6c3af249 100644 --- a/Arrowgene.Ddon.GameServer/Quests/GenericQuest.cs +++ b/Arrowgene.Ddon.GameServer/Quests/GenericQuest.cs @@ -365,11 +365,12 @@ private static CDataQuestProcessState BlockAsCDataQuestProcessState(GenericQuest break; case QuestBlockType.NewNpcTalkAndOrder: { + var questId = (questBlock.NpcOrderDetails[0].QuestId == QuestId.None) ? quest.QuestId : questBlock.NpcOrderDetails[0].QuestId; checkCommands.Add(QuestManager.CheckCommand.QuestNpcTalkAndOrderUi( StageManager.ConvertIdToStageNo(questBlock.NpcOrderDetails[0].StageId), (int)questBlock.NpcOrderDetails[0].StageId.GroupId, questBlock.NpcOrderDetails[0].StageId.LayerNo, - (int)quest.QuestId)); + (int) questId)); resultCommands.Add(QuestManager.ResultCommand.QstTalkChg(questBlock.NpcOrderDetails[0].NpcId, questBlock.NpcOrderDetails[0].MsgId)); } break; @@ -544,9 +545,11 @@ private static CDataQuestProcessState BlockAsCDataQuestProcessState(GenericQuest case QuestBlockType.NewTalkToNpc: { var orderDetails = questBlock.NpcOrderDetails[0]; + var questId = (orderDetails.QuestId == QuestId.None) ? quest.QuestId : orderDetails.QuestId; + var questCommand = questBlock.ShowMarker ? - QuestManager.CheckCommand.NewTalkNpc(StageManager.ConvertIdToStageNo(orderDetails.StageId), (int)orderDetails.StageId.GroupId, orderDetails.StageId.LayerNo, (int)quest.QuestId) : - QuestManager.CheckCommand.NewTalkNpcWithoutMarker(StageManager.ConvertIdToStageNo(orderDetails.StageId), (int)orderDetails.StageId.GroupId, orderDetails.StageId.LayerNo, (int)quest.QuestId); + QuestManager.CheckCommand.NewTalkNpc(StageManager.ConvertIdToStageNo(orderDetails.StageId), (int)orderDetails.StageId.GroupId, orderDetails.StageId.LayerNo, (int)questId) : + QuestManager.CheckCommand.NewTalkNpcWithoutMarker(StageManager.ConvertIdToStageNo(orderDetails.StageId), (int)orderDetails.StageId.GroupId, orderDetails.StageId.LayerNo, (int)questId); checkCommands.Add(questCommand); resultCommands.Add(QuestManager.ResultCommand.QstTalkChg(orderDetails.NpcId, orderDetails.MsgId)); } diff --git a/Arrowgene.Ddon.GameServer/Quests/Quest.cs b/Arrowgene.Ddon.GameServer/Quests/Quest.cs index a8713e99e..25f4a70e4 100644 --- a/Arrowgene.Ddon.GameServer/Quests/Quest.cs +++ b/Arrowgene.Ddon.GameServer/Quests/Quest.cs @@ -380,6 +380,14 @@ public virtual CDataTutorialQuestList ToCDataTutorialQuestList(uint step, bool e }; } + public virtual CDataTimeLimitedQuestOrderList ToCDataTimeLimitedQuestOrderList(uint step) + { + return new CDataTimeLimitedQuestOrderList() + { + Param = ToCDataQuestOrderList(step) + }; + } + public virtual CDataPriorityQuest ToCDataPriorityQuest(uint step) { var questProcessStateList = GetProcessState(step, out uint announceNoCount); diff --git a/Arrowgene.Ddon.Shared/AssetReader/QuestAssetDeserializer.cs b/Arrowgene.Ddon.Shared/AssetReader/QuestAssetDeserializer.cs index 15f117906..ed18ca899 100644 --- a/Arrowgene.Ddon.Shared/AssetReader/QuestAssetDeserializer.cs +++ b/Arrowgene.Ddon.Shared/AssetReader/QuestAssetDeserializer.cs @@ -614,6 +614,12 @@ private bool ParseBlocks(QuestProcess questProcess, JsonElement jBlocks) MsgId = jblock.GetProperty("message_id").GetInt32(), StageId = AssetCommonDeserializer.ParseStageId(jblock.GetProperty("stage_id")) }); + + questBlock.NpcOrderDetails[0].QuestId = QuestId.None; + if (jblock.TryGetProperty("quest_id", out JsonElement jOrderQuestId)) + { + questBlock.NpcOrderDetails[0].QuestId = (QuestId)jOrderQuestId.GetUInt32(); + } } break; case QuestBlockType.IsQuestOrdered: diff --git a/Arrowgene.Ddon.Shared/Files/Assets/EventDrops.json b/Arrowgene.Ddon.Shared/Files/Assets/EventDrops.json index ec79005d2..67f7d90e5 100644 --- a/Arrowgene.Ddon.Shared/Files/Assets/EventDrops.json +++ b/Arrowgene.Ddon.Shared/Files/Assets/EventDrops.json @@ -102,6 +102,16 @@ "item_ids": [23395, 23396, 23397] } } + }, + { + "item_id": 23548, + "comment": "Sparkling Snow Large Crystal (Christmas 2018)", + "min_num": 1, + "max_num": 1, + "drop_chance": 0.10, + "quest_ids": [60301057], + "stage_ids": [], + "enemy_ids": [] } ] diff --git a/Arrowgene.Ddon.Shared/Files/Assets/quests/q20085004.json b/Arrowgene.Ddon.Shared/Files/Assets/quests/q20085004.json index 5ce8eea46..96d037883 100644 --- a/Arrowgene.Ddon.Shared/Files/Assets/quests/q20085004.json +++ b/Arrowgene.Ddon.Shared/Files/Assets/quests/q20085004.json @@ -6,7 +6,7 @@ "base_level": 47, "minimum_item_rank": 0, "discoverable": true, - "area_id": "EasternZandora", + "area_id": "EasternZandora", "rewards": [ { "type": "wallet", @@ -35,7 +35,7 @@ }, { "item_id": 9363, - "num": 3 + "num": 3 } ] }, @@ -61,7 +61,7 @@ "enemy_id": "0x015103", "level": 48, "exp": 13000, - "is_boss": true + "is_boss": true } ] } @@ -92,7 +92,7 @@ "stage_id": { "id": 1, "group_id": 1, - "layer_no": 1 + "layer_no": 1 }, "announce_type": "Update", "npc_id": "Rick", diff --git a/Arrowgene.Ddon.Shared/Files/Assets/quests/q21014012.json b/Arrowgene.Ddon.Shared/Files/Assets/quests/q21014012.json index 2b1215a43..80432e5cb 100644 --- a/Arrowgene.Ddon.Shared/Files/Assets/quests/q21014012.json +++ b/Arrowgene.Ddon.Shared/Files/Assets/quests/q21014012.json @@ -6,7 +6,7 @@ "base_level": 75, "minimum_item_rank": 0, "discoverable": true, - "area_id": "ElanWaterGrove", + "area_id": "ElanWaterGrove", "rewards": [ { "type": "wallet", @@ -29,13 +29,13 @@ "item_id": 13483, "num": 3 }, - { + { "item_id": 15962, "num": 3 }, - { + { "item_id": 7555, - "num": 3 + "num": 3 } ] } @@ -60,30 +60,30 @@ { "enemy_id": "0x015504", "level": 75, - "exp": 5000 + "exp": 5000 } ] } - ], + ], "blocks": [ - { - "type": "NpcTalkAndOrder", + { + "type": "NpcTalkAndOrder", "flags": [ - {"type": "QstLayout", "action": "Set", "value": 4474, "comment": "Spawns Sullivan NPC"} - ], - "stage_id": { - "id": 372, - "group_id": 1, - "layer_no": 1 - }, - "npc_id": "561", - "message_id": 10800 + {"type": "QstLayout", "action": "Set", "value": 4474, "comment": "Spawns Sullivan NPC"} + ], + "stage_id": { + "id": 372, + "group_id": 1, + "layer_no": 1 + }, + "npc_id": "561", + "message_id": 10800 }, - { + { "type": "NewTalkToNpc", "flags": [ - {"type": "QstLayout", "action": "Set", "value": 4471, "comment": "Spawns Glenis NPC"} - ], + {"type": "QstLayout", "action": "Set", "value": 4471, "comment": "Spawns Glenis NPC"} + ], "stage_id": { "id": 416, "group_id": 1, @@ -91,9 +91,9 @@ }, "announce_type": "Accept", "npc_id": "562", - "message_id": 11842 - }, - { + "message_id": 11842 + }, + { "type": "SeekOutEnemiesAtMarkedLocation", "announce_type": "Update", "groups": [0] @@ -103,7 +103,7 @@ "announce_type": "Update", "groups": [0] }, - { + { "type": "TalkToNpc", "stage_id": { "id": 372, @@ -112,7 +112,7 @@ }, "announce_type": "Update", "npc_id": "561", - "message_id": 11842 - } - ] -} \ No newline at end of file + "message_id": 11842 + } + ] +} diff --git a/Arrowgene.Ddon.Shared/Files/Assets/quests/q21017014.json b/Arrowgene.Ddon.Shared/Files/Assets/quests/q21017014.json index 1d259ae58..367ed3ea9 100644 --- a/Arrowgene.Ddon.Shared/Files/Assets/quests/q21017014.json +++ b/Arrowgene.Ddon.Shared/Files/Assets/quests/q21017014.json @@ -6,7 +6,7 @@ "base_level": 73, "minimum_item_rank": 0, "discoverable": true, - "area_id": "KingalCanyon", + "area_id": "KingalCanyon", "rewards": [ { "type": "wallet", @@ -29,13 +29,13 @@ "item_id": 15923, "num": 3 }, - { + { "item_id": 7555, "num": 3 }, - { + { "item_id": 9364, - "num": 3 + "num": 3 } ] } @@ -51,7 +51,7 @@ "enemy_id": "0x010313", "level": 73, "exp": 3500, - "is_boss": false + "is_boss": false }, { "enemy_id": "0x010313", @@ -87,27 +87,27 @@ "enemy_id": "0x010607", "level": 73, "exp": 3500, - "is_boss": false + "is_boss": false } ] } - ], - "blocks": [ + ], + "blocks": [ { - "type": "NpcTalkAndOrder", + "type": "NpcTalkAndOrder", "stage_id": { "id": 377, "group_id": 1, "layer_no": 1 - }, + }, "npc_id": "Maeve", "message_id": 10800 }, - { + { "type": "TalkToNpc", "flags": [ - {"type": "QstLayout", "action": "Set", "value": 4362, "comment": "Spawns Plum NPC"} - ], + {"type": "QstLayout", "action": "Set", "value": 4362, "comment": "Spawns Plum NPC"} + ], "stage_id": { "id": 429, "group_id": 1, @@ -117,7 +117,7 @@ "npc_id": "Plum1", "message_id": 11842 }, - { + { "type": "SeekOutEnemiesAtMarkedLocation", "announce_type": "Update", "groups": [0] @@ -125,9 +125,9 @@ { "type": "KillGroup", "announce_type": "Update", - "groups": [0] + "groups": [0] }, - { + { "type": "TalkToNpc", "stage_id": { "id": 377, @@ -136,7 +136,7 @@ }, "announce_type": "Update", "npc_id": "Maeve", - "message_id": 11842 + "message_id": 11842 } ] -} \ No newline at end of file +} diff --git a/Arrowgene.Ddon.Shared/Files/Assets/quests/q60200022.json b/Arrowgene.Ddon.Shared/Files/Assets/quests/q60200022.json new file mode 100644 index 000000000..c7e6d2a64 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Files/Assets/quests/q60200022.json @@ -0,0 +1,22 @@ +{ + "state_machine": "GenericStateMachine", + "type": "Tutorial", + "comment": "For Christmas event NPC set (2016)", + "quest_id": 60200022, + "next_quest": 0, + "base_level": 0, + "minimum_item_rank": 0, + "discoverable": false, + "stage_id": {"id": 2}, + "order_conditions": [], + "rewards": [], + "enabled": false, + "blocks": [ + { + "type": "Raw", + "flags": [ + {"type": "QstLayout", "action": "Set", "value": 5276, "comment": "Spawns Nicholas, Marco and Mia"} + ] + } + ] +} diff --git a/Arrowgene.Ddon.Shared/Files/Assets/quests/q60301055.json b/Arrowgene.Ddon.Shared/Files/Assets/quests/q60301055.json new file mode 100644 index 000000000..d203ff7b7 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Files/Assets/quests/q60301055.json @@ -0,0 +1,177 @@ +{ + "state_machine": "GenericStateMachine", + "type": "Tutorial", + "comment": "Merry Christmas with Smiles I (2018)", + "quest_id": 60301055, + "next_quest": 0, + "base_level": 10, + "minimum_item_rank": 0, + "discoverable": false, + "stage_id": {"id": 2}, + "order_conditions": [], + "rewards": [ + { + "type": "exp", + "amount": 1224 + }, + { + "type": "wallet", + "wallet_type": "Gold", + "amount": 1224 + }, + { + "type": "wallet", + "wallet_type": "RiftPoints", + "amount": 1224 + }, + { + "type": "fixed", + "loot_pool": [ + { + "item_id": 23548, + "num": 50 + }, + { + "item_id": 23460, + "num": 1 + } + ] + } + ], + "enabled": false, + "enemy_groups" : [ + { + "stage_id": { + "id": 1, + "group_id": 71 + }, + "starting_index": 10, + "enemies": [ + { + "comment": "Sapling (ent)", + "enemy_id": "0x015031", + "level": 10, + "exp": 9800, + "is_boss": true, + "named_enemy_params_id": 2621 + } + ] + } + ], + "blocks": [ + { + "type": "NewNpcTalkAndOrder", + "flags": [ + {"type": "QstLayout", "action": "Set", "value": 8245, "comment": "Spawns NPCs"} + ], + "stage_id": { + "id": 2, + "group_id": 1 + }, + "npc_id": "Nicholas", + "message_id": 30843 + }, + { + "type": "IsStageNo", + "stage_id": {"id": 2}, + "announce_type": "Accept", + "comment": "This step is supposed to be type 'Merry Christmas'" + }, + { + "type": "NewTalkToNpc", + "stage_id": { + "id": 2, + "group_id": 1 + }, + "announce_type": "Update", + "checkpoint": true, + "npc_id": "Nicholas", + "message_id": 30847 + }, + { + "type": "TalkToNpc", + "stage_id": { + "id": 2 + }, + "announce_type": "Update", + "checkpoint": true, + "npc_id": "Isaac", + "message_id": 30849 + }, + { + "type": "DiscoverEnemy", + "announce_type": "Update", + "checkpoint": true, + "groups": [0] + }, + { + "type": "KillGroup", + "announce_type": "Update", + "reset_group": false, + "groups": [0] + }, + { + "type": "OmInteractEvent", + "checkpoint": true, + "announce_type": "Update", + "quest_type": "MyQuest", + "interact_type": "Release", + "stage_id": { + "id": 1, + "group_id": 0, + "layer_no": 0 + }, + "flags": [ + {"type": "QstLayout", "action": "Set", "value": 8249, "comment": "Spawns item to collect"} + ] + }, + { + "type": "NewTalkToNpc", + "stage_id": { + "id": 2, + "group_id": 1 + }, + "flags": [ + {"type": "QstLayout", "action": "Clear", "value": 8249, "comment": "Spawns item to collect"} + ], + "announce_type": "Update", + "checkpoint": true, + "npc_id": "Nicholas", + "message_id": 30851 + }, + { + "type": "Raw", + "comment": "Check for snowflake (1)", + "announce_type": "Update", + "checkpoint": true, + "check_commands": [ + {"type": "HaveItemAllBag", "Param1": 23548, "Param2": 1} + ] + }, + { + "type": "NewTalkToNpc", + "stage_id": { + "id": 2, + "group_id": 1 + }, + "announce_type": "Update", + "checkpoint": true, + "npc_id": "Nicholas", + "message_id": 30853 + }, + { + "type": "NewDeliverItems", + "stage_id": { + "id": 2, + "group_id": 1 + }, + "npc_id": "Nicholas", + "checkpoint": true, + "announce_type": "Update", + "items": [ + {"id": 23548, "amount": 20} + ], + "message_id": 30857 + } + ] +} diff --git a/Arrowgene.Ddon.Shared/Files/Assets/quests/q60301056.json b/Arrowgene.Ddon.Shared/Files/Assets/quests/q60301056.json new file mode 100644 index 000000000..ccc0d3937 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Files/Assets/quests/q60301056.json @@ -0,0 +1,182 @@ +{ + "state_machine": "GenericStateMachine", + "type": "Tutorial", + "comment": "Merry Christmas with Smiles II (2018)", + "quest_id": 60301056, + "next_quest": 0, + "base_level": 10, + "minimum_item_rank": 0, + "discoverable": false, + "stage_id": {"id": 2}, + "order_conditions": [], + "rewards": [ + { + "type": "exp", + "amount": 1225 + }, + { + "type": "wallet", + "wallet_type": "Gold", + "amount": 1225 + }, + { + "type": "wallet", + "wallet_type": "RiftPoints", + "amount": 1225 + }, + { + "type": "fixed", + "loot_pool": [ + { + "item_id": 23548, + "num": 70 + }, + { + "item_id": 21718, + "num": 1 + } + ] + } + ], + "enabled": false, + "enemy_groups" : [ + { + "stage_id": { + "id": 1, + "group_id": 71 + }, + "starting_index": 7, + "enemies": [ + { + "comment": "Green Guardian", + "enemy_id": "0x010210", + "level": 10, + "exp": 980, + "named_enemy_params_id": 2657 + }, + { + "comment": "Green Guardian", + "enemy_id": "0x010210", + "level": 10, + "exp": 980, + "named_enemy_params_id": 2657 + }, + { + "comment": "Green Guardian", + "enemy_id": "0x010210", + "level": 10, + "exp": 980, + "named_enemy_params_id": 2657 + }, + { + "comment": "Angry Ent Chieftan", + "enemy_id": "0x015031", + "level": 10, + "exp": 9800, + "is_boss": true, + "named_enemy_params_id": 2622 + } + ] + } + ], + "blocks": [ + { + "type": "Raw", + "check_commands": [ + {"type": "IsTutorialQuestClear", "Param1": 60301055} + ] + }, + { + "type": "NewNpcTalkAndOrder", + "flags": [ + {"type": "QstLayout", "action": "Set", "value": 8246, "comment": "Spawns NPCs"} + ], + "stage_id": { + "id": 2, + "group_id": 1, + "layer_no": 2 + }, + "npc_id": "Mia", + "message_id": 30858 + }, + { + "type": "TalkToNpc", + "stage_id": { + "id": 2 + }, + "announce_type": "Accept", + "npc_id": "Cornelia0", + "message_id": 30860 + }, + { + "type": "TalkToNpc", + "stage_id": { + "id": 78 + }, + "announce_type": "Update", + "checkpoint": true, + "npc_id": "Alvar", + "message_id": 30862 + }, + { + "type": "DiscoverEnemy", + "announce_type": "Update", + "checkpoint": true, + "groups": [0] + }, + { + "type": "KillGroup", + "announce_type": "Update", + "reset_group": false, + "groups": [0] + }, + { + "type": "TalkToNpc", + "stage_id": { + "id": 78 + }, + "announce_type": "Update", + "checkpoint": true, + "npc_id": "Alvar", + "message_id": 30864 + }, + { + "type": "NewTalkToNpc", + "announce_type": "Update", + "checkpoint": true, + "stage_id": { + "id": 2, + "group_id": 1, + "layer_no": 2 + }, + "npc_id": "Mia", + "message_id": 30866 + }, + { + "type": "NewTalkToNpc", + "announce_type": "Update", + "checkpoint": true, + "stage_id": { + "id": 2, + "group_id": 1, + "layer_no": 1 + }, + "npc_id": "Marco", + "message_id": 30867 + }, + { + "type": "NewTalkToNpc", + "announce_type": "Update", + "checkpoint": true, + "stage_id": { + "id": 2, + "group_id": 1, + "layer_no": 0 + }, + "announce_type": "Update", + "checkpoint": true, + "npc_id": "Nicholas", + "message_id": 30868 + } + ] +} diff --git a/Arrowgene.Ddon.Shared/Files/Assets/quests/q60301057.json b/Arrowgene.Ddon.Shared/Files/Assets/quests/q60301057.json new file mode 100644 index 000000000..a39986e2e --- /dev/null +++ b/Arrowgene.Ddon.Shared/Files/Assets/quests/q60301057.json @@ -0,0 +1,46 @@ +{ + "state_machine": "GenericStateMachine", + "type": "Tutorial", + "comment": "For Christmas event NPC set (2018)", + "quest_id": 60301057, + "next_quest": 0, + "base_level": 0, + "minimum_item_rank": 0, + "discoverable": false, + "stage_id": {"id": 2}, + "order_conditions": [], + "rewards": [], + "enabled": false, + "blocks": [ + { + "type": "Raw", + "check_commands": [ + {"type": "IsTutorialQuestClear", "Param1": 60301055} + ] + }, + { + "type": "Raw", + "check_commands": [ + {"type": "IsTutorialQuestClear", "Param1": 60301056} + ], + "flags": [ + {"type": "QstLayout", "action": "Set", "value": 8296, "comment": "Clan Base Christmas Tree"} + ] + }, + { + "type": "Raw", + "flags": [ + {"type": "QstLayout", "action": "Set", "value": 8296, "comment": "Clan Base Christmas Tree"}, + {"type": "QstLayout", "action": "Set", "value": 8229, "comment": "Spawns Nicholas, Marco and Mia and decorations"} + ] + }, + { + "type": "ReturnCheckPoint", + "check_commands": [ + {"type": "DummyNotProgress"} + ], + "process_no": 0, + "block_no": 1 + } + ] +} diff --git a/Arrowgene.Ddon.Shared/Model/Quest/QuestNpcOrder.cs b/Arrowgene.Ddon.Shared/Model/Quest/QuestNpcOrder.cs index 1b1871f22..c6e84ba8c 100644 --- a/Arrowgene.Ddon.Shared/Model/Quest/QuestNpcOrder.cs +++ b/Arrowgene.Ddon.Shared/Model/Quest/QuestNpcOrder.cs @@ -11,6 +11,7 @@ public class QuestNpcOrder public NpcId NpcId { get; set; } public int MsgId { get; set; } public StageId StageId { get; set; } + public QuestId QuestId { get; set; } public QuestNpcOrder() { diff --git a/docs/quests/holiday_personal_quests.md b/docs/quests/holiday_personal_quests.md index b5b2f579c..de5b63637 100644 --- a/docs/quests/holiday_personal_quests.md +++ b/docs/quests/holiday_personal_quests.md @@ -22,13 +22,44 @@ https://moreali523425.com/2018/10/02/post-5695/ - Emergency! Not Enough Candy! (1) (q60301052) - Emergency! Not Enough Candy! (2) (q60301053) - To enable the Halloween 2018 Event - Modify the quest files q60301052, q60301053 and q60301054 enabled field to be `true`. To enable the Halloween 2017 Event - Modify the quest files 60301000 and 60301001 enabled field to be `true`. +## Christmas + +- Path to Miracles (2016) + - Path to Miracles I (q60200017) + - Path to Miracles II (q60200018) + - Path to Miracles III (q60200019) +- With Great Desire to Gift (2016) + - With Great Desire to Gift: Upper (q60200020) + - With Great Desire to Gift: Lower (q60200021) +- Christmas NPCs and Decorations 2016 (q60200022) + +- Wish on a Shooting Star (2017) + - Wish on a Shooting Star I (q60301002) + - Wish on a Shooting Star II (q60301003) + - Wish on a Shooting Star III (q60301004) + - Wish on a Shooting Star IV (q60301005) +- Christmas NPCs and Decorations 2017 (q60301006) + +- Merry Christmas with Smiles (2018) + - Merry Christmas with Smiles I (q60301055) + - Merry Christmas with Smiles II (q60301056) +- Christmas NPCs and Decorations 2018 (q60301057) + +To enable the Christmas 2016 Event +- Set the enabled field to `true` in q60200017, q60200018, q60200019, q60200020, q60200021 and q60200022. + +To enable the Christmas 2017 Event +- Set the enabled field to `true` in q60301002, q60301003, q60301004, q60301005 and q60301006. + +To enable the Christmas 2018 Event +- Set the enabled field to `true` in q60301055, q60301056 and q60301057. + ## Valentines Day/White Day - quest\q60340004\quest\60340004\q60340004_st0200.qst.json (Angelo and Shelly in)