From d0579b645a9f303fd4250ebb4560e2fafef0c354 Mon Sep 17 00:00:00 2001 From: Chomp Date: Fri, 10 Sep 2021 14:26:43 +0100 Subject: [PATCH] Code cleanup --- QuestValidator/Program.cs | 127 +++++++++++++++++++++++++++----------- 1 file changed, 92 insertions(+), 35 deletions(-) diff --git a/QuestValidator/Program.cs b/QuestValidator/Program.cs index 226d47f..a588cf0 100644 --- a/QuestValidator/Program.cs +++ b/QuestValidator/Program.cs @@ -2,6 +2,7 @@ using QuestValidator.Common; using QuestValidator.Common.Helpers; using QuestValidator.Helpers; +using QuestValidator.Models; using System; using System.Collections.Generic; using System.IO; @@ -55,17 +56,17 @@ namespace QuestValidator } } - private static void LogQuestDetails(Models.Quest quest) + private static void LogQuestDetails(Quest quest) { var questName = QuestHelper.GetQuestNameById(quest._id); LoggingHelpers.LogInfo($"### Quest name: {questName} ({quest._id})"); LoggingHelpers.LogInfo($"Wiki: https://escapefromtarkov.fandom.com/wiki/{questName.Replace(' ', '_')}"); } - private static void CheckRootItemValues(Models.Quest quest, Models.Quest relatedLiveQuest) + private static void CheckRootItemValues(Quest quest, Quest relatedLiveQuest) { // Check image id matches - CheckValuesMatch(quest.image.Substring(0, quest.image.Length - 3), relatedLiveQuest?.image.Substring(0, relatedLiveQuest.image.Length - 3), "item path mismatch"); + CheckValuesMatch(quest.image.Substring(0, quest.image.Length - 4), relatedLiveQuest?.image.Substring(0, relatedLiveQuest.image.Length - 4), "item path mismatch"); // Check started reward count matches CheckValuesMatch(quest.rewards.Started.Count, relatedLiveQuest.rewards.Started.Count, "Started item count mismatch"); @@ -89,27 +90,20 @@ namespace QuestValidator CheckValuesMatch(quest.type, relatedLiveQuest.type, "quest type value mismatch"); } - private static void CheckSuccessRewardItems(Models.Quest quest, Models.Quest relatedLiveQuest) + private static void CheckSuccessRewardItems(Quest quest, Quest relatedLiveQuest) { var liveQuestSuccessRewardItems = relatedLiveQuest.rewards.Success; - foreach (var questSuccessRewardItem in quest.rewards.Success.Where(x => x.type == "Item")) + foreach (RewardStatus questSuccessRewardItem in quest.rewards.Success.Where(x => x.type == "Item")) { - var errorMessage = string.Empty; // Get live reward item by index and type - var relatedLiveRewardItem = liveQuestSuccessRewardItems.Find(x => x.index == questSuccessRewardItem.index && x.type == "Item"); + var relatedLiveRewardItem = GetLiveRewardItem(questSuccessRewardItem, liveQuestSuccessRewardItems); + + LogUnableToFindSuccessItemInLiveData(questSuccessRewardItem, relatedLiveRewardItem); if (relatedLiveRewardItem == null) { - // Get live reward item by templateId and type as we cant find it by index - relatedLiveRewardItem = liveQuestSuccessRewardItems.Find(x => x.items != null && x.items[0]?._tpl == questSuccessRewardItem.items[0]?._tpl && x.type == "Item"); - if (relatedLiveRewardItem == null) - { - LoggingHelpers.LogError($"ERROR unable to find success reward item in live quest data by index: ({questSuccessRewardItem.index}) OR template id: {questSuccessRewardItem.items[0]._tpl}"); - LoggingHelpers.LogError($"ERROR Skipping quest success item: {questSuccessRewardItem.id}"); - continue; - } + continue; } - //LoggingHelpers.LogInfo($"INFO Found live success reward item: {relatedLiveRewardItem.id}"); // Ensure target matches the objects items[0].id value if (questSuccessRewardItem.items[0]?._id != questSuccessRewardItem.target) @@ -130,20 +124,7 @@ namespace QuestValidator } // check sub items match - foreach (var subItem in questSuccessRewardItem.items.Where(x=> !string.IsNullOrEmpty(x.slotId))) - { - // find matching live counterpart - var liveCounterpart = relatedLiveRewardItem.items.FirstOrDefault(x=> x.slotId == subItem.slotId); - - if (liveCounterpart == null) - { - LoggingHelpers.LogWarning($"a live counterpart for the subItem {subItem.slotId} could not be found, skipping subItem check"); - continue; - } - - CheckValuesMatch(subItem._tpl, liveCounterpart._tpl, $"mismatch for success subItem({subItem.slotId}) reward templateId", subItem._id); - - } + CheckSubItemsMatch(questSuccessRewardItem, relatedLiveRewardItem); } foreach (var questSuccessRewardItem in quest.rewards.Success.Where(x => x.type == "Experience")) @@ -200,7 +181,66 @@ namespace QuestValidator } } - private static void CheckStartedRewardItems(Models.Quest quest, Models.Quest relatedLiveQuest) + private static void CheckSubItemsMatch(RewardStatus questSuccessRewardItem, RewardStatus relatedLiveRewardItem) + { + foreach (var subItem in questSuccessRewardItem.items.Where(x => !string.IsNullOrEmpty(x.slotId))) + { + // find matching live counterpart by slotid + var liveCounterpart = relatedLiveRewardItem.items.FirstOrDefault(x => x.slotId == subItem.slotId); + if (liveCounterpart == null) + { + LoggingHelpers.LogWarning($"a live counterpart for the subItem {subItem.slotId} could not be found, skipping subItem check"); + continue; + } + + CheckValuesMatch(subItem._tpl, liveCounterpart._tpl, $"mismatch for success subItem({subItem.slotId}) reward templateId", subItem._id); + } + } + + private static void LogUnableToFindSuccessItemInLiveData(RewardStatus questSuccessRewardItem, RewardStatus relatedLiveRewardItem) + { + if (relatedLiveRewardItem == null) + { + LoggingHelpers.LogError($"ERROR unable to find success reward item in live quest data by index: ({questSuccessRewardItem.index}) OR template id: {questSuccessRewardItem.items[0]._tpl} ({ItemTemplateHelper.GetTemplateById(questSuccessRewardItem.items[0]._tpl)._name})"); + + LoggingHelpers.LogError("Existing items:"); + LogSuccessItems(questSuccessRewardItem); + + LoggingHelpers.LogError($"ERROR Skipping quest success item. id: {questSuccessRewardItem.id}"); + } + } + + private static void LogSuccessItems(RewardStatus rewardItem) + { + foreach (var item in rewardItem.items) + { + LoggingHelpers.LogInfo($"{item._tpl} ({ItemTemplateHelper.GetTemplateById(item._tpl)._name})"); + } + } + + /// + /// Find live success item reward by index + /// If item at index does not match templateId to desired item + /// get live success item reward by template id + /// + /// + /// + /// + private static RewardStatus GetLiveRewardItem(RewardStatus questSuccessRewardItem, List liveQuestSuccessRewardItems) + { + var LiveItemRewards = liveQuestSuccessRewardItems.Where(x => x.type == "Item"); + var liveRewardItemByIndex = LiveItemRewards.FirstOrDefault(x => x.index == questSuccessRewardItem.index); + + // item found by index but template id didnt match + if (liveRewardItemByIndex != null && liveRewardItemByIndex.items[0]._tpl != questSuccessRewardItem.items[0]._tpl) + { + return LiveItemRewards.FirstOrDefault(x => x.items[0]._tpl == questSuccessRewardItem.items[0]._tpl); + } + + return liveRewardItemByIndex; + } + + private static void CheckStartedRewardItems(Quest quest, Quest relatedLiveQuest) { var liveQuestStartedRewardItems = relatedLiveQuest.rewards.Started; @@ -269,11 +309,11 @@ namespace QuestValidator } } - private static void CheckAvailableForFinishConditionItems(Models.Quest quest, Models.Quest relatedLiveQuest) + private static void CheckAvailableForFinishConditionItems(Quest quest, Quest relatedLiveQuest) { foreach (var availableForFinishItem in quest.conditions.AvailableForFinish) { - Models.AvailableFor liveFinishItem = relatedLiveQuest.conditions.AvailableForFinish.Find(x => x._props.id == availableForFinishItem._props.id); + AvailableFor liveFinishItem = relatedLiveQuest.conditions.AvailableForFinish.Find(x => x._props.id == availableForFinishItem._props.id); if (!ItemExists(liveFinishItem, "AvailableForFinish item", availableForFinishItem._props.index.Value)) { continue; @@ -328,7 +368,22 @@ namespace QuestValidator } } - private static void CheckValuesMatch(string firstValue, string secondValue, string message, string associatedId = "", bool performTemplateIdLookup = false) + private static void CheckValuesMatch(T firstValue, T secondValue, string message, string associatedId = "") where T : struct + { + if (firstValue.Equals(secondValue)) + { + if (associatedId == string.Empty) + { + LoggingHelpers.LogWarning($"WARNING {message}: '{firstValue}', expected '{secondValue}'"); + } + else + { + LoggingHelpers.LogWarning($"WARNING {associatedId} {message}: '{firstValue}', expected '{secondValue}'"); + } + } + } + + private static void CheckValuesMatch(string firstValue, string secondValue, string message, string associatedId = "", bool performTemplateIdLookup = false) { if (firstValue != secondValue) { @@ -363,8 +418,9 @@ namespace QuestValidator } } - private static void CheckForMissingQuestsInAkiFile(Models.QuestRoot liveQuestData, Dictionary akiQuestData) + private static void CheckForMissingQuestsInAkiFile(QuestRoot liveQuestData, Dictionary akiQuestData) { + // iterate over live quests and look for quests that exist in live but not in aki var missingQuests = new List(); foreach (var liveQuest in liveQuestData.data) { @@ -373,6 +429,7 @@ namespace QuestValidator missingQuests.Add($"{liveQuest._id} {QuestHelper.GetQuestNameById(liveQuest._id)}"); } } + // Quests in live but not in aki were found, log it if (missingQuests.Count > 0) { LoggingHelpers.LogWarning($"WARNING aki quest list is missing quests:");