2026-03-15 20:46:45 +01:00
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
|
2026-03-16 16:04:08 +01:00
|
|
|
def calc_base_change(elo_factor, match_is_draw, K_FACTOR):
|
2026-03-15 20:46:45 +01:00
|
|
|
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)
|
|
|
|
|
|
2026-03-16 16:04:08 +01:00
|
|
|
return base_change
|
|
|
|
|
|
2026-03-15 20:46:45 +01:00
|
|
|
|
|
|
|
|
def calc_elo_factor(winner_id, looser_id, system_name):
|
2026-03-16 16:04:08 +01:00
|
|
|
w_stats = data_api.get_player_statistics(winner_id)
|
|
|
|
|
l_stats = data_api.get_player_statistics(looser_id)
|
2026-03-15 20:46:45 +01:00
|
|
|
|
2026-03-16 16:04:08 +01:00
|
|
|
# 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)
|
2026-03-15 20:46:45 +01:00
|
|
|
|
2026-03-16 16:04:08 +01:00
|
|
|
w_mmr = w_stat['mmr'] if w_stat and w_stat['mmr'] is not None else 1000
|
2026-03-15 20:46:45 +01:00
|
|
|
l_mmr = l_stat['mmr'] if l_stat and l_stat['mmr'] is not None else 1000
|
|
|
|
|
|
2026-03-16 16:04:08 +01:00
|
|
|
return (1 / (1 + 10 ** ((l_mmr - w_mmr) / 400)))
|
2026-03-15 20:46:45 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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.
|
2026-03-16 16:04:08 +01:00
|
|
|
days_ago = max(w_days, l_days)
|
2026-03-15 20:46:45 +01:00
|
|
|
|
|
|
|
|
"""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)
|
|
|
|
|
|
|
|
|
|
|
2026-03-16 16:04:08 +01:00
|
|
|
def wrath_of_khorne(player_id, system_id):
|
2026-03-15 20:46:45 +01:00
|
|
|
# -----------------
|
|
|
|
|
khorne_days = 16
|
|
|
|
|
khorne_bonus = 8
|
|
|
|
|
# -----------------
|
|
|
|
|
|
2026-03-16 16:04:08 +01:00
|
|
|
last_played = int(data_api.get_days_since_last_system_game(player_id, system_id))
|
2026-03-15 20:46:45 +01:00
|
|
|
if last_played <= khorne_days:
|
|
|
|
|
return khorne_bonus
|
|
|
|
|
else:
|
|
|
|
|
return 0
|
|
|
|
|
|
2026-03-16 07:21:02 +01:00
|
|
|
def slaanesh_delight():
|
|
|
|
|
return 0
|
2026-03-16 16:04:08 +01:00
|
|
|
|
2026-03-17 16:08:38 +01:00
|
|
|
def tzeentch_scemes(system_id, winner_score, looser_score):
|
|
|
|
|
sys_data = data_api.get_gamesystem_data(system_id)
|
|
|
|
|
min_score = sys_data["min_score"]
|
|
|
|
|
max_score = sys_data["max_score"]
|
|
|
|
|
|
|
|
|
|
bonus = int(((max_score*(winner_score-looser_score)))/(max_score*1.1)) #Multiplikatiionsfaktor für die Berechnung.
|
|
|
|
|
|
|
|
|
|
return bonus
|