Add assort code to generate assorts - PoC
This commit is contained in:
parent
d338a98064
commit
593f68f812
114
AssortUpdater/AssortFlattener.cs
Normal file
114
AssortUpdater/AssortFlattener.cs
Normal file
@ -0,0 +1,114 @@
|
||||
using AssortValidator.Common;
|
||||
using AssortValidator.Common.Models;
|
||||
|
||||
namespace AssortUpdater
|
||||
{
|
||||
public static class AssortFlattener
|
||||
{
|
||||
|
||||
public static List<FlatAssort> FlattenExistingAssorts(Assort existingAssorts)
|
||||
{
|
||||
var results = new List<FlatAssort>();
|
||||
|
||||
foreach (var assort in existingAssorts.items.Where(x => x.slotId == "hideout"))
|
||||
{
|
||||
var level = existingAssorts.loyal_level_items.FirstOrDefault(x => x.Key == assort._id);
|
||||
var barterDetails = existingAssorts.barter_scheme.FirstOrDefault(x => x.Key == assort._id);
|
||||
var firstBarterDetails = barterDetails.Value[0].First();
|
||||
|
||||
results.Add(new FlatAssort
|
||||
{
|
||||
AssortId = assort._id,
|
||||
ItemId = assort._tpl,
|
||||
ItemName = ItemTemplateHelper.GetNameById(assort._tpl),
|
||||
Level = level.Value,
|
||||
IsMoney = barterDetails.Value.Count == 1 && ItemTemplateHelper.IsMoney(firstBarterDetails._tpl),
|
||||
BarterDetails = barterDetails.Value.First(),
|
||||
});
|
||||
}
|
||||
|
||||
// Add in sub items
|
||||
foreach (var subAssort in existingAssorts.items.Where(x => x.slotId != "hideout"))
|
||||
{
|
||||
// find parent item in assort list we created
|
||||
var assortToAddTo = results.Find(x => x.AssortId == subAssort.parentId);
|
||||
if (assortToAddTo is null)
|
||||
{
|
||||
// check items subitems as some have mods of their own
|
||||
foreach (var result in results)
|
||||
{
|
||||
if (result.SubItems.Any(x => x._id == subAssort.parentId))
|
||||
{
|
||||
assortToAddTo = result;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
assortToAddTo.SubItems.Add(subAssort);
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
public static List<FlatAssort> FlattenLiveAssorts(Assort liveAssorts)
|
||||
{
|
||||
var results = new List<FlatAssort>();
|
||||
foreach (var assort in liveAssorts.items.Where(x => x.slotId == "hideout"))
|
||||
{
|
||||
var level = liveAssorts.loyal_level_items.FirstOrDefault(x => x.Key == assort._id);
|
||||
var barterDetails = liveAssorts.barter_scheme.FirstOrDefault(x => x.Key == assort._id);
|
||||
var firstBarterDetails = barterDetails.Value[0].First();
|
||||
|
||||
results.Add(new FlatAssort
|
||||
{
|
||||
AssortId = assort._id,
|
||||
ItemId = assort._tpl,
|
||||
ItemName = ItemTemplateHelper.GetNameById(assort._tpl),
|
||||
Level = level.Value,
|
||||
IsMoney = barterDetails.Value.Count == 1 && ItemTemplateHelper.IsMoney(firstBarterDetails._tpl),
|
||||
BarterDetails = barterDetails.Value.First(),
|
||||
});
|
||||
}
|
||||
|
||||
// Add in sub items
|
||||
foreach (var subAssort in liveAssorts.items.Where(x => x.slotId != "hideout"))
|
||||
{
|
||||
// find parent item in assort list we created
|
||||
var assortToAddTo = results.Find(x => x.AssortId == subAssort.parentId);
|
||||
if (assortToAddTo is null)
|
||||
{
|
||||
// check items subitems as some have mods of their own
|
||||
foreach (var result in results)
|
||||
{
|
||||
if (result.SubItems.Any(x => x._id == subAssort.parentId))
|
||||
{
|
||||
assortToAddTo = result;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
assortToAddTo.SubItems.Add(subAssort);
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
public class FlatAssort
|
||||
{
|
||||
public FlatAssort()
|
||||
{
|
||||
SubItems = new List<Assort.Item>();
|
||||
BarterDetails = new List<Assort.BarterDetails>();
|
||||
}
|
||||
|
||||
public string AssortId { get; set; }
|
||||
public string ItemId { get; set; }
|
||||
public string ItemName { get; set; }
|
||||
public List<Assort.Item> SubItems { get; set; }
|
||||
public int Level { get; set; }
|
||||
public bool IsMoney { get; set; }
|
||||
public List<Assort.BarterDetails> BarterDetails { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
}
|
14
AssortUpdater/AssortUpdater.csproj
Normal file
14
AssortUpdater/AssortUpdater.csproj
Normal file
@ -0,0 +1,14 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\AssortValidator.Common\AssortValidator.Common.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
194
AssortUpdater/Program.cs
Normal file
194
AssortUpdater/Program.cs
Normal file
@ -0,0 +1,194 @@
|
||||
using AssortHelpers.Common.Helpers;
|
||||
using AssortHelpers.Helpers;
|
||||
using AssortUpdater;
|
||||
using AssortValidator.Common.Helpers;
|
||||
using static AssortUpdater.AssortFlattener;
|
||||
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
var inputPath = CreateWorkingFolders();
|
||||
InputFileHelper.SetInputFiles(inputPath);
|
||||
|
||||
var existingAssortData = AssortHelper.GetAssortData();
|
||||
var liveAssortData = AssortHelper.GetLiveAssortData();
|
||||
|
||||
var questData = QuestHelper.GetQuestData("quests");
|
||||
var questAssortData = QuestHelper.GetQuestAssortUnlocks(questData.Values.ToList());
|
||||
|
||||
foreach (var trader in liveAssortData)
|
||||
{
|
||||
var traderId = TraderHelper.GetTraderIdByName(trader.Key);
|
||||
var traderQuests = questData.Where(x=>x.Value.traderId == traderId);
|
||||
var traderAssortData = questAssortData.Where(x => x.TraderId == traderId);
|
||||
|
||||
var liveAssorts = trader.Value;
|
||||
var existingAssorts = existingAssortData[trader.Key];
|
||||
var mergedAssortData = liveAssorts;
|
||||
|
||||
var flattenedLiveAssorts = AssortFlattener.FlattenLiveAssorts(liveAssorts);
|
||||
var flattenedExistingAssorts = AssortFlattener.FlattenExistingAssorts(existingAssorts);
|
||||
|
||||
//LogItemsMissingInLiveAssorts(trader.Key.ToString(), flattenedExistingAssorts, flattenedLiveAssorts);
|
||||
|
||||
//LogItemsMissingInExistingAssorts(trader.Key.ToString(), flattenedExistingAssorts, flattenedLiveAssorts);
|
||||
|
||||
|
||||
var result = CreateMergedFlattenedAssorts(trader.Key.ToString(), flattenedLiveAssorts, flattenedExistingAssorts);
|
||||
|
||||
|
||||
// generate trader specific assort quest data, write out to file
|
||||
var questAssorts = QuestHelper.CreateQuestAssortsList(traderAssortData);
|
||||
//JsonWriter.WriteJson(questAssorts, traderId, Directory.GetCurrentDirectory(), "questassort");
|
||||
}
|
||||
}
|
||||
|
||||
private static List<FlatAssort> CreateMergedFlattenedAssorts(string trader, List<FlatAssort> flattenedLiveAssorts, List<FlatAssort> flattenedExistingAssorts)
|
||||
{
|
||||
var completeAssorts = new List<FlatAssort>();
|
||||
|
||||
// Add live assorts
|
||||
foreach (var liveAssort in flattenedLiveAssorts)
|
||||
{
|
||||
completeAssorts.Add(liveAssort);
|
||||
}
|
||||
LoggingHelpers.LogSuccess($"{trader} Added {flattenedLiveAssorts.Count} items from live");
|
||||
|
||||
|
||||
// Check for missing existing assorts and add those
|
||||
var ExistingItemCount = 0;
|
||||
foreach (var existingAssort in flattenedExistingAssorts)
|
||||
{
|
||||
var matchInCompleteAssorts = GetMatchingAssortFromCompleteList(trader, existingAssort, completeAssorts);
|
||||
if (matchInCompleteAssorts is null)
|
||||
{
|
||||
// no assort found, add
|
||||
LoggingHelpers.LogWarning($"{trader} Adding Item found in existing assorts but not live: {existingAssort.ItemId} {existingAssort.ItemName} Level: {existingAssort.Level}");
|
||||
completeAssorts.Add(existingAssort);
|
||||
ExistingItemCount++;
|
||||
}
|
||||
}
|
||||
|
||||
LoggingHelpers.LogSuccess($"{trader} Added {ExistingItemCount} existing items");
|
||||
return completeAssorts;
|
||||
}
|
||||
|
||||
private static FlatAssort GetMatchingAssortFromCompleteList(string traderName, FlatAssort assortToFind, List<FlatAssort> completeAssorts)
|
||||
{
|
||||
var existingAssort = completeAssorts.Where(x => x.ItemId == assortToFind.ItemId
|
||||
&& x.Level == assortToFind.Level);
|
||||
|
||||
// check only one item found
|
||||
if (existingAssort?.Count() == 1)
|
||||
{
|
||||
//LoggingHelpers.LogSuccess($"{traderName} match found for item: {assortToFind.ItemId} {assortToFind.ItemName} Level: {assortToFind.Level}");
|
||||
return existingAssort.First();
|
||||
}
|
||||
|
||||
if (existingAssort?.Count() > 1)
|
||||
{
|
||||
// try and get it by money
|
||||
existingAssort = completeAssorts.Where( x=> x.ItemId == assortToFind.ItemId
|
||||
&& x.Level == assortToFind.Level
|
||||
&& x.IsMoney == assortToFind.IsMoney);
|
||||
|
||||
if (existingAssort?.Count() == 1)
|
||||
{
|
||||
return existingAssort.First();
|
||||
}
|
||||
if (existingAssort?.Count() > 1)
|
||||
{
|
||||
existingAssort = completeAssorts.Where(x => x.ItemId == assortToFind.ItemId
|
||||
&& x.Level == assortToFind.Level
|
||||
&& x.IsMoney == assortToFind.IsMoney
|
||||
&& x.SubItems.Count == assortToFind.SubItems.Count
|
||||
&& x.BarterDetails[0].count == assortToFind.BarterDetails[0].count);
|
||||
|
||||
if ( existingAssort?.Count() == 1)
|
||||
{
|
||||
return existingAssort.First();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//LoggingHelpers.LogError($"{traderName} No match found for item: {assortToFind.ItemId} {assortToFind.ItemName} Level: {assortToFind.Level}");
|
||||
return null;
|
||||
}
|
||||
|
||||
private static void LogItemsMissingInExistingAssorts(string traderName, List<AssortFlattener.FlatAssort> flattenedExistingAssorts, List<AssortFlattener.FlatAssort> flattenedLiveAssorts)
|
||||
{
|
||||
foreach (var liveAssort in flattenedLiveAssorts)
|
||||
{
|
||||
// get live assort, match by level and item tpl
|
||||
var existingAssort = flattenedExistingAssorts.Where(x => x.ItemId == liveAssort.ItemId && x.Level == liveAssort.Level);
|
||||
|
||||
if (existingAssort.Count() > 1)
|
||||
{
|
||||
// we have multiple matches, lets compare by number of rewards
|
||||
existingAssort = flattenedExistingAssorts.Where(x => x.ItemId == liveAssort.ItemId
|
||||
&& x.Level == liveAssort.Level
|
||||
&& x.BarterDetails.Count == liveAssort.BarterDetails.Count
|
||||
&& x.SubItems.Count == liveAssort.SubItems.Count
|
||||
&& x.IsMoney == liveAssort.IsMoney);
|
||||
if (existingAssort is null)
|
||||
{
|
||||
LoggingHelpers.LogError($"{traderName} multiple matches found for item: {liveAssort.ItemId} {liveAssort.ItemName} Level: {liveAssort.Level}");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (liveAssort is null)
|
||||
{
|
||||
LoggingHelpers.LogError($"{traderName} unable to find matching live assort for item: {liveAssort.ItemId} {liveAssort.ItemName} Level: {liveAssort.Level}");
|
||||
}
|
||||
else
|
||||
{
|
||||
LoggingHelpers.LogSuccess($"{traderName} found matching live assort for item: {liveAssort.ItemId} {liveAssort.ItemName} Level: {liveAssort.Level}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void LogItemsMissingInLiveAssorts(string traderName, List<AssortFlattener.FlatAssort> flattenedExistingAssorts, List<AssortFlattener.FlatAssort> flattenedLiveAssorts)
|
||||
{
|
||||
foreach (var existingAssort in flattenedExistingAssorts)
|
||||
{
|
||||
// get live assort, match by level and item tpl
|
||||
var liveAssort = flattenedLiveAssorts.Where(x => x.ItemId == existingAssort.ItemId && x.Level == existingAssort.Level);
|
||||
|
||||
if (liveAssort.Count() > 1)
|
||||
{
|
||||
// we have multiple matches, lets compare by number of rewards
|
||||
liveAssort = flattenedLiveAssorts.Where(x => x.ItemId == existingAssort.ItemId
|
||||
&& x.Level == existingAssort.Level
|
||||
&& x.BarterDetails.Count == existingAssort.BarterDetails.Count
|
||||
&& x.SubItems.Count == existingAssort.SubItems.Count
|
||||
&& x.IsMoney == existingAssort.IsMoney);
|
||||
if (liveAssort.Count() > 1)
|
||||
{
|
||||
LoggingHelpers.LogError($"{traderName} multiple matches found for item: {existingAssort.ItemId} {existingAssort.ItemName} Level: {existingAssort.Level}");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (liveAssort is null)
|
||||
{
|
||||
LoggingHelpers.LogError($"{traderName} unable to find matching existing assort for item: {existingAssort.ItemId} {existingAssort.ItemName} Level: {existingAssort.Level}");
|
||||
}
|
||||
else
|
||||
{
|
||||
LoggingHelpers.LogSuccess($"{traderName} found matching existing assort for item: {existingAssort.ItemId} {existingAssort.ItemName} Level: {existingAssort.Level}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static string CreateWorkingFolders()
|
||||
{
|
||||
var workingPath = Directory.GetCurrentDirectory();
|
||||
// create input folder
|
||||
var inputPath = $"{workingPath}//input";
|
||||
DiskHelpers.CreateDirIfDoesntExist(inputPath);
|
||||
|
||||
return inputPath;
|
||||
}
|
||||
}
|
30
AssortValidator.Common/JsonWriter.cs
Normal file
30
AssortValidator.Common/JsonWriter.cs
Normal file
@ -0,0 +1,30 @@
|
||||
using AssortHelpers.Helpers;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text.Encodings.Web;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace AssortValidator.Common
|
||||
{
|
||||
public static class JsonWriter
|
||||
{
|
||||
public static void WriteJson<T>(T itemToSerialise, string outputFolderName, string workingPath, string fileName)
|
||||
{
|
||||
var outputPath = $"{workingPath}\\output\\{outputFolderName}";
|
||||
DiskHelpers.CreateDirIfDoesntExist(outputPath);
|
||||
|
||||
var options = new JsonSerializerOptions
|
||||
{
|
||||
WriteIndented = true,
|
||||
IgnoreNullValues = true,
|
||||
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
|
||||
|
||||
};
|
||||
var json = JsonSerializer.Serialize(itemToSerialise, options);
|
||||
File.WriteAllText($"{outputPath}\\{fileName}.json", json);
|
||||
|
||||
|
||||
Console.WriteLine($"wrote {fileName}.json file to {outputPath}");
|
||||
}
|
||||
}
|
||||
}
|
@ -27,6 +27,7 @@ namespace AssortValidator.Common.Models
|
||||
{
|
||||
public string _id { get; set; }
|
||||
public string _tpl { get; set; }
|
||||
public string ItemName { get; set; }
|
||||
public string parentId { get; set; }
|
||||
public string slotId { get; set; }
|
||||
public Upd upd { get; set; }
|
||||
|
Loading…
x
Reference in New Issue
Block a user