3.4 KiB
Einheiten: backend/tft/model/score.py
stand: f41ac76b57
backend/tft/model/score.py::active_trait_tiers
beschreibung: Ermittelt zu jedem Trait einer Board-Aufstellung den erreichten Breakpoint und gibt nur die aktiven Stufen zurück. input: board_units (Liste mit Unit-Dicts), static_traits (Trait-Definitionen), static_units (Unit-Definitionen) output: dict trait_api_name → erreichte Breakpoint-Ordnung (1-basiert), nur aktive Traits entscheidungen:
- Nur Traits mit einem Treffer in
static_traitswerden berücksichtigt, Unbekannte stillschweigend übersprungen. beleg: "if not info:" - Der höchste Breakpoint, dessen
min_unitserreicht ist, gewinnt — Iteration über alle Breakpoints mit laufender Aktualisierung. beleg: "for i, bp in enumerate(info["breakpoints"], start=1):" - Traits, die keinen Breakpoint erreichen, erscheinen gar nicht im Ergebnis (
ordinal == 0). beleg: "if ordinal:" kanten: - wird-genutzt-von: backend/tft/model/score.py::score_board
backend/tft/model/score.py::unit_profile
beschreibung: Baut das Kampfprofil einer einzelnen Board-Unit aus DPS, eHP, Defensive-Flag und Unit-Bezug. input: u (Board-Unit-Dict), artifact (gesamtes Artifact mit static-Daten, Rollen, Spell-DPS-Cap) output: dict mit "off", "def", "defensive", "unit" oder None bei unbekannter Unit entscheidungen:
- Unbekannte Units (fehlend in
static.units) führen zuNone, statt einen Fehler zu werfen. beleg: "if not unit:" - Rollen werden bevorzugt aus dem Artifact gelesen, sonst via
baseline.classify_rolebestimmt. beleg: "artifact.get("roles", {}).get(u["api_name"]) or baseline.classify_role(unit)" - Defensive-Status gilt ausschließlich für Rollen "frontline" und "utility" — Cast-Rollen steuern nur die Zielreihenfolge. beleg: ""defensive": role in ("frontline", "utility")" kanten:
- ruft-auf: backend/tft/model/baseline.py::classify_role
- nutzt: backend/tft/model/statsheet.py::unit_stats
- wird-genutzt-von: backend/tft/model/score.py::board_profiles
backend/tft/model/score.py::board_profiles
beschreibung: Liefert die Kampfprofile aller Units eines Boards, wobei Units ohne Profil herausgefiltert werden.
input: board_units (Liste mit Unit-Dicts), artifact (gesamtes Artifact)
output: Liste der Profile (None-Einträge aus unit_profile werden übersprungen)
entscheidungen:
- Die Filterung erfolgt inline per walrus-Operator, sodass kein zweiter Durchlauf nötig ist. beleg: "if (p := unit_profile(u, artifact))" kanten:
- ruft-auf: backend/tft/model/score.py::unit_profile
- wird-genutzt-von: backend/tft/model/score.py::score_board
backend/tft/model/score.py::score_board
beschreibung: Berechnet den Board-Score als Quadratwurzel aus (Σoff · Σdef), skaliert durch 100. input: board_units (Liste mit Unit-Dicts), augments (Signatur-Kompatibilität, ungenutzt), artifact (gesamtes Artifact) output: float — der Board-Score für Vergleiche entscheidungen:
- Die Formel ist
sqrt(Σoff × Σdef); sie kombiniert Offensiv- und Defensiv-Summen multiplikativ unter einer Wurzel. beleg: "return (off * dfn) ** 0.5 / 100" - Augments bleiben bewusst ungenutzt, nur die Signatur bleibt für Aufrufer kompatibel. beleg: "augments bleibt nur für Signatur-Kompatibilität."
- Die Division durch 100 dient nur der Anzeige-Skalierung und ist für Vergleiche irrelevant. beleg: "/100: nur Anzeige-Skalierung, für Vergleiche irrelevant." kanten:
- ruft-auf: backend/tft/model/score.py::board_profiles