This commit is contained in:
team3
2026-07-24 11:24:24 +02:00
parent f41ac76b57
commit 848c8ea1aa
41 changed files with 1776 additions and 15 deletions

View File

@@ -0,0 +1,57 @@
# 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