# Einheiten: backend/tft/staticdata/parse.py stand: f41ac76b5789 ## backend/tft/staticdata/parse.py::augment_tier beschreibung: Leitet die Augment-Stufe (I/II/III) aus dem Suffix des Icon-Dateinamens ab. input: icon_path — optionaler Pfad zum Augment-Icon. output: Ganzzahl 1–3 für die erkannte Stufe oder None bei fehlendem Pfad. entscheidungen: - Tier wird aus einem Römisch-Zahl-Suffix vor dem Punkt ermittelt, unabhängig von Groß-/Kleinschreibung. beleg: "AUGMENT_TIER_RE = re.compile(r\"[-_](I{1,3})\.\", re.I)" - Rückgabe ist die Länge der gematchten Römisch-Zahl, nicht ihr numerischer Wert. beleg: "return len(m.group(1)) if m else None" kanten: - wird-genutzt-von: backend/tft/staticdata/parse.py::parse ## backend/tft/staticdata/parse.py::render_desc beschreibung: Füllt Platzhalter in einem Tooltip-Text mit Effekt-Werten und entfernt übriges Markup. input: desc — Tooltip-Text mit @…@-Platzhaltern; effects — Dict mit numerischen Effekt-Werten. output: Bereinigter, einsatzfertiger Beschreibungstext. entscheidungen: - Unbekannte Platzhalter werden als "?" dargestellt, statt den Text zu verwerfen. beleg: "return \"?\"" - HTML-Tags und %i:…%-Blöcke werden per Regex entfernt, bevor Mehrfach-Whitespace kollabiert wird. beleg: "text = re.sub(r\"<[^>]+>\", \" \", text)" - Ganze Zahlen werden ohne Dezimalstellen ausgegeben, andere auf eine Nachkommastelle gerundet. beleg: "str(int(value)) if float(value).is_integer() else str(round(value, 1))" kanten: - wird-genutzt-von: backend/tft/staticdata/parse.py::parse ## backend/tft/staticdata/parse.py::resolve_spell beschreibung: Ermittelt Schadens-Array, Schadenstyp und Skalierung einer Champion-Fähigkeit aus dem Desc-Markup. input: ability — Dict mit Desc-Text, Variablen und Schadens-Tags. output: Dict mit spell_damage, spell_damage_type und spell_scaling. entscheidungen: - Erstes im Desc gefundenes Schadens-Tag gewinnt; zugehöriger Variablenname wird gegen "Modified"-Variante geprüft. beleg: "array = get(name) or get(name.removeprefix(\"Modified\"))" - Ohne expliziten Tag wird ADDamage+APDamage kombiniert, sonst greift die Fallback-Liste in festgelegter Reihenfolge. beleg: "for name in DAMAGE_FALLBACKS:" - Skalierung wird aus %i:scaleAP% / %i:scaleAD%-Markern im Desc abgeleitet, nicht aus Variablen. beleg: "has_ap = \"%i:scaleAP%\" in desc" kanten: - wird-genutzt-von: backend/tft/staticdata/parse.py::parse ## backend/tft/staticdata/parse.py::icon_url beschreibung: Wandelt einen Community-Dragon-Asset-Pfad in eine URL zum PNG-Abbild um. input: asset_path — interner Asset-Pfad mit Endung .tex oder .dds. output: URL auf raw.communitydragon.org mit .png-Endung. entscheidungen: - Endungen werden case-insensitive ersetzt, sodass .TEX und .DDS ebenfalls zu .png werden. beleg: "p = asset_path.lower()" - Basis-URL wird als Modul-Konstante gehalten, nicht pro Aufruf neu gebaut. beleg: "return f\"{CDRAGON_GAME}/{p}\"" kanten: - wird-genutzt-von: backend/tft/staticdata/parse.py::parse ## backend/tft/staticdata/parse.py::detect_set beschreibung: Wählt aus dem Rohtext die höchste Set-Nummer, die Champion-Daten enthält. input: raw — vollständiges cdragon-JSON mit einem sets-Dict. output: Integer der gewählten Set-Nummer. entscheidungen: - Nur Sets mit tatsächlichen Champions werden als Kandidaten zugelassen. beleg: "if v.get(\"champions\")" - Ohne Kandidat wird hart ein ValueError geworfen, statt zu raten. beleg: "raise ValueError(\"no set with champions found in cdragon data\")" kanten: - wird-genutzt-von: backend/tft/staticdata/parse.py::parse ## backend/tft/staticdata/parse.py::parse beschreibung: Normalisiert das Rohtext-JSON in flache Tabellen für Units, Traits, Items und Augments. input: raw — cdragon-Gesamtdaten; set_override — optionale Set-Nummer. output: Dict mit meta, units, traits, items und augments. entscheidungen: - Minions und Beschwörungen werden über apiName bzw. leere Trait-Listen ausgefiltert, nicht über eine eigene Allowlist. beleg: "if not c[\"traits\"] or \"Minion\" in c[\"apiName\"]:" - Trait-Anzeigenamen werden nachträglich auf api-Namen gemappt, damit die Unit-Tabelle konsistente Identifier führt. beleg: "u[\"traits\"] = [trait_name_to_api[name] for name in u[\"traits\"]]" - Augments werden anhand von Präfix oder apiName-Inhalt gefiltert und um Shop-/Tooltip-Müll bereinigt. beleg: "if \"MarketOffering\" in api or \"@\" in (i[\"name\"] or \"\")" - Set-Nummer kann per Parameter überschrieben werden, sonst fällt parse auf detect_set zurück. beleg: "set_number = set_override if set_override is not None else detect_set(raw)" kanten: - ruft-auf: backend/tft/staticdata/parse.py::detect_set - ruft-auf: backend/tft/staticdata/parse.py::icon_url - ruft-auf: backend/tft/staticdata/parse.py::resolve_spell - ruft-auf: backend/tft/staticdata/parse.py::augment_tier - ruft-auf: backend/tft/staticdata/parse.py::render_desc