I posted (what I hope) is a fair approach to calculating AW matchmaking.
I will not repeat it here - it is linked below.
It boils down to a form of Elo system, but factors in players’ individual scores in AW instead of just the alliance as a whole. This is to increase the data points and make the Elo system more responsive.
Some criticisms have been raised (I’ll link to them in separate posts below)… but the main one I would like to address is the perception that it would be hard to calculate and a lot of effort to develop.
I disagree. While it would certainly be non-trivial, I really don’t think it would prove OVER Complicated.
I spent about 20min of my time coming up with an approach where this can be calculated and stored without the need for big, complicated batch jobs, etc. It boils down to giving the client the job of calculating and storing the Elo while it is busy doing work that it would already be doing in managing the alliance battle or war results.
It is outlined below.
If it took me 20min to flesh out the basic algorithm, I can’t see it being OVER complicated to implement. (Yes, using simple metrics like Titan score or Alliance score is easier… but really does have several fundamental problems).
I don’t know if it’s worth spending time trying to correct every detail of my algorithm. The main reason for my post is to indicate that it actually shouldn’t be all that hard to code it. Obviously SG would spend a lot more than 20min ironing out the detail and checking for logical flaws… we don’t have to do ALL of their work for them.
In the client:
When Player has completed attack in AW
If first attack of war then [Battle Count in war] := 0
[Power Elo] := Score based on difference between his team power and the opponent.
If victory then big +ve if player power < opponent power or small +ve otherwise.
If defeat then big -ve if player power < opponent power, otherwise small -ve
Add to [running total of health taken] from enemies.
If Flags is zero, [Health Elo] := score on the final [running total of health taken]
Increment [Battle count in war]
Add battle score to [score tracking array]. If no. of elements in [score tracking array] is now more than max_tracked_elements, remove the first element. (To track rolling average)
[Avg Points Elo] = Average(all elements in [score tracking array]
Store these variables with player record in an array - 1 per battle.
Calculate [Defence Elo] for the DEFENDING PLAYER using similar concept to [Power Elo]
Store [Defence Elo] for the DEFENDING PLAYER
When collating final count of all players stats after war:
- if [Battle count in war] < 6 then add (6 - [Battle count in war]) 0s to [score tracking array] and remove (elements([score tracking array]) - max_tracked_elements) from the start of [score tracking array].
(i.e. recording the battles the user failed to fight).
- Calculate [Player’s_Cumulative_Elo_Current_Battle] score using average of [Power Elo]; [Health Elo]; [Avg Points Elo] and the current player’s stored [Defence Elo] for each battle as inputs, with weightings as appropriate.
(If the player didn’t take part, but has a defence, his Elo score is zero and will influence the Alliance Elo down. If he didn’t set a defence, his Elo is not factored in)
- Calculate [Player’s Overall Elo] by adding or subtracting to it based on [Player’s_Cumulative_Elo_Current_Battle] relative to [Player’s Overall Elo]
(i.e. lift the [Player’s Overall Elo] by some factor if [Player’s_Cumulative_Elo_Current_Battle] is greater than it, otherwise drop it by some factor
- Store [Player’s Overall Elo]
- When all [Player’s Overall Elo] scores are done…
Calculate [Current War Players’ Average Elo] across all who registered a defence (i.e. who opted to take part).
Calculate [Alliance Overall Elo] as follows:
* +ve boost for Victory or -ve boost for defeat. Amount of boost is dependent on current [Alliance Overall Elo] versus the opposing alliance’s [Alliance Overall Elo]
* +ve boost if [Stored Players’ Average Elo] exceeds [Current War Player’s Average Elo]. -ve boost otherwise. (Size of boost dependent on the size in difference in scores).
- Store [Current War Players’ Average Elo] as [Stored Players’ Average Elo]
- Store the calculated [Alliance Overall Elo]
You can add a number of other performance metrics to above without greatly impacting the algorithm - the principle remains the same… just more data points to store.
Job done. Wasn’t that hard, was it?