Advertisement
Krythic

Generator

Oct 10th, 2024
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.91 KB | None | 0 0
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using UnityEngine;
  4. using VoidwalkerEngine.Framework.Algorithms;
  5.  
  6. public class GameItemGenerator
  7. {
  8.     private List<EnchantmentTemplate> _enchantmentTemplates;
  9.     private GameItemNameGenerator _gameItemNameGenerator;
  10.     public GameItemGenerator()
  11.     {
  12.         Initialize();
  13.     }
  14.  
  15.     private void Initialize()
  16.     {
  17.         LoadEnchantmentTemplates();
  18.         _gameItemNameGenerator = new GameItemNameGenerator();
  19.     }
  20.  
  21.     public GameItemTemplate Generate(GameItemType itemType, GameItemRarity rarity, int itemLevel)
  22.     {
  23.         GameItemTemplate gameItemTemplate = ScriptableObject.CreateInstance<GameItemTemplate>();
  24.         gameItemTemplate.itemType = itemType;
  25.         gameItemTemplate.itemRarity = rarity;
  26.         gameItemTemplate.itemName = "Generated Item";
  27.         gameItemTemplate.itemLevel = itemLevel;
  28.         int enchantmentCount = GenerateEnchantmentCount(rarity);
  29.         Enchantment[] generatedEnchantments = GenerateEnchantments(itemType, itemLevel, enchantmentCount, out EnchantmentTemplate[] generatedTemplates);
  30.         gameItemTemplate.enchantments = generatedEnchantments;
  31.         gameItemTemplate.isGenerated = true;
  32.         switch (rarity)
  33.         {
  34.             case GameItemRarity.Common:
  35.                 gameItemTemplate.itemName = "Null Common";
  36.                 break;
  37.             case GameItemRarity.Uncommon:
  38.                 gameItemTemplate.itemName = _gameItemNameGenerator.GenerateUncommonName(gameItemTemplate.itemType, gameItemTemplate.itemLevel, generatedTemplates);
  39.                 break;
  40.             case GameItemRarity.Rare:
  41.                 gameItemTemplate.itemName = _gameItemNameGenerator.GenerateRareName(gameItemTemplate.itemType);
  42.                 break;
  43.             case GameItemRarity.Epic:
  44.                 gameItemTemplate.itemName = _gameItemNameGenerator.GenerateEpicName(gameItemTemplate.itemType);
  45.                 break;
  46.             case GameItemRarity.Legendary:
  47.                 gameItemTemplate.itemName = "Null Legendary";
  48.                 break;
  49.             default:
  50.                 gameItemTemplate.itemName = "Error";
  51.                 break;
  52.         }
  53.         return gameItemTemplate;
  54.     }
  55.  
  56.     public Enchantment[] GenerateEnchantments(GameItemType itemType, int itemLevel, int enchantmentCount, out EnchantmentTemplate[] generatedTemplates)
  57.     {
  58.         List<Enchantment> generatedEnchantments = new List<Enchantment>();
  59.         List<EnchantmentTemplate> enchantmentTemplates = new List<EnchantmentTemplate>();
  60.         List<EnchantmentTemplate> validEnchantments = new List<EnchantmentTemplate>();
  61.         foreach (EnchantmentTemplate template in _enchantmentTemplates)
  62.         {
  63.             if (template.levelBracket.Contains(itemLevel))
  64.             {
  65.                 bool constraintFound = false;
  66.                 foreach (GameItemType constraint in template.itemConstraints)
  67.                 {
  68.                     if (constraint == itemType)
  69.                     {
  70.                         constraintFound = true;
  71.                         break;
  72.                     }
  73.                 }
  74.                 if (constraintFound)
  75.                 {
  76.                     validEnchantments.Add(template);
  77.                 }
  78.             }
  79.         }
  80.  
  81.         if (validEnchantments.Count == 0)
  82.         {
  83.             generatedTemplates = null;
  84.             return generatedEnchantments.ToArray();
  85.         }
  86.  
  87.         int totalWeight = 0;
  88.         foreach (var enchantment in validEnchantments)
  89.         {
  90.             totalWeight += enchantment.weight;
  91.         }
  92.  
  93.         for (int i = 0; i < enchantmentCount; i++)
  94.         {
  95.             int randomWeight = Random.Range(0, totalWeight);
  96.             int cumulativeWeight = 0;
  97.  
  98.             foreach (EnchantmentTemplate enchantmentTemplate in validEnchantments)
  99.             {
  100.                 cumulativeWeight += enchantmentTemplate.weight;
  101.                 if (randomWeight < cumulativeWeight)
  102.                 {
  103.                     Enchantment newEnchantment = new Enchantment
  104.                     {
  105.                         property = enchantmentTemplate.property,
  106.                         parameter = Random.Range(enchantmentTemplate.parameterRange.min, enchantmentTemplate.parameterRange.max),
  107.                         priceModifier = enchantmentTemplate.priceModifier
  108.                     };
  109.                     generatedEnchantments.Add(newEnchantment);
  110.                     enchantmentTemplates.Add(enchantmentTemplate);
  111.                     validEnchantments.Remove(enchantmentTemplate);
  112.                     totalWeight -= enchantmentTemplate.weight;
  113.                     break;
  114.                 }
  115.             }
  116.         }
  117.  
  118.         generatedTemplates = enchantmentTemplates.ToArray();
  119.         return generatedEnchantments.ToArray();
  120.     }
  121.  
  122.     public int GenerateEnchantmentCount(GameItemRarity rarity)
  123.     {
  124.         switch (rarity)
  125.         {
  126.             case GameItemRarity.Uncommon:
  127.                 return Random.Range(1, 2);
  128.             case GameItemRarity.Rare:
  129.                 return Random.Range(2, 3);
  130.             case GameItemRarity.Epic:
  131.                 return Random.Range(3, 4);
  132.             default:
  133.                 return 0;
  134.         }
  135.     }
  136.  
  137.     public void LoadEnchantmentTemplates()
  138.     {
  139.         List<EnchantmentTemplate> templates = new List<EnchantmentTemplate>();
  140.         string fileName = "EnchantmentTemplates";
  141.         TextAsset textAsset = Resources.Load<TextAsset>("Prefabs/Data/" + fileName);
  142.         if (textAsset == null)
  143.         {
  144.             throw new System.Exception("File not found: Resources/Prefabs/Data/" + fileName);
  145.         }
  146.         string[] lines = textAsset.text.Split(new[] { '\n' }, System.StringSplitOptions.RemoveEmptyEntries);
  147.         if (lines.Length <= 1)
  148.         {
  149.             throw new System.Exception("Enchantment template file is empty or missing data.");
  150.         }
  151.         for (int i = 1; i < lines.Length; i++)
  152.         {
  153.             string[] fields = lines[i].Split(new[] { '\t' }, System.StringSplitOptions.None);
  154.             if (fields.Length < 9)
  155.             {
  156.                 continue;
  157.             }
  158.             try
  159.             {
  160.                 EnchantmentTemplate enchantment = new EnchantmentTemplate();
  161.                 if (!Enchantment.TryParseEnchantmentProperty(fields[0], out EnchantmentProperty property))
  162.                 {
  163.                     throw new System.Exception($"Could not parse property: {fields[0]}");
  164.                 }
  165.                 enchantment.property = property;
  166.                 enchantment.prefix = fields[1];
  167.                 enchantment.suffix = fields[2];
  168.                 enchantment.levelBracket = Range.Parse(fields[3]);
  169.                 enchantment.parameterRange = Range.Parse(fields[4]);
  170.                 enchantment.weight = int.Parse(fields[5]);
  171.                 enchantment.priceModifier = int.Parse(fields[6]);
  172.                 enchantment.itemConstraints = ParseGameItemConstraintsField(fields[7]);
  173.                 enchantment.displayText = fields[8];
  174.                 templates.Add(enchantment);
  175.             }
  176.             catch (System.Exception)
  177.             {
  178.                 continue;
  179.             }
  180.         }
  181.         this._enchantmentTemplates = templates;
  182.     }
  183.  
  184.     private static GameItemType[] ParseGameItemConstraintsField(string constraints)
  185.     {
  186.         if (string.IsNullOrWhiteSpace(constraints))
  187.         {
  188.             return new GameItemType[0];
  189.         }
  190.         string[] constraintParts = constraints.Split(",", System.StringSplitOptions.RemoveEmptyEntries);
  191.         List<GameItemType> results = new List<GameItemType>();
  192.         foreach (string constraint in constraintParts)
  193.         {
  194.             string trimmedConstraint = constraint.Trim();
  195.             GameItemType parsedConstraint = ParseGameItemTypeConstraint(trimmedConstraint);
  196.             if (!results.Contains(parsedConstraint))
  197.             {
  198.                 results.Add(parsedConstraint);
  199.             }
  200.         }
  201.         return results.ToArray();
  202.     }
  203.  
  204.     private static GameItemType ParseGameItemTypeConstraint(string constraints)
  205.     {
  206.         switch (constraints)
  207.         {
  208.             case "Sword":
  209.                 return GameItemType.Sword;
  210.             case "Greatsword":
  211.                 return GameItemType.GreatSword;
  212.             case "Axe":
  213.                 return GameItemType.Axe;
  214.             case "Greataxe":
  215.                 return GameItemType.GreatAxe;
  216.             case "Mace":
  217.                 return GameItemType.Mace;
  218.             case "Greatmace":
  219.                 return GameItemType.GreatMace;
  220.             case "Bow":
  221.                 return GameItemType.Bow;
  222.             case "L_Head":
  223.                 return GameItemType.Light_Headwear;
  224.             case "L_Chest":
  225.                 return GameItemType.Light_Chestwear;
  226.             case "L_Hand":
  227.                 return GameItemType.Light_Handwear;
  228.             case "L_Foot":
  229.                 return GameItemType.Light_Footwear;
  230.             case "M_Head":
  231.                 return GameItemType.Medium_Headwear;
  232.             case "M_Chest":
  233.                 return GameItemType.Medium_Chestwear;
  234.             case "M_Hand":
  235.                 return GameItemType.Medium_Handwear;
  236.             case "M_Foot":
  237.                 return GameItemType.Medium_Footwear;
  238.             case "H_Head":
  239.                 return GameItemType.Heavy_Headwear;
  240.             case "H_Chest":
  241.                 return GameItemType.Heavy_Chestwear;
  242.             case "H_Hand":
  243.                 return GameItemType.Heavy_Handwear;
  244.             case "H_Foot":
  245.                 return GameItemType.Heavy_Footwear;
  246.             case "Amulet":
  247.                 return GameItemType.Amulet;
  248.             case "Ring":
  249.                 return GameItemType.Ring;
  250.             case "Shield":
  251.                 return GameItemType.Shield;
  252.             default:
  253.                 throw new System.Exception("Could not parse GameItemConstraint: '" + constraints + "'!");
  254.         }
  255.     }
  256. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement