From 1e372deabd746b4d90172e844021afb76a329e1d Mon Sep 17 00:00:00 2001 From: AlchlcDvl <56699741+AlchlcDvl@users.noreply.github.com> Date: Sat, 5 Oct 2024 18:11:17 -0400 Subject: [PATCH] i think i got a better solution to this --- MiraAPI/Modifiers/ModifierManager.cs | 76 ++++++++++++++-------------- 1 file changed, 37 insertions(+), 39 deletions(-) diff --git a/MiraAPI/Modifiers/ModifierManager.cs b/MiraAPI/Modifiers/ModifierManager.cs index a779787..bf314e8 100644 --- a/MiraAPI/Modifiers/ModifierManager.cs +++ b/MiraAPI/Modifiers/ModifierManager.cs @@ -19,6 +19,7 @@ public static class ModifierManager { private static readonly Dictionary IdToTypeModifierMap = []; private static readonly Dictionary TypeToIdModifierMap = []; + private static readonly Dictionary> PrioritiesToTypesMap = []; private static uint _nextId; @@ -57,62 +58,59 @@ internal static void RegisterModifier(Type modifierType) IdToTypeModifierMap.Add(GetNextId(), modifierType); TypeToIdModifierMap.Add(modifierType, _nextId); - } - internal static void AssignModifiers(List plrs) - { - var rand = new Random(); + if (!typeof(GameModifier).IsAssignableFrom(modifierType)) + { + return; + } - List filteredModifiers = []; - var modifiers = IdToTypeModifierMap.Where(pair => pair.Value.IsAssignableTo(typeof(GameModifier))).Reverse(); // For some reason the modifiers are sorted in reverse by namespace, but alphabetical by class name lol + var mod = Activator.CreateInstance(modifierType) as GameModifier; + var prio = mod!.Priority(); - foreach (var modifier in modifiers) + if (!PrioritiesToTypesMap.TryGetValue(prio, out var list)) { - if (Activator.CreateInstance(modifier.Value) is not GameModifier mod) - { - Logger.Error($"Failed to create instance of {modifier.Value.Name}"); - continue; - } + PrioritiesToTypesMap[prio] = list = []; + } - if (!plrs.Exists(x => IsGameModifierValid(x, mod, modifier.Key))) - { - Logger.Warning("No players are valid for modifier: " + mod.ModifierName); - continue; - } + list.Add(modifierType); + } - var maxCount = plrs.Count(x => IsGameModifierValid(x, mod, modifier.Key)); + internal static void AssignModifiers(List plrs) + { + var rand = new Random(); - var num = Math.Clamp(mod.GetAmountPerGame(), 0, maxCount); - var chance = mod.GetAssignmentChance(); - Logger.Warning($"{mod}:{modifier.Key}:{mod.Priority()}:{mod.GetAssignmentChance()}"); + Dictionary filteredModifiers = []; - for (var i = 0; i < num; i++) + foreach (var prioPairs in PrioritiesToTypesMap) + { + foreach (var modifier in prioPairs.Value) { - var randomNum = rand.Next(100); + var mod = Activator.CreateInstance(modifier) as GameModifier; + var id = TypeToIdModifierMap[modifier]; - if (randomNum < Math.Clamp(chance, 0, 100)) + if (!plrs.Exists(x => IsGameModifierValid(x, mod!, id))) { - filteredModifiers.Add(TypeToIdModifierMap[modifier.Value]); + Logger.Warning("No players are valid for modifier: " + mod!.ModifierName); + continue; } - } - } - var shuffledModifiers = filteredModifiers.Randomize(); - var map = new Dictionary(); + var maxCount = plrs.Count(x => IsGameModifierValid(x, mod!, id)); + var num = Math.Clamp(mod!.GetAmountPerGame(), 0, maxCount); + var chance = mod.GetAssignmentChance(); - foreach (var id in shuffledModifiers) - { - if (Activator.CreateInstance(IdToTypeModifierMap[id]) is not GameModifier mod) - { - Logger.Error($"Failed to create instance of {IdToTypeModifierMap[id].Name}"); - continue; - } + for (var i = 0; i < num; i++) + { + var randomNum = rand.Next(100); - map[id] = mod.Priority(); - Logger.Warning($"{mod}:{id}:{mod.Priority()}:{mod.GetAssignmentChance()}"); + if (randomNum < Math.Clamp(chance, 0, 100)) + { + filteredModifiers.Add(id, prioPairs.Key); + } + } + } } - shuffledModifiers = map.OrderByDescending(x => x.Value).Select(x => x.Key).ToList(); + var shuffledModifiers = filteredModifiers.ToList().Randomize().OrderByDescending(x => x.Value).Select(x => x.Key).ToList(); if (shuffledModifiers.Count > plrs.Count) {