Originally posted by kess
View Post
Announcement
Collapse
No announcement yet.
Next League
Collapse
X
-
I already have solutions to the ratings and drafting systems for TSL, did this ages ago it just never got implemented.
Ratings
The formulas in this thread produce dollar-values that can be compared between divisions and between basing ships.
https://forums.trenchwars.com/forum/...ula-discussion
Drafting
This is a sample of code from an automated drafter. It picks basing teams like a real captain would, e.g. if you pick a shark and there aren't many sharks I pick a shark. Can provide the full code if needed for someone to actually implement it.
Code:using DraftLibrary.Classes; using System.Collections.Generic; using System; using System.Linq; namespace DraftLibrary.Algorithms { class Snake { public static List<Team> DraftWithCaptain(List<Player> players, List<Team> teams) { //// the snake format is still fine for picking with a captain //// it gives the captains a turn in the correct order, like TWDT List<int> draftOrder = GetDraftOrder(players, teams); for (int i = 0; i < draftOrder.Count; i++) { int teamIndex = draftOrder[i]; Team currentTeam = teams[teamIndex]; //// //// I am ALL CAPS picking against ALL THE OTHERS //// //// work out who we should pick //// we need 1 terr, 2 sharks, 5 spiders //// we know which team we're up against Team opponentTeam = (teamIndex % 2) == 0 ? teams[teamIndex + 1] : teams[teamIndex - 1]; //// we have overall, terr, shark, spid ratings. // see who's left to pick List<Player> remaining = GetPlayersRemaining(players, teams); //// someone might end up in multiple lists, e.g. turban, dreamwin // be less selective as the draft progresses. int round = (i + teams.Count) / teams.Count; // some constants which vary depending on the ratings used int HighestUsefulRating = 7; /* e.g. 7* at something is worth prioritising over their Overall rating, 6* isn't. */ int EliteRating = 10; /* you want to be picking a 10* first */ int RoundRelaxation = 1; /* each round, including round 1, reduce pickyness by 1* */ // ^ the point of this is that you don't really want to be picking an 8* over a 9/10* in round 1, but in round 2 you might. // shortlist remaining sharks List<Player> sharkShortlist = ShortlistSharks(remaining, Math.Max(HighestUsefulRating, EliteRating - (round * RoundRelaxation))); // shortlist remaining terrs List<Player> terrShortlist = ShortlistTerrs(remaining, Math.Max(HighestUsefulRating, EliteRating - (round * RoundRelaxation))); // shortlist remaining spiders List<Player> spiderShortlist = ShortlistSpiders(remaining, Math.Max(HighestUsefulRating, EliteRating - (round * RoundRelaxation))); // I need to know how many turns until my next pick bool haveAnotherPick = false; int turnsUntilNextPick = 0; for (int j = i + 1; j < draftOrder.Count; j++) { if (teamIndex == draftOrder[j]) { haveAnotherPick = true; turnsUntilNextPick = j - i; break; } } List<Player> solidPicks = new List<Player>(); if ( /* dont pick more than 2 sharks */ currentTeam.Sharks.Count < 2 /* this logic only works if we have shortlisted sharks available */ && sharkShortlist.Count > 0 && ( /* don't get out sharked */ currentTeam.Sharks.Count <= opponentTeam.Sharks.Count /* if you're concerned someone else is going to snipe your shark pick */ || (haveAnotherPick && sharkShortlist.Count < turnsUntilNextPick) ) ) { Player player = GetHighestRatedShark(sharkShortlist); if (!solidPicks.Contains(player)) { player.Context = "Shark"; solidPicks.Add(player); } } if ( /* don't pick more than 1 terr */ currentTeam.Terr.Count < 1 /* this logic only works if we have shortlisted terrs available */ && terrShortlist.Count > 0 && ( /* don't get out terred */ currentTeam.Terr.Count <= opponentTeam.Terr.Count /* if you're concerned someone else is going to snipe your terr pick */ || (haveAnotherPick && terrShortlist.Count < turnsUntilNextPick) ) ) { Player player = GetHighestRatedTerr(terrShortlist); if (!solidPicks.Contains(player)) { player.Context = "Terr"; solidPicks.Add(player); } } if ( /* don't pick more than 5 spiders */ currentTeam.Spids.Count < 5 /* this logic only works if we have shortlisted spiders available */ && spiderShortlist.Count > 0 && ( /* don't get out spidered */ currentTeam.Spids.Count <= opponentTeam.Spids.Count /* if you're concerned someone else is going to snipe your spider pick */ || (haveAnotherPick && spiderShortlist.Count < turnsUntilNextPick) ) ) { Player player = GetHighestRatedSpider(spiderShortlist); if (!solidPicks.Contains(player)) { player.Context = "Spid"; solidPicks.Add(player); } } Player pick = null; if (solidPicks.Count == 1) { // We found 1 solid pick, just add it. pick = solidPicks[0]; } else if (solidPicks.Count > 1) { // There's more than 1 player we'd like to pick // We have to resolve it somehow... prefer the default order, but let higher rating override it. Player player = GetHighestRatedSolidPick(solidPicks); pick = player; } else { // fallback, just pick the highest overall rated player Player player = GetHighestRatedPlayer(remaining); player.Context = string.Empty; pick = player; } switch (pick.Context) { case "Terr": currentTeam.AddTerr(pick); break; case "Shark": currentTeam.AddShark(pick); break; case "Spid": currentTeam.AddSpid(pick); break; default: currentTeam.AddPlayer(pick); break; } } return teams; } private static Player GetHighestRatedSpider(List<Player> spiders) { Player player = null; foreach (Player p in spiders) { if (player == null) player = p; if (p.Spid > player.Spid) player = p; } return player; } private static Player GetHighestRatedTerr(List<Player> terrs) { Player player = null; foreach (Player p in terrs) { if (player == null) player = p; if (p.Terr > player.Terr) player = p; } return player; } private static Player GetHighestRatedShark(List<Player> sharks) { Player player = null; foreach (Player p in sharks) { if (player == null) player = p; if (p.Shark > player.Shark) player = p; } return player; } private static List<int> GetDraftOrder(List<Player> players, List<Team> teams) { List<int> draftOrder = new List<int>(); int teamIndex = 0; string direction = "r"; // the number of picks matches the number of players for (int i = 0; i < players.Count; i++) { draftOrder.Add(teamIndex); // snake switch (direction) { case "r": { if (teamIndex + 1 == teams.Count) { direction = "l"; } else { teamIndex++; } break; } case "l": { if (teamIndex == 0) { direction = "r"; } else { teamIndex--; } break; } } } return draftOrder; } private static List<Player> ShortlistSpiders(List<Player> remaining, int rating) { List<Player> shortlist = new List<Player>(); foreach (Player player in remaining) { if (player.Spid >= rating) { shortlist.Add(player); } } return shortlist.OrderByDescending(p => p.Spid).ToList(); } private static List<Player> ShortlistTerrs(List<Player> remaining, int rating) { List<Player> shortlist = new List<Player>(); foreach (Player player in remaining) { if (player.Terr >= rating) { shortlist.Add(player); } } return shortlist.OrderByDescending(p => p.Terr).ToList(); } private static List<Player> ShortlistSharks(List<Player> remaining, int rating) { List<Player> shortlist = new List<Player>(); foreach (Player player in remaining) { if (player.Shark >= rating) { shortlist.Add(player); } } return shortlist.OrderByDescending(p => p.Shark).ToList(); } private static List<Player> GetPlayersRemaining(List<Player> players, List<Team> teams) { List<Player> remaining = new List<Player>(); foreach (Player player in players) { bool picked = false; foreach (Team team in teams) { if (team.Players.Contains(player)) picked = true; } if (!picked) remaining.Add(player); } return remaining; } public static List<Team> DraftWithoutCaptain(List<Player> players, List<Team> teams) { List<int> draftOrder = GetDraftOrder(players, teams); foreach (int teamIndex in draftOrder) { Team currentTeam = teams[teamIndex]; // see who's left to pick List<Player> remaining = GetPlayersRemaining(players, teams); Player player = GetHighestRatedPlayer(remaining); currentTeam.AddPlayer(player); } return teams; } private static Player GetHighestRatedPlayer(List<Player> remaining) { Player player = null; foreach (Player p in remaining) { if (player == null) player = p; if (p.Overall > player.Overall) player = p; } return player; } private static Player GetHighestRatedSolidPick(List<Player> remaining) { Player player = null; foreach (Player p in remaining) { if (player == null) player = p; if (p.RatingInContext() > player.RatingInContext()) player = p; } return player; } } }
Comment
-
Originally posted by Claushouse View Post
TSL ended up creating multiple insane psychos who still stalk and harass me to this day because I ran TSL and gave out warnings and bans (Skyforger, Jessup, etc.) You had players ragequitting games, refusing to play with certain bad players, demanding bans on Jessup because he would just run and extended every game 10 minutes. He would play like 70 jav and 70 wb games which means that he wasted like 140 GP x 10 minutes x 30 or 40 players stuck in spec waiting for the next game equalled:
One player singlehandedly wasted 840 man hours of our lives running every game per season.
I was never banned or asked to be banned by ANYONE except you and YOU WERE THE ONE WARNED FOR ABUSE AS A HOST AND FABRICATING LIES ABOUT ME DURING TSL WHICH I SEE YOU STILL ARE FIXATED ON DOING.The reason you quit was because you were told you were unstable and out of control and were urself banned from running things until you cooled down. You are such a twit ogron.
I do not stalk you at all and never have but these are messages I sometimes still log in to see left by you... God you are such a twit.
This all said I'd like to see TSL again since I am a defending champion of it . :kiss:TWDT-J CHAMPION POWER 2018
TWDT-B CHAMPION POWER 2018
TWDT TRIPLE CROWN MEMBER POWER 2018
TSL TRIPLE CROWN FINALIST 2018
TSLD CHAMPION 2018
TSLB CHAMPION 2018
Comment
-
Originally posted by Jessup View Post
I was never banned or asked to be banned by ANYONE except you and YOU WERE THE ONE WARNED FOR ABUSE AS A HOST AND FABRICATING LIES ABOUT ME DURING TSL WHICH I SEE YOU STILL ARE FIXATED ON DOING.The reason you quit was because you were told you were unstable and out of control and were urself banned from running things until you cooled down. You are such a twit ogron.
I do not stalk you at all and never have but these are messages I sometimes still log in to see left by you... God you are such a twit.
This all said I'd like to see TSL again since I am a defending champion of it . :kiss:
This is not coming from a hateful place, but in all honesty this forum would be a much better place without your outbursts and constant derailing posts. Even if your anger, frustration, and feelings of being disrespected are warranted, you can choose not to engage.
As things stand, you aren't contributing anything positive to the forum, and it seems that the forums aren't contributing anything positive to your life. I urge you to seriously consider logging out of forums for a while, for everyone's sake (yours included).
Comment
-
Originally posted by Pressure View Post
Jessup, other than dissolving Paladen, I don't have a problem with you personally, and I have actually protected you behind the scenes in ways you are unaware of. However, you keep derailing league-related threads. You don't have to respond every time someone mentions your name. You can choose not to respond. Stop showing us all how affected you are by others' opinion and perspective of you. Please stop.
This is not coming from a hateful place, but in all honesty this forum would be a much better place without your outbursts and constant derailing posts. Even if your anger, frustration, and feelings of being disrespected are warranted, you can choose not to engage.
As things stand, you aren't contributing anything positive to the forum, and it seems that the forums aren't contributing anything positive to your life. I urge you to seriously consider logging out of forums for a while, for everyone's sake (yours included).
Again I would like to do TSL.TWDT-J CHAMPION POWER 2018
TWDT-B CHAMPION POWER 2018
TWDT TRIPLE CROWN MEMBER POWER 2018
TSL TRIPLE CROWN FINALIST 2018
TSLD CHAMPION 2018
TSLB CHAMPION 2018
Comment
-
This is just my personal opinion but I think TWL and TWDT are the only leagues worth playing. I'd suggest we go back to 3 game weekends though so it would only take 1,5 hours of your sunday instead of 3-4 hours. Maybe even start the 2nd and 3rd games right after the last ones have finished
Comment
-
Originally posted by maketso View PostThis is just my personal opinion but I think TWL and TWDT are the only leagues worth playing. I'd suggest we go back to 3 game weekends though so it would only take 1,5 hours of your sunday instead of 3-4 hours. Maybe even start the 2nd and 3rd games right after the last ones have finished2018 TWDT Champion 2019 TWLD Final 4 2019 TWDTJ Semi finalist 2019 2x TWDTD Finalist 2020 TW Forum Mafia Game champion
Comment
-
Some people have expressed TSL becomes less fun the longer you play it.
We could just do a Sunday event of TSL.
We play a bunch of games to 5 and have finals the same day or next weekend.
Lets use Ogrons original rating system with oversight from a league op.
Or Rabs , if the system can be implemented and works better.
Comment
-
bumphttps://twd.trenchwars.org/showgame/90112596
Retired after i dropped 24 kills and carry the team
wbduel Map Maker Legend
Comment
-
Originally posted by Cape View PostLets do all a league where the teams are random every game all season. TWDueling. TWJav. TWBasing. TWSpider.
But the catch is, after a certain amount of games, we will tally up player stats and their win/loss ratio to determine the top 10 in Jav/Wb and top 16 in basing.
Finals would be basically an all-star team match-up.
Example:
Best 10 Javs #1 and #9 on a team #2 and #8 on the other team ect.
Do it up. This sounds like it would be a lot of fun - and most of all fair for everyone. You could just run it for 4 or 5 weeks too so it doesn't go on for too long.
Comment
Channels
Collapse
Comment