# Einheiten: backend/tft/model/score.py stand: f41ac76b5789 ## 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_traits` werden berücksichtigt, Unbekannte stillschweigend übersprungen. beleg: "if not info:" - Der höchste Breakpoint, dessen `min_units` erreicht 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 zu `None`, statt einen Fehler zu werfen. beleg: "if not unit:" - Rollen werden bevorzugt aus dem Artifact gelesen, sonst via `baseline.classify_role` bestimmt. 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