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?",
|
||||
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<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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ namespace Lieb.Data
|
|||
public class RaidRandomizerService
|
||||
{
|
||||
private readonly IDbContextFactory<LiebContext> _contextFactory;
|
||||
private static Random _random = new Random();
|
||||
|
||||
public RaidRandomizerService(IDbContextFactory<LiebContext> 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<GuildWars2Class> possibleClasses = new HashSet<GuildWars2Class>();
|
||||
|
@ -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<EliteSpecialization> possibleEliteSpecs = new HashSet<EliteSpecialization>();
|
||||
|
@ -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<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)
|
||||
{
|
||||
List<PlannedRaidRole> rolesToDelete = new List<PlannedRaidRole>();
|
||||
|
|
|
@ -20,7 +20,7 @@ namespace Lieb.Models.GuildWars2
|
|||
Thief = 3,
|
||||
Ranger = 4,
|
||||
Necromancer = 5,
|
||||
Masmer = 6,
|
||||
Mesmer = 6,
|
||||
Revenant = 7,
|
||||
Guard = 8,
|
||||
Warrior = 9,
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<AuthorizeView>
|
||||
<AuthorizeView Policy="@Constants.Roles.User">
|
||||
<Authorized>
|
||||
@{
|
||||
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);
|
||||
|
||||
<table class="table">
|
||||
<tbody>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue