added RandomWithBoons randomizer

This commit is contained in:
t.ruspekhofer 2022-02-28 15:42:34 +01:00
parent 788badff16
commit 191572b8bf
4 changed files with 259 additions and 9 deletions

View file

@ -95,7 +95,7 @@ namespace Lieb.Data
Description = "This is a test raid\nwith multiple lines?", Description = "This is a test raid\nwith multiple lines?",
Guild = "LIEB", Guild = "LIEB",
Organizer = "Sarah", Organizer = "Sarah",
RaidType = RaidType.RandomClasses, RaidType = RaidType.RandomWithBoons,
Date = DateTime.Now.Date, Date = DateTime.Now.Date,
StartTime = DateTime.Now, StartTime = DateTime.Now,
EndTime = DateTime.Now.AddHours(2), EndTime = DateTime.Now.AddHours(2),
@ -114,6 +114,34 @@ namespace Lieb.Data
context.RaidSignUps.AddRange(signUps); context.RaidSignUps.AddRange(signUps);
context.SaveChanges(); 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<GuildWars2Build>(){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 #endif
} }
} }

View file

@ -7,6 +7,7 @@ namespace Lieb.Data
public class RaidRandomizerService public class RaidRandomizerService
{ {
private readonly IDbContextFactory<LiebContext> _contextFactory; private readonly IDbContextFactory<LiebContext> _contextFactory;
private static Random _random = new Random();
public RaidRandomizerService(IDbContextFactory<LiebContext> contextFactory) public RaidRandomizerService(IDbContextFactory<LiebContext> contextFactory)
{ {
@ -45,7 +46,7 @@ namespace Lieb.Data
RandomizeEliteSpecs(raid); RandomizeEliteSpecs(raid);
break; break;
case RaidType.RandomWithBoons: case RaidType.RandomWithBoons:
RandomizeWithBoons(raid);
break; break;
} }
raid.IsRandomized = true; raid.IsRandomized = true;
@ -57,7 +58,6 @@ namespace Lieb.Data
private void RandomizeClasses(Raid raid) private void RandomizeClasses(Raid raid)
{ {
Random rand = new Random();
foreach (RaidSignUp signUp in raid.SignUps) foreach (RaidSignUp signUp in raid.SignUps)
{ {
HashSet<GuildWars2Class> possibleClasses = new HashSet<GuildWars2Class>(); HashSet<GuildWars2Class> possibleClasses = new HashSet<GuildWars2Class>();
@ -69,7 +69,7 @@ namespace Lieb.Data
role.Spots = 1; role.Spots = 1;
if (possibleClasses.Count > 0) 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 else
{ {
@ -82,7 +82,6 @@ namespace Lieb.Data
private void RandomizeEliteSpecs(Raid raid) private void RandomizeEliteSpecs(Raid raid)
{ {
Random rand = new Random();
foreach (RaidSignUp signUp in raid.SignUps) foreach (RaidSignUp signUp in raid.SignUps)
{ {
HashSet<EliteSpecialization> possibleEliteSpecs = new HashSet<EliteSpecialization>(); HashSet<EliteSpecialization> possibleEliteSpecs = new HashSet<EliteSpecialization>();
@ -94,7 +93,7 @@ namespace Lieb.Data
role.Spots = 1; role.Spots = 1;
if (possibleEliteSpecs.Count > 0) 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 else
{ {
@ -105,6 +104,228 @@ namespace Lieb.Data
} }
} }
private void RandomizeWithBoons(Raid raid)
{
Dictionary<int, GuildWars2Build> signedUpUsers= new Dictionary<int, GuildWars2Build>();
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<int, GuildWars2Build> 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<int, GuildWars2Build> 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<int, GuildWars2Build> 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<int, GuildWars2Build> 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<int, GuildWars2Build> 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<int, GuildWars2Build> 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<int, GuildWars2Build> 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<int, GuildWars2Build> 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<int, GuildWars2Build> 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) private void CleanUpRoles(Raid raid, LiebContext context)
{ {
List<PlannedRaidRole> rolesToDelete = new List<PlannedRaidRole>(); List<PlannedRaidRole> rolesToDelete = new List<PlannedRaidRole>();

View file

@ -20,7 +20,7 @@ namespace Lieb.Models.GuildWars2
Thief = 3, Thief = 3,
Ranger = 4, Ranger = 4,
Necromancer = 5, Necromancer = 5,
Masmer = 6, Mesmer = 6,
Revenant = 7, Revenant = 7,
Guard = 8, Guard = 8,
Warrior = 9, Warrior = 9,

View file

@ -37,7 +37,7 @@
</div> </div>
</div> </div>
<AuthorizeView> <AuthorizeView Policy="@Constants.Roles.User">
<Authorized> <Authorized>
@{ @{
ulong discordId = ulong.Parse(@context.User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier).Value); ulong discordId = ulong.Parse(@context.User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier).Value);
@ -46,6 +46,7 @@
bool isSignedUp = userRole != null; bool isSignedUp = userRole != null;
DateTime flexTime = _raid.FreeForAllDate.Date + _raid.FreeForAllTime.TimeOfDay; 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); 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);
<table class="table"> <table class="table">
<tbody> <tbody>