diff --git a/Projects/Server/Utilities/Utility.cs b/Projects/Server/Utilities/Utility.cs index 0c2fee286..24ab56991 100644 --- a/Projects/Server/Utilities/Utility.cs +++ b/Projects/Server/Utilities/Utility.cs @@ -21,91 +21,6 @@ public static class Utility { private static Dictionary _ipAddressTable; - private static SkillName[] _allSkills = - [ - SkillName.Alchemy, - SkillName.Anatomy, - SkillName.AnimalLore, - SkillName.ItemID, - SkillName.ArmsLore, - SkillName.Parry, - SkillName.Begging, - SkillName.Blacksmith, - SkillName.Fletching, - SkillName.Peacemaking, - SkillName.Camping, - SkillName.Carpentry, - SkillName.Cartography, - SkillName.Cooking, - SkillName.DetectHidden, - SkillName.Discordance, - SkillName.EvalInt, - SkillName.Healing, - SkillName.Fishing, - SkillName.Forensics, - SkillName.Herding, - SkillName.Hiding, - SkillName.Provocation, - SkillName.Inscribe, - SkillName.Lockpicking, - SkillName.Magery, - SkillName.MagicResist, - SkillName.Tactics, - SkillName.Snooping, - SkillName.Musicianship, - SkillName.Poisoning, - SkillName.Archery, - SkillName.SpiritSpeak, - SkillName.Stealing, - SkillName.Tailoring, - SkillName.AnimalTaming, - SkillName.TasteID, - SkillName.Tinkering, - SkillName.Tracking, - SkillName.Veterinary, - SkillName.Swords, - SkillName.Macing, - SkillName.Fencing, - SkillName.Wrestling, - SkillName.Lumberjacking, - SkillName.Mining, - SkillName.Meditation, - SkillName.Stealth, - SkillName.RemoveTrap, - SkillName.Necromancy, - SkillName.Focus, - SkillName.Chivalry, - SkillName.Bushido, - SkillName.Ninjitsu, - SkillName.Spellweaving, - // TODO: Update RandomSkill once these are implemented! - // SkillName.Mysticism, - // SkillName.Imbuing, - SkillName.Throwing - ]; - - private static readonly SkillName[] m_CombatSkills = - [ - SkillName.Archery, - SkillName.Swords, - SkillName.Macing, - SkillName.Fencing, - SkillName.Wrestling - ]; - - private static readonly SkillName[] m_CraftSkills = - [ - SkillName.Alchemy, - SkillName.Blacksmith, - SkillName.Fletching, - SkillName.Carpentry, - SkillName.Cartography, - SkillName.Cooking, - SkillName.Inscribe, - SkillName.Tailoring, - SkillName.Tinkering - ]; - private static readonly Stack m_ConsoleColors = new(); public static void Separate(StringBuilder sb, string value, string separator) @@ -365,25 +280,6 @@ public static class Utility public static object GetArrayCap(Array array, int index, object emptyValue = null) => array.Length > 0 ? array.GetValue(Math.Clamp(index, 0, array.Length - 1)) : emptyValue; - public static SkillName RandomSkill() - { - // TODO: Add 2 to each entry for Mysticism and Imbuing, once they are uncommented on _allSkills. - var offset = Core.Expansion switch - { - >= Expansion.SA => 0, - Expansion.ML => 1, - Expansion.SE => 2, - Expansion.AOS => 4, - _ => 7 - }; - - return _allSkills[Random(_allSkills.Length - offset)]; - } - - public static SkillName RandomCombatSkill() => m_CombatSkills.RandomElement(); - - public static SkillName RandomCraftSkill() => m_CraftSkills.RandomElement(); - public static void FixPoints(ref Point3D top, ref Point3D bottom) { if (bottom.m_X < top.m_X) diff --git a/Projects/UOContent.Tests/Tests/Skills/SkillPacketsTests.cs b/Projects/UOContent.Tests/Tests/Skills/SkillPacketsTests.cs index ad72cae81..764e25bb6 100644 --- a/Projects/UOContent.Tests/Tests/Skills/SkillPacketsTests.cs +++ b/Projects/UOContent.Tests/Tests/Skills/SkillPacketsTests.cs @@ -37,7 +37,7 @@ public class SkillPacketsTests : IClassFixture m.DefaultMobileInit(); var skills = m.Skills; - m.Skills[Utility.RandomSkill()].BaseFixedPoint = 1000; + m.Skills[SkillsInfo.RandomSkill()].BaseFixedPoint = 1000; var expected = new SkillUpdate(skills).Compile(); diff --git a/Projects/UOContent/Items/Minor Artifacts/DreadPirateHat.cs b/Projects/UOContent/Items/Minor Artifacts/DreadPirateHat.cs index f0302aec3..03fe634bb 100644 --- a/Projects/UOContent/Items/Minor Artifacts/DreadPirateHat.cs +++ b/Projects/UOContent/Items/Minor Artifacts/DreadPirateHat.cs @@ -5,12 +5,21 @@ namespace Server.Items; [SerializationGenerator(0, false)] public partial class DreadPirateHat : TricorneHat { + private static readonly SkillName[] _combatSkills = + [ + SkillName.Tactics, + SkillName.Archery, + SkillName.Swords, + SkillName.Macing, + SkillName.Fencing + ]; + [Constructible] public DreadPirateHat() { Hue = 0x497; - SkillBonuses.SetValues(0, Utility.RandomCombatSkill(), 10.0); + SkillBonuses.SetValues(0, _combatSkills.RandomElement(), 10.0); Attributes.BonusDex = 8; Attributes.AttackChance = 10; diff --git a/Projects/UOContent/Items/Special/Special Scrolls/ScrollofTranscendence.cs b/Projects/UOContent/Items/Special/Special Scrolls/ScrollofTranscendence.cs index 68687ef18..7ad9b72fd 100644 --- a/Projects/UOContent/Items/Special/Special Scrolls/ScrollofTranscendence.cs +++ b/Projects/UOContent/Items/Special/Special Scrolls/ScrollofTranscendence.cs @@ -28,7 +28,7 @@ public partial class ScrollofTranscendence : SpecialScroll $"Scroll of Transcendence ({Math.Floor(Value * 10) / 10:0.#} Skill):".Color(0xFFFFFF); public static ScrollofTranscendence CreateRandom(int min, int max) => - new(Utility.RandomSkill(), Utility.RandomMinMax(min, max) / 10.0); + new(SkillsInfo.RandomSkill(), Utility.RandomMinMax(min, max) / 10.0); public override void GetProperties(IPropertyList list) { diff --git a/Projects/UOContent/Skills/SkillsInfo.cs b/Projects/UOContent/Skills/SkillsInfo.cs index 68cd7897d..9da218a7c 100644 --- a/Projects/UOContent/Skills/SkillsInfo.cs +++ b/Projects/UOContent/Skills/SkillsInfo.cs @@ -5,6 +5,121 @@ namespace Server; public static class SkillsInfo { + public static SkillName RandomSkill() + { + var exclusiveMaxIndex = Core.Expansion switch + { + >= Expansion.SA => 59, // <= Throwing + >= Expansion.ML => 55, // <= Spellweaving + Expansion.SE => 54, // <= Ninjitsu + Expansion.AOS => 52, // <= Chivalry + _ => 49 // <= RemoveTrap + }; + + return (SkillName)Utility.Random(exclusiveMaxIndex); + } + + private static readonly SkillName[] _combatSkills = + [ + SkillName.Parry, + SkillName.Tactics, + SkillName.Archery, + SkillName.Swords, + SkillName.Macing, + SkillName.Fencing, + SkillName.Wrestling, + + // AOS + SkillName.Focus, + + // SE + SkillName.Bushido, + SkillName.Ninjitsu, + + // SA + SkillName.Throwing + ]; + + public static SkillName RandomCombatSkill() + { + var exclusiveMaxIndex = Core.Expansion switch + { + >= Expansion.SA => 11, + >= Expansion.SE => 10, + Expansion.AOS => 8, + _ => 7 + }; + + return _combatSkills[Utility.Random(exclusiveMaxIndex)]; + } + + private static readonly SkillName[] _craftSkills = + [ + SkillName.Alchemy, + SkillName.Blacksmith, + SkillName.Fletching, + SkillName.Carpentry, + SkillName.Cartography, + SkillName.Cooking, + SkillName.Inscribe, + SkillName.Tailoring, + SkillName.Tinkering, + + // SA + SkillName.Imbuing + ]; + + public static SkillName RandomCraftSkill() + { + var exclusiveMaxIndex = Core.Expansion switch + { + >= Expansion.SA => 10, + _ => 9 + }; + + return _craftSkills[Utility.Random(exclusiveMaxIndex)]; + } + + private static readonly SkillName[] _randomMagicSkill = + [ + SkillName.EvalInt, + SkillName.Magery, + SkillName.MagicResist, + SkillName.Meditation, + + // AOS + SkillName.Necromancy, + SkillName.Chivalry, + + // ML + SkillName.Spellweaving, + + // SA + SkillName.Mysticism + ]; + + public static SkillName RandomMagicSkill() + { + var exclusiveMaxIndex = Core.Expansion switch + { + >= Expansion.SA => 8, + >= Expansion.ML => 7, + Expansion.AOS => 6, + _ => 4 + }; + + return _randomMagicSkill[Utility.Random(exclusiveMaxIndex)]; + } + + private static readonly SkillName[] _gatheringSkills = + { + SkillName.Fishing, + SkillName.Mining, + SkillName.Lumberjacking + }; + + public static SkillName RandomGatheringSkill() => _gatheringSkills.RandomElement(); + public static void Configure() { SkillInfo.Table = JsonConfig.Deserialize(Path.Combine(Core.BaseDirectory, "Data/skills.json"));