Ok, so I've managed to collect up some data:
- I've input the top 21 players from each team for 20 matches (and growing!) evenly split between EU and NA
- This gives me roughly ~= 840 individual player match (player,score,kills,deaths,rounds won).
- Which in turn gives me aggregate data on 516 unique players (player,total score, total kills, total death, total rounds,score per round).
- I filtered this on players who I had at least 3 matches for. This gave me about 71 players. Not the greatest dataset, but data entry takes time
From this, I was able to determine that there is a linear relationship between a players score per round and their average k/d.
average_score_per_round = 3.46 * average_kd + 4.40The average score value should be correct to with +-30%
So if we want to get the auto-balancer to stop being level dependent, I propose we change the
script_cf_crpg_autobalance_get_level to be the following.
("cf_crpg_autobalance_get_level", [
(store_script_param, ":player_no", 1), #Store script input to :player_no
(try_begin),
(store_add, ":troop_no", "trp_player0_multiplayer", ":player_no"), # get troopnumber
(troop_get_slot, ":kd", ":troop_no", slot_troop_crpg_kd_ratio), #players k/d ratio * 100 I think.
(assign, ":player_value", ":kd"), #total value of player, normalized
#Generally the team with the higher combined score wins. Average score per round isn't saved, but it can be derived from k/d.
#score_per_round=3.46 * kd_ratio + 4.4
(val_mul, ":player_value",346 ),#People seem to be afraid of floats, so so shall I
(val_add, ":player_value",44000),#Y intercept in correct units
(val_div, ":player_value",1800),#Score one gets with a 4.0 kd on average * 100. May need to be adjusted up.
(val_min, ":player_value",100), # cap so we can get a value between 0 & 100
(assign, reg0, ": player_value"),#assign return
(else_try),
(assign, reg0, 0),
(try_end),
]),
Breakdown in story form (See Sir_TryHard post):
P1 Sir_TryHard_CarriesAlot
Level: 30
Overall K/D from all matched: 10:1
Round 1 kills: 7 ( Had a bad round)
Round 1 Deaths: 1
Round 1 Points: 40
On Losing team(Re: Bad round)
P1 ArcherWith300Ping
Level: 31
Overall K/D from all matches: 1:4
Round 1 kills :0
Round 1 Deaths:0
Round 1 Points: 3
On winning team
(store_add, ":troop_no", "trp_player0_multiplayer", ":player_no"), # get troopnumber
(troop_get_slot, ":kd", ":troop_no", slot_troop_crpg_kd_ratio), #players k/d ratio * 100 I think.
(assign, ":player_value", ":kd"), #total value of player, normalized
So we are not paying any attention to how well (or badly) a player did on the first round. So using only persistent data we get:
Sir_TryHard_CarriesAlot player_value: 1000
ArcherWith300Ping player_value: 25
Yeah, its a bit lopsided, but as far as I can tell 10:1 is a unreasonably high average k:d.
(val_mul, ":player_value",346 ),#People seem to be afraid of floats, so so shall I
(val_add, ":player_value",44000),#Y intercept in correct units
Ok, so now we transform that in to expected points per round and we get
Sir_TryHard_CarriesAlot player_value: 390000 (Dividing by 10,000 to get points, or 39 points per round expected)
ArcherWith300Ping player_value: 52650 (Dividing by 10,000 to get points, or 5.2 points per round expected)
I swear made that original data up. I had no Idea it would be relatively accurate.
(val_div, ":player_value",1800),#Score one gets with a 4.0 kd on average * 100. May need to be adjusted up.
(val_min, ":player_value",100), # cap so we can get a value between 0 & 100
So we have to cap Sir_TryHard unfortunately. Luckily, he's still several times better than ArcherWith300Ping
Sir_TryHard_CarriesAlot player_value: 100
ArcherWith300Ping player_value: 29.25
And for those of you who just want to see the results:
Player | Original Value | New Value |
Sir_TryHard_CarriesAlot | 636 | 100 |
ArcherWith300Ping | 654 | 29.25 |
And again, I'd like to that Sniger for providing me we the EU screenshots. Ill be posting some comparisons of how those two algorithms perform in a bit.