Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using Assets.Resources.Scripts;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using UnityEngine;
- /// <summary>
- /// The Order of these enums determines property order
- /// for display purposes. IE: The properties located at
- /// the top of the enumeration are sorted to the top
- /// of item descriptions
- /// </summary>
- public enum MagicPropertyType
- {
- None,
- Stat_Strength_Mod,
- Stat_Defense_Mod,
- Stat_Vitality_Mod,
- Stat_Intellect_Mod,
- Stat_Wisdom_Mod,
- Stat_Spirit_Mod,
- DamageVs_Aberrations,
- DamageVs_Beasts,
- DamageVs_Demons,
- DamageVs_Undead,
- ElementalMastery_Arcane,
- ElementalMastery_Cold,
- ElementalMastery_Fire,
- ElementalMastery_Holy,
- ElementalMastery_Poison,
- ElementalMastery_Shadow,
- ElementalMastery_Shock,
- EnhancedBlockChance_Mod,
- EnhancedWeaponDamage_Mult,
- ExtraDamage_Arcane,
- ExtraDamage_Cold,
- ExtraDamage_Fire,
- ExtraDamage_Holy,
- ExtraDamage_Poison,
- ExtraDamage_Shadow,
- ExtraDamage_Shock,
- Resist_All,
- Resist_Arcane,
- Resist_Cold,
- Resist_Fire,
- Resist_Holy,
- Resist_Poison,
- Resist_Shadow,
- Resist_Shock,
- WeaponMastery_Axes,
- WeaponMastery_Bows,
- WeaponMastery_Daggers,
- WeaponMastery_Knuckles,
- WeaponMastery_Maces,
- WeaponMastery_Staves,
- WeaponMastery_Swords,
- WeaponMastery_Wands,
- }
- public class MagicPropertyTemplate
- {
- public MagicPropertyType property;
- public VoidwalkerRange levelBracket;
- public AffixType affixType;
- public VoidwalkerRange valueRange;
- public GameItemType[] constraints;
- public int weight;
- public MagicPropertyTemplate()
- {
- }
- }
- public enum GameItemCraftmanship
- {
- None,
- Normal, // Iron 0-25
- Exceptional, // Titanite 26-50
- Exquisite, // Mythrite 51-75
- Masterwork // Eternium 76-100
- }
- public enum AffixType
- {
- Any,
- Prefix,
- Suffix,
- }
- public class GameItemGenerator
- {
- private GameItemNameGenerator _nameGenerator;
- private VoidwalkerRandom _random;
- private List<MagicPropertyTemplate> _magicPropertyTemplates;
- private Dictionary<string, MagicPropertyType> _magicPropertyTypeConverter;
- private Dictionary<string, GameItemType> _gameItemTypeConverter;
- public GameItemGenerator()
- {
- _nameGenerator = new GameItemNameGenerator();
- _random = new VoidwalkerRandom();
- InitializeMagicProperties();
- }
- private void InitializeMagicProperties()
- {
- _magicPropertyTypeConverter = new Dictionary<string, MagicPropertyType>
- {
- { "DamageVs_Aberrations", MagicPropertyType.DamageVs_Aberrations },
- { "DamageVs_Beasts", MagicPropertyType.DamageVs_Beasts },
- { "DamageVs_Demons", MagicPropertyType.DamageVs_Demons },
- { "DamageVs_Undead", MagicPropertyType.DamageVs_Undead },
- { "ElementalMastery_Arcane", MagicPropertyType.ElementalMastery_Arcane },
- { "ElementalMastery_Cold", MagicPropertyType.ElementalMastery_Cold },
- { "ElementalMastery_Fire", MagicPropertyType.ElementalMastery_Fire },
- { "ElementalMastery_Holy", MagicPropertyType.ElementalMastery_Holy },
- { "ElementalMastery_Poison", MagicPropertyType.ElementalMastery_Poison },
- { "ElementalMastery_Shadow", MagicPropertyType.ElementalMastery_Shadow },
- { "ElementalMastery_Shock", MagicPropertyType.ElementalMastery_Shock },
- { "EnhancedBlockChance", MagicPropertyType.EnhancedBlockChance_Mod },
- { "EnhancedWeaponDamage", MagicPropertyType.EnhancedWeaponDamage_Mult },
- { "ExtraDamage_Arcane", MagicPropertyType.ExtraDamage_Arcane },
- { "ExtraDamage_Cold", MagicPropertyType.ExtraDamage_Cold },
- { "ExtraDamage_Fire", MagicPropertyType.ExtraDamage_Fire },
- { "ExtraDamage_Holy", MagicPropertyType.ExtraDamage_Holy },
- { "ExtraDamage_Poison", MagicPropertyType.ExtraDamage_Poison },
- { "ExtraDamage_Shadow", MagicPropertyType.ExtraDamage_Shadow },
- { "ExtraDamage_Shock", MagicPropertyType.ExtraDamage_Shock },
- { "Resist_All", MagicPropertyType.Resist_All },
- { "Resist_Arcane", MagicPropertyType.Resist_Arcane },
- { "Resist_Cold", MagicPropertyType.Resist_Cold },
- { "Resist_Fire", MagicPropertyType.Resist_Fire },
- { "Resist_Holy", MagicPropertyType.Resist_Holy },
- { "Resist_Poison", MagicPropertyType.Resist_Poison },
- { "Resist_Shadow", MagicPropertyType.Resist_Shadow },
- { "Resist_Shock", MagicPropertyType.Resist_Shock },
- { "Stat_Defense_Mod", MagicPropertyType.Stat_Defense_Mod },
- { "Stat_Intellect_Mod", MagicPropertyType.Stat_Intellect_Mod },
- { "Stat_Strength_Mod", MagicPropertyType.Stat_Strength_Mod },
- { "Stat_Vitality_Mod", MagicPropertyType.Stat_Vitality_Mod },
- { "Stat_Wisdom_Mod", MagicPropertyType.Stat_Wisdom_Mod },
- { "Stat_Spirit_Mod", MagicPropertyType.Stat_Spirit_Mod },
- { "WeaponMastery_Axes", MagicPropertyType.WeaponMastery_Axes },
- { "WeaponMastery_Bows", MagicPropertyType.WeaponMastery_Bows },
- { "WeaponMastery_Daggers", MagicPropertyType.WeaponMastery_Daggers },
- { "WeaponMastery_Knuckles", MagicPropertyType.WeaponMastery_Knuckles },
- { "WeaponMastery_Maces", MagicPropertyType.WeaponMastery_Maces },
- { "WeaponMastery_Staves", MagicPropertyType.WeaponMastery_Staves },
- { "WeaponMastery_Swords", MagicPropertyType.WeaponMastery_Swords },
- { "WeaponMastery_Wands", MagicPropertyType.WeaponMastery_Wands },
- };
- _gameItemTypeConverter = new Dictionary<string, GameItemType>
- {
- { "Daggers", GameItemType.Weapon_Dagger },
- { "Bows", GameItemType.Weapon_Bow },
- { "Knuckles", GameItemType.Weapon_Knuckle },
- { "Staves", GameItemType.Weapon_Staff },
- { "Wands", GameItemType.Weapon_Wand },
- { "Swords", GameItemType.Weapon_Sword },
- { "GreatSwords", GameItemType.Weapon_Greatsword },
- { "Axes", GameItemType.Weapon_Axe },
- { "GreatAxes", GameItemType.Weapon_Greataxe },
- { "Maces", GameItemType.Weapon_Mace },
- { "GreatMaces", GameItemType.Weapon_GreatMace },
- { "Shields", GameItemType.Shield },
- { "Headwear", GameItemType.Headwear },
- { "Chestwear", GameItemType.Chestwear },
- { "Handwear", GameItemType.Handwear },
- { "Footwear", GameItemType.Footwear },
- { "Amulets", GameItemType.Jewelry_Amulet },
- { "Rings", GameItemType.Jewelry_Ring },
- { "Charms", GameItemType.Jewelry_Charm }
- };
- /**
- * Load MagicProperties.txt
- */
- this._magicPropertyTemplates = new List<MagicPropertyTemplate>();
- TextAsset mytxtData = Resources.Load<TextAsset>("Data/MagicProperties");
- string[] magicPropertyData = mytxtData.text.Split("\n");
- foreach (string line in magicPropertyData)
- {
- string[] lineData = line.Split("\t");
- string[] constraints = RemoveFormatting(lineData[5]).Split(",");
- MagicPropertyTemplate template = new MagicPropertyTemplate()
- {
- property = ParseMagicPropertyType(lineData[0]),
- levelBracket = VoidwalkerRange.Parse(lineData[1]),
- affixType = ParseAffixType(lineData[2]),
- valueRange = VoidwalkerRange.Parse(lineData[3]),
- weight = Int32.Parse(lineData[4]),
- constraints = ParseGameItemConstraints(constraints)
- };
- this._magicPropertyTemplates.Add(template);
- }
- }
- private AffixType ParseAffixType(string affixType)
- {
- switch (affixType)
- {
- case "Prefix":
- return AffixType.Prefix;
- case "Suffix":
- return AffixType.Suffix;
- default:
- return AffixType.Any; // Should probably default to a null state?
- }
- }
- public static string RemoveFormatting(string pString)
- {
- return pString.Replace("\n", "").Replace("\r", "");
- }
- private MagicPropertyType ParseMagicPropertyType(string property)
- {
- return _magicPropertyTypeConverter[property];
- }
- private GameItemType[] ParseGameItemConstraints(string[] properties)
- {
- List<GameItemType> propertyTypes = new List<GameItemType>();
- foreach (string propertyType in properties)
- {
- propertyTypes.Add(ParseGameItemConstraint(propertyType));
- }
- return propertyTypes.ToArray();
- }
- private GameItemType ParseGameItemConstraint(string constraint)
- {
- return _gameItemTypeConverter[constraint];
- }
- /// <summary>
- /// TODO: Finish adding this functionality.
- /// </summary>
- /// <param name="level"></param>
- /// <returns></returns>
- public GameItemTemplate Generate(int level)
- {
- return null;
- }
- /// <summary>
- /// TODO: Tie this into the dynamic Generate function directly above
- /// this declaration. This will be used to generate a random item quality
- /// without the need to manually feed one into the generator.
- /// </summary>
- /// <param name="level"></param>
- /// <returns></returns>
- private ItemQuality NextRandomQuality(int level)
- {
- return ItemQuality.None;
- }
- public GameItemTemplate Generate(GameItemType itemType, int level, ItemQuality quality)
- {
- GameItemTemplate template = ScriptableObject.CreateInstance<GameItemTemplate>();
- template.baseItemQuality = quality;
- template.itemType = itemType;
- template.itemLevel = level;
- template.identifier = "ProcGen_" + level + "_" + itemType;
- template.name = _nameGenerator.Generate(quality, itemType);
- if (quality == ItemQuality.Uncommon || quality == ItemQuality.Rare)
- {
- GenerateAffixCount(quality, out int prefixCount, out int suffixCount);
- List<MagicProperty> properties = new List<MagicProperty>();
- List<MagicPropertyTemplate> generatedTemplates = new List<MagicPropertyTemplate>();
- generatedTemplates.AddRange(GenerateMagicPropertyTemplates(itemType, level, prefixCount, AffixType.Prefix, false));
- generatedTemplates.AddRange(GenerateMagicPropertyTemplates(itemType, level, suffixCount, AffixType.Suffix, false));
- foreach (MagicPropertyTemplate magicPropertyTemplate in generatedTemplates)
- {
- MagicProperty property = new MagicProperty()
- {
- propertyType = magicPropertyTemplate.property,
- value = _random.NextRange(magicPropertyTemplate.valueRange)
- };
- properties.Add(property);
- }
- properties = properties.OrderBy(property => property.propertyType).ToList();
- template.magicProperties = new MagicProperties();
- template.magicProperties.properties = properties;
- }
- return template;
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="constraint"></param>
- /// <param name="level"></param>
- /// <param name="count"></param>
- /// <param name="allowDuplicates"></param>
- /// <returns></returns>
- private List<MagicPropertyTemplate> GenerateMagicPropertyTemplates(GameItemType constraint, int level, int count,
- AffixType affixType = AffixType.Any, bool allowDuplicates = false)
- {
- List<MagicPropertyTemplate> results = new List<MagicPropertyTemplate>();
- if (count == 0)
- {
- return results;
- }
- int totalFitness = 0;
- List<MagicPropertyTemplate> filteredTemplates = new List<MagicPropertyTemplate>();
- foreach (MagicPropertyTemplate candidate in this._magicPropertyTemplates)
- {
- if (candidate.affixType == affixType || affixType == AffixType.Any)
- {
- if (candidate.constraints.Contains(constraint))
- {
- if (candidate.levelBracket.Contains(level))
- {
- filteredTemplates.Add(candidate);
- totalFitness += candidate.weight;
- }
- }
- }
- }
- if (filteredTemplates.Count < count)
- {
- count = filteredTemplates.Count;
- if (count == 0)
- {
- return results;
- }
- }
- filteredTemplates.OrderBy(enchantment => enchantment.weight).Reverse().ToList();
- int enchantmentsGenerated = 0;
- bool isSearching = true;
- int attempts = 0;
- const int maximumAttempts = 32; // Prevent Infinite Loops
- while (isSearching)
- {
- MagicPropertyTemplate selectedEnchantment = null;
- int randomSample = _random.NextInteger(totalFitness);
- foreach (MagicPropertyTemplate attempt in filteredTemplates)
- {
- if (randomSample < attempt.weight)
- {
- selectedEnchantment = attempt;
- break;
- }
- randomSample -= attempt.weight;
- }
- if (allowDuplicates ||
- !results.Any(e => e == selectedEnchantment) &&
- !results.Any(e => e.property.Equals(selectedEnchantment.property)))
- {
- attempts = 0;
- results.Add(selectedEnchantment);
- enchantmentsGenerated++;
- }
- attempts++;
- if (enchantmentsGenerated == count || attempts >= maximumAttempts)
- {
- isSearching = false;
- }
- }
- return results;
- }
- private void GenerateAffixCount(ItemQuality quality, out int prefixCount, out int suffixCount)
- {
- switch (quality)
- {
- case ItemQuality.Uncommon:
- prefixCount = _random.NextRange(1, 3);
- suffixCount = _random.NextRange(0, 1);
- return;
- case ItemQuality.Rare:
- prefixCount = _random.NextRange(3, 4);
- suffixCount = _random.NextRange(1, 2);
- return;
- default:
- prefixCount = 0;
- suffixCount = 0;
- return;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement