added RandomWithBoons randomizer
This commit is contained in:
parent
788badff16
commit
191572b8bf
4 changed files with 259 additions and 9 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>();
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue