public static RewardWithDetailsList VerasFindSourcesForItems(this String id, Details mainDetails = default, RewardWithDetailsList inResult = default) { mainDetails = (mainDetails == default) ? new Details() : mainDetails; mainDetails.PreviousIDs.Add(id); var mainResult = inResult ?? new RewardWithDetailsList(); var resultstoadd = new List <RewardWithDetailsList>(); var links = Program.Original.Root.XPathSelectElements($"//*[text()={id} and not(self::GUID)]").ToArray(); if (links.Length > 0) { for (var i = 0; i < links.Length; i++) { var element = links[i]; while (element.Name.LocalName != "Asset" || !element.HasElements) { element = element.Parent; } var Details = new Details(mainDetails); var result = mainResult.Copy(); if (element.Element("Template") == null) { if (element.XPathSelectElement("Values/Profile/ShipDropRewardPool")?.Value == id) { result.AddSourceAsset(element.GetProxy("ShipDrop"), new HashSet <XElement> { element.GetProxy("ShipDrop") }); resultstoadd.Add(result); continue; } else { continue; } } var key = element.XPathSelectElement("Values/Standard/GUID").Value; if (mainDetails.PreviousIDs.Contains(key)) { continue; } switch (element.Element("Template").Value) { case "AssetPool": case "TutorialQuest": case "SettlementRightsFeature": case "Profile_2ndParty": case "GuildhouseItem": case "HarborOfficeItem": case "HarbourOfficeBuff": case "MonumentEvent": case "MainQuest": // ignore break; case "Expedition": if (!element.XPathSelectElement("Values/Standard/Name").Value.Contains("Test")) { if (Details.Items.Count == 0) { Details.Add(element); } result.AddSourceAsset(element, Details.Items); } break; case "Profile_3rdParty": case "Profile_3rdParty_Pirate": if (!element.XPathSelectElement("Values/Standard/Name").Value.Contains("Test") && element.XPathSelectElement("Standard/Profile/ShipDropRewardPool")?.Value == id) { result.AddSourceAsset(element.GetProxy("ShipDrop"), new HashSet <XElement> { element.GetProxy("ShipDrop") }); break; } goto case "A7_QuestEscortObject"; case "A7_QuestEscortObject": case "A7_QuestDeliveryObject": case "A7_QuestDestroyObjects": case "A7_QuestPickupObject": case "A7_QuestFollowShip": case "A7_QuestPhotography": case "A7_QuestStatusQuo": case "A7_QuestItemUsage": case "A7_QuestSustain": case "A7_QuestPicturePuzzleObject": case "Quest": case "CollectablePicturePuzzle": case "MonumentEventReward": case "TourismFeature": if (!element.XPathSelectElement("Values/Standard/Name").Value.Contains("Test")) { result.AddSourceAsset(element, new HashSet <XElement> { element }); } break; case "ExpeditionDecision": var check = false; var name = element.XPathSelectElement("Values/Standard/Name")?.Value; var reward = element.XPathSelectElement("Values/Reward/RewardAssets"); check = reward?.HasElements == true && reward.Elements("Item").Any(l => l.Element("Reward").Value == id); if (check || element.XPathSelectElements($"//*[text()={id} and not(self::GUID) and (self::InsertEvent)]").Any()) { Details.Add(element); } goto case "ExpeditionOption"; case "ExpeditionOption": case "ExpeditionTrade": case "ExpeditionEvent": case "ExpeditionEventPool": if (Sources.ContainsKey(key)) { result.AddSourceAsset(Sources[key].Copy(), Details); break; } goto case "RewardPool"; case "RewardPool": case "RewardItemPool": if (Sources.ContainsKey(key)) { result.AddSourceAsset(Sources[key].Copy()); break; } VerasFindSourcesForItems(key, Details, result); if (!Sources.ContainsKey(key)) { Sources.Add(key, result.Copy()); } break; default: Debug.WriteLine(element.Element("Template").Value); break; //throw new NotImplementedException(element.Element("Template").Value); } resultstoadd.Add(result); } } foreach (var item in resultstoadd) { mainResult.AddSourceAsset(item); } return(mainResult); }
private static RewardWithDetailsList VerasFindExpeditionEvents(string id, Details mainDetails = default, RewardWithDetailsList inResult = default) { mainDetails = (mainDetails == default) ? new Details() : mainDetails; mainDetails.PreviousIDs.Add(id); var mainResult = inResult ?? new RewardWithDetailsList(); var resultstoadd = new List <RewardWithDetailsList>(); var links = Program.Original.Root.XPathSelectElements($"//*[text()={id} and not(self::GUID)]").ToArray(); if (links.Length > 0) { for (var i = 0; i < links.Length; i++) { var element = links[i]; while (element.Name.LocalName != "Asset" || !element.HasElements) { element = element.Parent; } if (element.Element("Template") == null) { continue; } var key = element.XPathSelectElement("Values/Standard/GUID").Value; if (mainDetails.PreviousIDs.Contains(key)) { continue; } var Details = new Details(mainDetails); var result = mainResult.Copy(); switch (element.Element("Template").Value) { case "AssetPool": case "TutorialQuest": case "SettlementRightsFeature": case "Profile_2ndParty": case "GuildhouseItem": case "HarborOfficeItem": case "HarbourOfficeBuff": case "MonumentEvent": case "Expedition": case "Profile_3rdParty": case "Profile_3rdParty_Pirate": case "A7_QuestEscortObject": case "A7_QuestDeliveryObject": case "A7_QuestDestroyObjects": case "A7_QuestPickupObject": case "A7_QuestFollowShip": case "A7_QuestPhotography": case "A7_QuestStatusQuo": case "A7_QuestItemUsage": case "A7_QuestSustain": case "A7_QuestPicturePuzzleObject": case "Quest": case "CollectablePicturePuzzle": case "MonumentEventReward": case "TourismFeature": case "RewardPool": case "RewardItemPool": case "ExpeditionEventPool": // ignore break; case "ExpeditionDecision": case "ExpeditionOption": case "ExpeditionTrade": Details.Add(element); VerasFindExpeditionEvents(key, Details, result); break; case "ExpeditionEvent": if (!element.XPathSelectElement("Values/Standard/Name").Value.Contains("Test")) { result.AddSourceAsset(element, Details.Items); } break; default: throw new NotImplementedException(element.Element("Template").Value); } resultstoadd.Add(result); } } foreach (var item in resultstoadd) { mainResult.AddSourceAsset(item); } return(mainResult); }