Liga-System/match_calculations/calc_mmr_change.py

86 lines
3.5 KiB
Python

from data import data_api
from wood import logger
# Faktor für die Punkte Inflation. Um diesen Wert verliert der Verlierer weniger Punkte als der Sieger bekommt. Über Kurz oder Lang werden
# die meisten Spieler über 1000MMR sein. Sprich: Neueinsteiger, oder leute die weniger spielen sind eher im unteren Ende als in der Mitte.
point_inflation = 0.7 # => entspricht %
K_FACTOR = 40 # Die "Border" (Maximalpunkte) die ein Sieg gibt.
def calc_mmr_change(systemname, winner_id, looser_id, winner_points, looser_points, match_is_draw):
def get_rust_dampener(days_ago):
"""Berechnet den Dämpfungsfaktor basierend auf den vergangen Tagen."""
if days_ago <= 30:
return 1.0 # Volle Punkte
elif days_ago > 90:
return 0.1 # Maximal eingerostet (nur 10% der Punkteänderung)
else:
# Lineare Rampe von 0.8 (bei Tag 31) runter auf 0.1 (bei Tag 90)
# Formel: Startwert - (Differenz * Prozentualer Weg)
factor = 0.8 - 0.7 * ((days_ago - 30) / 60)
return round(factor, 2)
gamesystem_id = data_api.get_gamesystem_id_by_name(systemname)
# 1. Die aktuellen MMR-Punkte holen
w_stat = data_api.get_player_system_stats(winner_id, systemname)
l_stat = data_api.get_player_system_stats(looser_id, systemname)
# Wenn ein Spieler noch keine keine Stats hat wird None zurück gegeben. Fallback für diesen Fall
w_mmr = w_stat['mmr'] if w_stat and w_stat['mmr'] is not None else 1000
l_mmr = l_stat['mmr'] if l_stat and l_stat['mmr'] is not None else 1000
expected_win = 1 / (1 + 10 ** ((l_mmr - w_mmr)/400))
logger.log("MATCH CALC", f"1 / (1 + 10 ** (({l_mmr} - {w_mmr})/400))")
if match_is_draw:
# Bei einem Draw (0.5) gewinnt der Schwächere leicht Punkte, der Stärkere verliert leicht.
base_change = (K_FACTOR * (0.5 - expected_win)/2)
logger.log("MATCH CALC", "Draw")
else:
# Sieg (1.0). Gewinnt der Favorit, gibt es wenig Punkte. Gewinnt der Underdog, gibt es viele!
base_change = K_FACTOR * (1.0 - expected_win)
# 3. Den "Rostigkeits-Dämpfer" errechnen.
w_days = data_api.get_days_since_last_system_game(winner_id, gamesystem_id)
l_days = data_api.get_days_since_last_system_game(looser_id, gamesystem_id)
days = max(w_days, l_days)
rust_factor = get_rust_dampener(days)
sla_points = 0 #slaanesh_delight(winner_points, looser_points)
logger.log(f"MATCH CALC", f"Base Change: {base_change}, Rost Faktor: {rust_factor}, EloFaktor: {expected_win}")
# Wenn Das Match ein Draw ist, können keine Slaanesh Punkte auftreten.
if match_is_draw:
winner_final_mmr_change = int(base_change + wrath_of_khorne(winner_id)* rust_factor)
looser_final_mmr_change = int(base_change + wrath_of_khorne(looser_id)* rust_factor)
else:
winner_final_mmr_change = int((base_change + wrath_of_khorne(winner_id) + sla_points) * rust_factor)
looser_final_mmr_change = int(((base_change + wrath_of_khorne(winner_id) - sla_points) * rust_factor)* point_inflation)
return winner_final_mmr_change, looser_final_mmr_change
# -----------------
khorne_days = 16
khorne_bonus = 8
# -----------------
def wrath_of_khorne(player_id):
last_played = data_api.get_days_since_last_game(player_id)["days_ago"]
if last_played <= khorne_days:
return khorne_bonus
else:
return 0
def slaanesh_delight(winner_points, looser_points, rules):
print()
def tzeentch_scemes():
print("k")
def nurgles_entropy():
print("k")