diff --git a/.nicegui/storage-user-21d6fdd4-43d2-4625-8dc2-9282b6aa433f.json b/.nicegui/storage-user-21d6fdd4-43d2-4625-8dc2-9282b6aa433f.json index e85e364..719b094 100644 --- a/.nicegui/storage-user-21d6fdd4-43d2-4625-8dc2-9282b6aa433f.json +++ b/.nicegui/storage-user-21d6fdd4-43d2-4625-8dc2-9282b6aa433f.json @@ -1 +1 @@ -{"authenticated":true,"discord_id":"277898241750859776","discord_name":"mrteels","db_id":2,"display_name":"Schwitzender Klebschnüffler","discord_avatar_url":"https://cdn.discordapp.com/avatars/277898241750859776/7c3446bb51fafd72b1b4c21124b4994f.png"} \ No newline at end of file +{"authenticated":true,"discord_id":"277898241750859776","discord_name":"mrteels","db_id":2,"display_name":"Stolpernder Guardmen","discord_avatar_url":"https://cdn.discordapp.com/avatars/277898241750859776/7c3446bb51fafd72b1b4c21124b4994f.png"} \ No newline at end of file diff --git a/data/data_api.py b/data/data_api.py index 9e68fe0..a66d8b1 100644 --- a/data/data_api.py +++ b/data/data_api.py @@ -459,7 +459,6 @@ def apply_match_to_player_statistic (player_id, gamesystem_id, mmr_change, score last_played = CURRENT_TIMESTAMP WHERE player_id = ? AND gamesystem_id = ? """ - # ACHTUNG: Wir müssen scored_points ZWEIMAL übergeben! # Einmal für die 'points' und einmal für die Berechnung der 'avv_points'. cursor.execute(query, (mmr_change, scored_points, scored_points, player_id, gamesystem_id)) @@ -512,7 +511,6 @@ def update_match_mmr_change(match_id, p1_change, p2_change): connection.close() - def get_player_name(player_id): """Gibt den Namen eines Spielers im Format 'Anzeigename (Discordname)' zurück.""" @@ -552,7 +550,6 @@ def get_system_name(sys_id): return "Gelöschtes System" - def get_days_since_last_system_game(player_id, gamesystem_id): """Gibt zurück, wie viele Tage das letzte Spiel in einem bestimmten System her ist.""" connection = sqlite3.connect(DB_PATH) @@ -576,7 +573,6 @@ def get_days_since_last_system_game(player_id, gamesystem_id): - # ----------------------------------------------------- # Matches Bestätigen, Löschen, Berechnen, ... # ----------------------------------------------------- @@ -613,7 +609,6 @@ def delete_match(match_id, player_id): # DELETE FROM löscht die gesamte Zeile, bei der die ID übereinstimmt. cursor.execute("DELETE FROM matches WHERE id = ?", (match_id,)) - logger.log ("MATCH", f"Match mit ID:{match_id} wurde gelöscht von {get_player_name(player_id)}") connection.commit() connection.close() @@ -624,7 +619,6 @@ def confirm_match(match_id): # Ändert nur die Spalte player2_check auf 1 (True) cursor.execute("UPDATE matches SET player2_check = 1 WHERE id = ?", (match_id,)) - logger.log ("MATCH CALC", f"Match mit ID{match_id} wurde als 'Confirmed' gekennzeichnet") connection.commit() connection.close() @@ -636,7 +630,6 @@ def set_match_counted(match_id): # Ändert nur die Spalte match_is_counted auf 1 (True) cursor.execute("UPDATE matches SET match_is_counted = 1 WHERE id = ?", (match_id,)) - logger.log ("MATCH CALC", f"Match mit ID{match_id} wurde als 'Counted' gekennzeichnet") connection.commit() connection.close() @@ -665,8 +658,6 @@ def get_submitted_matches(player_id): return [dict(row) for row in rows] - - def get_match_history_log(player_id): """Holt ALLE Matches eines Spielers inklusive der MMR-Änderungen für das Log.""" connection = sqlite3.connect(DB_PATH) diff --git a/match_calculations/calc_match.py b/match_calculations/calc_match.py index c562bda..06fe0f8 100644 --- a/match_calculations/calc_match.py +++ b/match_calculations/calc_match.py @@ -2,6 +2,7 @@ from data import data_api from match_calculations import calc_mmr_change import json import os +from wood import logger # Mach die DB abfrage für die Relevanten Daten. Von hier aus werden die "Aufgaben" und Daten dann an die kleineren Berechnungs Funktionen verteilt. def calculate_match (match_id): @@ -30,7 +31,6 @@ def calculate_match (match_id): draw_diff = determine_draw_diff(sys_id) - # Abgrenzen ob das Match schon berechnet wurde. Weil ein Draw kann 4 Punkte unterschied haben # 43-41 ist ein Draw aber rein Mathematisch würde es auch ein anderes if triggern # Abgrenzen, wer gewonnen hat (if, elif, else Kette) @@ -60,7 +60,6 @@ def calculate_match (match_id): looser_score = p1_score mmr_change_winner, mmr_change_looser = calc_mmr_change.calc_mmr_change(sys_name, winner_id, looser_id, winner_score, looser_score, match_is_draw) - data_api.apply_match_to_player_statistic (winner_id, sys_id, mmr_change_winner, winner_score) data_api.apply_match_to_player_statistic (looser_id, sys_id, mmr_change_looser, looser_score) diff --git a/match_calculations/calc_mmr_change.py b/match_calculations/calc_mmr_change.py index 307858f..9f66ac7 100644 --- a/match_calculations/calc_mmr_change.py +++ b/match_calculations/calc_mmr_change.py @@ -1,4 +1,5 @@ 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. @@ -7,7 +8,7 @@ point_inflation = 0.7 # => entspricht % ! z.B. 0.7 = 70% def calc_mmr_change(systemname, winner_id, looser_id, winner_points, looser_points, match_is_draw): point_inflation = 0.7 # Verlierer verliert nur 70% der Punkte - K_FACTOR = 35 # Die "Border" (Maximalpunkte) die ein Sieg gibt. + K_FACTOR = 40 # Die "Border" (Maximalpunkte) die ein Sieg gibt. def get_rust_dampener(days_ago): """Berechnet den Dämpfungsfaktor basierend auf den vergangen Tagen.""" @@ -27,10 +28,10 @@ def calc_mmr_change(systemname, winner_id, looser_id, winner_points, looser_poin w_stat = data_api.get_player_system_stats(winner_id, gamesystem_id) l_stat = data_api.get_player_system_stats(looser_id, gamesystem_id) - w_mmr = w_stat['mmr'] if w_stat and w_stat['mmr'] is not None else 1000 + # 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 - # 2. Die fließende Elo-Mathematik (Ersetzt die JSON Datei) # Berechnet die Siegwahrscheinlichkeit des Gewinners (Wert zwischen 0.0 und 1.0) expected_win = 1 / (1 + 10 ** ((l_mmr - w_mmr) / 400)) @@ -46,42 +47,21 @@ def calc_mmr_change(systemname, winner_id, looser_id, winner_points, looser_poin 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) - def get_rust_dampener(days_ago): - 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) + days = max(w_days, l_days) - rust_factor = get_rust_dampener(w_days) - - w_mmr_change = base_change * rust_factor - l_mmr_change = base_change * rust_factor - - - # 4. Deine Sonderregeln (Slaanesh & Khorne) addieren + rust_factor = get_rust_dampener(days) sla_points = 0 #slaanesh_delight(winner_points, looser_points) - w_mmr_change += sla_points - # Auch der Verlierer bekommt Slaanesh Punkte addiert, wenn es die Regel so sagt - l_mmr_change += sla_points + logger.log(f"MATCH CALC", f"Base Change {base_change}, Rost Faktor {rust_factor}, EloFaktor {expected_win}") - winner_final = int(w_mmr_change + wrath_of_khorne(winner_id)) - - # 5. Verlierer-Punkte abziehen und Inflation (0.7) anwenden + # Wenn Das Match ein Draw ist, können keine Slaanesh Punkte auftreten. if match_is_draw: - looser_final = int(-w_mmr_change) # Bei Draw spiegeln wir es einfach (ohne Inflation) + winner_final_mmr_change = int(w_mmr_change + wrath_of_khorne(winner_id)* rust_factor) + looser_final_mmr_change = int(l_mmr_change + wrath_of_khorne(looser_id)* rust_factor) else: - looser_base = int(l_mmr_change + wrath_of_khorne(looser_id)) - looser_final = -int(looser_base * point_inflation) - - return winner_final, looser_final - - + 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) + return winner_final_mmr_change, looser_final_mmr_change # -----------------