update
This commit is contained in:
57
.planer/einheiten/backend__tft__model__score.py.md
Normal file
57
.planer/einheiten/backend__tft__model__score.py.md
Normal 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
|
||||
Reference in New Issue
Block a user