Initial commit of assort generator code
This commit is contained in:
parent
efc5bedace
commit
e21ccb711c
248814
AssortGenerator.Common/Assets/items.json
Normal file
248814
AssortGenerator.Common/Assets/items.json
Normal file
File diff suppressed because it is too large
Load Diff
17
AssortGenerator.Common/AssortGenerator.Common.csproj
Normal file
17
AssortGenerator.Common/AssortGenerator.Common.csproj
Normal file
@ -0,0 +1,17 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\AssortGenerator.Models\AssortGenerator.Models.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Update="Assets\items.json">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
22
AssortGenerator.Common/DiskHelpers.cs
Normal file
22
AssortGenerator.Common/DiskHelpers.cs
Normal file
@ -0,0 +1,22 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
|
||||
namespace Common
|
||||
{
|
||||
public static class DiskHelpers
|
||||
{
|
||||
public static void CreateDirIfDoesntExist(string path)
|
||||
{
|
||||
if (!Directory.Exists($"{path}"))
|
||||
{
|
||||
//create dump dir
|
||||
Directory.CreateDirectory($"{path}");
|
||||
}
|
||||
}
|
||||
|
||||
public static string[] GetJsonFiles(string path)
|
||||
{
|
||||
return Directory.GetFiles(path, "*.json", SearchOption.TopDirectoryOnly);
|
||||
}
|
||||
}
|
||||
}
|
25
AssortGenerator.Common/Extensions/StringToolsExtensions.cs
Normal file
25
AssortGenerator.Common/Extensions/StringToolsExtensions.cs
Normal file
@ -0,0 +1,25 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Common.Extensions
|
||||
{
|
||||
public static class StringToolsExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Add a string to a list only if it doesnt already exist
|
||||
/// </summary>
|
||||
public static void AddUnique(this IList<string> self, string item)
|
||||
{
|
||||
if (!self.Contains(item))
|
||||
self.Add(item);
|
||||
}
|
||||
|
||||
public static void AddUniqueRange(this IList<string> self, IList<string> itemsToAdd)
|
||||
{
|
||||
foreach (var item in itemsToAdd)
|
||||
{
|
||||
if (!self.Contains(item))
|
||||
self.Add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
21
AssortGenerator.Common/Helpers/InputFileHelper.cs
Normal file
21
AssortGenerator.Common/Helpers/InputFileHelper.cs
Normal file
@ -0,0 +1,21 @@
|
||||
using Common;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace AssortGenerator.Common.Helpers
|
||||
{
|
||||
public static class InputFileHelper
|
||||
{
|
||||
private static List<string> _inputFilePaths;
|
||||
|
||||
public static void SetInputFiles(string assortsPath)
|
||||
{
|
||||
_inputFilePaths = DiskHelpers.GetJsonFiles(assortsPath).ToList();
|
||||
}
|
||||
|
||||
public static IEnumerable<string> GetInputFilePaths()
|
||||
{
|
||||
return _inputFilePaths;
|
||||
}
|
||||
}
|
||||
}
|
63
AssortGenerator.Common/Helpers/QuestHelper.cs
Normal file
63
AssortGenerator.Common/Helpers/QuestHelper.cs
Normal file
@ -0,0 +1,63 @@
|
||||
using AssortGenerator.Models.Input;
|
||||
using AssortGenerator.Models.Other;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace AssortGenerator.Common.Helpers
|
||||
{
|
||||
public static class QuestHelper
|
||||
{
|
||||
private static QuestRoot _questData;
|
||||
private static List<AssortUnlocks> _assortUnlocks;
|
||||
public static QuestRoot GetQuestData()
|
||||
{
|
||||
if (_questData == null)
|
||||
{
|
||||
var questFilePath = InputFileHelper.GetInputFilePaths().FirstOrDefault(x => x.Contains("resp.client.quest.list"));
|
||||
var questDataJson = File.ReadAllText(questFilePath);
|
||||
_questData = JsonSerializer.Deserialize<QuestRoot>(questDataJson);
|
||||
}
|
||||
|
||||
return _questData;
|
||||
}
|
||||
|
||||
public static List<AssortUnlocks> GetAssortUnlocks()
|
||||
{
|
||||
if (_assortUnlocks == null)
|
||||
{
|
||||
_assortUnlocks = new List<AssortUnlocks>();
|
||||
foreach (var quest in GetQuestData().data)
|
||||
{
|
||||
if (quest._id == "5b478b1886f7744d1b23c57d")
|
||||
{
|
||||
var x = 1;
|
||||
}
|
||||
|
||||
foreach (var reward in quest.rewards.Success)
|
||||
{
|
||||
if (string.Equals(reward.type, "assortmentunlock", System.StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
_assortUnlocks.Add(new AssortUnlocks
|
||||
{
|
||||
AssortUnlockId = reward.id,
|
||||
ItemUnlockedId = reward.target,
|
||||
ItemUnlockedTemplateId = reward.items[0]._tpl,
|
||||
LoyaltyLevel = (int)reward.loyaltyLevel,
|
||||
QuestId = quest._id,
|
||||
QuestRewardId = reward.id,
|
||||
TraderId = reward.traderId,
|
||||
TraderType = TraderHelper.GetTraderTypeById(reward.traderId),
|
||||
Criteria = "Success"
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return _assortUnlocks;
|
||||
}
|
||||
}
|
||||
}
|
45
AssortGenerator.Common/Helpers/TraderHelper.cs
Normal file
45
AssortGenerator.Common/Helpers/TraderHelper.cs
Normal file
@ -0,0 +1,45 @@
|
||||
using AssortGenerator.Models.Other;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace AssortGenerator.Common.Helpers
|
||||
{
|
||||
public static class TraderHelper
|
||||
{
|
||||
private static Dictionary<Trader, string> _traders;
|
||||
|
||||
public static Dictionary<Trader, string> GetTraders()
|
||||
{
|
||||
if (_traders == null)
|
||||
{
|
||||
_traders = new Dictionary<Trader, string>
|
||||
{
|
||||
{ Trader.Prapor, "54cb50c76803fa8b248b4571" },
|
||||
{ Trader.Therapist, "54cb57776803fa99248b456e"},
|
||||
{ Trader.Skier, "58330581ace78e27b8b10cee"},
|
||||
{ Trader.Peacekeeper, "5935c25fb3acc3127c3d8cd9"},
|
||||
{ Trader.Mechanic, "5a7c2eca46aef81a7ca2145d"},
|
||||
{ Trader.Ragman, "5ac3b934156ae10c4430e83c"},
|
||||
{ Trader.Jaeger, "5c0647fdd443bc2504c2d371"}
|
||||
};
|
||||
}
|
||||
|
||||
return _traders;
|
||||
}
|
||||
|
||||
public static Trader GetTraderTypeById(string traderId)
|
||||
{
|
||||
Trader returnType = 0;
|
||||
foreach (var item in GetTraders())
|
||||
{
|
||||
if (item.Value == traderId)
|
||||
{
|
||||
returnType = item.Key;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return returnType;
|
||||
}
|
||||
}
|
||||
}
|
44
AssortGenerator.Common/ItemTemplateHelper.cs
Normal file
44
AssortGenerator.Common/ItemTemplateHelper.cs
Normal file
@ -0,0 +1,44 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text.Json;
|
||||
using Item = Common.Models.Item;
|
||||
|
||||
namespace AssortGenerator.Common
|
||||
{
|
||||
public static class ItemTemplateHelper
|
||||
{
|
||||
private static Dictionary<string, Item> _itemCache;
|
||||
|
||||
public static Dictionary<string, Item> Items
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_itemCache == null)
|
||||
{
|
||||
var itemsFilePath = $"{Directory.GetCurrentDirectory()}\\Assets\\items.json";
|
||||
if (!File.Exists(itemsFilePath))
|
||||
{
|
||||
throw new Exception($"Missing items.json under assets ({itemsFilePath})");
|
||||
}
|
||||
|
||||
var itemsJson = File.ReadAllText(itemsFilePath);
|
||||
_itemCache = JsonSerializer.Deserialize<Dictionary<string, Item>>(itemsJson);
|
||||
}
|
||||
|
||||
return _itemCache;
|
||||
}
|
||||
}
|
||||
|
||||
public static Item GetTemplateById(string templateId)
|
||||
{
|
||||
if (Items.ContainsKey(templateId))
|
||||
{
|
||||
return Items[templateId];
|
||||
}
|
||||
|
||||
LoggingHelpers.LogToConsole($"Could not locate item template with id {templateId}", ConsoleColor.Red);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
29
AssortGenerator.Common/JsonWriter.cs
Normal file
29
AssortGenerator.Common/JsonWriter.cs
Normal file
@ -0,0 +1,29 @@
|
||||
using Common;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text.Encodings.Web;
|
||||
using System.Text.Json;
|
||||
using System.Text.Unicode;
|
||||
|
||||
namespace AssortGenerator.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);
|
||||
|
||||
Console.WriteLine($"Writing json file to {outputPath}");
|
||||
|
||||
var options = new JsonSerializerOptions
|
||||
{
|
||||
WriteIndented = true,
|
||||
Encoder = JavaScriptEncoder.Create(UnicodeRanges.BasicLatin, UnicodeRanges.Cyrillic)
|
||||
|
||||
};
|
||||
var json = JsonSerializer.Serialize(itemToSerialise, options);
|
||||
File.WriteAllText($"{outputPath}\\{fileName}.json", json);
|
||||
}
|
||||
}
|
||||
}
|
68
AssortGenerator.Common/LoggingHelpers.cs
Normal file
68
AssortGenerator.Common/LoggingHelpers.cs
Normal file
@ -0,0 +1,68 @@
|
||||
using System;
|
||||
|
||||
namespace AssortGenerator.Common
|
||||
{
|
||||
public static class LoggingHelpers
|
||||
{
|
||||
public static string LogTimeTaken(double totalSeconds)
|
||||
{
|
||||
return Math.Round(totalSeconds, 2, MidpointRounding.ToEven).ToString();
|
||||
}
|
||||
|
||||
public static void LogWarning(string message)
|
||||
{
|
||||
Console.BackgroundColor = ConsoleColor.DarkYellow;
|
||||
Console.ForegroundColor = ConsoleColor.Black;
|
||||
|
||||
Console.Write(message);
|
||||
ResetConsoleColours();
|
||||
Console.WriteLine();
|
||||
}
|
||||
|
||||
public static void LogInfo(string message)
|
||||
{
|
||||
Console.BackgroundColor = ConsoleColor.Gray;
|
||||
Console.ForegroundColor = ConsoleColor.Black;
|
||||
|
||||
Console.Write(message);
|
||||
ResetConsoleColours();
|
||||
Console.WriteLine();
|
||||
}
|
||||
|
||||
public static void LogSuccess(string message)
|
||||
{
|
||||
Console.BackgroundColor = ConsoleColor.Green;
|
||||
Console.ForegroundColor = ConsoleColor.Black;
|
||||
|
||||
Console.Write(message);
|
||||
ResetConsoleColours();
|
||||
Console.WriteLine();
|
||||
}
|
||||
|
||||
public static void LogError(string message)
|
||||
{
|
||||
Console.BackgroundColor = ConsoleColor.Red;
|
||||
Console.ForegroundColor = ConsoleColor.White;
|
||||
|
||||
Console.Write(message);
|
||||
ResetConsoleColours();
|
||||
Console.WriteLine();
|
||||
}
|
||||
|
||||
public static void LogToConsole(string message, ConsoleColor backgroundColour = ConsoleColor.Green)
|
||||
{
|
||||
Console.BackgroundColor = backgroundColour;
|
||||
Console.ForegroundColor = ConsoleColor.Black;
|
||||
|
||||
Console.Write(message);
|
||||
ResetConsoleColours();
|
||||
Console.WriteLine();
|
||||
}
|
||||
|
||||
private static void ResetConsoleColours()
|
||||
{
|
||||
Console.BackgroundColor = ConsoleColor.Black;
|
||||
Console.ForegroundColor = ConsoleColor.White;
|
||||
}
|
||||
}
|
||||
}
|
55
AssortGenerator.Common/Models/Items.cs
Normal file
55
AssortGenerator.Common/Models/Items.cs
Normal file
@ -0,0 +1,55 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Common.Models
|
||||
{
|
||||
public class ItemsLibRoot
|
||||
{
|
||||
public List<Dictionary<string, Item>> items { get; set; }
|
||||
}
|
||||
|
||||
public class Item
|
||||
{
|
||||
public string _id { get; set; }
|
||||
public string _name { get; set; }
|
||||
public string _parent { get; set; }
|
||||
public string _type { get; set; }
|
||||
public Props _props { get; set; }
|
||||
}
|
||||
|
||||
public class Props
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string ShortName { get; set; }
|
||||
public string Description { get; set; }
|
||||
public List<Chamber> Chambers { get; set; }
|
||||
public List<Slot> Slots { get; set; }
|
||||
public string defAmmo { get; set; }
|
||||
}
|
||||
|
||||
public class Chamber
|
||||
{
|
||||
public string _name { get; set; }
|
||||
public string _id { get; set; }
|
||||
public string _parent { get; set; }
|
||||
public ChamberProps _props { get; set; }
|
||||
public bool _required { get; set; }
|
||||
public bool _mergeSlotWithChildren { get; set; }
|
||||
public string _proto { get; set; }
|
||||
}
|
||||
|
||||
public class Slot
|
||||
{
|
||||
public string _name { get; set; }
|
||||
public bool _required { get; set; }
|
||||
}
|
||||
|
||||
public class ChamberProps
|
||||
{
|
||||
public List<Filter> filters { get; set; }
|
||||
}
|
||||
|
||||
public class Filter
|
||||
{
|
||||
public List<string> filter { get; set; }
|
||||
}
|
||||
}
|
7
AssortGenerator.Models/AssortGenerator.Models.csproj
Normal file
7
AssortGenerator.Models/AssortGenerator.Models.csproj
Normal file
@ -0,0 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
11
AssortGenerator.Models/Input/CustomisationRoot.cs
Normal file
11
AssortGenerator.Models/Input/CustomisationRoot.cs
Normal file
@ -0,0 +1,11 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace AssortGenerator.Models.Input
|
||||
{
|
||||
public class CustomisationRoot
|
||||
{
|
||||
public int err { get; set; }
|
||||
public object errmsg { get; set; }
|
||||
public List<Suit> data { get; set; }
|
||||
}
|
||||
}
|
60
AssortGenerator.Models/Input/Quest.cs
Normal file
60
AssortGenerator.Models/Input/Quest.cs
Normal file
@ -0,0 +1,60 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace AssortGenerator.Models.Input
|
||||
{
|
||||
public class QuestRoot
|
||||
{
|
||||
public int err { get; set; }
|
||||
public object errmsg { get; set; }
|
||||
public List<Quest> data { get; set; }
|
||||
}
|
||||
|
||||
public class Quest
|
||||
{
|
||||
public string _id { get; set; }
|
||||
public string traderId { get; set; }
|
||||
public string location { get; set; }
|
||||
public string image { get; set; }
|
||||
public string type { get; set; }
|
||||
public bool isKey { get; set; }
|
||||
public bool restartable { get; set; }
|
||||
public bool instantComplete { get; set; }
|
||||
public bool secretQuest { get; set; }
|
||||
public int min_level { get; set; }
|
||||
public bool canShowNotificationsInGame { get; set; }
|
||||
public Rewards rewards { get; set; }
|
||||
}
|
||||
|
||||
public class Rewards
|
||||
{
|
||||
public List<RewardStatus> Started { get; set; }
|
||||
public List<RewardStatus> Success { get; set; }
|
||||
public List<RewardStatus> Fail { get; set; }
|
||||
}
|
||||
|
||||
public class RewardStatus
|
||||
{
|
||||
public string value { get; set; }
|
||||
public string id { get; set; }
|
||||
public string type { get; set; }
|
||||
public int index { get; set; }
|
||||
public string target { get; set; }
|
||||
public List<QuestRewardItem> items { get; set; }
|
||||
public int? loyaltyLevel { get; set; }
|
||||
public string traderId { get; set; }
|
||||
}
|
||||
|
||||
public class QuestRewardItem
|
||||
{
|
||||
public string _id { get; set; }
|
||||
public string _tpl { get; set; }
|
||||
public QuestRewardUpd upd { get; set; }
|
||||
public string parentId { get; set; }
|
||||
public string slotId { get; set; }
|
||||
}
|
||||
|
||||
public class QuestRewardUpd
|
||||
{
|
||||
public int StackObjectsCount { get; set; }
|
||||
}
|
||||
}
|
32
AssortGenerator.Models/Input/TraderAssort.cs
Normal file
32
AssortGenerator.Models/Input/TraderAssort.cs
Normal file
@ -0,0 +1,32 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace AssortGenerator.Models.Input
|
||||
{
|
||||
public class Items
|
||||
{
|
||||
public string _id { get; set; }
|
||||
public string _tpl { get; set; }
|
||||
public string parentId { get; set; }
|
||||
public string slotId { get; set; }
|
||||
public TraderUpd upd { get; set; }
|
||||
}
|
||||
|
||||
public class TraderUpd
|
||||
{
|
||||
public bool UnlimitedCount { get; set; }
|
||||
public int StackObjectsCount { get; set; }
|
||||
public int? BuyRestrictionMax { get; set; }
|
||||
public int? BuyRestrictionCurrent { get; set; }
|
||||
}
|
||||
|
||||
public class BarterScheme
|
||||
{
|
||||
}
|
||||
|
||||
public class LoyaltyLevelItems
|
||||
{
|
||||
Dictionary<string, int> items { get; set;}
|
||||
}
|
||||
}
|
15
AssortGenerator.Models/Other/Assortunlocks.cs
Normal file
15
AssortGenerator.Models/Other/Assortunlocks.cs
Normal file
@ -0,0 +1,15 @@
|
||||
namespace AssortGenerator.Models.Other
|
||||
{
|
||||
public class AssortUnlocks
|
||||
{
|
||||
public string QuestId { get; set; }
|
||||
public string AssortUnlockId { get; set; }
|
||||
public string QuestRewardId { get; set; }
|
||||
public string TraderId { get; set; }
|
||||
public string ItemUnlockedId { get; set; }
|
||||
public string ItemUnlockedTemplateId { get; set; }
|
||||
public Trader TraderType { get; set; }
|
||||
public int LoyaltyLevel { get; set; }
|
||||
public string Criteria { get; set; }
|
||||
}
|
||||
}
|
14
AssortGenerator.Models/Other/Trader.cs
Normal file
14
AssortGenerator.Models/Other/Trader.cs
Normal file
@ -0,0 +1,14 @@
|
||||
namespace AssortGenerator.Models.Other
|
||||
{
|
||||
public enum Trader
|
||||
{
|
||||
Unknown = 0,
|
||||
Prapor = 1,
|
||||
Therapist = 2,
|
||||
Skier = 3,
|
||||
Peacekeeper = 4,
|
||||
Mechanic = 5,
|
||||
Ragman = 6,
|
||||
Jaeger = 7
|
||||
}
|
||||
}
|
34
AssortGenerator.Models/Output/AssortRoot.cs
Normal file
34
AssortGenerator.Models/Output/AssortRoot.cs
Normal file
@ -0,0 +1,34 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace AssortGenerator.Models.Output
|
||||
{
|
||||
public class AssortRoot
|
||||
{
|
||||
public List<Item> items { get; set; }
|
||||
public Dictionary<string, object> barter_scheme { get; set; }
|
||||
public Dictionary<string, int> loyal_level_items { get; set; }
|
||||
}
|
||||
|
||||
public class Item
|
||||
{
|
||||
public string _id { get; set; }
|
||||
public string _tpl { get; set; }
|
||||
public string parentId { get; set; }
|
||||
public string slotId { get; set; }
|
||||
public Upd upd { get; set; }
|
||||
}
|
||||
|
||||
public class Upd
|
||||
{
|
||||
public bool UnlimitedCount { get; set; }
|
||||
public int StackObjectsCount { get; set; }
|
||||
public int? BuyRestrictionMax { get; set; }
|
||||
public int? BuyRestrictionCurrent { get; set; }
|
||||
}
|
||||
|
||||
public class BarterObject
|
||||
{
|
||||
public int count { get; set; }
|
||||
public string _tpl { get; set; }
|
||||
}
|
||||
}
|
67
AssortGenerator.Models/Output/Base.cs
Normal file
67
AssortGenerator.Models/Output/Base.cs
Normal file
@ -0,0 +1,67 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace AssortGenerator.Models.Output
|
||||
{
|
||||
public class BaseRoot
|
||||
{
|
||||
public List<Base> data { get; set; }
|
||||
}
|
||||
public class Base
|
||||
{
|
||||
public string _id { get; set; }
|
||||
public bool customization_seller { get; set; }
|
||||
public string name { get; set; }
|
||||
public string surname { get; set; }
|
||||
public string nickname { get; set; }
|
||||
public string location { get; set; }
|
||||
public string avatar { get; set; }
|
||||
public int balance_rub { get; set; }
|
||||
public int balance_dol { get; set; }
|
||||
public int balance_eur { get; set; }
|
||||
public bool unlockedByDefault { get; set; }
|
||||
public int discount { get; set; }
|
||||
public int discount_end { get; set; }
|
||||
public bool buyer_up { get; set; }
|
||||
public string currency { get; set; }
|
||||
public int nextResupply { get; set; }
|
||||
public Repair repair { get; set; }
|
||||
public Insurance insurance { get; set; }
|
||||
public bool medic { get; set; }
|
||||
public int gridHeight { get; set; }
|
||||
public List<LoyaltyLevel> loyaltyLevels { get; set; }
|
||||
public List<string> sell_category { get; set; }
|
||||
}
|
||||
|
||||
public class Repair
|
||||
{
|
||||
public bool availability { get; set; }
|
||||
public string quality { get; set; }
|
||||
public List<object> excluded_id_list { get; set; }
|
||||
public List<object> excluded_category { get; set; }
|
||||
public string currency { get; set; }
|
||||
public int currency_coefficient { get; set; }
|
||||
public int price_rate { get; set; }
|
||||
}
|
||||
|
||||
public class Insurance
|
||||
{
|
||||
public bool availability { get; set; }
|
||||
public int min_payment { get; set; }
|
||||
public int min_return_hour { get; set; }
|
||||
public int max_return_hour { get; set; }
|
||||
public int max_storage_time { get; set; }
|
||||
public List<object> excluded_category { get; set; }
|
||||
}
|
||||
|
||||
public class LoyaltyLevel
|
||||
{
|
||||
public object minLevel { get; set; }
|
||||
public object minSalesSum { get; set; }
|
||||
public object minStanding { get; set; }
|
||||
public int buy_price_coef { get; set; }
|
||||
public object repair_price_coef { get; set; }
|
||||
public object insurance_price_coef { get; set; }
|
||||
public int exchange_price_coef { get; set; }
|
||||
public object heal_price_coef { get; set; }
|
||||
}
|
||||
}
|
18
AssortGenerator.Models/Output/QuestAssort.cs
Normal file
18
AssortGenerator.Models/Output/QuestAssort.cs
Normal file
@ -0,0 +1,18 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace AssortGenerator.Models.Output
|
||||
{
|
||||
public class QuestAssort
|
||||
{
|
||||
public QuestAssort()
|
||||
{
|
||||
started = new Dictionary<string, string>();
|
||||
success = new Dictionary<string, string>();
|
||||
fail = new Dictionary<string, string>();
|
||||
}
|
||||
|
||||
public Dictionary<string, string> started { get; set; }
|
||||
public Dictionary<string, string> success { get; set; }
|
||||
public Dictionary<string, string> fail { get; set; }
|
||||
}
|
||||
}
|
32
AssortGenerator.Models/Output/Suits.cs
Normal file
32
AssortGenerator.Models/Output/Suits.cs
Normal file
@ -0,0 +1,32 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace AssortGenerator.Models.Input
|
||||
{
|
||||
public class Suit
|
||||
{
|
||||
public string _id { get; set; }
|
||||
public string tid { get; set; }
|
||||
public string suiteId { get; set; }
|
||||
public bool isActive { get; set; }
|
||||
public Requirements requirements { get; set; }
|
||||
}
|
||||
|
||||
public class Requirements
|
||||
{
|
||||
public int loyaltyLevel { get; set; }
|
||||
public int profileLevel { get; set; }
|
||||
public int standing { get; set; }
|
||||
public List<object> skillRequirements { get; set; }
|
||||
public List<string> questRequirements { get; set; }
|
||||
public List<ItemRequirement> itemRequirements { get; set; }
|
||||
}
|
||||
|
||||
public class ItemRequirement
|
||||
{
|
||||
public int count { get; set; }
|
||||
public string _tpl { get; set; }
|
||||
public bool onlyFunctional { get; set; }
|
||||
}
|
||||
}
|
37
AssortGenerator.sln
Normal file
37
AssortGenerator.sln
Normal file
@ -0,0 +1,37 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.31624.102
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AssortGenerator", "AssortGenerator\AssortGenerator.csproj", "{747ED3CB-DED2-47CB-9BD6-493FB05B6C2B}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AssortGenerator.Models", "AssortGenerator.Models\AssortGenerator.Models.csproj", "{BC63C9C4-A796-4C25-AC3E-8C9565F041DC}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AssortGenerator.Common", "AssortGenerator.Common\AssortGenerator.Common.csproj", "{FED37D1A-85E4-45C6-9D55-EFD05065251B}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{747ED3CB-DED2-47CB-9BD6-493FB05B6C2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{747ED3CB-DED2-47CB-9BD6-493FB05B6C2B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{747ED3CB-DED2-47CB-9BD6-493FB05B6C2B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{747ED3CB-DED2-47CB-9BD6-493FB05B6C2B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{BC63C9C4-A796-4C25-AC3E-8C9565F041DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{BC63C9C4-A796-4C25-AC3E-8C9565F041DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{BC63C9C4-A796-4C25-AC3E-8C9565F041DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{BC63C9C4-A796-4C25-AC3E-8C9565F041DC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{FED37D1A-85E4-45C6-9D55-EFD05065251B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{FED37D1A-85E4-45C6-9D55-EFD05065251B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{FED37D1A-85E4-45C6-9D55-EFD05065251B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{FED37D1A-85E4-45C6-9D55-EFD05065251B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {91DF85C3-CCE8-4AE9-96FE-CA2DDE52AE42}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
13
AssortGenerator/AssortGenerator.csproj
Normal file
13
AssortGenerator/AssortGenerator.csproj
Normal file
@ -0,0 +1,13 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\AssortGenerator.Common\AssortGenerator.Common.csproj" />
|
||||
<ProjectReference Include="..\AssortGenerator.Models\AssortGenerator.Models.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
192
AssortGenerator/Program.cs
Normal file
192
AssortGenerator/Program.cs
Normal file
@ -0,0 +1,192 @@
|
||||
using AssortGenerator.Common;
|
||||
using AssortGenerator.Common.Helpers;
|
||||
using AssortGenerator.Models.Input;
|
||||
using AssortGenerator.Models.Other;
|
||||
using AssortGenerator.Models.Output;
|
||||
using Common;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace AssortGenerator
|
||||
{
|
||||
partial class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
var assortsPath = CreateWorkingFolders();
|
||||
InputFileHelper.SetInputFiles(assortsPath);
|
||||
|
||||
// Get trader assort files from assorts input folder
|
||||
var traderAssortFilePaths = InputFileHelper.GetInputFilePaths().Where(x => TraderHelper.GetTraders().Values.Any(x.Contains)).ToList();
|
||||
|
||||
foreach (var trader in TraderHelper.GetTraders())
|
||||
{
|
||||
// Get relevant trader dump
|
||||
var assortDumpPath = traderAssortFilePaths.Find(x => x.Contains(trader.Value));
|
||||
|
||||
// convert input dump json into object
|
||||
var json = File.ReadAllText(assortDumpPath);
|
||||
var jsonObject = JsonDocument.Parse(json);
|
||||
|
||||
// find root data node
|
||||
var data = jsonObject.RootElement.GetProperty("data");
|
||||
|
||||
// find items node and parse into object
|
||||
string itemsJson = data.GetProperty("items").ToString();
|
||||
List<Item> items = JsonSerializer.Deserialize<List<Item>>(itemsJson);
|
||||
|
||||
// Find barter scheme node and parse into object
|
||||
var barterSchemeJson = data.GetProperty("barter_scheme").ToString();
|
||||
var barterSchemeItems = JsonSerializer.Deserialize<Dictionary<string, object>>(barterSchemeJson);
|
||||
|
||||
// Find loyalty level node and parse into object
|
||||
var loyaltyLevelItemsJson = data.GetProperty("loyal_level_items").ToString();
|
||||
var loyaltyLevelItems = JsonSerializer.Deserialize<Dictionary<string, int>>(loyaltyLevelItemsJson);
|
||||
|
||||
WriteOutputFilesForTrader(trader, items, barterSchemeItems, loyaltyLevelItems);
|
||||
}
|
||||
}
|
||||
|
||||
private static string CreateWorkingFolders()
|
||||
{
|
||||
var workingPath = Directory.GetCurrentDirectory();
|
||||
// create input folder
|
||||
var inputPath = $"{workingPath}//input";
|
||||
DiskHelpers.CreateDirIfDoesntExist(inputPath);
|
||||
|
||||
// create sub folder in input called assorts
|
||||
var assortsPath = $"{inputPath}//assorts";
|
||||
DiskHelpers.CreateDirIfDoesntExist(assortsPath);
|
||||
|
||||
// create output folder
|
||||
var outputPath = $"{workingPath}//output";
|
||||
DiskHelpers.CreateDirIfDoesntExist(outputPath);
|
||||
|
||||
// create traders sub-folder
|
||||
var tradersPath = $"{outputPath}//traders";
|
||||
DiskHelpers.CreateDirIfDoesntExist(tradersPath);
|
||||
|
||||
return assortsPath;
|
||||
}
|
||||
|
||||
private static BaseRoot GetTraderData(IEnumerable<string> filesInAssortsFolder)
|
||||
{
|
||||
var traderDataPath = filesInAssortsFolder.FirstOrDefault(x => x.Contains("resp.client.trading.api.traderSettings"));
|
||||
var traderDataJson = File.ReadAllText(traderDataPath);
|
||||
return JsonSerializer.Deserialize<BaseRoot>(traderDataJson);
|
||||
}
|
||||
|
||||
private static void WriteOutputFilesForTrader(KeyValuePair<Trader, string> trader,
|
||||
List<Item> items,
|
||||
Dictionary<string, object>
|
||||
barterSchemeItems,
|
||||
Dictionary<string, int> loyaltyLevelItems)
|
||||
{
|
||||
var workingPath = Directory.GetCurrentDirectory();
|
||||
|
||||
var traderData = GetTraderData(InputFileHelper.GetInputFilePaths());
|
||||
var traderFolderPath = $"traders\\{trader.Value}";
|
||||
|
||||
// create assort file, serialise into json and save into output folder
|
||||
var outputAssortFile = new AssortRoot
|
||||
{
|
||||
items = items,
|
||||
barter_scheme = barterSchemeItems,
|
||||
loyal_level_items = loyaltyLevelItems
|
||||
};
|
||||
JsonWriter.WriteJson(outputAssortFile, traderFolderPath, workingPath, "assorts");
|
||||
|
||||
// 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 = GenerateQuestAssort(trader.Key, outputAssortFile);
|
||||
JsonWriter.WriteJson(questAssort, traderFolderPath, workingPath, "questassort");
|
||||
|
||||
// create suits file for ragman
|
||||
if (trader.Key == Trader.Ragman)
|
||||
{
|
||||
var customisationFilePath = InputFileHelper.GetInputFilePaths().FirstOrDefault(x => x.Contains("resp.client.trading.customization"));
|
||||
var traderDataJson = File.ReadAllText(customisationFilePath);
|
||||
var suitData = JsonSerializer.Deserialize<CustomisationRoot>(traderDataJson);
|
||||
|
||||
var outputSuitData = new List<Suit>();
|
||||
outputSuitData.AddRange(suitData.data);
|
||||
|
||||
JsonWriter.WriteJson(outputSuitData, traderFolderPath, workingPath, "suits");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private static QuestAssort GenerateQuestAssort(Trader trader, AssortRoot assortRoot)
|
||||
{
|
||||
var result = new QuestAssort();
|
||||
var questData = QuestHelper.GetQuestData();
|
||||
|
||||
// Find assortunlocks
|
||||
List<AssortUnlocks> assortUnlocks = QuestHelper.GetAssortUnlocks();
|
||||
|
||||
// TODO: find out how the fuck the assort unlock is associated to the quest
|
||||
foreach (var assortUnlock in assortUnlocks.Where(x => x.TraderType == trader))
|
||||
{
|
||||
// Get unlock items name
|
||||
var assortItemName = ItemTemplateHelper.Items.FirstOrDefault(x=> x.Key == assortUnlock.ItemUnlockedTemplateId).Value._name;
|
||||
|
||||
|
||||
// TODO: handle started
|
||||
// TODO: handle fail
|
||||
|
||||
// handle quest success for now
|
||||
if (assortUnlock.Criteria == "Success")
|
||||
{
|
||||
//Find assorts that match the quest unlocks item template
|
||||
var assortItemsThatMatch = assortRoot.items.Where(x => x._tpl == assortUnlock.ItemUnlockedTemplateId).ToList();
|
||||
|
||||
// no assort found for this unlock, log and skip it
|
||||
if (assortItemsThatMatch == null || assortItemsThatMatch.Count == 0)
|
||||
{
|
||||
LoggingHelpers.LogError($"{trader} item templateId: {assortUnlock.ItemUnlockedTemplateId}. questId: {assortUnlock.QuestId}. no assort item found. ({assortItemName})");
|
||||
continue;
|
||||
}
|
||||
|
||||
// Iterate over assorts that match. goal is to find which assort fits the best (traders assort has same loyalty level unlock as quest expects)
|
||||
string assortIdUnlockedByQuest = string.Empty;
|
||||
foreach (var match in assortItemsThatMatch)
|
||||
{
|
||||
// Look up item in Loyalty Level array
|
||||
|
||||
var associatedLoyaltyLevelItem = assortRoot.loyal_level_items.FirstOrDefault(x => x.Key == match._id);
|
||||
if (associatedLoyaltyLevelItem.Key == null)
|
||||
{
|
||||
// end loop if no record found
|
||||
LoggingHelpers.LogError($"{trader} item templateId: {assortUnlock.ItemUnlockedTemplateId}. questId: {assortUnlock.QuestId}. no loyalty record found. ({assortItemName})");
|
||||
break;
|
||||
}
|
||||
|
||||
if (associatedLoyaltyLevelItem.Value != assortUnlock.LoyaltyLevel)
|
||||
{
|
||||
// loyalty level is different to what was expected, skip
|
||||
LoggingHelpers.LogWarning($"{trader} item templateId: {assortUnlock.ItemUnlockedTemplateId}. questId: {assortUnlock.QuestId}. no match found in LL array. LL{associatedLoyaltyLevelItem.Value}. questListLevel: {assortUnlock.LoyaltyLevel}. ({assortItemName})");
|
||||
continue;
|
||||
}
|
||||
|
||||
//LoggingHelpers.LogInfo($"{trader} item templateId: {assortUnlock.ItemUnlockedTemplateId} {assortItemName}. MATCH FOUND. LL{assortUnlock.LoyaltyLevel}");
|
||||
assortIdUnlockedByQuest = associatedLoyaltyLevelItem.Key;
|
||||
}
|
||||
if (result.success.ContainsKey(assortUnlock.QuestId))
|
||||
{
|
||||
LoggingHelpers.LogWarning($"{trader} item templateId: {assortUnlock.ItemUnlockedTemplateId}. questId: {assortUnlock.QuestId}. ALREADY EXISTS. SKIPPING. ({assortItemName})");
|
||||
continue;
|
||||
}
|
||||
|
||||
LoggingHelpers.LogSuccess($"{trader} item templateId: {assortUnlock.ItemUnlockedTemplateId}. questId: {assortUnlock.QuestId}. ADDING TO QUEST-ASSORT. ({assortItemName})");
|
||||
result.success.Add(assortUnlock.QuestId, assortIdUnlockedByQuest);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user