Skip to content

Commit

Permalink
i think i got a better solution to this
Browse files Browse the repository at this point in the history
  • Loading branch information
AlchlcDvl committed Oct 5, 2024
1 parent 3c63f8b commit 1e372de
Showing 1 changed file with 37 additions and 39 deletions.
76 changes: 37 additions & 39 deletions MiraAPI/Modifiers/ModifierManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public static class ModifierManager
{
private static readonly Dictionary<uint, Type> IdToTypeModifierMap = [];
private static readonly Dictionary<Type, uint> TypeToIdModifierMap = [];
private static readonly Dictionary<int, List<Type>> PrioritiesToTypesMap = [];

private static uint _nextId;

Expand Down Expand Up @@ -57,62 +58,59 @@ internal static void RegisterModifier(Type modifierType)

IdToTypeModifierMap.Add(GetNextId(), modifierType);
TypeToIdModifierMap.Add(modifierType, _nextId);
}

internal static void AssignModifiers(List<PlayerControl> plrs)
{
var rand = new Random();
if (!typeof(GameModifier).IsAssignableFrom(modifierType))
{
return;
}

List<uint> 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<MiraApiPlugin>.Error($"Failed to create instance of {modifier.Value.Name}");
continue;
}
PrioritiesToTypesMap[prio] = list = [];
}

if (!plrs.Exists(x => IsGameModifierValid(x, mod, modifier.Key)))
{
Logger<MiraApiPlugin>.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<PlayerControl> plrs)
{
var rand = new Random();

var num = Math.Clamp(mod.GetAmountPerGame(), 0, maxCount);
var chance = mod.GetAssignmentChance();
Logger<MiraApiPlugin>.Warning($"{mod}:{modifier.Key}:{mod.Priority()}:{mod.GetAssignmentChance()}");
Dictionary<uint, int> 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<MiraApiPlugin>.Warning("No players are valid for modifier: " + mod!.ModifierName);
continue;
}
}
}

var shuffledModifiers = filteredModifiers.Randomize();
var map = new Dictionary<uint, int>();
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<MiraApiPlugin>.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<MiraApiPlugin>.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)
{
Expand Down

0 comments on commit 1e372de

Please sign in to comment.