diff --git a/Lieb/Data/DbInitializer.cs b/Lieb/Data/DbInitializer.cs index c1dcd4d..4166521 100644 --- a/Lieb/Data/DbInitializer.cs +++ b/Lieb/Data/DbInitializer.cs @@ -95,7 +95,7 @@ namespace Lieb.Data Description = "This is a test raid\nwith multiple lines?", Guild = "LIEB", Organizer = "Sarah", - RaidType = RaidType.RandomClasses, + RaidType = RaidType.RandomWithBoons, Date = DateTime.Now.Date, StartTime = DateTime.Now, EndTime = DateTime.Now.AddHours(2), @@ -114,7 +114,35 @@ namespace Lieb.Data context.RaidSignUps.AddRange(signUps); context.SaveChanges(); + + GuildWars2Build healTempest = new GuildWars2Build() { BuildName = "HealTempest", Class = GuildWars2Class.Elementalist, EliteSpecialization = EliteSpecialization.Tempest, Heal = 5, Might = 10 }; + GuildWars2Build condiScourge = new GuildWars2Build() { BuildName = "CondiScourge", Class = GuildWars2Class.Necromancer, EliteSpecialization = EliteSpecialization.Scourge }; + GuildWars2Build quickBrand = new GuildWars2Build() { BuildName = "QuickBrand", Class = GuildWars2Class.Guard, EliteSpecialization = EliteSpecialization.Firebrand, Heal = 5, Quickness = 5 }; + GuildWars2Build alacregate = new GuildWars2Build() { BuildName = "Alacregate", Class = GuildWars2Class.Revenant, EliteSpecialization = EliteSpecialization.Renegade, Alacrity = 5 }; + GuildWars2Build chrono = new GuildWars2Build() { BuildName = "Chrono", Class = GuildWars2Class.Mesmer, EliteSpecialization = EliteSpecialization.Chronomancer, Alacrity = 5, Quickness = 5 }; + GuildWars2Build daredevil = new GuildWars2Build() { BuildName = "Daredevil", Class = GuildWars2Class.Thief, EliteSpecialization = EliteSpecialization.DareDevil }; + context.GuildWars2Builds.AddRange(new List(){healTempest, condiScourge, quickBrand, alacregate, chrono, daredevil }); + context.SaveChanges(); + + var equippedBuilds = new Equipped[] + { + new Equipped(){GuildWars2Account = linaith, CanTank = true, GuildWars2Build = quickBrand}, + new Equipped(){GuildWars2Account = linaith, CanTank = false, GuildWars2Build = healTempest}, + new Equipped(){GuildWars2Account = linaith, CanTank = false, GuildWars2Build = daredevil}, + new Equipped(){GuildWars2Account = sarah, CanTank = false, GuildWars2Build = healTempest}, + new Equipped(){GuildWars2Account = sarah, CanTank = false, GuildWars2Build = daredevil}, + new Equipped(){GuildWars2Account = hierpiepts, CanTank = false, GuildWars2Build = condiScourge}, + new Equipped(){GuildWars2Account = hierpiepts, CanTank = true, GuildWars2Build = quickBrand}, + new Equipped(){GuildWars2Account = hierpiepts, CanTank = false, GuildWars2Build = healTempest}, + new Equipped(){GuildWars2Account = bloodseeker, CanTank = true, GuildWars2Build = chrono}, + new Equipped(){GuildWars2Account = bloodseeker, CanTank = false, GuildWars2Build = alacregate}, + new Equipped(){GuildWars2Account = bloodseeker, CanTank = false, GuildWars2Build = condiScourge}, + }; + + context.Equipped.AddRange(equippedBuilds); + context.SaveChanges(); + #endif - } + } } } diff --git a/Lieb/Data/RaidRandomizerService.cs b/Lieb/Data/RaidRandomizerService.cs index cafcdb5..aeec738 100644 --- a/Lieb/Data/RaidRandomizerService.cs +++ b/Lieb/Data/RaidRandomizerService.cs @@ -7,6 +7,7 @@ namespace Lieb.Data public class RaidRandomizerService { private readonly IDbContextFactory _contextFactory; + private static Random _random = new Random(); public RaidRandomizerService(IDbContextFactory contextFactory) { @@ -45,7 +46,7 @@ namespace Lieb.Data RandomizeEliteSpecs(raid); break; case RaidType.RandomWithBoons: - + RandomizeWithBoons(raid); break; } raid.IsRandomized = true; @@ -57,7 +58,6 @@ namespace Lieb.Data private void RandomizeClasses(Raid raid) { - Random rand = new Random(); foreach (RaidSignUp signUp in raid.SignUps) { HashSet possibleClasses = new HashSet(); @@ -69,7 +69,7 @@ namespace Lieb.Data role.Spots = 1; if (possibleClasses.Count > 0) { - role.Name = possibleClasses.ToList()[rand.Next(possibleClasses.Count - 1)].ToString(); + role.Name = possibleClasses.ToList()[_random.Next(possibleClasses.Count - 1)].ToString(); } else { @@ -82,7 +82,6 @@ namespace Lieb.Data private void RandomizeEliteSpecs(Raid raid) { - Random rand = new Random(); foreach (RaidSignUp signUp in raid.SignUps) { HashSet possibleEliteSpecs = new HashSet(); @@ -94,7 +93,7 @@ namespace Lieb.Data role.Spots = 1; if (possibleEliteSpecs.Count > 0) { - role.Name = possibleEliteSpecs.ToList()[rand.Next(possibleEliteSpecs.Count - 1)].ToString(); + role.Name = possibleEliteSpecs.ToList()[_random.Next(possibleEliteSpecs.Count - 1)].ToString(); } else { @@ -105,6 +104,228 @@ namespace Lieb.Data } } + private void RandomizeWithBoons(Raid raid) + { + Dictionary signedUpUsers= new Dictionary(); + foreach (RaidSignUp signUp in raid.SignUps) + { + signedUpUsers.Add(signUp.LiebUserId, signUp.GuildWars2Account.EquippedBuilds.ToList()[_random.Next(signUp.GuildWars2Account.EquippedBuilds.Count - 1)].GuildWars2Build); + } + BalanceRoles(raid, signedUpUsers); + foreach(var userBuild in signedUpUsers) + { + PlannedRaidRole role = new PlannedRaidRole(); + role.Spots = 1; + role.Name = userBuild.Value.BuildName; + raid.Roles.Add(role); + RaidSignUp signUp = raid.SignUps.FirstOrDefault(s => s.LiebUserId == userBuild.Key); + signUp.PlannedRaidRole = role; + } + } + + private void BalanceRoles(Raid raid, Dictionary signedUpUsers, int recusrionDepth = 0) + { + int Alac = 0; + int Quick = 0; + int Heal = 0; + int Might = 0; + + signedUpUsers = signedUpUsers.OrderBy(u => _random.Next()).ToDictionary(u => u.Key, u => u.Value); + + foreach(GuildWars2Build build in signedUpUsers.Values) + { + Alac += build.Alacrity; + Quick += build.Quickness; + Heal += build.Heal; + Might += build.Might; + } + if(Alac > 10) + { + ReduceAlac(raid, signedUpUsers, Alac); + } + if(Alac < 10) + { + IncreaseAlac(raid, signedUpUsers, Alac); + } + signedUpUsers = signedUpUsers.OrderBy(u => _random.Next()).ToDictionary(u => u.Key, u => u.Value); + if (Quick > 10) + { + ReduceQuick(raid, signedUpUsers, Quick); + } + if (Quick < 10) + { + IncreaseQuick(raid, signedUpUsers, Quick); + } + signedUpUsers = signedUpUsers.OrderBy(u => _random.Next()).ToDictionary(u => u.Key, u => u.Value); + if (Heal > 10) + { + ReduceHeal(raid, signedUpUsers, Heal); + } + if (Heal < 10) + { + IncreaseHeal(raid, signedUpUsers, Heal); + } + signedUpUsers = signedUpUsers.OrderBy(u => _random.Next()).ToDictionary(u => u.Key, u => u.Value); + if (Might > 10) + { + ReduceMight(raid, signedUpUsers, Might); + } + if (Might < 10) + { + IncreaseMight(raid, signedUpUsers, Might); + } + + if(recusrionDepth < 20) + { + recusrionDepth++; + BalanceRoles(raid, signedUpUsers, recusrionDepth); + } + } + + private void ReduceAlac(Raid raid, Dictionary signedUpUsers, int currentAlac) + { + foreach (var userBuild in signedUpUsers) + { + if(userBuild.Value.Alacrity > 0 && currentAlac > 10) + { + RaidSignUp signUp = raid.SignUps.FirstOrDefault(s => s.LiebUserId == userBuild.Key); + Equipped newBuild = signUp.GuildWars2Account.EquippedBuilds.Where(b => b.GuildWars2Build.Alacrity == 0).OrderBy(u => _random.Next()).FirstOrDefault(); + if (newBuild != null) + { + currentAlac -= userBuild.Value.Alacrity; + signedUpUsers[userBuild.Key] = newBuild.GuildWars2Build; + currentAlac += signedUpUsers[userBuild.Key].Alacrity; + } + } + } + } + + private void IncreaseAlac(Raid raid, Dictionary signedUpUsers, int currentAlac) + { + foreach (var userBuild in signedUpUsers) + { + if (userBuild.Value.Alacrity == 00 && currentAlac < 10) + { + RaidSignUp signUp = raid.SignUps.FirstOrDefault(s => s.LiebUserId == userBuild.Key); + Equipped newBuild = signUp.GuildWars2Account.EquippedBuilds.Where(b => b.GuildWars2Build.Alacrity > 0).OrderBy(u => _random.Next()).FirstOrDefault(); + if (newBuild != null) + { + currentAlac -= userBuild.Value.Alacrity; + signedUpUsers[userBuild.Key] = newBuild.GuildWars2Build; + currentAlac += signedUpUsers[userBuild.Key].Alacrity; + } + } + } + } + + private void ReduceQuick(Raid raid, Dictionary signedUpUsers, int currentQuick) + { + foreach (var userBuild in signedUpUsers) + { + if (userBuild.Value.Quickness > 0 && currentQuick > 10) + { + RaidSignUp signUp = raid.SignUps.FirstOrDefault(s => s.LiebUserId == userBuild.Key); + Equipped newBuild = signUp.GuildWars2Account.EquippedBuilds.Where(b => b.GuildWars2Build.Quickness == 0).OrderBy(u => _random.Next()).FirstOrDefault(); + if (newBuild != null) + { + currentQuick -= userBuild.Value.Quickness; + signedUpUsers[userBuild.Key] = newBuild.GuildWars2Build; + currentQuick += signedUpUsers[userBuild.Key].Quickness; + } + } + } + } + + private void IncreaseQuick(Raid raid, Dictionary signedUpUsers, int currentQuick) + { + foreach (var userBuild in signedUpUsers) + { + if (userBuild.Value.Quickness == 00 && currentQuick < 10) + { + RaidSignUp signUp = raid.SignUps.FirstOrDefault(s => s.LiebUserId == userBuild.Key); + Equipped newBuild = signUp.GuildWars2Account.EquippedBuilds.Where(b => b.GuildWars2Build.Quickness > 0).OrderBy(u => _random.Next()).FirstOrDefault(); + if (newBuild != null) + { + currentQuick -= userBuild.Value.Quickness; + signedUpUsers[userBuild.Key] = newBuild.GuildWars2Build; + currentQuick += signedUpUsers[userBuild.Key].Quickness; + } + } + } + } + + private void ReduceMight(Raid raid, Dictionary signedUpUsers, int currentMight) + { + foreach (var userBuild in signedUpUsers) + { + if (userBuild.Value.Might > 0 && currentMight > 10) + { + RaidSignUp signUp = raid.SignUps.FirstOrDefault(s => s.LiebUserId == userBuild.Key); + Equipped newBuild = signUp.GuildWars2Account.EquippedBuilds.Where(b => b.GuildWars2Build.Might == 0).OrderBy(u => _random.Next()).FirstOrDefault(); + if (newBuild != null) + { + currentMight -= userBuild.Value.Might; + signedUpUsers[userBuild.Key] = newBuild.GuildWars2Build; + currentMight += signedUpUsers[userBuild.Key].Might; + } + } + } + } + + private void IncreaseMight(Raid raid, Dictionary signedUpUsers, int currentMight) + { + foreach (var userBuild in signedUpUsers) + { + if (userBuild.Value.Might == 00 && currentMight < 10) + { + RaidSignUp signUp = raid.SignUps.FirstOrDefault(s => s.LiebUserId == userBuild.Key); + Equipped newBuild = signUp.GuildWars2Account.EquippedBuilds.Where(b => b.GuildWars2Build.Might > 0).OrderBy(u => _random.Next()).FirstOrDefault(); + if (newBuild != null) + { + currentMight -= userBuild.Value.Might; + signedUpUsers[userBuild.Key] = newBuild.GuildWars2Build; + currentMight += signedUpUsers[userBuild.Key].Might; + } + } + } + } + + private void ReduceHeal(Raid raid, Dictionary signedUpUsers, int currentHeal) + { + foreach (var userBuild in signedUpUsers) + { + if (userBuild.Value.Heal > 0 && currentHeal > 10) + { + RaidSignUp signUp = raid.SignUps.FirstOrDefault(s => s.LiebUserId == userBuild.Key); + Equipped newBuild = signUp.GuildWars2Account.EquippedBuilds.Where(b => b.GuildWars2Build.Heal == 0).OrderBy(u => _random.Next()).FirstOrDefault(); + if (newBuild != null) + { + currentHeal -= userBuild.Value.Heal; + signedUpUsers[userBuild.Key] = newBuild.GuildWars2Build; + currentHeal += signedUpUsers[userBuild.Key].Heal; + } + } + } + } + + private void IncreaseHeal(Raid raid, Dictionary signedUpUsers, int currentHeal) + { + foreach (var userBuild in signedUpUsers) + { + if (userBuild.Value.Heal == 00 && currentHeal < 10) + { + RaidSignUp signUp = raid.SignUps.FirstOrDefault(s => s.LiebUserId == userBuild.Key); + Equipped newBuild = signUp.GuildWars2Account.EquippedBuilds.Where(b => b.GuildWars2Build.Heal > 0).OrderBy(u => _random.Next()).FirstOrDefault(); + if (newBuild != null) + { + currentHeal -= userBuild.Value.Heal; + signedUpUsers[userBuild.Key] = newBuild.GuildWars2Build; + currentHeal += signedUpUsers[userBuild.Key].Heal; + } + } + } + } + private void CleanUpRoles(Raid raid, LiebContext context) { List rolesToDelete = new List(); diff --git a/Lieb/Models/GuildWars2/GuildWars2Build.cs b/Lieb/Models/GuildWars2/GuildWars2Build.cs index d5383d5..f3d965a 100644 --- a/Lieb/Models/GuildWars2/GuildWars2Build.cs +++ b/Lieb/Models/GuildWars2/GuildWars2Build.cs @@ -20,7 +20,7 @@ namespace Lieb.Models.GuildWars2 Thief = 3, Ranger = 4, Necromancer = 5, - Masmer = 6, + Mesmer = 6, Revenant = 7, Guard = 8, Warrior = 9, diff --git a/Lieb/Pages/Raids/RaidDetails.razor b/Lieb/Pages/Raids/RaidDetails.razor index 5ad5a10..9a8dd75 100644 --- a/Lieb/Pages/Raids/RaidDetails.razor +++ b/Lieb/Pages/Raids/RaidDetails.razor @@ -37,7 +37,7 @@ - + @{ ulong discordId = ulong.Parse(@context.User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier).Value); @@ -46,6 +46,7 @@ bool isSignedUp = userRole != null; DateTime flexTime = _raid.FreeForAllDate.Date + _raid.FreeForAllTime.TimeOfDay; bool isSignUoAllowed = !_raid.IsRandomized && (user.RoleAssignments.FirstOrDefault(a => a.LiebRole.RoleName == _raid.RequiredRole) != null || flexTime < DateTime.Now); + isSignedUp = isSignedUp && user.GuildWars2Accounts.Count > 0 && (_raid.RaidType == RaidType.Planned || user.GuildWars2Accounts.FirstOrDefault()?.EquippedBuilds.Count > 0);