diff --git a/src/Controllers/Common/AchievementController.cs b/src/Controllers/Common/AchievementController.cs index 268fee4..673ae34 100644 --- a/src/Controllers/Common/AchievementController.cs +++ b/src/Controllers/Common/AchievementController.cs @@ -119,6 +119,22 @@ public class AchievementController : Controller { return null; } + [HttpPost] + [Produces("application/xml")] + [Route("AchievementWebService.asmx/GetUserAchievements")] // used by Magic & Mythies + [VikingSession] + public IActionResult GetUserAchievements(Viking viking) { + ArrayOfUserAchievementInfo arrAchievements = new ArrayOfUserAchievementInfo { + UserAchievementInfo = new UserAchievementInfo[]{ + achievementService.CreateUserAchievementInfo(viking, AchievementPointTypes.PlayerXP), + achievementService.CreateUserAchievementInfo(viking.Id, 60000, AchievementPointTypes.PlayerFarmingXP), // TODO: placeholder until there is no leveling for farm XP + achievementService.CreateUserAchievementInfo(viking.Id, 20000, AchievementPointTypes.PlayerFishingXP), // TODO: placeholder until there is no leveling for fishing XP + } + }; + + return Ok(arrAchievements); + } + [HttpPost] [Produces("application/xml")] [Route("AchievementWebService.asmx/SetAchievementAndGetReward")] diff --git a/src/Controllers/Common/AuthenticationController.cs b/src/Controllers/Common/AuthenticationController.cs index 0f78616..32cd18c 100644 --- a/src/Controllers/Common/AuthenticationController.cs +++ b/src/Controllers/Common/AuthenticationController.cs @@ -86,7 +86,7 @@ public class AuthenticationController : Controller { [HttpPost] [Produces("application/xml")] [Route("AuthenticationWebService.asmx/GetUserInfoByApiToken")] - public IActionResult GetUserInfoByApiToken([FromForm] string apiToken) { + public IActionResult GetUserInfoByApiToken([FromForm] string apiToken, [FromForm] string apiKey) { // First check if this is a user session User? user = ctx.Sessions.FirstOrDefault(e => e.ApiToken == apiToken)?.User; if (user is not null) { @@ -95,7 +95,8 @@ public class AuthenticationController : Controller { Username = user.Username, MembershipID = "ef84db9-59c6-4950-b8ea-bbc1521f899b", // placeholder FacebookUserID = 0, - MultiplayerEnabled = true, + MultiplayerEnabled = (apiKey != "a1a13a0a-7c6e-4e9b-b0f7-22034d799013" && apiKey != "a2a09a0a-7c6e-4e9b-b0f7-22034d799013" && apiKey != "a3a12a0a-7c6e-4e9b-b0f7-22034d799013"), + IsApproved = true, Age = 24, OpenChatEnabled = true }); @@ -108,7 +109,9 @@ public class AuthenticationController : Controller { return Ok(new UserInfo { UserID = viking.Id, Username = viking.Name, - MultiplayerEnabled = true, + FacebookUserID = 0, + MultiplayerEnabled = (apiKey != "a1a13a0a-7c6e-4e9b-b0f7-22034d799013" && apiKey != "a2a09a0a-7c6e-4e9b-b0f7-22034d799013" && apiKey != "a3a12a0a-7c6e-4e9b-b0f7-22034d799013"), + IsApproved = true, Age = 24, OpenChatEnabled = true }); diff --git a/src/Controllers/Common/ConfigurationController.cs b/src/Controllers/Common/ConfigurationController.cs index 44a761f..3cdf00b 100644 --- a/src/Controllers/Common/ConfigurationController.cs +++ b/src/Controllers/Common/ConfigurationController.cs @@ -9,8 +9,12 @@ public class ConfigurationController : Controller { [HttpPost] //[Produces("application/xml")] [Route("ConfigurationWebService.asmx/GetMMOServerInfoWithZone")] - public IActionResult GetMMOServerInfoWithZone() { + public IActionResult GetMMOServerInfoWithZone([FromForm] string apiKey) { // TODO: this is a placeholder + if (apiKey == "A1A13A0A-7C6E-4E9B-B0F7-22034D799013" || apiKey == "A2A09A0A-7C6E-4E9B-B0F7-22034D799013" || apiKey == "A3A12A0A-7C6E-4E9B-B0F7-22034D799013") { // NOTE: in this request apiKey is send uppercase + // do not send MMO servers to old (incompatibility with MMO server) client + return Ok(XmlUtil.SerializeXml(new MMOServerInformation[0])); + } return Ok(XmlUtil.ReadResourceXmlString("mmo")); } } diff --git a/src/Controllers/Common/ContentController.cs b/src/Controllers/Common/ContentController.cs index 6c41415..d21b921 100644 --- a/src/Controllers/Common/ContentController.cs +++ b/src/Controllers/Common/ContentController.cs @@ -230,25 +230,32 @@ public class ContentController : Controller { return Ok(new DateTime(DateTime.Now.Ticks)); } + private int GetAvatarVersion(AvatarData avatarData) { + foreach (AvatarDataPart part in avatarData.Part) { + if (part.PartType == "Version") { + return (int)part.Offsets[0].X * 100 + (int)part.Offsets[0].Y * 10 + (int)part.Offsets[0].Z; + } + } + return 0; + } + [HttpPost] [Produces("application/xml")] [Route("V2/ContentWebService.asmx/SetAvatar")] [VikingSession] public IActionResult SetAvatar(Viking viking, [FromForm] string contentXML) { - AvatarData avatarData = XmlUtil.DeserializeXml(contentXML); - foreach (AvatarDataPart part in avatarData.Part) { - if (part.PartType == "Version") { - if (part.Offsets[0].X < 6 || part.Offsets[0].X == 6 && part.Offsets[0].Y < 1) { - // do not allow to save avatar data from old clients (avatar data version < 6.1) ... it's broke profile on 3.31 - // but return as true to trick the client to avoid re-show change viking name dialog - // TODO: maybe better set pair AvatarNameCustomizationDone -> 1 (in "2017" pairs) and return error here? - return Ok(new SetAvatarResult { - Success = true, - DisplayName = viking.Name, - StatusCode = AvatarValidationResult.Valid - }); - } - break; + if (viking.AvatarSerialized != null) { + AvatarData dbAvatarData = XmlUtil.DeserializeXml(viking.AvatarSerialized); + AvatarData reqAvatarData = XmlUtil.DeserializeXml(contentXML); + + int dbAvatarVersion = GetAvatarVersion(dbAvatarData); + int reqAvatarVersion = GetAvatarVersion(reqAvatarData); + + if (dbAvatarVersion > reqAvatarVersion) { + // do not allow override newer version avatar data by older version + return Ok(new SetAvatarResult { + Success = false, + }); } } @@ -323,6 +330,30 @@ public class ContentController : Controller { }); } + [HttpPost] + [Produces("application/xml")] + [Route("V2/ContentWebService.asmx/SetRaisedPet")] // used by Magic & Mythies + [VikingSession] + public IActionResult SetRaisedPetv2(Viking viking, [FromForm] string raisedPetData) { + RaisedPetData petData = XmlUtil.DeserializeXml(raisedPetData); + + // Find the dragon + Dragon? dragon = viking.Dragons.FirstOrDefault(e => e.Id == petData.RaisedPetID); + if (dragon is null) { + return Ok(new SetRaisedPetResponse { + RaisedPetSetResult = RaisedPetSetResult.Invalid + }); + } + + dragon.RaisedPetData = XmlUtil.SerializeXml(UpdateDragon(dragon, petData)); + ctx.Update(dragon); + ctx.SaveChanges(); + + return Ok(new SetRaisedPetResponse { + RaisedPetSetResult = RaisedPetSetResult.Success + }); + } + [HttpPost] [Produces("application/xml")] [Route("v3/ContentWebService.asmx/SetRaisedPet")] @@ -392,7 +423,7 @@ public class ContentController : Controller { [HttpPost] [Produces("application/xml")] - [Route("ContentWebService.asmx/GetUnselectedPetByTypes")] + [Route("ContentWebService.asmx/GetUnselectedPetByTypes")] // used by old SoD (e.g. 1.13) [VikingSession(UseLock=false)] public RaisedPetData[]? GetUnselectedPetByTypes(Viking viking, [FromForm] string petTypeIDs, [FromForm] bool active) { RaisedPetData[] dragons = viking.Dragons @@ -491,14 +522,14 @@ public class ContentController : Controller { [HttpPost] [Produces("application/xml")] [Route("V2/ContentWebService.asmx/GetUserUpcomingMissionState")] - public IActionResult GetUserUpcomingMissionState([FromForm] string apiToken, [FromForm] string userId) { + public IActionResult GetUserUpcomingMissionState([FromForm] string apiToken, [FromForm] string userId, [FromForm] string apiKey) { Viking? viking = ctx.Vikings.FirstOrDefault(x => x.Id == userId); if (viking is null) return Ok("error"); UserMissionStateResult result = new UserMissionStateResult { Missions = new List() }; foreach (var mission in viking.MissionStates.Where(x => x.MissionStatus == MissionStatus.Upcoming)) - result.Missions.Add(missionService.GetMissionWithProgress(mission.MissionId, viking.Id)); + result.Missions.Add(missionService.GetMissionWithProgress(mission.MissionId, viking.Id, apiKey)); result.UserID = Guid.Parse(viking.Id); return Ok(result); @@ -507,14 +538,14 @@ public class ContentController : Controller { [HttpPost] [Produces("application/xml")] [Route("V2/ContentWebService.asmx/GetUserActiveMissionState")] - public IActionResult GetUserActiveMissionState([FromForm] string apiToken, [FromForm] string userId) { + public IActionResult GetUserActiveMissionState([FromForm] string apiToken, [FromForm] string userId, [FromForm] string apiKey) { Viking? viking = ctx.Vikings.FirstOrDefault(x => x.Id == userId); if (viking is null) return Ok("error"); UserMissionStateResult result = new UserMissionStateResult { Missions = new List() }; foreach (var mission in viking.MissionStates.Where(x => x.MissionStatus == MissionStatus.Active)) { - Mission updatedMission = missionService.GetMissionWithProgress(mission.MissionId, viking.Id); + Mission updatedMission = missionService.GetMissionWithProgress(mission.MissionId, viking.Id, apiKey); if (mission.UserAccepted != null) updatedMission.Accepted = (bool)mission.UserAccepted; result.Missions.Add(updatedMission); @@ -527,14 +558,14 @@ public class ContentController : Controller { [HttpPost] [Produces("application/xml")] [Route("V2/ContentWebService.asmx/GetUserCompletedMissionState")] - public IActionResult GetUserCompletedMissionState([FromForm] string apiToken, [FromForm] string userId) { + public IActionResult GetUserCompletedMissionState([FromForm] string apiToken, [FromForm] string userId, [FromForm] string apiKey) { Viking? viking = ctx.Vikings.FirstOrDefault(x => x.Id == userId); if (viking is null) return Ok("error"); UserMissionStateResult result = new UserMissionStateResult { Missions = new List() }; foreach (var mission in viking.MissionStates.Where(x => x.MissionStatus == MissionStatus.Completed)) - result.Missions.Add(missionService.GetMissionWithProgress(mission.MissionId, viking.Id)); + result.Missions.Add(missionService.GetMissionWithProgress(mission.MissionId, viking.Id, apiKey)); result.UserID = Guid.Parse(viking.Id); return Ok(result); @@ -560,18 +591,19 @@ public class ContentController : Controller { [HttpPost] [Produces("application/xml")] - [Route("V2/ContentWebService.asmx/GetUserMissionState")] - //[VikingSession(UseLock=false)] - public IActionResult GetUserMissionState([FromForm] string userId, [FromForm] string filter) { - MissionRequestFilterV2 filterV2 = XmlUtil.DeserializeXml(filter); + [Route("ContentWebService.asmx/GetUserMissionState")] // used by SoD 1.13 + public IActionResult GetUserMissionStatev1([FromForm] string userId, [FromForm] string filter, [FromForm] string apiKey) { Viking? viking = ctx.Vikings.FirstOrDefault(x => x.Id == userId); if (viking is null) return Ok("error"); UserMissionStateResult result = new UserMissionStateResult { Missions = new List() }; - foreach (var m in filterV2.MissionPair) - if (m.MissionID != null) - result.Missions.Add(missionService.GetMissionWithProgress((int)m.MissionID, viking.Id)); + foreach (var mission in viking.MissionStates.Where(x => x.MissionStatus != MissionStatus.Completed)) { + Mission updatedMission = missionService.GetMissionWithProgress(mission.MissionId, viking.Id, apiKey); + if (mission.UserAccepted != null) + updatedMission.Accepted = (bool)mission.UserAccepted; + result.Missions.Add(updatedMission); + } result.UserID = Guid.Parse(viking.Id); return Ok(result); @@ -579,13 +611,64 @@ public class ContentController : Controller { [HttpPost] [Produces("application/xml")] - [Route("V2/ContentWebService.asmx/SetTaskState")] - [VikingSession] - public IActionResult SetTaskState(Viking viking, [FromForm] string userId, [FromForm] int missionId, [FromForm] int taskId, [FromForm] bool completed, [FromForm] string xmlPayload) { + [Route("V2/ContentWebService.asmx/GetUserMissionState")] + //[VikingSession(UseLock=false)] + public IActionResult GetUserMissionState([FromForm] string userId, [FromForm] string filter, [FromForm] string apiKey) { + MissionRequestFilterV2 filterV2 = XmlUtil.DeserializeXml(filter); + Viking? viking = ctx.Vikings.FirstOrDefault(x => x.Id == userId); + if (viking is null) + return Ok("error"); + + UserMissionStateResult result = new UserMissionStateResult { Missions = new List() }; + if (filterV2.MissionPair.Count > 0) { + foreach (var m in filterV2.MissionPair) + if (m.MissionID != null) + result.Missions.Add(missionService.GetMissionWithProgress((int)m.MissionID, viking.Id, apiKey)); + // TODO: probably should also check for msiion based on filterV2.ProductGroupID vs mission.GroupID + } else { + if (filterV2.GetCompletedMission ?? false) { + foreach (var mission in viking.MissionStates.Where(x => x.MissionStatus == MissionStatus.Completed)) + result.Missions.Add(missionService.GetMissionWithProgress(mission.MissionId, viking.Id, apiKey)); + } else { + foreach (var mission in viking.MissionStates.Where(x => x.MissionStatus != MissionStatus.Completed)) + result.Missions.Add(missionService.GetMissionWithProgress(mission.MissionId, viking.Id, apiKey)); + } + } + + result.UserID = Guid.Parse(viking.Id); + return Ok(result); + } + + [HttpPost] + [Produces("application/xml")] + [Route("ContentWebService.asmx/SetTaskState")] // used by SoD 1.13 + [VikingSession(UseLock=true)] + public IActionResult SetTaskStatev1(Viking viking, [FromForm] string userId, [FromForm] int missionId, [FromForm] int taskId, [FromForm] bool completed, [FromForm] string xmlPayload, [FromForm] string apiKey) { if (viking.Id != userId) return Unauthorized("Can't set not owned task"); - List results = missionService.UpdateTaskProgress(missionId, taskId, userId, completed, xmlPayload); + List results = missionService.UpdateTaskProgress(missionId, taskId, userId, completed, xmlPayload, apiKey); + + SetTaskStateResult taskResult = new SetTaskStateResult { + Success = true, + Status = SetTaskStateStatus.TaskCanBeDone, + }; + + if (results.Count > 0) + taskResult.MissionsCompleted = results.ToArray(); + + return Ok(taskResult); + } + + [HttpPost] + [Produces("application/xml")] + [Route("V2/ContentWebService.asmx/SetTaskState")] + [VikingSession] + public IActionResult SetTaskState(Viking viking, [FromForm] string userId, [FromForm] int missionId, [FromForm] int taskId, [FromForm] bool completed, [FromForm] string xmlPayload, [FromForm] string apiKey) { + if (viking.Id != userId) + return Unauthorized("Can't set not owned task"); + + List results = missionService.UpdateTaskProgress(missionId, taskId, userId, completed, xmlPayload, apiKey); SetTaskStateResult taskResult = new SetTaskStateResult { Success = true, diff --git a/src/Controllers/Common/MembershipController.cs b/src/Controllers/Common/MembershipController.cs index cf88960..230c5e6 100644 --- a/src/Controllers/Common/MembershipController.cs +++ b/src/Controllers/Common/MembershipController.cs @@ -25,9 +25,12 @@ public class MembershipController : Controller { [HttpPost] [Produces("application/xml")] - [Route("MembershipWebService.asmx/GetChildList")] + [Route("MembershipWebService.asmx/GetChildList")] // used by old SoD (e.g. 2.9) [VikingSession(Mode=VikingSession.Modes.USER, UseLock=false)] public IActionResult GetChildList(User user) { + if (user.Vikings.Count <= 0) + return Ok(); + ChildList profiles = new ChildList(); profiles.strings = user.Vikings.Select(viking => viking.Id + ", " + viking.Name).ToArray(); diff --git a/src/Controllers/Common/ProfileController.cs b/src/Controllers/Common/ProfileController.cs index c928e90..eb2dd99 100644 --- a/src/Controllers/Common/ProfileController.cs +++ b/src/Controllers/Common/ProfileController.cs @@ -19,7 +19,7 @@ public class ProfileController : Controller { [HttpPost] [Produces("application/xml")] [Route("ProfileWebService.asmx/GetUserProfileByUserID")] - public IActionResult GetUserProfileByUserID([FromForm] string userId) { + public IActionResult GetUserProfileByUserID([FromForm] string userId, [FromForm] string apiKey) { // NOTE: this is public info (for mmo) - no session check Viking? viking = ctx.Vikings.FirstOrDefault(e => e.Id == userId); @@ -29,26 +29,26 @@ public class ProfileController : Controller { // (not Ok response cause soft-lock client - can't close error message) } - return Ok(GetProfileDataFromViking(viking)); + return Ok(GetProfileDataFromViking(viking, apiKey)); } [HttpPost] [Produces("application/xml")] [Route("ProfileWebService.asmx/GetUserProfile")] [VikingSession(UseLock=false)] - public IActionResult GetUserProfile(Viking viking) { - return Ok(GetProfileDataFromViking(viking)); + public IActionResult GetUserProfile(Viking viking, [FromForm] string apiKey) { + return Ok(GetProfileDataFromViking(viking, apiKey)); } [HttpPost] [Produces("application/xml")] [Route("ProfileWebService.asmx/GetDetailedChildList")] [VikingSession(Mode=VikingSession.Modes.USER, ApiToken="parentApiToken", UseLock=false)] - public Schema.UserProfileDataList? GetDetailedChildList(User user) { + public Schema.UserProfileDataList? GetDetailedChildList(User user, [FromForm] string apiKey) { if (user.Vikings.Count <= 0) return null; - UserProfileData[] profiles = user.Vikings.Select(GetProfileDataFromViking).ToArray(); + UserProfileData[] profiles = user.Vikings.Select(v => GetProfileDataFromViking(v, apiKey)).ToArray(); return new UserProfileDataList { UserProfiles = profiles }; @@ -99,8 +99,16 @@ public class ProfileController : Controller { } }); } - - private UserProfileData GetProfileDataFromViking(Viking viking) { + + [HttpPost] + //[Produces("application/xml")] + [Route("ProfileWebService.asmx/GetProfileTagAll")] // used by Magic & Mythies + public IActionResult GetProfileTagAll() { + // TODO: This is a placeholder + return Ok(""); + } + + private UserProfileData GetProfileDataFromViking(Viking viking, [FromForm] string apiKey) { // Get the avatar data AvatarData avatarData = null; if (viking.AvatarSerialized is not null) { @@ -108,6 +116,20 @@ public class ProfileController : Controller { avatarData.Id = viking.Inventory.Id; } + if (avatarData != null && (apiKey == "a3a12a0a-7c6e-4e9b-b0f7-22034d799013")) { + if (avatarData.Part.FirstOrDefault(e => e.PartType == "Sword") is null) { + var extraParts = new AvatarDataPart[] { + new AvatarDataPart { + PartType = "Sword", + Geometries = new string[] {"NULL"}, + Textures = new string[] {"__EMPTY__"}, + UserInventoryId = null, + } + }; + avatarData.Part = extraParts.Concat(avatarData.Part).ToArray(); + } + } + // Build the AvatarDisplayData AvatarDisplayData avatar = new AvatarDisplayData { AvatarData = avatarData, @@ -117,7 +139,7 @@ public class ProfileController : Controller { ParentUserID = viking.UserId, Username = viking.Name, FirstName = viking.Name, - MultiplayerEnabled = true, + MultiplayerEnabled = (apiKey != "a1a13a0a-7c6e-4e9b-b0f7-22034d799013" && apiKey != "a2a09a0a-7c6e-4e9b-b0f7-22034d799013" && apiKey != "a3a12a0a-7c6e-4e9b-b0f7-22034d799013"), Locale = "en-US", // placeholder GenderID = Gender.Male, // placeholder OpenChatEnabled = true, diff --git a/src/Controllers/Common/RegistrationController.cs b/src/Controllers/Common/RegistrationController.cs index 9f84504..e71772f 100644 --- a/src/Controllers/Common/RegistrationController.cs +++ b/src/Controllers/Common/RegistrationController.cs @@ -14,12 +14,14 @@ public class RegistrationController : Controller { private ItemService itemService; private MissionService missionService; private RoomService roomService; + private KeyValueService keyValueService; - public RegistrationController(DBContext ctx, ItemService itemService, MissionService missionService, RoomService roomService) { + public RegistrationController(DBContext ctx, ItemService itemService, MissionService missionService, RoomService roomService, KeyValueService keyValueService) { this.ctx = ctx; this.itemService = itemService; this.missionService = missionService; this.roomService = roomService; + this.keyValueService = keyValueService; } [HttpPost] @@ -91,10 +93,11 @@ public class RegistrationController : Controller { [HttpPost] [Produces("application/xml")] + [Route("V3/RegistrationWebService.asmx/RegisterChild")] // used by Magic & Mythies [Route("V4/RegistrationWebService.asmx/RegisterChild")] [DecryptRequest("childRegistrationData")] [EncryptResponse] - public IActionResult RegisterChild([FromForm] string parentApiToken) { + public IActionResult RegisterChild([FromForm] string parentApiToken, [FromForm] string apiKey) { User? user = ctx.Sessions.FirstOrDefault(e => e.ApiToken == parentApiToken)?.User; if (user is null) { return Ok(new RegistrationResult{ @@ -115,6 +118,7 @@ public class RegistrationController : Controller { Inventory inv = new Inventory { InventoryItems = new List() }; inv.InventoryItems.Add(new InventoryItem { ItemId = 8977, Quantity = 1 }); // DragonStableINTDO - Dragons Dragon Stable + Viking v = new Viking { Id = Guid.NewGuid().ToString(), Name = data.ChildName, @@ -123,10 +127,22 @@ public class RegistrationController : Controller { AchievementPoints = new List(), Rooms = new List() }; - - missionService.SetUpMissions(v); - + + missionService.SetUpMissions(v, apiKey); + ctx.Vikings.Add(v); + + if (apiKey == "a1a13a0a-7c6e-4e9b-b0f7-22034d799013") { + keyValueService.SetPairData(null, v, null, 2017, new Schema.PairData { + Pairs = new Schema.Pair[]{ + new Schema.Pair { + // avoid show change viking name dialog + PairKey = "AvatarNameCustomizationDone", + PairValue = "1" + }, + } + }); + } ctx.SaveChanges(); roomService.CreateRoom(v, "MyRoomINT"); diff --git a/src/Resources/defaultmissionlist.xml b/src/Resources/defaultmissionlist.xml index e6dfb41..360a29d 100644 --- a/src/Resources/defaultmissionlist.xml +++ b/src/Resources/defaultmissionlist.xml @@ -1,5 +1,6 @@  + 999 1035 @@ -761,4 +762,4 @@ 3177 3178 - \ No newline at end of file + diff --git a/src/Resources/defaultmissionlistv1.xml b/src/Resources/defaultmissionlistv1.xml new file mode 100644 index 0000000..697fe30 --- /dev/null +++ b/src/Resources/defaultmissionlistv1.xml @@ -0,0 +1,700 @@ + + + + + 1035 + 1036 + 1037 + 1046 + 1047 + 1048 + 1185 + 1186 + 1187 + 1188 + 1189 + 1191 + 1192 + 1193 + 1194 + 1195 + 1196 + 1197 + 1198 + 1199 + 1200 + 1201 + 1202 + 1203 + 1204 + 1205 + 1206 + 1207 + 1208 + 1209 + 1210 + 1211 + 1212 + 1213 + 1214 + 1215 + 1216 + 1217 + 1218 + 1219 + 1220 + 1221 + 1222 + 1223 + 1224 + 1225 + 1226 + 1227 + 1228 + 1229 + 1230 + 1231 + 1232 + 1233 + 1234 + 1235 + 1236 + 1237 + 1238 + 1239 + 1240 + 1241 + 1242 + 1243 + 1244 + 1245 + 1250 + 1251 + 1252 + 1253 + 1254 + 1255 + 1256 + 1257 + 1258 + 1259 + 1260 + 1261 + 1262 + 1263 + 1264 + 1265 + 1266 + 1267 + 1268 + 1269 + 1270 + 1271 + 1272 + 1273 + 1274 + 1275 + 1276 + 1277 + 1278 + 1279 + 1280 + 1281 + 1282 + 1283 + 1284 + 1285 + 1286 + 1287 + 1288 + 1289 + 1290 + 1291 + 1292 + 1293 + 1294 + 1295 + 1307 + 1308 + 1309 + 1310 + 1311 + 1312 + 1313 + 1314 + 1315 + 1316 + 1321 + 1322 + 1323 + 1324 + 1325 + 1326 + 1327 + 1328 + 1329 + 1330 + 1345 + 1346 + 1347 + 1348 + 1349 + 1350 + 1351 + 1352 + 1353 + 1354 + 1689 + 1690 + 1691 + 1692 + 1693 + 1694 + 1695 + 1696 + 1697 + 1698 + 1699 + 1700 + 1701 + 1702 + 1703 + 1704 + 1705 + 1706 + 1707 + 1708 + 1709 + 1710 + 1711 + 1712 + 1713 + 1714 + 1715 + 1716 + 1717 + 1718 + 1719 + 1720 + 1721 + 1722 + 1723 + 1724 + 1725 + 1726 + 1727 + 1728 + 1729 + 1730 + 2176 + 2287 + 2303 + 2304 + 2309 + 2392 + 2393 + 2394 + 2395 + 2396 + 2397 + 2398 + 2399 + 2400 + 2401 + 2402 + 2403 + 2404 + 2405 + 2406 + 2407 + 2421 + 2422 + 2424 + 2425 + 2426 + 2427 + 2428 + 2429 + 2430 + 2431 + 2432 + 2433 + 2434 + 2435 + 2436 + 2437 + 2438 + 2439 + 2457 + 2458 + 2510 + 2511 + 2512 + 2513 + 2514 + 2515 + 2516 + 2517 + 2518 + 2519 + 2520 + 2521 + 2562 + 2563 + 2564 + 2565 + 2566 + 2567 + 2568 + 2569 + 2570 + 2571 + 2572 + 2573 + 2578 + 2579 + 2580 + 2581 + 2582 + 2583 + 2584 + 2585 + 2586 + 2587 + 2588 + 2606 + 2607 + 2631 + 2632 + 2633 + 2634 + 2635 + 2636 + 2637 + 2638 + 2639 + 2640 + 2645 + 2646 + 2649 + 2650 + 2652 + 2653 + 2655 + 2656 + 2661 + 2662 + 2663 + 2664 + 2665 + 2666 + 2667 + 2668 + 2669 + 2670 + 2673 + 2674 + 2675 + 2676 + 2677 + 2678 + 2679 + 2680 + 2681 + 2682 + 2683 + 2684 + 2685 + 2686 + 2687 + 2786 + 2787 + 2790 + 2806 + 2807 + 2808 + 2809 + 2810 + 2811 + 2812 + 2813 + 2814 + 2815 + 2816 + 2817 + 2818 + 2819 + 2843 + 2844 + 2845 + 2878 + 2879 + 2894 + 2895 + 2931 + 2932 + 2946 + 2947 + 2972 + 2973 + 3022 + 3023 + 3036 + 3037 + 3052 + 3053 + 3071 + 3072 + 3073 + 3074 + 3075 + 3076 + 3077 + 3078 + 3079 + 3080 + 3099 + 3100 + 3113 + 3114 + 3115 + 3116 + 3117 + 3118 + 3119 + 3120 + 3121 + 3122 + 3123 + 3124 + 3127 + 3128 + 3129 + 3130 + 3131 + 3132 + 3133 + 3134 + 3135 + 3136 + 3148 + 3149 + + + 999 + 1003 + 1014 + 1015 + 1016 + 1017 + 1027 + 1028 + 1029 + 1031 + 1033 + 1038 + 1044 + 1053 + 1054 + 1055 + 1057 + 1058 + 1062 + 1067 + 1074 + 1085 + 1089 + 1090 + 1091 + 1093 + 1095 + 1096 + 1097 + 1099 + 1101 + 1102 + 1106 + 1108 + 1110 + 1111 + 1114 + 1120 + 1121 + 1128 + 1134 + 1140 + 1143 + 1144 + 1150 + 1153 + 1155 + 1159 + 1163 + 1164 + 1166 + 1167 + 1168 + 1169 + 1171 + 1173 + 1179 + 1247 + 1296 + 1304 + 1305 + 1317 + 1318 + 1331 + 1333 + 1335 + 1338 + 1343 + 1344 + 1357 + 1361 + 1362 + 1390 + 1508 + 1529 + 1530 + 1575 + 1579 + 1605 + 1606 + 1607 + 1608 + 1611 + 1612 + 1613 + 1614 + 1615 + 1617 + 1618 + 1619 + 1620 + 1622 + 1623 + 1624 + 1625 + 1626 + 1627 + 1628 + 1629 + 1630 + 1632 + 1633 + 1634 + 1636 + 1638 + 1640 + 1641 + 1642 + 1646 + 1648 + 1652 + 1655 + 1656 + 1657 + 1658 + 1660 + 1661 + 1663 + 1666 + 1667 + 1669 + 1671 + 1672 + 1673 + 1674 + 1675 + 1676 + 1678 + 1681 + 1683 + 1736 + 1749 + 1769 + 1771 + 1777 + 1781 + 1787 + 1788 + 1813 + 1815 + 1818 + 1822 + 1828 + 1961 + 1967 + 1969 + 1970 + 1971 + 1972 + 1973 + 1974 + 1978 + 2175 + 2178 + 2180 + 2182 + 2195 + 2196 + 2199 + 2206 + 2207 + 2208 + 2212 + 2213 + 2215 + 2217 + 2218 + 2219 + 2223 + 2225 + 2226 + 2228 + 2229 + 2232 + 2233 + 2235 + 2284 + 2288 + 2300 + 2302 + 2307 + 2308 + 2311 + 2314 + 2315 + 2318 + 2319 + 2320 + 2324 + 2328 + 2329 + 2330 + 2331 + 2332 + 2333 + 2335 + 2337 + 2338 + 2339 + 2344 + 2346 + 2347 + 2353 + 2354 + 2357 + 2363 + 2372 + 2389 + 2408 + 2415 + 2416 + 2423 + 2444 + 2459 + 2472 + 2474 + 2475 + 2476 + 2477 + 2478 + 2479 + 2481 + 2482 + 2483 + 2485 + 2486 + 2493 + 2494 + 2496 + 2498 + 2499 + 2500 + 2503 + 2506 + 2522 + 2526 + 2528 + 2529 + 2532 + 2533 + 2536 + 2538 + 2542 + 2548 + 2551 + 2554 + 2556 + 2557 + 2574 + 2589 + 2590 + 2591 + 2592 + 2593 + 2594 + 2596 + 2597 + 2598 + 2608 + 2613 + 2614 + 2622 + 2626 + 2641 + 2643 + 2659 + 2689 + 2690 + 2691 + 2692 + 2693 + 2694 + 2695 + 2697 + 2699 + 2700 + 2705 + 2707 + 2708 + 2711 + 2714 + 2717 + 2718 + 2719 + 2723 + 2730 + 2731 + 2874 + 2884 + 2887 + 2889 + 2892 + 2893 + 2937 + 2974 + 2986 + 2988 + 2989 + 2990 + 2992 + 2993 + 2996 + 3013 + 3041 + 3057 + 3150 + 3167 + 3176 + 3177 + 3178 + + diff --git a/src/Resources/missions.xml b/src/Resources/missions.xml index a49f9f7..1b01465 100644 --- a/src/Resources/missions.xml +++ b/src/Resources/missions.xml @@ -1,5 +1,1014 @@  + + 30999 + Quest 1 + 3 + <Data><Repeat>0</Repeat><Hidden>0</Hidden><Reward><Asset>PfUiMissionRewardDBDO</Asset></Reward><Random>0</Random><Title><Text>New Student</Text><ID>922059</ID></Title><Desc><Text>{{Input}} on Gobber</Text><ID>926629</ID></Desc></Data> + false + 0 + + + 2 + true + 0 + false + + + 1 + False + 0 + false + + + all + true + 4 + 1 + + 1 + 999 + 3427 + 0 + + + 1 + 999 + 3428 + 0 + + + 1 + 999 + 793 + 0 + + + 1 + 999 + 771 + 0 + + + + 1 + 201320 + 0 + + 771 + Talk to the Headmaster + <Data><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWGobber</NPC><Text>What a beauty of a dragon! I'm right chuffed by your choice! Talk to the Headmaster. He's the teacher standing in front of the school building.</Text><ID>922010</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><End><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHeadmaster</NPC><Text>Welcome to the School of Dragons! I am the Headmaster. Vikings who have a quest for you will have a golden exclamation over their heads. {{Input}} on them and accept the quest.</Text><ID>922011</ID><ItemID>0</ItemID><Priority>0</Priority></End><End><Type>VO</Type><Asset>RS_DATA/PfDWHeadmaster.unity3d/PfDWHeadmaster</Asset><NPC>PfDWHeadmaster</NPC><ItemID>0</ItemID><Priority>0</Priority></End><Objective><Pair><Key>Scene</Key><Value>HubSchoolDO</Value></Pair><Pair><Key>NPC</Key><Value>PfDWHeadmaster</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Meet</Type><Title><Text>Talk to the Headmaster</Text><ID>922008</ID></Title><Desc><Text>Talk to the Headmaster. He is standing by the school building at school.</Text><ID>939148</ID></Desc></Data> + 0 + false + + + 3427 + Old Tutorial Init + <Data><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWGobber</NPC><Text>Hi, I'm Gobber the Belch! Ah, all your classmates are already on board the boat to school! That boat is going to set sail with or without ya! Get a move on. Follow the wooden path behind me to the boat. When you're on a quest, the arrow will help show you the path.</Text><ItemID>0</ItemID><Priority>0</Priority></Offer><Objective><Pair><Key>Scene</Key><Value>HubBerkDO</Value></Pair><Pair><Key>NPC</Key><Value>PfDWHiccup</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Meet</Type><Title><Text>Walk forward and {{input}} on Hiccup</Text><ID>929442</ID></Title><Desc><Text>Walk forward and talk to Hiccup.</Text><ID>939149</ID></Desc></Data> + 0 + false + + + 3428 + Go to school + <Data><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>Use world map to go to School Island and go to Hatchery.</Text><ItemID>0</ItemID><Priority>0</Priority></Offer><Objective><Pair><Key>Scene</Key><Value>HatcheryINTDO</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Visit</Type><Title><Text>Go to Hatchery.</Text></Title><Desc><Text>Go to Hatchery.</Text></Desc></Data> + 0 + false + + + 793 + Hatch dragon old + <Data><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWGobber</NPC><Text>You can pick any dragon you like! It's time to pick your own dragon egg. The eggs are in nests deeper inside the Hatchery. {{Input}} on the nest you like. Once you have the egg you want, place it in the Dragon Hearth. That's the pool of lava in the middle of the cavern. </Text><ID>939861</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><Objective><Pair><Key>Scene</Key><Value>HatcheryINTDO</Value></Pair><Pair><Key>Name</Key><Value>HatchDragon</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Action</Type><Title><Text>Hatch your egg</Text><ID>939860</ID></Title></Data> + 0 + false + + + 100 +

2

+ 0 + 1 + 23 + 201320 + true + 100 + 100 + 0 +
+ + 100 +

1

+ 0 + 1 + 38 + 201320 + true + 100 + 100 + 0 +
+ + 200 +

8

+ 0 + 1 + 652 + 201320 + true + 200 + 200 + 0 +
+ + 200 +

12

+ 0 + 1 + 914 + 201320 + true + 200 + 200 + 0 +
+ false +
+ + 20999 + Quest 1 + 3 + <Data><Setup><Scene>HubSchoolDO</Scene><Asset>RS_DATA/PfDWBucket.unity3d/PfDWBucket</Asset><Location>PfMarker_BondingArea</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>HatcheryINTDO</Scene><Asset>RS_DATA/PfGrpQMMO_Off.unity3d/PfGrpQMMO_Off</Asset><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>HubSchoolDO</Scene><Asset>RS_DATA/PfGrpQ01T00.unity3d/PfGrpQ01T00</Asset><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>BerkDocksDO</Scene><Asset>RS_DATA/PfGrpFTUE01T00.unity3d/PfGrpFTUE01T00</Asset><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>BerkDocksDO</Scene><Asset>RS_DATA/PfGrpQMMO_Off.unity3d/PfGrpQMMO_Off</Asset><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Repeat>0</Repeat><Hidden>0</Hidden><Reward><Asset>PfUiMissionRewardDBDO</Asset></Reward><Random>0</Random><Title><Text>New Student</Text><ID>922059</ID></Title><Desc><Text>{{Input}} on Gobber</Text><ID>926629</ID></Desc></Data> + false + 0 + + + 2 + False + 0 + false + + + 1 + False + 0 + false + + + all + true + 4 + 1 + + 1 + 999 + 3427 + 0 + + + 1 + 999 + 3428 + 0 + + + 1 + 999 + 3429 + 0 + + + 1 + 999 + 3430 + 0 + + + 1 + 999 + 3431 + 0 + + + 1 + 999 + 3432 + 0 + + + 1 + 999 + 3433 + 0 + + + 2 + 999 + 22412 + 0 + + + 1 + 999 + 3435 + 0 + + + 2 + 999 + 22413 + 0 + + + 1 + 999 + 3440 + 0 + + + 1 + 999 + 3443 + 0 + + + 1 + 999 + 3444 + 0 + + + 1 + 999 + 3445 + 0 + + + 1 + 999 + 771 + 0 + + + + 7 + 201320 + 0 + + 22412 + FTUE08: Click on dragon + 3 +

999

+ <Data><Setup><Scene>BerkDocksDO</Scene><Asset>PfDragonCageSingetailHanging</Asset><Location>PfMarker_AdultDragonOnGround</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Repeat>0</Repeat><Hidden>0</Hidden><Reward><Asset /></Reward><Title><Text>Click on the dragon</Text><ID>927450</ID></Title></Data> + false + 0 + + + 2 + False + 0 + false + + + 1 + False + 0 + false + + + all + true + 4 + 1 + + 1 + 22412 + 3434 + 0 + + + + 7 + 204802 + 0 + + 3434 + FTUE08: Click on dragon + <Data><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>There, there... it's going to be okay, big guy. {{Name}}, you freed them so they'll trust you the most. Bond with the dragon. Step forward, reach out your hand, and {{input}} on the dragon.</Text><ID>929431</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><Offer><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupEncourage02</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>0</Priority></Offer><End><Type>CutScene</Type><Asset>RS_DATA/PfGrpFTUEt08CS.unity3d/PfGrpFTUEt08CS</Asset><ItemID>0</ItemID><Priority>0</Priority></End><Objective><Pair><Key>Scene</Key><Value>BerkDocksDO</Value></Pair><Pair><Key>Location</Key><Value>PfMarker_AdultDragonOnGround</Value></Pair><Pair><Key>Name</Key><Value>ClickObject</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Action</Type><Title><Text>{{Input}} on the wounded dragon</Text><ID>929429</ID></Title><Desc><Text>{{Input}} on the wounded dragon.</Text><ID>939146</ID></Desc><AutoComplete><Pair><Key>RaisedPetStage</Key><Value>Baby</Value></Pair></AutoComplete></Data> + 0 + false + + + 10 +

1

+ 0 + 1 + 2 + 204802 + true + 10 + 10 + 0 +
+ false +
+ + 22413 + FTUE11: Mulch + 3 +

999

+ <Data><Setup><Scene>BerkDocksDO</Scene><Asset>PfDragonCageSingetailHanging</Asset><Location>PfMarker_AdultDragonOnGround</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Repeat>0</Repeat><Hidden>0</Hidden><Reward><Asset>PfUiMissionRewardDBDO</Asset></Reward><Random>0</Random><Title><Text>Talk to Mulch</Text><ID>927451</ID></Title></Data> + false + 0 + + + 2 + False + 0 + false + + + 1 + False + 0 + false + + + all + true + 4 + 1 + + 1 + 22413 + 3437 + 0 + + + + 7 + 204800 + 0 + + 3437 + FTUE11: Talk to Mulch + <Data><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>What a first day of school, huh? I can tell that you're going to be an amazing dragon trainer!@@We'll teach you how to care for {{dragon name}}. Talk to Mulch, the best fisherman on Berk. You'll find him by the lake!</Text><ID>929434</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><Offer><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupAttract03</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>0</Priority></Offer><End><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWMulch</NPC><Text>I have a saying: a full dragon is a happy dragon! Fish are a dragon's favorite meal so here's a few to get started.</Text><ID>929435</ID><ItemID>0</ItemID><Priority>0</Priority></End><Objective><Pair><Key>Scene</Key><Value>BerkDocksDO</Value></Pair><Pair><Key>NPC</Key><Value>PfDWMulch</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Meet</Type><Title><Text>Talk to Mulch</Text><ID>929432</ID></Title><Desc><Text>Talk to Mulch.</Text><ID>939147</ID></Desc></Data> + 0 + false + + + 10 +

1

+ 0 + 1 + 2 + 204800 + true + 10 + 10 + 0 +
+ + 200 +

12

+ 0 + 1 + 914 + 204800 + true + 200 + 200 + 0 +
+ + 3 +

6

+ 7139 + 1 + 7438 + 204800 + true + 3 + 3 + 0 +
+ + 10 +

6

+ 7249 + 1 + 7436 + 204800 + true + 10 + 10 + 0 +
+ + 1 +

6

+ 7583 + 1 + 7437 + 204800 + true + 1 + 1 + 0 +
+ false +
+ + 771 + Talk to the Headmaster + <Data><Setup><Scene>BerkDocksDO</Scene><Asset>PfDragonCageSingetailHanging</Asset><Location>PfMarker_AdultDragonOnGround</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>Nicely done! I can tell you're going to fit in well around here. Talk to the Headmaster. He's the teacher standing in front of the school building. Oh and great job, buddy.</Text><ID>922010</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><End><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHeadmaster</NPC><Text>Welcome to the School of Dragons! I am the Headmaster. Vikings who have a quest for you will have a golden exclamation over their heads. {{Input}} on them and accept the quest.@@This is a difficult time, but I know that you will be up to the challenge.</Text><ID>922011</ID><ItemID>0</ItemID><Priority>0</Priority></End><End><Type>VO</Type><Asset>RS_DATA/DOQuest1.unity3d/DlgHeyralQ6T1End</Asset><NPC>PfDWHeadmaster</NPC><ItemID>0</ItemID><Priority>0</Priority></End><Objective><Pair><Key>Scene</Key><Value>HubSchoolDO</Value></Pair><Pair><Key>NPC</Key><Value>PfDWHeadmaster</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Meet</Type><Title><Text>Talk to the Headmaster</Text><ID>922008</ID></Title><Desc><Text>Talk to the Headmaster. He is standing by the school building at school.</Text><ID>939148</ID></Desc></Data> + 0 + false + + + 3427 + FTUE01: Talk to Hiccup + <Data><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>Hey! You're {{Name}}, the new student? Come talk to me! Use the movement controls and walk over to me!</Text><ID>929444</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><Offer><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupAttract03</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>0</Priority></Offer><End><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>Hi {{Name}}. I'm Hiccup, the chief of Berk. Sorry for the abrupt introduction but Berk is under attack!</Text><ID>929445</ID><ItemID>0</ItemID><Priority>0</Priority></End><End><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupGreeting</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>0</Priority></End><Objective><Pair><Key>Scene</Key><Value>BerkDocksDO</Value></Pair><Pair><Key>NPC</Key><Value>PfDWHiccup</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Meet</Type><Title><Text>Walk forward and {{input}} on Hiccup</Text><ID>929442</ID></Title><Desc><Text>Walk forward and talk to Hiccup.</Text><ID>939149</ID></Desc></Data> + 0 + false + + + 3428 + FTUE02: Mount Toothless + <Data><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>We need to get in the air and stop these raiders from capturing dragons! {{Input}} on Toothless and select the Mount button.</Text><ID>929448</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><Offer><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupQuestOffer04</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>0</Priority></Offer><End><Type>CutScene</Type><Asset>RS_DATA/PfGrpFTUEt02CS.unity3d/PfGrpFTUEt02CS</Asset><ItemID>0</ItemID><Priority>0</Priority></End><Objective><Pair><Key>Location</Key><Value>PfDWNightFury</Value></Pair><Pair><Key>Name</Key><Value>MountDragon</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Action</Type><Title><Text>{{Input}} on Toothless and mount him</Text><ID>929446</ID></Title><Desc><Text>{{Input}} on Toothless and mount him.</Text><ID>939150</ID></Desc></Data> + 0 + false + + + 3429 + FTUE03: Meet Astrid + <Data><Setup><Scene>BerkDocksDO</Scene><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>All right! Here's the plan. I need you to take the controls and fly us over to Astrid. She's the Viking right in front of us. Don't worry about flying... Toothless and I are here with you.</Text><ID>929451</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><Offer><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupQuestOffer03</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>0</Priority></Offer><End><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWAstrid</NPC><Text>Hiccup... and a new student! Well, you chose a great time to join the fight. They're starting to press the attack.</Text><ID>932825</ID><ItemID>0</ItemID><Priority>0</Priority></End><End><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>Well, let's take care of that!</Text><ID>932929</ID><ItemID>0</ItemID><Priority>1</Priority></End><End><Type>VO</Type><Asset>RS_DATA/DlgDWAstridDO.unity3d/DlgAstridQuestOffer01</Asset><NPC>PfDWAstrid</NPC><ItemID>0</ItemID><Priority>0</Priority></End><End><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupEncourage05</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>1</Priority></End><Objective><Pair><Key>Scene</Key><Value>BerkDocksDO</Value></Pair><Pair><Key>Name</Key><Value>PfMarker_Astrid</Value></Pair><Pair><Key>Range</Key><Value>10</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Visit</Type><Title><Text>Fly up to meet Astrid</Text><ID>929449</ID></Title><Desc><Text>Fly up to meet Astrid.</Text><ID>939151</ID></Desc></Data> + 0 + false + + + 3430 + FTUE04: Fight Boat + <Data><Setup><Scene>BerkDocksDO</Scene><Asset>PfDWHiccup</Asset><Location>PfMarker_HiccupLanded</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWAstrid</NPC><Text>Okay, then. That leaves the other ship for you and me! Avoid the incoming arrows and use the Fire button to shoot the ship with the red sails!</Text><ID>929456</ID><ItemID>0</ItemID><Priority>1</Priority></Offer><Offer><Type>VO</Type><Asset>RS_DATA/DlgDWAstridDO.unity3d/DlgAstridEncourage01</Asset><NPC>PfDWAstrid</NPC><ItemID>0</ItemID><Priority>1</Priority></Offer><Offer><Type>CutScene</Type><Asset>RS_DATA/PfGrpFTUEt03CS.unity3d/PfGrpFTUEt03CS</Asset><ItemID>0</ItemID><Priority>0</Priority></Offer><End><Type>CutScene</Type><Asset>RS_DATA/PfGrpFTUEt04CS.unity3d/PfGrpFTUEt04CS</Asset><ItemID>0</ItemID><Priority>0</Priority></End><Objective><Pair><Key>Location</Key><Value>PfBattleBoatMission</Value></Pair><Pair><Key>Name</Key><Value>PfBattleBoatMission</Value></Pair><Pair><Key>Quantity</Key><Value>1</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Collect</Type><Title><Text>Shoot down the boat with the red sails!</Text><ID>929454</ID></Title><Desc><Text>Fight the boat.</Text><ID>939152</ID></Desc></Data> + 0 + false + + + 3431 + FTUE05: Collect Axe + <Data><Setup><Scene>BerkDocksDO</Scene><Asset>RS_DATA/PfGrpQFTuet05.unity3d/PfGrpQFTuet05</Asset><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>BerkDocksDO</Scene><Asset>PfDWHiccup</Asset><Location>PfMarker_Hiccup</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>BerkDocksDO</Scene><Asset>PfDWDeadlyNadder_Stormfly</Asset><Location>PfMarker_Astrid02</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>BerkDocksDO</Scene><Asset>RS_DATA/PfGrpFTUEt06CS.unity3d/PfGrpFTUEt06CS</Asset><Recursive>false</Recursive><Persistent>true</Persistent></Setup><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>Great job, you two, but it's not over yet... These raiders caught a lot of dragons in their traps and wounded them. The twins are going around destroying traps, but, we need to free these dragons.@@You'll need to find the right tool for the job. I'll try to keep this poor wounded dragon calm while you find an axe. Hurry!</Text><ID>932826</ID><ItemID>0</ItemID><Priority>1</Priority></Offer><Offer><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupQuestOffer12</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>1</Priority></Offer><Offer><Type>VO</Type><Asset>RS_DATA/DlgDWAstridDO.unity3d/DlgAstridPos01</Asset><NPC>PfDWAstrid</NPC><ItemID>0</ItemID><Priority>0</Priority></Offer><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWAstrid</NPC><Text>We did it! Those lousy trappers will have a long way to swim home from here.</Text><ID>933394</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><Objective><Pair><Key>Scene</Key><Value>BerkDocksDO</Value></Pair><Pair><Key>Name</Key><Value>PfCollectDWAxe</Value></Pair><Pair><Key>Quantity</Key><Value>1</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Collect</Type><Title><Text>Find the axe</Text><ID>929457</ID></Title><Desc><Text>Find the axe.</Text><ID>939153</ID></Desc></Data> + 0 + false + + + 3432 + FTUE06: Chop Rope + <Data><Setup><Scene>BerkDocksDO</Scene><Asset>PfDWHiccup</Asset><Location>PfMarker_Hiccup</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><RandomSetup><Scene>BerkDocksDO</Scene><Asset>RS_DATA/PfGrpFTUEt07CS.unity3d/PfGrpFTUEt07CS</Asset><Recursive>false</Recursive><Persistent>true</Persistent></RandomSetup><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>Great! Now let's save that dragon. Step up to the rope and {{input}} on the Axe button.</Text><ID>929464</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><Offer><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupPos03</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>0</Priority></Offer><Objective><Pair><Key>Scene</Key><Value>BerkDocksDO</Value></Pair><Pair><Key>Location</Key><Value>PfMarker_ChopRope</Value></Pair><Pair><Key>Name</Key><Value>Chop</Value></Pair><Pair><Key>ItemName</Key><Value>BerkDocksCraneRope</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Action</Type><Title><Text>Chop the rope holding the dragon trap</Text><ID>929462</ID></Title><Desc><Text>Chop the rope holding the dragon trap.</Text><ID>939154</ID></Desc></Data> + 0 + false + + + 3433 + FTUE07: Unlock Cage + <Data><Setup><Scene>BerkDocksDO</Scene><Asset>PfDragonCageSingetailHanging</Asset><Location>PfMarker_AdultDragonOnGround</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>BerkDocksDO</Scene><Asset>PfDWHiccup</Asset><Location>PfMarker_Hiccup</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>Steady, steady... there's just one more problem for us to fix. Click on the cage and try to figure out the combination to the lock.</Text><ID>929467</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><Offer><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupAttract05</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>0</Priority></Offer><End><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>Perfect!</Text><ID>920818</ID><ItemID>0</ItemID><Priority>0</Priority></End><End><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupQuestEnd02</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>0</Priority></End><Objective><Pair><Key>Scene</Key><Value>BerkDocksDO</Value></Pair><Pair><Key>Location</Key><Value>PfMarker_AdultDragonOnGround</Value></Pair><Pair><Key>Name</Key><Value>Cryptex</Value></Pair><Pair><Key>ItemName</Key><Value>DragonCageC</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Game</Type><Title><Text>{{Input}} on the cage and unlock it</Text><ID>929465</ID></Title><Desc><Text>{{Input}} on the cage and unlock it.</Text><ID>939155</ID></Desc></Data> + 0 + false + + + 3435 + FTUE09: Meet Hiccup + <Data><Setup><Scene>BerkDocksDO</Scene><Asset>PfDWHiccup</Asset><Location>PfMarker_Hiccup</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>BerkDocksDO</Scene><Asset>PfDragonCageSingetailHanging</Asset><Location>PfMarker_AdultDragonOnGround</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>You did it! You're a natural.Our first priority as dragon trainers is to grow with dragons. Come talk to me!</Text><ID>929471</ID><ItemID>0</ItemID><Priority>1</Priority></Offer><Offer><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupEncourage03</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>1</Priority></Offer><Objective><Pair><Key>Scene</Key><Value>BerkDocksDO</Value></Pair><Pair><Key>NPC</Key><Value>PfDWHiccup</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Meet</Type><Title><Text>Talk to Hiccup</Text><ID>904789</ID></Title><Desc><Text>Talk to Hiccup.</Text><ID>923314</ID></Desc></Data> + 0 + false + + + 3440 + FTUE14: Feed + <Data><Setup><Scene>BerkDocksDO</Scene><Asset>PfDragonCageSingetailHanging</Asset><Location>PfMarker_AdultDragonOnGround</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>BerkDocksDO</Scene><Asset>PfDWHiccup</Asset><Location>PfMarker_HiccupLake</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>BerkDocksDO</Scene><Asset>PfDWToothlessAlpha_PostCS</Asset><Location>PfMarker_ToothlessLake</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>The meters on the top left of the screen will tell you when the dragon is hungry or wants to play. {{Input}} on {{dragon name}}, {{input}} on the eating utensils and {{input}} on the fish.</Text><ID>929485</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><Offer><Type>VO</Type><Asset>RS_DATA/DOQuestStory1.unity3d/DlgHiccupSciMethod02End</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>0</Priority></Offer><End><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>Feeding {{dragon name}} increases the [c][0f2896]Energy[/c][ffffff] meter. Make sure to have a lot of fish handy to feed your buddy! When they get sad, {{input}} on them and {{input}} on the eel button.</Text><ID>929486</ID><ItemID>0</ItemID><Priority>0</Priority></End><End><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupGreat</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>0</Priority></End><Objective><Pair><Key>Location</Key><Value>MyDragon</Value></Pair><Pair><Key>Name</Key><Value>Peteat</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Action</Type><Title><Text>{{Input}} on {{dragon name}} and {{input}} on the fork to feed them</Text><ID>929483</ID></Title><Desc><Text>{{Input}} on {{dragon name}} and feed them.</Text><ID>939157</ID></Desc></Data> + 0 + false + + + 3443 + FTUE17: Talk to Valka + <Data><Setup><Scene>BerkDocksDO</Scene><Asset>PfDWValka</Asset><Location>PfMarker_ValkaStanding</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>BerkDocksDO</Scene><Asset>RS_DATA/PfGrpFTUEt17.unity3d/PfGrpFTUEt17</Asset><Recursive>false</Recursive><Persistent>true</Persistent></Setup><Setup><Scene>BerkDocksDO</Scene><Asset>PfDragonCageSingetailHanging</Asset><Location>PfMarker_AdultDragonOnGround</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWValka</NPC><Text>I see that my son has already taught you the basics. If he thinks you're ready for the next step, you're ready. Cloudjumper and I will take you to the Hatchery!</Text><ID>929492</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><End><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWGobber</NPC><Text>Ahh! Your dragon looks like they could use a good long nap after what they've been through. I'll take them to your stables to rest while you talk to Valka!</Text><ID>929493</ID><ItemID>0</ItemID><Priority>0</Priority></End><End><Type>VO</Type><Asset>RS_DATA/DlgDWGobberDO.unity3d/DlgGobberGenPraise03</Asset><NPC>PfDWGobber</NPC><ItemID>0</ItemID><Priority>0</Priority></End><Objective><Pair><Key>Scene</Key><Value>HatcheryINTDO</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Visit</Type><Title><Text>Join Valka at the Hatchery</Text><ID>929490</ID></Title><Desc><Text>Talk to Valka at the Hatchery.</Text><ID>939158</ID></Desc></Data> + 0 + false + + + 3444 + FTUE18: Dragon Questionnaire + <Data><Setup><Scene>BerkDocksDO</Scene><Asset>PfDragonCageSingetailHanging</Asset><Location>PfMarker_AdultDragonOnGround</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>BerkDocksDO</Scene><Asset>RS_DATA/PfGrpFTUEt17.unity3d/PfGrpFTUEt17</Asset><Recursive>false</Recursive><Persistent>true</Persistent></Setup><Offer><Type>Popup</Type><ID>929496</ID><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWValka</NPC><Text>I am Valka. I have devoted my entire life to understanding and protecting these beautiful creatures. I will help you on your journey to adopt and raise a baby dragon. Talk to me and we'll discover which dragon suits you best.</Text><ItemID>0</ItemID><Priority>0</Priority></Offer><Objective><Pair><Key>Scene</Key><Value>HatcheryINTDO</Value></Pair><Pair><Key>Type</Key><Value>PersonalityTest</Value></Pair><Pair><Key>NPC</Key><Value>PfDWValka</Value></Pair><Pair><Key>Asset</Key><Value>RS_DATA/PfUiDragonsQuestionnaire.unity3d/PfUiDragonsQuestionnaire</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Meet</Type><Title><Text>Talk to Valka</Text><ID>904780</ID></Title><Desc><Text>Talk to Valka to learn what dragon best suits you.</Text><ID>929495</ID></Desc></Data> + 0 + false + + + 3445 + FTUE19: Hatch dragon + <Data><Setup><Scene>BerkDocksDO</Scene><Asset>PfDragonCageSingetailHanging</Asset><Location>PfMarker_AdultDragonOnGround</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWValka</NPC><Text>It's just a suggestion, my dear... you may choose whichever dragon resonates in your heart.{{Input}} on the dragon egg of your choice.</Text><ID>929499</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><Objective><Pair><Key>Scene</Key><Value>HatcheryINTDO</Value></Pair><Pair><Key>Name</Key><Value>HatchDragon</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Action</Type><Title><Text>{{Input}} on a dragon egg and hatch it</Text><ID>929497</ID></Title><Desc><Text>Hatch a dragon.</Text><ID>939159</ID></Desc></Data> + 0 + false + + + 100 +

2

+ 0 + 1 + 23 + 201320 + true + 100 + 100 + 0 +
+ + 100 +

1

+ 0 + 1 + 38 + 201320 + true + 100 + 100 + 0 +
+ + 200 +

8

+ 0 + 1 + 652 + 201320 + true + 200 + 200 + 0 +
+ + 200 +

12

+ 0 + 1 + 914 + 201320 + true + 200 + 200 + 0 +
+ false +
+ + 10999 + Quest 1 + 3 + <Data><Setup><Scene>HubSchoolDO</Scene><Asset>RS_DATA/PfDWBucket.unity3d/PfDWBucket</Asset><Location>PfMarker_BondingArea</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>HatcheryINTDO</Scene><Asset>RS_DATA/PfGrpQMMO_Off.unity3d/PfGrpQMMO_Off</Asset><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>HubSchoolDO</Scene><Asset>RS_DATA/PfGrpQ01T00.unity3d/PfGrpQ01T00</Asset><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>BerkDocksDO</Scene><Asset>RS_DATA/PfGrpFTUE01T00.unity3d/PfGrpFTUE01T00</Asset><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>BerkDocksDO</Scene><Asset>RS_DATA/PfGrpQMMO_Off.unity3d/PfGrpQMMO_Off</Asset><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Repeat>0</Repeat><Hidden>0</Hidden><Reward><Asset>PfUiMissionRewardDBDO</Asset></Reward><Random>0</Random><Title><Text>New Student</Text><ID>922059</ID></Title><Desc><Text>{{Input}} on Gobber</Text><ID>926629</ID></Desc></Data> + false + 0 + + + 2 + False + 0 + false + + + 1 + False + 0 + false + + + all + true + 4 + 1 + + 1 + 999 + 3427 + 0 + + + 1 + 999 + 3428 + 0 + + + 1 + 999 + 3429 + 0 + + + 1 + 999 + 3430 + 0 + + + 1 + 999 + 3431 + 0 + + + 1 + 999 + 3432 + 0 + + + 1 + 999 + 3433 + 0 + + + 2 + 999 + 2412 + 0 + + + 1 + 999 + 3435 + 0 + + + 2 + 999 + 2413 + 0 + + + 1 + 999 + 3440 + 0 + + + 1 + 999 + 3443 + 0 + + + 1 + 999 + 3444 + 0 + + + 1 + 999 + 3445 + 0 + + + + 1 + 999 + 4426 + 0 + + + 1 + 999 + 771 + 0 + + + + 7 + 201320 + 0 + + 2412 + FTUE08: Click on dragon + 3 +

999

+ <Data><Setup><Scene>BerkDocksDO</Scene><Asset>PfDragonCageSingetailHanging</Asset><Location>PfMarker_AdultDragonOnGround</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Repeat>0</Repeat><Hidden>0</Hidden><Reward><Asset /></Reward><Title><Text>Click on the dragon</Text><ID>927450</ID></Title></Data> + false + 0 + + + 2 + False + 0 + false + + + 1 + False + 0 + false + + + all + true + 4 + 1 + + 1 + 2412 + 3434 + 0 + + + + 7 + 204802 + 0 + + 3434 + FTUE08: Click on dragon + <Data><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>There, there... it's going to be okay, big guy. {{Name}}, you freed them so they'll trust you the most. Bond with the dragon. Step forward, reach out your hand, and {{input}} on the dragon.</Text><ID>929431</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><Offer><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupEncourage02</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>0</Priority></Offer><End><Type>CutScene</Type><Asset>RS_DATA/PfGrpFTUEt08CS.unity3d/PfGrpFTUEt08CS</Asset><ItemID>0</ItemID><Priority>0</Priority></End><Objective><Pair><Key>Scene</Key><Value>BerkDocksDO</Value></Pair><Pair><Key>Location</Key><Value>PfMarker_AdultDragonOnGround</Value></Pair><Pair><Key>Name</Key><Value>ClickObject</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Action</Type><Title><Text>{{Input}} on the wounded dragon</Text><ID>929429</ID></Title><Desc><Text>{{Input}} on the wounded dragon.</Text><ID>939146</ID></Desc><AutoComplete><Pair><Key>RaisedPetStage</Key><Value>Baby</Value></Pair></AutoComplete></Data> + 0 + false + + + 10 +

1

+ 0 + 1 + 2 + 204802 + true + 10 + 10 + 0 +
+ false +
+ + 2413 + FTUE11: Mulch + 3 +

999

+ <Data><Setup><Scene>BerkDocksDO</Scene><Asset>PfDragonCageSingetailHanging</Asset><Location>PfMarker_AdultDragonOnGround</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Repeat>0</Repeat><Hidden>0</Hidden><Reward><Asset>PfUiMissionRewardDBDO</Asset></Reward><Random>0</Random><Title><Text>Talk to Mulch</Text><ID>927451</ID></Title></Data> + false + 0 + + + 2 + False + 0 + false + + + 1 + False + 0 + false + + + all + true + 4 + 1 + + 1 + 2413 + 3437 + 0 + + + + 7 + 204800 + 0 + + 3437 + FTUE11: Talk to Mulch + <Data><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>What a first day of school, huh? I can tell that you're going to be an amazing dragon trainer!@@We'll teach you how to care for {{dragon name}}. Talk to Mulch, the best fisherman on Berk. You'll find him by the lake!</Text><ID>929434</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><Offer><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupAttract03</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>0</Priority></Offer><End><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWMulch</NPC><Text>I have a saying: a full dragon is a happy dragon! Fish are a dragon's favorite meal so here's a few to get started.</Text><ID>929435</ID><ItemID>0</ItemID><Priority>0</Priority></End><Objective><Pair><Key>Scene</Key><Value>BerkDocksDO</Value></Pair><Pair><Key>NPC</Key><Value>PfDWMulch</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Meet</Type><Title><Text>Talk to Mulch</Text><ID>929432</ID></Title><Desc><Text>Talk to Mulch.</Text><ID>939147</ID></Desc></Data> + 0 + false + + + 10 +

1

+ 0 + 1 + 2 + 204800 + true + 10 + 10 + 0 +
+ + 200 +

12

+ 0 + 1 + 914 + 204800 + true + 200 + 200 + 0 +
+ + 3 +

6

+ 7139 + 1 + 7438 + 204800 + true + 3 + 3 + 0 +
+ + 10 +

6

+ 7249 + 1 + 7436 + 204800 + true + 10 + 10 + 0 +
+ + 1 +

6

+ 7583 + 1 + 7437 + 204800 + true + 1 + 1 + 0 +
+ false +
+ + 771 + Talk to the Headmaster + <Data><Setup><Scene>BerkDocksDO</Scene><Asset>PfDragonCageSingetailHanging</Asset><Location>PfMarker_AdultDragonOnGround</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWAstrid</NPC><Text>Oh, dear Odin. How did this happen? We need to... Where do we go from here?@@I need you to talk to the Headmaster of the school. He's the teacher standing in front of the school building.We're all going to need to step up, {{Name}}. Let's do this.</Text><ID>922010</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><End><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHeadmaster</NPC><Text>Welcome to the School of Dragons! I am the Headmaster. Vikings who have a quest for you will have a golden exclamation over their heads. {{Input}} on them and accept the quest.@@This is a difficult time, but I know that you will be up to the challenge.</Text><ID>922011</ID><ItemID>0</ItemID><Priority>0</Priority></End><End><Type>VO</Type><Asset>RS_DATA/DOQuest1.unity3d/DlgHeyralQ6T1End</Asset><NPC>PfDWHeadmaster</NPC><ItemID>0</ItemID><Priority>0</Priority></End><Objective><Pair><Key>Scene</Key><Value>HubSchoolDO</Value></Pair><Pair><Key>NPC</Key><Value>PfDWHeadmaster</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Meet</Type><Title><Text>Talk to the Headmaster</Text><ID>922008</ID></Title><Desc><Text>Talk to the Headmaster. He is standing by the school building at school.</Text><ID>939148</ID></Desc></Data> + 0 + false + + + 3427 + FTUE01: Talk to Hiccup + <Data><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>You're the new student, right? Welcome! Use the movement controls to walk here and {{input}} on me.</Text><ID>929444</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><Offer><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupAttract03</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>0</Priority></Offer><End><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>I'm Hiccup, the chief of Berk. I'm glad you're here, {{Name}}! I'd love to give you a proper welcome but we don't have time.We're under attack!</Text><ID>929445</ID><ItemID>0</ItemID><Priority>0</Priority></End><End><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupGreeting</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>0</Priority></End><Objective><Pair><Key>Scene</Key><Value>BerkDocksDO</Value></Pair><Pair><Key>NPC</Key><Value>PfDWHiccup</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Meet</Type><Title><Text>Walk forward and {{input}} on Hiccup</Text><ID>929442</ID></Title><Desc><Text>Walk forward and talk to Hiccup.</Text><ID>939149</ID></Desc></Data> + 0 + false + + + 3428 + FTUE02: Mount Toothless + <Data><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>We need to get in the air right away. {{Input}} on Toothless and {{input}} the Mount button.</Text><ID>929448</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><Offer><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupQuestOffer04</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>0</Priority></Offer><End><Type>CutScene</Type><Asset>RS_DATA/PfGrpFTUEt02CS.unity3d/PfGrpFTUEt02CS</Asset><ItemID>0</ItemID><Priority>0</Priority></End><Objective><Pair><Key>Location</Key><Value>PfDWNightFury</Value></Pair><Pair><Key>Name</Key><Value>MountDragon</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Action</Type><Title><Text>{{Input}} on Toothless and mount him</Text><ID>929446</ID></Title><Desc><Text>{{Input}} on Toothless and mount him.</Text><ID>939150</ID></Desc></Data> + 0 + false + + + 3429 + FTUE03: Meet Astrid + <Data><Setup><Scene>BerkDocksDO</Scene><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>Nothing like learning on the field, right? Take the reins! Fly us to Astrid right in front of us.</Text><ID>929451</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><Offer><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupQuestOffer03</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>0</Priority></Offer><End><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWAstrid</NPC><Text>New student, huh? You chose a heck of a time to join the fight. Grimmel's here!</Text><ID>932825</ID><ItemID>0</ItemID><Priority>0</Priority></End><End><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWGrimmel</NPC><Text>You delay the inevitable. Your Night Fury will belong to me and all the dragons you protect will be enslaved. It is destiny.</Text><ID>932929</ID><ItemID>0</ItemID><Priority>1</Priority></End><End><Type>VO</Type><Asset>RS_DATA/DlgDWAstridDO.unity3d/DlgAstridQuestOffer01</Asset><NPC>PfDWAstrid</NPC><ItemID>0</ItemID><Priority>0</Priority></End><End><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupEncourage05</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>1</Priority></End><Objective><Pair><Key>Scene</Key><Value>BerkDocksDO</Value></Pair><Pair><Key>Name</Key><Value>PfMarker_Astrid</Value></Pair><Pair><Key>Range</Key><Value>10</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Visit</Type><Title><Text>Fly up to meet Astrid</Text><ID>929449</ID></Title><Desc><Text>Fly up to meet Astrid.</Text><ID>939151</ID></Desc></Data> + 0 + false + + + 3430 + FTUE04: Fight Boat + <Data><Setup><Scene>BerkDocksDO</Scene><Asset>PfDWHiccup</Asset><Location>PfMarker_HiccupLanded</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWAstrid</NPC><Text>Okay then. That leaves the other ship for you and me! Dodge the arrows and use the Fire button to shoot the ship!</Text><ID>929456</ID><ItemID>0</ItemID><Priority>1</Priority></Offer><Offer><Type>VO</Type><Asset>RS_DATA/DlgDWAstridDO.unity3d/DlgAstridEncourage01</Asset><NPC>PfDWAstrid</NPC><ItemID>0</ItemID><Priority>1</Priority></Offer><Offer><Type>CutScene</Type><Asset>RS_DATA/PfGrpFTUEt03CS.unity3d/PfGrpFTUEt03CS</Asset><ItemID>0</ItemID><Priority>0</Priority></Offer><End><Type>CutScene</Type><Asset>RS_DATA/PfGrpFTUEt04CS.unity3d/PfGrpFTUEt04CS</Asset><ItemID>0</ItemID><Priority>0</Priority></End><Objective><Pair><Key>Location</Key><Value>PfBattleBoatMission</Value></Pair><Pair><Key>Name</Key><Value>PfBattleBoatMission</Value></Pair><Pair><Key>Quantity</Key><Value>1</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Collect</Type><Title><Text>Shoot down the boat with the red sails!</Text><ID>929454</ID></Title><Desc><Text>Fight the boat.</Text><ID>939152</ID></Desc></Data> + 0 + false + + + 3431 + FTUE05: Collect Axe + <Data><Setup><Scene>BerkDocksDO</Scene><Asset>RS_DATA/PfGrpQFTuet05.unity3d/PfGrpQFTuet05</Asset><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>BerkDocksDO</Scene><Asset>PfDWHiccup</Asset><Location>PfMarker_Hiccup</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>BerkDocksDO</Scene><Asset>PfDWDeadlyNadder_Stormfly</Asset><Location>PfMarker_Astrid02</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>BerkDocksDO</Scene><Asset>RS_DATA/PfGrpFTUEt06CS.unity3d/PfGrpFTUEt06CS</Asset><Recursive>false</Recursive><Persistent>true</Persistent></Setup><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>Great job you two, but it's not over yet.Grimmel managed to trap a lot of wounded dragons so we need to free these dragons.@@You'll need to find the right tool for the job. I'll try to keep this poor wounded dragon calm while you look for an axe!</Text><ID>932826</ID><ItemID>0</ItemID><Priority>1</Priority></Offer><Offer><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupQuestOffer12</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>1</Priority></Offer><Offer><Type>VO</Type><Asset>RS_DATA/DlgDWAstridDO.unity3d/DlgAstridPos01</Asset><NPC>PfDWAstrid</NPC><ItemID>0</ItemID><Priority>0</Priority></Offer><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWAstrid</NPC><Text>We did it! He'll think twice before he tries to grab our dragons again...</Text><ID>933394</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><Objective><Pair><Key>Scene</Key><Value>BerkDocksDO</Value></Pair><Pair><Key>Name</Key><Value>PfCollectDWAxe</Value></Pair><Pair><Key>Quantity</Key><Value>1</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Collect</Type><Title><Text>Find the axe</Text><ID>929457</ID></Title><Desc><Text>Find the axe.</Text><ID>939153</ID></Desc></Data> + 0 + false + + + 3432 + FTUE06: Chop Rope + <Data><Setup><Scene>BerkDocksDO</Scene><Asset>PfDWHiccup</Asset><Location>PfMarker_Hiccup</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><RandomSetup><Scene>BerkDocksDO</Scene><Asset>RS_DATA/PfGrpFTUEt07CS.unity3d/PfGrpFTUEt07CS</Asset><Recursive>false</Recursive><Persistent>true</Persistent></RandomSetup><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>Great! Now let's save that dragon. Step up to the rope and {{input}} on the Axe button.</Text><ID>929464</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><Offer><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupPos03</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>0</Priority></Offer><Objective><Pair><Key>Scene</Key><Value>BerkDocksDO</Value></Pair><Pair><Key>Location</Key><Value>PfMarker_ChopRope</Value></Pair><Pair><Key>Name</Key><Value>Chop</Value></Pair><Pair><Key>ItemName</Key><Value>BerkDocksCraneRope</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Action</Type><Title><Text>Chop the rope holding the dragon trap</Text><ID>929462</ID></Title><Desc><Text>Chop the rope holding the dragon trap.</Text><ID>939154</ID></Desc></Data> + 0 + false + + + 3433 + FTUE07: Unlock Cage + <Data><Setup><Scene>BerkDocksDO</Scene><Asset>PfDragonCageSingetailHanging</Asset><Location>PfMarker_AdultDragonOnGround</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>BerkDocksDO</Scene><Asset>PfDWHiccup</Asset><Location>PfMarker_Hiccup</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>Steady, steady... now, {{input}} on the cage and open the door.</Text><ID>929467</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><Offer><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupAttract05</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>0</Priority></Offer><End><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>Perfect!</Text><ID>920818</ID><ItemID>0</ItemID><Priority>0</Priority></End><End><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupQuestEnd02</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>0</Priority></End><Objective><Pair><Key>Scene</Key><Value>BerkDocksDO</Value></Pair><Pair><Key>Location</Key><Value>PfMarker_AdultDragonOnGround</Value></Pair><Pair><Key>Name</Key><Value>ClickObject</Value></Pair><Pair><Key>ItemName</Key><Value>DragonCageC</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Action</Type><Title><Text>{{Input}} on the cage and unlock it</Text><ID>929465</ID></Title><Desc><Text>{{Input}} on the cage and unlock it.</Text><ID>939155</ID></Desc></Data> + 0 + false + + + 3435 + FTUE09: Meet Hiccup + <Data><Setup><Scene>BerkDocksDO</Scene><Asset>PfDWHiccup</Asset><Location>PfMarker_Hiccup</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>BerkDocksDO</Scene><Asset>PfDragonCageSingetailHanging</Asset><Location>PfMarker_AdultDragonOnGround</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>You did it! You're a natural.Our first priority as dragon trainers is to grow with dragons. Come talk to me!</Text><ID>929471</ID><ItemID>0</ItemID><Priority>1</Priority></Offer><Offer><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupEncourage03</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>1</Priority></Offer><Objective><Pair><Key>Scene</Key><Value>BerkDocksDO</Value></Pair><Pair><Key>NPC</Key><Value>PfDWHiccup</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Meet</Type><Title><Text>Talk to Hiccup</Text><ID>904789</ID></Title><Desc><Text>Talk to Hiccup.</Text><ID>923314</ID></Desc></Data> + 0 + false + + + 3440 + FTUE14: Feed + <Data><Setup><Scene>BerkDocksDO</Scene><Asset>PfDragonCageSingetailHanging</Asset><Location>PfMarker_AdultDragonOnGround</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>BerkDocksDO</Scene><Asset>PfDWHiccup</Asset><Location>PfMarker_HiccupLake</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>BerkDocksDO</Scene><Asset>PfDWToothlessAlpha_PostCS</Asset><Location>PfMarker_ToothlessLake</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>The meters on the top left of the screen will tell you when the dragon is hungry or wants to play. {{Input}} on {{dragon name}}, {{input}} on the eating utensils and {{input}} on the fish.</Text><ID>929485</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><Offer><Type>VO</Type><Asset>RS_DATA/DOQuestStory1.unity3d/DlgHiccupSciMethod02End</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>0</Priority></Offer><End><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>Feeding {{dragon name}} increases the [c][0f2896]Energy[/c][ffffff] meter. Make sure to have a lot of fish handy to feed your buddy! When they get sad, {{input}} on them and {{input}} on the eel button.</Text><ID>929486</ID><ItemID>0</ItemID><Priority>0</Priority></End><End><Type>VO</Type><Asset>RS_DATA/DlgDWHiccupDO.unity3d/DlgHiccupGreat</Asset><NPC>PfDWHiccup</NPC><ItemID>0</ItemID><Priority>0</Priority></End><Objective><Pair><Key>Location</Key><Value>MyDragon</Value></Pair><Pair><Key>Name</Key><Value>Peteat</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Action</Type><Title><Text>{{Input}} on {{dragon name}} and {{input}} on the fork to feed them</Text><ID>929483</ID></Title><Desc><Text>{{Input}} on {{dragon name}} and feed them.</Text><ID>939157</ID></Desc></Data> + 0 + false + + + 3443 + FTUE17: Talk to Valka + <Data><Setup><Scene>BerkDocksDO</Scene><Asset>PfDWValka</Asset><Location>PfMarker_ValkaStanding</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>BerkDocksDO</Scene><Asset>RS_DATA/PfGrpFTUEt17.unity3d/PfGrpFTUEt17</Asset><Recursive>false</Recursive><Persistent>true</Persistent></Setup><Setup><Scene>BerkDocksDO</Scene><Asset>PfDragonCageSingetailHanging</Asset><Location>PfMarker_AdultDragonOnGround</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWValka</NPC><Text>I see that my son has already taught you the basics. If he thinks you're ready for the next step, you're ready. Cloudjumper and I will take you to the Hatchery!</Text><ID>929492</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><End><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWGobber</NPC><Text>Ahh! Your dragon looks like they could use a good long nap after what they've been through. I'll take them to your stables to rest while you talk to Valka!</Text><ID>929493</ID><ItemID>0</ItemID><Priority>0</Priority></End><End><Type>VO</Type><Asset>RS_DATA/DlgDWGobberDO.unity3d/DlgGobberGenPraise03</Asset><NPC>PfDWGobber</NPC><ItemID>0</ItemID><Priority>0</Priority></End><Objective><Pair><Key>Scene</Key><Value>HatcheryINTDO</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Visit</Type><Title><Text>Join Valka at the Hatchery</Text><ID>929490</ID></Title><Desc><Text>Talk to Valka at the Hatchery.</Text><ID>939158</ID></Desc></Data> + 0 + false + + + 3444 + FTUE18: Dragon Questionnaire + <Data><Setup><Scene>BerkDocksDO</Scene><Asset>PfDragonCageSingetailHanging</Asset><Location>PfMarker_AdultDragonOnGround</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Setup><Scene>BerkDocksDO</Scene><Asset>RS_DATA/PfGrpFTUEt17.unity3d/PfGrpFTUEt17</Asset><Recursive>false</Recursive><Persistent>true</Persistent></Setup><Offer><Type>Popup</Type><ID>929496</ID><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWValka</NPC><Text>I am Valka. I have devoted my entire life to understanding and protecting these beautiful creatures. I will help you on your journey to adopt and raise a baby dragon. Talk to me and we'll discover which dragon suits you best.</Text><ItemID>0</ItemID><Priority>0</Priority></Offer><Objective><Pair><Key>Scene</Key><Value>HatcheryINTDO</Value></Pair><Pair><Key>Type</Key><Value>PersonalityTest</Value></Pair><Pair><Key>NPC</Key><Value>PfDWValka</Value></Pair><Pair><Key>Asset</Key><Value>RS_DATA/PfUiDragonsQuestionnaire.unity3d/PfUiDragonsQuestionnaire</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Meet</Type><Title><Text>Talk to Valka</Text><ID>904780</ID></Title><Desc><Text>Talk to Valka to learn what dragon best suits you.</Text><ID>929495</ID></Desc></Data> + 0 + false + + + 3445 + FTUE19: Hatch dragon + <Data><Setup><Scene>BerkDocksDO</Scene><Asset>PfDragonCageSingetailHanging</Asset><Location>PfMarker_AdultDragonOnGround</Location><Recursive>false</Recursive><Persistent>false</Persistent></Setup><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWValka</NPC><Text>It's just a suggestion, my dear... you may choose whichever dragon resonates in your heart.{{Input}} on the dragon egg of your choice.</Text><ID>929499</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><Objective><Pair><Key>Scene</Key><Value>HatcheryINTDO</Value></Pair><Pair><Key>Name</Key><Value>HatchDragon</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Action</Type><Title><Text>{{Input}} on a dragon egg and hatch it</Text><ID>929497</ID></Title><Desc><Text>Hatch a dragon.</Text><ID>939159</ID></Desc></Data> + 0 + false + + + 4426 + FTUE: Go to the School + <Data><Offer><Type>Popup</Type><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWHiccup</NPC><Text>Sorry to interrupt, but we're under attack! If it's not one villain, it's another.@@Harald snuck in with sort of explosive device here. We need to stop him! Please protect the dragon nests mom. Come with me, {{Name}}; let's see what we can do.</Text><ID>936190</ID><ItemID>0</ItemID><Priority>0</Priority></Offer><Objective><Pair><Key>Scene</Key><Value>HubSchoolDO</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Visit</Type><Title><Text>Go to the School</Text><ID>930700</ID></Title><Desc><Text>Go to the School.</Text><ID>930701</ID></Desc></Data> + 0 + false + + + 5797 + FTUE: Look at your CSM + <Data><Offer><Type>Popup</Type><ID>939163</ID><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWValka</NPC><Text>Aww, that dragon is a beauty. What a wonderful choice!Now, let me show you a very useful tool that will help you out at the School. {{Input}} on yourself and take a look at the menu that appears!</Text><ItemID>0</ItemID><Priority>0</Priority></Offer><End><Type>Popup</Type><ID>939164</ID><Asset>PfUiMissionActionDBDO</Asset><NPC>PfDWValka</NPC><Text>These buttons are shortcuts to many important options in the game. You can customize your clothing or your dragons, find minigames, or look at your active quests in your Journal!</Text><ItemID>0</ItemID><Priority>0</Priority></End><Objective><Pair><Key>Name</Key><Value>OpenCSM</Value></Pair><Pair><Key>Time</Key><Value>0</Value></Pair><Pair><Key>HideArrow</Key><Value>False</Value></Pair></Objective><Type>Action</Type><Title><Text>{{Input}} on yourself and look at the menu</Text><ID>939161</ID></Title><Desc><Text>{{Input}} on yourself.</Text><ID>939162</ID></Desc></Data> + 1 + false + + + 100 +

2

+ 0 + 1 + 23 + 201320 + true + 100 + 100 + 0 +
+ + 100 +

1

+ 0 + 1 + 38 + 201320 + true + 100 + 100 + 0 +
+ + 200 +

8

+ 0 + 1 + 652 + 201320 + true + 200 + 200 + 0 +
+ + 200 +

12

+ 0 + 1 + 914 + 201320 + true + 200 + 200 + 0 +
+ false +
1263 New Farming 74 diff --git a/src/Services/KeyValueService.cs b/src/Services/KeyValueService.cs index e8e7d98..5b29809 100644 --- a/src/Services/KeyValueService.cs +++ b/src/Services/KeyValueService.cs @@ -95,7 +95,7 @@ public class KeyValueService { Model.PairData? pair = null; if (viking != null) - pair = viking.PairData.FirstOrDefault(e => e.PairId == pairId); + pair = viking.PairData?.FirstOrDefault(e => e.PairId == pairId); else if (user != null) pair = user.PairData.FirstOrDefault(e => e.PairId == pairId); else if (dragon != null) diff --git a/src/Services/MissionService.cs b/src/Services/MissionService.cs index 9b981cc..1aea76f 100644 --- a/src/Services/MissionService.cs +++ b/src/Services/MissionService.cs @@ -16,13 +16,25 @@ public class MissionService { this.achievementService = achievementService; } - public Mission GetMissionWithProgress(int missionId, string userId) { - Mission mission = missionStore.GetMission(missionId); + public Mission GetMissionWithProgress(int missionId, string userId, string apiKey) { + Mission mission; + if (missionId == 999 && apiKey == "a3a12a0a-7c6e-4e9b-b0f7-22034d799013") { // TODO This is not a pretty solution with hard-coded values. + mission = missionStore.GetMission(10999); + mission.MissionID = 999; + } else if (missionId == 999 && apiKey == "a2a09a0a-7c6e-4e9b-b0f7-22034d799013") { + mission = missionStore.GetMission(20999); + mission.MissionID = 999; + } else if (missionId == 999 && apiKey == "a1a13a0a-7c6e-4e9b-b0f7-22034d799013") { + mission = missionStore.GetMission(30999); + mission.MissionID = 999; + } else { + mission = missionStore.GetMission(missionId); + } UpdateMissionRecursive(mission, userId); return mission; } - public List UpdateTaskProgress(int missionId, int taskId, string userId, bool completed, string xmlPayload) { + public List UpdateTaskProgress(int missionId, int taskId, string userId, bool completed, string xmlPayload, string apiKey) { SetTaskProgressDB(missionId, taskId, userId, completed, xmlPayload); // NOTE: This won't work if a mission can be completed by completing an inner mission @@ -36,7 +48,7 @@ public class MissionService { // I do know that outer missions have inner missions as RuleItems, and if the RuleItem is supposed to be "complete" and it isn't, the quest breaks when the player quits the game and loads the quest again List result = new(); if (completed) { - Mission mission = GetMissionWithProgress(missionId, userId); + Mission mission = GetMissionWithProgress(missionId, userId, apiKey); if (MissionCompleted(mission)) { // Update mission from active to completed Viking viking = ctx.Vikings.FirstOrDefault(x => x.Id == userId)!; @@ -100,16 +112,17 @@ public class MissionService { mission.Completed = 1; } - public void SetUpMissions(Viking viking) { + public void SetUpMissions(Viking viking, string apiKey) { viking.MissionStates = new List(); - foreach (int m in missionStore.GetActiveMissions()) { + + foreach (int m in missionStore.GetActiveMissions(apiKey)) { viking.MissionStates.Add(new MissionState { MissionId = m, MissionStatus = MissionStatus.Active }); } - foreach (int m in missionStore.GetUpcomingMissions()) { + foreach (int m in missionStore.GetUpcomingMissions(apiKey)) { viking.MissionStates.Add(new MissionState { MissionId = m, MissionStatus = MissionStatus.Upcoming diff --git a/src/Services/MissionStoreSingleton.cs b/src/Services/MissionStoreSingleton.cs index 1596e58..4acadab 100644 --- a/src/Services/MissionStoreSingleton.cs +++ b/src/Services/MissionStoreSingleton.cs @@ -8,6 +8,8 @@ public class MissionStoreSingleton { private Dictionary missions = new(); private int[] activeMissions; private int[] upcomingMissions; + private int[] activeMissionsV1; + private int[] upcomingMissionsV1; public MissionStoreSingleton() { ServerMissionArray missionArray = XmlUtil.DeserializeXml(XmlUtil.ReadResourceXmlString("missions")); @@ -17,17 +19,27 @@ public class MissionStoreSingleton { } activeMissions = defaultMissions.Active; upcomingMissions = defaultMissions.Upcoming; + + defaultMissions = XmlUtil.DeserializeXml(XmlUtil.ReadResourceXmlString("defaultmissionlistv1")); + activeMissionsV1 = defaultMissions.Active; + upcomingMissionsV1 = defaultMissions.Upcoming; } public Mission GetMission(int missionID) { return DeepCopy(missions[missionID]); } - public int[] GetActiveMissions() { + public int[] GetActiveMissions(string apiKey) { + if (apiKey == "a1a13a0a-7c6e-4e9b-b0f7-22034d799013") { + return activeMissionsV1; + } return activeMissions; } - public int[] GetUpcomingMissions() { + public int[] GetUpcomingMissions(string apiKey) { + if (apiKey == "a1a13a0a-7c6e-4e9b-b0f7-22034d799013") { + return upcomingMissionsV1; + } return upcomingMissions; } diff --git a/src/sodoff.csproj b/src/sodoff.csproj index cdf5bc8..069b2df 100644 --- a/src/sodoff.csproj +++ b/src/sodoff.csproj @@ -24,6 +24,7 @@ + @@ -85,5 +86,8 @@ PreserveNewest + + PreserveNewest +