96 lines
5.6 KiB
Markdown
96 lines
5.6 KiB
Markdown
# Einheiten: backend/tft/model/statsheet.py
|
|
stand: f41ac76b5789
|
|
|
|
## backend/tft/model/statsheet.py::_empty_acc
|
|
beschreibung: Liefert ein frisches Sammel-Dictionary mit allen bekannten Stat-Buff-Akkumulatoren auf 0.0 initialisiert.
|
|
input: keine Argumente
|
|
output: ein `dict` mit 12 numerischen Stat-Feldern (z. B. `ad_pct`, `ap_flat`, `hp_pct`).
|
|
entscheidungen:
|
|
- Alle Felder werden explizit auf 0.0 gesetzt, damit Akkumulatoren ohne Vorbelastung starten.
|
|
beleg: "{\"ad_pct\": 0.0, \"ap_flat\": 0.0, \"as_pct\": 0.0, \"hp_flat\": 0.0,"
|
|
- Es wird genau ein gemeinsames Akkumulator-Schema für Items und Trait-Buffs verwendet.
|
|
beleg: "return {\"ad_pct\": 0.0, \"ap_flat\": 0.0, \"as_pct\": 0.0, \"hp_flat\": 0.0,"
|
|
kanten:
|
|
- wird-genutzt-von: backend/tft/model/statsheet.py::_apply_item_effects
|
|
- wird-genutzt-von: backend/tft/model/statsheet.py::trait_buffs
|
|
- wird-genutzt-von: backend/tft/model/statsheet.py::unit_stats
|
|
|
|
## backend/tft/model/statsheet.py::_apply_item_effects
|
|
beschreibung: Überträgt die modellierten Item-Effekte aus dem Datenkatalog in den Stat-Akkumulator und normalisiert Werteinheiten.
|
|
input: `item_apis` (zu applizierende Item-IDs), `static_items` (Item-Katalog), `acc` (Stat-Akkumulator)
|
|
output: keine Rückgabe; `acc` wird in-place um Item-Boni angereichert.
|
|
entscheidungen:
|
|
- Unbekannte oder `None`-Effekte werden bewusst ignoriert, um bespoke Mechanik nicht zu modellieren.
|
|
beleg: "if val is None:"
|
|
- Roh-Listenwerte werden via `_fraction` normalisiert, während flache Skalierungen direkt addiert werden.
|
|
beleg: "elif key in (\"BonusDamage\", \"DamageAmp\"):"
|
|
- Prozent-Keys (`AS`, `CritChance`) werden durch 100 geteilt, weil sie als Prozentzahl geliefert werden.
|
|
beleg: "elif key == \"AS\":"
|
|
- `MAPPED_ITEM_KEYS` definiert die Menge der modellierten Effekte als vertragliche Whitelist.
|
|
beleg: "MAPPED_ITEM_KEYS = (\"AD\", \"AP\", \"AS\", \"CritChance\", \"Health\", \"Armor\","
|
|
kanten:
|
|
- nutzt: backend/tft/model/statsheet.py::_fraction
|
|
- wird-genutzt-von: backend/tft/model/statsheet.py::unit_stats
|
|
|
|
## backend/tft/model/statsheet.py::item_is_modeled
|
|
beschreibung: Entscheidet anhand der modellierten Effekt-Whitelist, ob ein Item überhaupt in die Berechnung einfließt.
|
|
input: `item_info` (Item-Datensatz mit `effects`)
|
|
output: `bool`, `True` sobald mindestens ein modellierter Key einen Nicht-`None`-Wert hat.
|
|
entscheidungen:
|
|
- Nur Werte != None zählen, da `None` als „nicht angegeben" interpretiert wird.
|
|
beleg: "return any(effects.get(k) is not None for k in MAPPED_ITEM_KEYS)"
|
|
- Die modellierten Keys sind als Modul-Konstante `MAPPED_ITEM_KEYS` zusammengefasst.
|
|
beleg: "MAPPED_ITEM_KEYS = (\"AD\", \"AP\", \"AS\", \"CritChance\", \"Health\", \"Armor\","
|
|
kanten:
|
|
- nutzt: backend/tft/model/statsheet.py::_apply_item_effects
|
|
|
|
## backend/tft/model/statsheet.py::_fraction
|
|
beschreibung: Normalisiert cdragon-Werte, die mal als Fraction (0.15) und mal als Prozentzahl (15.0) vorliegen, auf einen einheitlichen Bruch.
|
|
input: `value` (float)
|
|
output: `float` im Bereich [0, 1] (Fraction).
|
|
entscheidungen:
|
|
- Schwellwert 1.0 entscheidet, ob ein Wert als bereits normalisierte Fraction gilt.
|
|
beleg: "return value if abs(value) <= 1.0 else value / 100"
|
|
- Beträge werden verglichen, damit auch negative Fraktionen korrekt behandelt werden.
|
|
beleg: "return value if abs(value) <= 1.0 else value / 100"
|
|
kanten:
|
|
- wird-genutzt-von: backend/tft/model/statsheet.py::_apply_item_effects
|
|
- wird-genutzt-von: backend/tft/model/statsheet.py::trait_buffs
|
|
|
|
## backend/tft/model/statsheet.py::trait_buffs
|
|
beschreibung: Zerlegt Trait-Variablennamen in Tokens und leitet daraus teamweite Stat-Buffs sowie die Liste der erkannten Traits ab.
|
|
input: `active_tiers` (aktive Trait-Breakpoints), `static_traits` (Trait-Katalog)
|
|
output: Tupel `(buffs, recognized)` mit Akkumulator-Dictionary und Set erkannter Trait-IDs.
|
|
entscheidungen:
|
|
- Mechanik-Parameter werden über eine Token-Blacklist früh aussortiert.
|
|
beleg: "if tokens & _SKIP_TOKENS or name.startswith(\"{\"):"
|
|
- `ap`-Tokens werden mit `* 100` auf den flachen AP-Konventionen aufsummiert.
|
|
beleg: "elif \"ap\" in tokens:"
|
|
- Variablen ohne numerischen Wert werden übersprungen, um Token-Mismatches zu vermeiden.
|
|
beleg: "if value is None or not isinstance(value, (int, float)):"
|
|
- Nur Traits, bei denen mindestens eine Variable als Buff gemappt wurde, landen in `recognized`.
|
|
beleg: "if matched:"
|
|
kanten:
|
|
- nutzt: backend/tft/model/statsheet.py::_empty_acc
|
|
- nutzt: backend/tft/model/statsheet.py::_fraction
|
|
- nutzt: backend/tft/model/statsheet.py::_TOKEN_RE
|
|
|
|
## backend/tft/model/statsheet.py::unit_stats
|
|
beschreibung: Berechnet das effektive Kampfprofil (eHP, Gesamt-DPS, Spell-DPS) einer Unit aus Basiswerten, Sternenmultiplikatoren, Team-Buffs und Items.
|
|
input: `unit` (Champion-Daten), `stars`, `item_apis`, `static_items`, `team_buffs`, `role`, optional `spell_cap`
|
|
output: `dict` mit den Schlüsseln `ehp`, `dps` und `spell_dps`.
|
|
entscheidungen:
|
|
- HP und AD skalieren über `HP_STAR_MULT` bzw. `AD_STAR_MULT` je nach Sternenlevel.
|
|
beleg: "hp = (stats.get(\"hp\") or 0) * HP_STAR_MULT ** (stars - 1)"
|
|
- eHP kombiniert Rüstung/MR und Schadensreduktion multiplikativ.
|
|
beleg: "ehp = hp * (1 + (armor + mr) / 200) * (1 + acc[\"dr\"])"
|
|
- Die Cast-Rate wird durch `CAST_RATE_CAP` gedeckelt, um Ausreißer zu verhindern.
|
|
beleg: "CAST_RATE_CAP,"
|
|
- Spell-DPS ist auf `SPELL_AUTO_CAP` mal eigene Auto-DPS begrenzt, mit optionalem Floor.
|
|
beleg: "limit = SPELL_AUTO_CAP * auto_dps"
|
|
- Team-Buffs und Item-Effekte werden in `_empty_acc` zusammengeführt, um Bonus-Stats konsistent anzureichern.
|
|
beleg: "acc = _empty_acc()"
|
|
kanten:
|
|
- nutzt: backend/tft/model/statsheet.py::_empty_acc
|
|
- nutzt: backend/tft/model/statsheet.py::_apply_item_effects
|