Add code to add missing quest assorts to trader assort files

This commit is contained in:
Dev 2023-08-02 13:05:34 +01:00
parent 167bba85e2
commit 2abf70a978
2 changed files with 350809 additions and 348625 deletions

File diff suppressed because it is too large Load Diff

View File

@ -145,15 +145,19 @@ namespace AssortGenerator
barter_scheme = barterSchemeItems,
loyal_level_items = loyaltyLevelItems
};
JsonWriter.WriteJson(outputAssortFile, traderFolderPath, workingPath, "assort");
// create base file, serialise into json and save into output folder
var outputBaseFile = traderData.data.Find(x => x._id == trader.Value);
JsonWriter.WriteJson(outputBaseFile, traderFolderPath, workingPath, "base");
QuestAssort questAssort = GenerateQuestAssortForTrader(trader.Key, outputAssortFile);
QuestAssort questAssort = GenerateQuestAssortForTrader(trader.Key, outputAssortFile, out List<AssortUnlocks> missingQuestAssorts);
AttemptToAddMissingQuestAssorts(outputAssortFile, questAssort, missingQuestAssorts);
JsonWriter.WriteJson(outputBaseFile, traderFolderPath, workingPath, "base");
JsonWriter.WriteJson(outputAssortFile, traderFolderPath, workingPath, "assort");
JsonWriter.WriteJson(questAssort, traderFolderPath, workingPath, "questassort");
//UpdateQuestAssortUnlockIds(trader.Value, questAssort, finalisedQuestData, outputAssortFile);
// create suits file for ragman
if (trader.Key == Trader.Ragman)
{
@ -161,6 +165,123 @@ namespace AssortGenerator
}
}
private static void AttemptToAddMissingQuestAssorts(AssortRoot outputAssortFile, QuestAssort questAssort, List<AssortUnlocks> missingQuestAssorts)
{
// iterate over each missing assort
foreach (var missingQuestAssort in missingQuestAssorts)
{
// Single item, maybe we can add one in (skip complex items like guns/ammo boxes etc)
if (missingQuestAssort.Items.Count == 1)
{
// Check isn't a weapon
var itemTemplate = ItemTemplateHelper.GetTemplateById(missingQuestAssort.Items[0]._tpl);
if (itemTemplate._parent == "5447b5f14bdc2d61278b4567")
{
continue;
}
if (outputAssortFile.items.Any(x => x._id == missingQuestAssort.Items[0]._id))
{
LoggingHelpers.LogError("OH NO, DUPE ID FOUND");
}
// We can add it
var item = new Item
{
_tpl = missingQuestAssort.Items[0]._tpl,
_id = missingQuestAssort.Items[0]._id,
parentId = "hideout",
slotId = "hideout",
upd = new Upd
{
StackObjectsCount = 10
}
};
outputAssortFile.items.Add(item);
var barterItemListInner = new List<BarterObject>
{
// 10,000 Roubles
new BarterObject() { _tpl = "5449016a4bdc2d6f028b456f", count = 25000 }
};
var barterItemListOuter = new List<List<BarterObject>>
{
barterItemListInner
};
outputAssortFile.barter_scheme.Add(missingQuestAssort.Items[0]._id, barterItemListOuter);
outputAssortFile.loyal_level_items[missingQuestAssort.Items[0]._id] = missingQuestAssort.LoyaltyLevel;
var associatedQuestAssort = questAssort.success.FirstOrDefault(x => x.Value == missingQuestAssort.QuestId && x.Key.StartsWith("UnknownAssortId"));
if (associatedQuestAssort.Key != null)
{
LoggingHelpers.LogWarning($"Able to replace missing quest: {missingQuestAssort.QuestId} assort with placeholder");
questAssort.success.Remove(associatedQuestAssort.Key);
questAssort.success.Add(missingQuestAssort.Items[0]._id, missingQuestAssort.QuestId);
}
}
}
}
private static void UpdateQuestAssortUnlockIds(string traderId, QuestAssort traderQuestAssort, Dictionary<string, Quest> finalisedQuestData, AssortRoot traderAssortRoot)
{
var alreadyMatchedAssortIds = new List<string>();
var assortUnlocks = QuestHelper.GetAssortUnlocks().Where(x => x.TraderId == traderId);
foreach (var assort in assortUnlocks)
{
// Find quest that matches quest assort key
Quest matchingQuest = finalisedQuestData.FirstOrDefault(x => x.Key == assort.QuestId).Value;
if (matchingQuest == null)
{
continue;
}
if (matchingQuest.QuestName == "Debut")
{
var x = 2;
}
RewardStatus matchingReward = null;
switch (assort.Criteria)
{
case "Success":
matchingReward = matchingQuest.rewards.Success.Single(x => x.id == assort.AssortUnlockId);
break;
case "Started":
matchingReward = matchingQuest.rewards.Started.Single(x => x.id == assort.AssortUnlockId);
break;
}
// Try to find assort with an _id of the quests target value
var matchingAssortInTrader = traderAssortRoot.items.SingleOrDefault(x => x._id == matchingReward.target);
if (matchingAssortInTrader == null)
{
// Mismatch! quest reward has a target that doesnt exist in trader assort
// Update to match quest
Dictionary<string,string> matching = null;
switch (assort.Criteria)
{
case "Success":
matching = traderQuestAssort.success;
break;
case "Started":
matching = traderQuestAssort.started;
break;
}
var kvp = matching.FirstOrDefault(x => x.Value == matchingQuest._id && !alreadyMatchedAssortIds.Contains(x.Value));
matchingReward.target = kvp.Key;
// Quests can have multiple unlocks per quest, keep track of processed assort ids
alreadyMatchedAssortIds.Add(kvp.Key);
}
}
}
/// <summary>
/// merges bear and usec ragman clothing dumps into one file
/// </summary>
@ -199,8 +320,10 @@ namespace AssortGenerator
/// <param name="trader"></param>
/// <param name="assortRoot"></param>
/// <returns></returns>
private static QuestAssort GenerateQuestAssortForTrader(Trader trader, AssortRoot assortRoot)
private static QuestAssort GenerateQuestAssortForTrader(Trader trader, AssortRoot assortRoot, out List<AssortUnlocks> missingQuestAssorts)
{
missingQuestAssorts = new List<AssortUnlocks>();
var result = new QuestAssort();
var questData = QuestHelper.GetQuestData();
@ -208,11 +331,11 @@ namespace AssortGenerator
List<AssortUnlocks> assortUnlocks = QuestHelper.GetAssortUnlocks();
// Store already matched items
var assortItemsThatMatchBlackList = new List<string>();
var matchedAssortItemIds = new List<string>();
int unknownCount = 1;
foreach (var assortUnlock in assortUnlocks.Where(x => x.TraderType == trader))
{
if (assortUnlock.QuestId == "64764abcd125ab430a14ccb5")
if (assortUnlock.QuestId == "60e71ce009d7c801eb0c0ec6")
{
var x = 2;
}
@ -223,7 +346,9 @@ namespace AssortGenerator
var assortItemModsFromQuest = assortUnlock.Items.Where(x => x.parentId == assortUnlock.ItemUnlockedId);
// Get matching assorts from trader
var results = GetMatchingTraderAssortsWithScore(assortRoot, assortUnlock, trader, assortItemsThatMatchBlackList);
var results = GetMatchingTraderAssortsWithScore(assortRoot, assortUnlock, trader, matchedAssortItemIds);
// No matches, add a placeholder to output file
if (results.Keys.Count == 0)
{
// no assort found for this unlock, add to questassort with a placeholder value instead of assort id
@ -232,9 +357,12 @@ namespace AssortGenerator
result.success.Add($"UnknownAssortId{unknownCount}", assortUnlock.QuestId);
unknownCount++;
missingQuestAssorts.Add(assortUnlock);
continue;
}
// All the assorts found have a matching score below 0 - very bad
if (results.Values.All( x => x < 0))
{
LoggingHelpers.LogError($"{trader} item templateId: {assortUnlock.ItemUnlockedTemplateId} ({ItemName}). questId: {assortUnlock.QuestId}. Only negative scored matches found");
@ -242,13 +370,16 @@ namespace AssortGenerator
result.success.Add($"UnknownAssortId{unknownCount}", assortUnlock.QuestId);
unknownCount++;
missingQuestAssorts.Add(assortUnlock);
continue;
}
var highestScoringAssortIdMatch = results.OrderByDescending(x => x.Value).Where(x => x.Value > 0).First().Key;
// get highest scoring match
var highestScoringAssortIdMatch = results.OrderByDescending(x => x.Value).First().Key;
// Add assort item id to blacklist so it wont be matched again
assortItemsThatMatchBlackList.Add(highestScoringAssortIdMatch);
matchedAssortItemIds.Add(highestScoringAssortIdMatch);
if (result.success.ContainsKey(highestScoringAssortIdMatch))
{