Liga-System/match_calculations/calculation.py

82 lines
2.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.
def calc_base_change(elo_factor, match_is_draw, K_FACTOR):
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 - elo_factor)/2)
else:
# Sieg (1.0). Gewinnt der Favorit, gibt es wenig Punkte. Gewinnt der Underdog, gibt es viele!
base_change = K_FACTOR * (1.0 - elo_factor)
return base_change
def calc_elo_factor(winner_id, looser_id, system_name):
w_stats = data_api.get_player_statistics(winner_id)
l_stats = data_api.get_player_statistics(looser_id)
# Passendes System aus der Liste herausfiltern
w_stat = next((s for s in w_stats if s['gamesystem_name'] == system_name), None)
l_stat = next((s for s in l_stats if s['gamesystem_name'] == system_name), None)
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
return (1 / (1 + 10 ** ((l_mmr - w_mmr) / 400)))
def calc_rust_factor(winner_id, looser_id, gamesystem_id):
# 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)
# Der größeren der beiden Werte wird verwendet.
days_ago = max(w_days, l_days)
"""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)
def wrath_of_khorne(player_id, system_id):
# -----------------
khorne_days = 16
khorne_bonus = 8
# -----------------
last_played = int(data_api.get_days_since_last_system_game(player_id, system_id))
if last_played <= khorne_days:
return khorne_bonus
else:
return 0
def slaanesh_delight():
return 0
def tzeentch_schemes(system_id, winner_score, looser_score):
sys_data = data_api.get_gamesystem_data(system_id)
max_score = sys_data["max_score"]
diff_normalized = (winner_score - looser_score) / max_score # 0.0 1.0
threshold = 0.1 # Bonus startet erst ab 10% Vorsprung
bonus = int(max(0, diff_normalized - threshold) * 10) # Ergibt 09
bonus = min(bonus, 9) # Sicherheits-Cap
return bonus