Designer Diary | WARLINE: Maneuver Strategy & Tactics

A look inside the making of WARLINE: Maneuver Strategy & Tactics
 Thumb up

A Fighting Chance: Custom Elo-like Rating System for WARLINE

Justin Leingang
United States
flag msg tools
Microbadge: Meet me on the battlefield!Microbadge: Wargamer of 5+ yearsMicrobadge: I love baseball!Microbadge: Belgian beer fanMicrobadge: Train Gamer
WARLINE: Tactical Fantasy Battles (or r/Warline on reddit) is being engineered as both a community-driven casual play platform and a highly-competitive organized play platform. Unlike a vast majority of modern competitive tabletop games that are popular, WARLINE's game systems include zero true RNG. This fact leaves me with a steep mountain to climb toward success, because it is RNG in competitive game systems that helps welcome new players and keep less skilled/casual players engaged in organized play (for reasons that are too deep to go into in this post).

So, to give WARLINE a fighting chance as a successful organized play platform, I'm developing a custom Elo-like rating system--I say "Elo-like" because my system necessarily can't use a strict Elo algorithm or a variant. With a system like this in place, I can develop a strict organized play platform that includes detailed match-making, based on my rating system, ensuring that any player always has a chance to win an OP battle. The intended result is that new players can have fun, casual players can have fun, and masters can stay challenged and engaged. Additionally, a weaker player's rank can increase much more by defeating a stronger (i.e. higher ranked) player, and a stronger player's rank will suffer if defeated by a weaker player.

In an Elo system, a player's rating shifts up or down following a game based on win/lose/draw and the strength of their opponent. In these systems, points from winning or losing is a binary: 1 point for a win and 0 points for a loss (with 0.5 points awarded for a draw). However, in WARLINE, victory isn't a binary: There are 5 different victory conditions, which each award a different number of Organized Play Points, according to the difficulty of meeting the condition. Because of this scoring system, I have to develop a custom algorithm to express how good any given player is at playing WARLINE. Also, an Elo system doesn't directly account for the total number of games a player has played--I don't care for this fact, because a player's aptitude always increases with play, regardless of whether or not they win or lose. My rating algorithm, therefore, also takes total sanctioned games played into account.

I'm calling WARLINE's custom rating system the Warline Aptitude Rating system (or, WAR). To follow is a breakdown of the factors that are being considered in this system, along with the algorithms currently in place. I'd appreciate feedback on the reasoning behind the factors that I've chosen, along with feedback on the algorithms I'm using to express the intended results.


The WAR rating algorithm

r = ((((t/n)*w)*1000)+n)

(if n == 0, then r = 0)

...where r is the player's actual rating (WAR), t is the player's total AP ("Aptitude Points"-details to follow) across all games, n is the total number of sanctioned games played by the player, w is the ratio of the player's victories to defeats, and the 1000 multiplier is simply applied so that WAR are expressed as whole numbers instead of being < 1 > 0 decimal numbers.

WAR factors rationale

Total Aptitude Points (t) | The rationale behind this factor is self explanatory, as it's the total number of Aptitude Points (see below for details) a player has scored across all sanctioned games he has played.

Total number of games played (n) | I'm factoring in the player's total number of sanctioned games played, because a player always learns by playing a game, and therefore his aptitude increases. Without factoring this in, it's difficult to express the difference between someone who's played 1 game and someone who's played 100 games, if the players both played the same opponent every time, scored the same number of points every time, and have the exact same win/loss ratio ("w" in my algorithm). By factoring in total plays, WAR expresses the learning that comes from playing more and more games--a player who's played 100 games and lost them all is definitely going to be a better player than another who's played 1 game and lost.

Victory ratio (w) | I factor in the percentage of sanctioned games a player has won, because this helps express the traditional Elo binary of win/loss in a manner that harmonizes with my system. We need to express wins versus losses, because that idea expresses the base "strength" of a player.


Aptitude Points algorithm

a = (m*(1+(0.1*(ro-rp))))

...where a is Aptitude Points earned from the game just played, m is a multiplier that comes from the OPP won in the game, ro is the WAR of your opponent, and rp is your WAR. The 1+ is used so that AP is most always a number >= 1, while the 0.1 multiplier is used because WARs are often in the thousands, and AP are best expressed as small numbers, so that shifts in WAR are more gradual.

Aptitude Points (a) | This is a custom points system for a game, used because WARLINE doesn't have a binary win/lose value. I need a custom points system like this in order to express how well a player understands the nuances of the game, not just whether they know how to win at the most basic level.

OPP multiplier (m) | Within any given WARLINE tournament or league season, players earn Organized Play Points for wins, based on the type of victory the player executes--these OPP determine advancement in a tournament or standings in a league season. Since these points already express the aptitude required for a certain victory, I use the equivalent value as a multiplier to the win earned.

Opponent's rating (ro) | I factor in the opponent's WAR because it's more difficult to earn victory against a strong opponent than against a weak opponent. The way this factor is used in the algorithm results in a player *losing* points if defeated by another player who is weaker (lower WAR) than the player.

Player rating (rp) | This is your own WAR at the time the game took place (prior to post-game recalculation). It's factored in as part of the comparison between your aptitude and your opponent's aptitude.


Applying the algorithms to update a player's WAR

The process of using these two algorithms to adjust a player's WAR, after a game has concluded, is pretty simple:

1. First, calculate the player's AP gained from the game he just completed. For example, consider Player A--who has a WAR of 390--and Player B--WAR 833. If Player A wins the battle for 3 OPP, then Player A earns 135.9 AP for the game [calculated from a = (3*(1+(0.1*(833-390))))]. The AP earned is rather large, because Player A won against an opponent *much* stronger than himself (if Player B would have won, the AP earned would have been significantly smaller, because Player B defeated a much weaker opponent).

2. Next, update the Player A's WAR by adding the game's AP into the Player A's total AP (let's say his total AP is now 193.9, after adding in the game's AP), then updating *n* and *w* based on the game's outcome, and finally running the WAR rating algorithm. Player A's new WAR is 1068.58 [calculated from r = ((((193.9/101)*0.504)*1000)+101)]. By defeating an opponent much stronger than himself, Player A's WAR jumps significantly!


Wrapping up

If you're still with me, I really appreciate you taking the time to read! Let me know what you think, and if you have experience developing an Elo-like system for your game or any other game you play.

Thanks for reading, and thanks even more for your feedback!
Justin D Leingang
Twitter Facebook
Subscribe sub options Mon Mar 5, 2018 5:00 pm
Post Rolls
  • [+] Dice rolls
Loading... | Locked Hide Show Unlock Lock Comment     View Previous {{limitCount(numprevitems_calculated,commentParams.showcount)}} 1 « Pg. {{commentParams.pageid}} » {{data.config.endpage}}
    View More Comments {{limitCount(numnextitems_calculated,commentParams.showcount)}} / {{numnextitems_calculated}} 1 « Pg. {{commentParams.pageid}} » {{data.config.endpage}}