Advertisement
Krythic

Raidable Bases Spreadsheet Parser

Feb 8th, 2023
1,000
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.25 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Text;
  5.  
  6. namespace Raidable_Bases_Spreadsheet_Parser
  7. {
  8.     public static class Program
  9.     {
  10.         public enum DifficultyType
  11.         {
  12.             Easy = 0,
  13.             Medium = 1,
  14.             Hard = 2,
  15.             Nightmare = 3
  16.         }
  17.  
  18.         /// <summary>
  19.         /// Also doubles as column index
  20.         /// </summary>
  21.         public enum SpreadSheetColumnType
  22.         {
  23.             Shortname = 0,
  24.             QuantityEasy = 1,
  25.             QuantityMedium = 2,
  26.             QuantityHard = 3,
  27.             QuantityNightmare = 4,
  28.             ProbabilityEasy = 5,
  29.             ProbabilityMedium = 6,
  30.             ProbabilityHard = 7,
  31.             ProbabilityNightmare = 8,
  32.             StackSize = 9
  33.  
  34.         }
  35.  
  36.         private static double Normalize(double value)
  37.         {
  38.             return value / 100.0D;
  39.         }
  40.  
  41.         public static void Main(string[] args)
  42.         {
  43.             /**
  44.              * Create and Initialize the Database
  45.              */
  46.             List<GameItem> database = new List<GameItem>();
  47.             /**
  48.              * Begin parsing the spreadsheet.
  49.              */
  50.             Console.WriteLine("Example File Path: \"C:/Users/Krythic/Desktop/LootTableData.txt\"");
  51.             Console.Write("Input File Path:");
  52.             string path = Console.ReadLine();
  53.             if (File.Exists(path))
  54.             {
  55.                 string[] spreadsheet = File.ReadAllLines(path);
  56.                 foreach (string rowData in spreadsheet)
  57.                 {
  58.                     // Clear the GameItem Cache
  59.                     GameItem gameItem = new GameItem();
  60.                     string[] columnData = rowData.Split('\t');
  61.                     for (int i = 0; i < columnData.Length; i++)
  62.                     {
  63.                         switch (i)
  64.                         {
  65.                             /**
  66.                              * Parse Short Name Column
  67.                              */
  68.                             case (int)SpreadSheetColumnType.Shortname:
  69.                                 string shortname = columnData[i];
  70.                                 if (shortname != null && shortname.Length > 0)
  71.                                 {
  72.                                     gameItem.Shortname = shortname;
  73.                                 }
  74.                                 break;
  75.                             /**
  76.                              * Parse Difficulty Columns
  77.                              */
  78.                             case (int)SpreadSheetColumnType.QuantityEasy:
  79.                             case (int)SpreadSheetColumnType.QuantityMedium:
  80.                             case (int)SpreadSheetColumnType.QuantityHard:
  81.                             case (int)SpreadSheetColumnType.QuantityNightmare:
  82.                                 string quantityColumnData = columnData[i];
  83.  
  84.                                 if (quantityColumnData != null && quantityColumnData.Length > 0)
  85.                                 {
  86.                                     if (quantityColumnData.Equals("--"))
  87.                                     {
  88.                                         quantityColumnData = "0-0";
  89.                                     }
  90.                                     string[] minMax = quantityColumnData.Split('-');
  91.                                     if (minMax.Length == 2)
  92.                                     {
  93.                                         int minimum = Int32.Parse(minMax[0]);
  94.                                         int maximum = Int32.Parse(minMax[1]);
  95.                                         gameItem.AmountMin[ConvertToDifficultyType((SpreadSheetColumnType)i)] = minimum;
  96.                                         gameItem.Amount[ConvertToDifficultyType((SpreadSheetColumnType)i)] = maximum;
  97.                                     }
  98.                                 }
  99.                                 break;
  100.  
  101.                             /**
  102.                              * Parse Probability Columns
  103.                              */
  104.                             case (int)SpreadSheetColumnType.ProbabilityEasy:
  105.                             case (int)SpreadSheetColumnType.ProbabilityMedium:
  106.                             case (int)SpreadSheetColumnType.ProbabilityHard:
  107.                             case (int)SpreadSheetColumnType.ProbabilityNightmare:
  108.                                 string probabilityColumnData = columnData[i];
  109.                                 if (probabilityColumnData != null && probabilityColumnData.Length > 0)
  110.                                 {
  111.                                     if (probabilityColumnData.Equals("--"))
  112.                                     {
  113.                                         probabilityColumnData = "0.00%";
  114.                                     }
  115.                                     double probability = Double.Parse(probabilityColumnData.Replace("%", ""));
  116.                                     gameItem.Probability[ConvertToDifficultyType((SpreadSheetColumnType)i)] = Normalize(probability);
  117.  
  118.                                 }
  119.                                 break;
  120.                             /**
  121.                              * Parse Stack Size
  122.                              */
  123.                             case (int)SpreadSheetColumnType.StackSize:
  124.                                 gameItem.StackSize = Int32.Parse(columnData[i]);
  125.                                 break;
  126.  
  127.                             default:
  128.                                 break;
  129.                         }
  130.  
  131.                     }
  132.                     /**
  133.                      * Add the parsed item to the database
  134.                      */
  135.                     database.Add(gameItem);
  136.                 }
  137.                 Console.WriteLine("Successfully parsed " + database.Count + " GameItems");
  138.                 Console.WriteLine("Generating JSON Files...");
  139.                 /**
  140.                  * Generate the JSON files
  141.                  */
  142.                 DifficultyType[] difficulties = (DifficultyType[])Enum.GetValues(typeof(DifficultyType)); // Cached for performance
  143.                 Dictionary<DifficultyType, StringBuilder> builders = new Dictionary<DifficultyType, StringBuilder>();
  144.                 foreach (DifficultyType difficultyType in difficulties)
  145.                 {
  146.                     builders.Add(difficultyType, new StringBuilder());
  147.                 }
  148.                 foreach (DifficultyType difficultyType in difficulties)
  149.                 {
  150.                     StringBuilder difficultyBuilder = builders[difficultyType];
  151.                     difficultyBuilder.AppendLine("[");
  152.                     foreach (GameItem item in database)
  153.                     {
  154.                         difficultyBuilder.AppendLine("{");
  155.                         difficultyBuilder.AppendLine("\"shortname\": \"" + item.Shortname + "\",");
  156.                         difficultyBuilder.AppendLine("\"name\": null,");
  157.                         difficultyBuilder.AppendLine("\"amount\":" + item.Amount[difficultyType] + ",");
  158.                         difficultyBuilder.AppendLine("\"skin\": " + item.Skin + ",");
  159.                         difficultyBuilder.AppendLine("\"amountmin\": " + item.AmountMin[difficultyType] + ",");
  160.                         difficultyBuilder.AppendLine("\"probability\": " + item.Probability[difficultyType] + ",");
  161.                         difficultyBuilder.AppendLine("\"stacksize\": " + item.StackSize);
  162.                         difficultyBuilder.AppendLine("},");
  163.                     }
  164.                     string finalOutput = difficultyBuilder.ToString().Trim().TrimEnd(',') + "\n]";
  165.                     string outputDirectory = Path.GetDirectoryName(path) + "/LootTables/";
  166.                     Directory.CreateDirectory(outputDirectory);
  167.                     File.WriteAllText(outputDirectory + GetDifficultyFileName(difficultyType), finalOutput);
  168.                     Console.WriteLine("Successfully Generated " + GetDifficultyFileName(difficultyType));
  169.                 }
  170.                 Console.WriteLine("Finished!");
  171.                 Console.Read();
  172.             }
  173.             else
  174.             {
  175.                 Console.WriteLine("File at path: '" + path + "' does not exist!");
  176.             }
  177.         }
  178.  
  179.         public static string GetDifficultyFileName(DifficultyType difficulty)
  180.         {
  181.             switch (difficulty)
  182.             {
  183.                 case DifficultyType.Easy:
  184.                     return "Easy Bases.json";
  185.                 case DifficultyType.Medium:
  186.                     return "Medium Bases.json";
  187.                 case DifficultyType.Hard:
  188.                     return "Hard Bases.json";
  189.                 case DifficultyType.Nightmare:
  190.                     return "Nightmare Bases.json";
  191.                 default:
  192.                     throw new Exception("Could not get file name for difficulty: " + difficulty);
  193.             }
  194.         }
  195.  
  196.         public static DifficultyType ConvertToDifficultyType(SpreadSheetColumnType column)
  197.         {
  198.             switch (column)
  199.             {
  200.                 case SpreadSheetColumnType.QuantityEasy:
  201.                 case SpreadSheetColumnType.ProbabilityEasy:
  202.                     return DifficultyType.Easy;
  203.                 case SpreadSheetColumnType.QuantityMedium:
  204.                 case SpreadSheetColumnType.ProbabilityMedium:
  205.                     return DifficultyType.Medium;
  206.                 case SpreadSheetColumnType.QuantityHard:
  207.                 case SpreadSheetColumnType.ProbabilityHard:
  208.                     return DifficultyType.Hard;
  209.                 case SpreadSheetColumnType.QuantityNightmare:
  210.                 case SpreadSheetColumnType.ProbabilityNightmare:
  211.                     return DifficultyType.Nightmare;
  212.                 default:
  213.                     throw new Exception("Cannot convert Columntype: '" + column + "' to Difficulty Type!");
  214.             }
  215.         }
  216.  
  217.         public class GameItem
  218.         {
  219.             public string Shortname { get; set; }
  220.             public string Name { get; set; }
  221.             public Dictionary<DifficultyType, int> Amount { get; set; }
  222.             public int Skin { get; set; }
  223.             public Dictionary<DifficultyType, int> AmountMin { get; set; }
  224.             public Dictionary<DifficultyType, double> Probability { get; set; }
  225.             public int StackSize { get; set; }
  226.             public static readonly DifficultyType[] Difficulties;
  227.  
  228.             static GameItem()
  229.             {
  230.                 Difficulties = (DifficultyType[])Enum.GetValues(typeof(DifficultyType));
  231.             }
  232.  
  233.             public GameItem()
  234.             {
  235.                 Amount = new Dictionary<DifficultyType, int>();
  236.                 foreach (DifficultyType difficulty in Difficulties)
  237.                 {
  238.                     Amount.Add(difficulty, 0);
  239.                 }
  240.                 AmountMin = new Dictionary<DifficultyType, int>();
  241.                 foreach (DifficultyType difficulty in Difficulties)
  242.                 {
  243.                     AmountMin.Add(difficulty, 0);
  244.                 }
  245.                 Probability = new Dictionary<DifficultyType, double>();
  246.                 foreach (DifficultyType difficulty in Difficulties)
  247.                 {
  248.                     Probability.Add(difficulty, 0);
  249.                 }
  250.             }
  251.         }
  252.     }
  253.  
  254.  
  255.  
  256. }
  257.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement