Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections.Generic;
- using System.Linq;
- using UnityEngine;
- using VoidwalkerEngine.Framework.Algorithms;
- public class GameItemGenerator
- {
- private List<EnchantmentTemplate> _enchantmentTemplates;
- private GameItemNameGenerator _gameItemNameGenerator;
- public GameItemGenerator()
- {
- Initialize();
- }
- private void Initialize()
- {
- LoadEnchantmentTemplates();
- _gameItemNameGenerator = new GameItemNameGenerator();
- }
- public GameItemTemplate Generate(GameItemType itemType, GameItemRarity rarity, int itemLevel)
- {
- GameItemTemplate gameItemTemplate = ScriptableObject.CreateInstance<GameItemTemplate>();
- gameItemTemplate.itemType = itemType;
- gameItemTemplate.itemRarity = rarity;
- gameItemTemplate.itemName = "Generated Item";
- gameItemTemplate.itemLevel = itemLevel;
- int enchantmentCount = GenerateEnchantmentCount(rarity);
- Enchantment[] generatedEnchantments = GenerateEnchantments(itemType, itemLevel, enchantmentCount, out EnchantmentTemplate[] generatedTemplates);
- gameItemTemplate.enchantments = generatedEnchantments;
- gameItemTemplate.isGenerated = true;
- switch (rarity)
- {
- case GameItemRarity.Common:
- gameItemTemplate.itemName = "Null Common";
- break;
- case GameItemRarity.Uncommon:
- gameItemTemplate.itemName = _gameItemNameGenerator.GenerateUncommonName(gameItemTemplate.itemType, gameItemTemplate.itemLevel, generatedTemplates);
- break;
- case GameItemRarity.Rare:
- gameItemTemplate.itemName = _gameItemNameGenerator.GenerateRareName(gameItemTemplate.itemType);
- break;
- case GameItemRarity.Epic:
- gameItemTemplate.itemName = _gameItemNameGenerator.GenerateEpicName(gameItemTemplate.itemType);
- break;
- case GameItemRarity.Legendary:
- gameItemTemplate.itemName = "Null Legendary";
- break;
- default:
- gameItemTemplate.itemName = "Error";
- break;
- }
- return gameItemTemplate;
- }
- public Enchantment[] GenerateEnchantments(GameItemType itemType, int itemLevel, int enchantmentCount, out EnchantmentTemplate[] generatedTemplates)
- {
- List<Enchantment> generatedEnchantments = new List<Enchantment>();
- List<EnchantmentTemplate> enchantmentTemplates = new List<EnchantmentTemplate>();
- List<EnchantmentTemplate> validEnchantments = new List<EnchantmentTemplate>();
- foreach (EnchantmentTemplate template in _enchantmentTemplates)
- {
- if (template.levelBracket.Contains(itemLevel))
- {
- bool constraintFound = false;
- foreach (GameItemType constraint in template.itemConstraints)
- {
- if (constraint == itemType)
- {
- constraintFound = true;
- break;
- }
- }
- if (constraintFound)
- {
- validEnchantments.Add(template);
- }
- }
- }
- if (validEnchantments.Count == 0)
- {
- generatedTemplates = null;
- return generatedEnchantments.ToArray();
- }
- int totalWeight = 0;
- foreach (var enchantment in validEnchantments)
- {
- totalWeight += enchantment.weight;
- }
- for (int i = 0; i < enchantmentCount; i++)
- {
- int randomWeight = Random.Range(0, totalWeight);
- int cumulativeWeight = 0;
- foreach (EnchantmentTemplate enchantmentTemplate in validEnchantments)
- {
- cumulativeWeight += enchantmentTemplate.weight;
- if (randomWeight < cumulativeWeight)
- {
- Enchantment newEnchantment = new Enchantment
- {
- property = enchantmentTemplate.property,
- parameter = Random.Range(enchantmentTemplate.parameterRange.min, enchantmentTemplate.parameterRange.max),
- priceModifier = enchantmentTemplate.priceModifier
- };
- generatedEnchantments.Add(newEnchantment);
- enchantmentTemplates.Add(enchantmentTemplate);
- validEnchantments.Remove(enchantmentTemplate);
- totalWeight -= enchantmentTemplate.weight;
- break;
- }
- }
- }
- generatedTemplates = enchantmentTemplates.ToArray();
- return generatedEnchantments.ToArray();
- }
- public int GenerateEnchantmentCount(GameItemRarity rarity)
- {
- switch (rarity)
- {
- case GameItemRarity.Uncommon:
- return Random.Range(1, 2);
- case GameItemRarity.Rare:
- return Random.Range(2, 3);
- case GameItemRarity.Epic:
- return Random.Range(3, 4);
- default:
- return 0;
- }
- }
- public void LoadEnchantmentTemplates()
- {
- List<EnchantmentTemplate> templates = new List<EnchantmentTemplate>();
- string fileName = "EnchantmentTemplates";
- TextAsset textAsset = Resources.Load<TextAsset>("Prefabs/Data/" + fileName);
- if (textAsset == null)
- {
- throw new System.Exception("File not found: Resources/Prefabs/Data/" + fileName);
- }
- string[] lines = textAsset.text.Split(new[] { '\n' }, System.StringSplitOptions.RemoveEmptyEntries);
- if (lines.Length <= 1)
- {
- throw new System.Exception("Enchantment template file is empty or missing data.");
- }
- for (int i = 1; i < lines.Length; i++)
- {
- string[] fields = lines[i].Split(new[] { '\t' }, System.StringSplitOptions.None);
- if (fields.Length < 9)
- {
- continue;
- }
- try
- {
- EnchantmentTemplate enchantment = new EnchantmentTemplate();
- if (!Enchantment.TryParseEnchantmentProperty(fields[0], out EnchantmentProperty property))
- {
- throw new System.Exception($"Could not parse property: {fields[0]}");
- }
- enchantment.property = property;
- enchantment.prefix = fields[1];
- enchantment.suffix = fields[2];
- enchantment.levelBracket = Range.Parse(fields[3]);
- enchantment.parameterRange = Range.Parse(fields[4]);
- enchantment.weight = int.Parse(fields[5]);
- enchantment.priceModifier = int.Parse(fields[6]);
- enchantment.itemConstraints = ParseGameItemConstraintsField(fields[7]);
- enchantment.displayText = fields[8];
- templates.Add(enchantment);
- }
- catch (System.Exception)
- {
- continue;
- }
- }
- this._enchantmentTemplates = templates;
- }
- private static GameItemType[] ParseGameItemConstraintsField(string constraints)
- {
- if (string.IsNullOrWhiteSpace(constraints))
- {
- return new GameItemType[0];
- }
- string[] constraintParts = constraints.Split(",", System.StringSplitOptions.RemoveEmptyEntries);
- List<GameItemType> results = new List<GameItemType>();
- foreach (string constraint in constraintParts)
- {
- string trimmedConstraint = constraint.Trim();
- GameItemType parsedConstraint = ParseGameItemTypeConstraint(trimmedConstraint);
- if (!results.Contains(parsedConstraint))
- {
- results.Add(parsedConstraint);
- }
- }
- return results.ToArray();
- }
- private static GameItemType ParseGameItemTypeConstraint(string constraints)
- {
- switch (constraints)
- {
- case "Sword":
- return GameItemType.Sword;
- case "Greatsword":
- return GameItemType.GreatSword;
- case "Axe":
- return GameItemType.Axe;
- case "Greataxe":
- return GameItemType.GreatAxe;
- case "Mace":
- return GameItemType.Mace;
- case "Greatmace":
- return GameItemType.GreatMace;
- case "Bow":
- return GameItemType.Bow;
- case "L_Head":
- return GameItemType.Light_Headwear;
- case "L_Chest":
- return GameItemType.Light_Chestwear;
- case "L_Hand":
- return GameItemType.Light_Handwear;
- case "L_Foot":
- return GameItemType.Light_Footwear;
- case "M_Head":
- return GameItemType.Medium_Headwear;
- case "M_Chest":
- return GameItemType.Medium_Chestwear;
- case "M_Hand":
- return GameItemType.Medium_Handwear;
- case "M_Foot":
- return GameItemType.Medium_Footwear;
- case "H_Head":
- return GameItemType.Heavy_Headwear;
- case "H_Chest":
- return GameItemType.Heavy_Chestwear;
- case "H_Hand":
- return GameItemType.Heavy_Handwear;
- case "H_Foot":
- return GameItemType.Heavy_Footwear;
- case "Amulet":
- return GameItemType.Amulet;
- case "Ring":
- return GameItemType.Ring;
- case "Shield":
- return GameItemType.Shield;
- default:
- throw new System.Exception("Could not parse GameItemConstraint: '" + constraints + "'!");
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement