Ein Content-Pack ist eine einzige Datei: eine SQLite-Datenbank, die in deinem Mods-Ordner liegt (%APPDATA%\TheUndercut\mods\ unter Windows — siehe wohin die Dateien gehören). Sie trägt die Datensätze und die Logobilder, sodass ein Pack ein einziges Ding zum Teilen, Sichern oder Veröffentlichen ist.
mods/
my_pack.db ← die ganze Mod
Du musst kein SQL können, um eines zu bauen — der mit dem Spiel gelieferte Mod-Editor schreibt genau diese Datei. Willst du die Datei doch selbst öffnen — für Massenänderungen oder um ein Pack aus einem Skript zu erzeugen — dokumentiert die SQL-Referenz jede Tabelle und jede Spalte. Diese Seite dokumentiert, was die Datei bedeutet, und das brauchst du, egal ob du den Editor benutzt, ein eigenes Skript schreibst oder das Pack von jemand anderem liest.
Die goldene Regel des Formats: jede Tabelle und jede Spalte ist optional. Ein Pack, das nur zwei Teams umbenennt, ist gültig. Alles, was du weglässt, bleibt prozedural, und ein für eine ältere Version geschriebenes Pack lädt auch in einem neueren Spiel.
Das aktuelle Format ist v2. Ein Pack hält fest, in welcher Version es geschrieben wurde, und das Spiel sagt es in der Zeile des Packs, wenn es eines nur halb versteht — du rätselst nie, warum ein Teil des Packs nichts bewirkt hat. Der Mod-Editor aktualisiert ein älteres Pack, sobald du es öffnest.
Was in einem Pack steckt
| Tabelle | Enthält |
|---|---|
meta | Die Einstellungen des Packs: Name, Abschnittsmodi, Szenario, Startjahr |
teams | Das Starterfeld — Identität, Farben, Auto, Budget und (bei vorgegebenen Packs) Infrastruktur und Erfolgsbilanz |
drivers | Fahrerprofile — Fähigkeiten, Obergrenzen, Wachstumskurven, Eigenschaften, Porträt, Gehalt, Cockpit |
sponsors | Marken, die auf dem Sponsorenmarkt verfügbar sind |
suppliers | Motoren-, Reifen- und Kraftstoffhersteller |
circuits | Aus .circuit-Dateien importierte Strecken — siehe Strecken-Modding |
calendar | Die Rennen der Saison, in Reihenfolge |
images | Die PNG-Dateien, auf die die Zeilen zeigen: Logos und eigene Auto-Sprites |
extend oder replace
Jeder Abschnitt trägt einen Modus, in meta als <abschnitt>_mode gespeichert:
extend ist die Vorgabe und entspricht dem Muster des Grundspiels: ein statischer Kern plus prozedurale Füllung. replace willst du für eine vollständige reale Saison.
Was replace genau bedeutet, hängt vom Abschnitt ab — gut zu wissen, bevor du dich wunderst, warum ein Lieferant überlebt hat:
| Abschnitt | replace bewirkt |
|---|---|
teams | Kürzt das Feld auf deine Liste — es ist am Ende genau so lang wie deine Teamtabelle |
drivers | Der Fahrerpool besteht nur aus deinen; für deine Serie wird niemand sonst erzeugt |
sponsors | Der Sponsorenmarkt besteht nur aus deinen |
suppliers | Nur die Kategorien, die du abdeckst, werden ersetzt. Ein Pack mit zwei Motorenherstellern und ohne Reifenhersteller behält die generierten Reifenhersteller, denn ohne einen lässt sich keine Saison fahren |
circuits | Gilt für den Streckenpool der Welt — die Austragungsorte, aus denen künftige Kalender schöpfen. replace heißt, dass die Welt nie zu generierten Strecken zurückdriftet; der Kalender, den du baust, fährt ohnehin immer die Strecken, die du daraufgesetzt hast |
Eines, was replace nicht tut
Die Fahrer eines Packs füllen deine Serie. Die Welt betreibt zusätzlich zehn nicht spielbare Meisterschaften, jede mit einem Feld, das gefüllt werden will, und das Spiel füllt den Fahrerpool auf, damit deren Cockpits nicht leer bleiben — deshalb kann ein Pack mit eigenem vollem Feld trotzdem von generierten freien Fahrern umgeben sein.
meta.active_series ist die Antwort: Liste die Meisterschaften auf, die die Welt betreiben soll (PFS ist die spielbare), und jede andere Serie wird abgeschaltet. Hake alles außer deiner eigenen ab, und die Fahrer deines Packs sind die einzigen Menschen der Welt. Sag nichts, und alle Serien laufen wie bisher.
Zwei Arten, mit einem Pack eine Karriere zu starten
meta.scenario entscheidet, was passiert, wenn der Spieler dein Pack wählt.
| Szenario | Was der Spieler bekommt |
|---|---|
| New Series (Vorgabe) | Der Spieler erstellt ein neues Team, das ins Feld einsteigt, und spielt die Vorsaison. Deine Teams sind Rivalen. |
| Imposed | Das Feld steht so, wie du es gestaltet hast — jedes Team besetzt, ausgerüstet und unter Vertrag. Der Spieler übernimmt eines deiner Teams, und die Saison beginnt bei Rennen 1, ohne Vorsaison. |
Ein vorgegebenes Pack schaltet Felder frei, die sonst keinen Sinn ergäben, und das ist der einzige Unterschied im Format: Infrastrukturstufen, Erfolgsbilanz von Team und Fahrern, Gründungsjahr und die „unter Vertrag bei“-Bindungen, die die Fahrer, Sponsoren und Lieferanten jedes Teams vorbelegen. Nutze bei Teams replace für ein vorgegebenes Feld, damit nur deine Teams fahren.
meta — die Einstellungen des Packs
| Schlüssel | Wert | Vorgabe |
|---|---|---|
name | In der Pack-Auswahl angezeigt | der Dateiname |
author | Freier Text | — |
schema_version | Version des Pack-Formats, in der diese Datei geschrieben wurde (aktuell: 2) | 1 |
min_game_version | Spielversion, die das Pack braucht. Ein älteres Spiel sagt das in der Zeile des Packs, statt es halb angewandt zu laden | — |
scenario | new_series · imposed | new_series |
start_year | Kalenderjahr von Saison 1 — ein Pack kann in jeder Ära beginnen | 1990 |
teams_mode, drivers_mode, sponsors_mode, suppliers_mode, circuits_mode | extend · replace | extend |
active_series | Meisterschaften, die die Welt betreibt, kommagetrennt (PFS,PF2) | fehlt = alle |
rules | IDs der Serien-Regelsätze, kommagetrennt (Punkteskala, 107-%-Qualifikationsregel) | die Vorgaben des Spiels |
teams
Eine Zeile ohne name wird übersprungen. Teams werden in Reihenfolge auf das Feld angewandt, die erste Zeile ist also das erste Team.
| Spalte | Bedeutung | Wenn du sie weglässt |
|---|---|---|
id | Stabiler Schlüssel. Jede Bindung im Pack zeigt darauf, sodass ein Team umbenannt werden kann, ohne seine Fahrer, Sponsoren und Lieferanten zu verlieren | stattdessen wird der Anzeigename benutzt |
name | Teamname — was das Spiel überall anzeigt | erforderlich |
country | Ländername oder ISO-Code | generiert |
budget_tier | small · medium · large — das Verhaltensprofil: KI-Barreserven, Infrastrukturobergrenze, Prestige, F&E-Ehrgeiz | aus dem Budget abgeleitet |
budget_musd | Startkapital, in Millionen | 0 = der Betrag der Stufe (40 Mio. $ / 60 Mio. $ / 90 Mio. $) |
reputation | 0–100 | 0 = generiert |
color1, color2, color3 | #RRGGBB — die drei Lackierungszonen | leer gelassen = die generierte Lackierung behalten |
car_index | 0–11, welches Seitenansicht-Modell | leer gelassen = das generierte Modell behalten (0 ist ein echtes Modell und kann daher nicht „nicht gesetzt“ heißen) |
car_image | Name einer images-Zeile: ein eigener Seitenansicht-Sprite, der das Modell ersetzt | eingebautes Modell |
livery | Lackierungsmuster von oben, im Live-Rennen getragen | 255 = das Spiel wählt |
suit | Rennanzug der Fahrer des Teams | 255 = je Fahrer |
logo | Ein images-Zeilenname, oder eine Zahl (eines der mitgelieferten Logos), oder ein Pfad relativ zu mods/ | ein prozedurales Zeichen aus dem Teamnamen |
infra_engineering … infra_academy | Die neun Abteilungsstufen (Akademie bis 3, der Rest bis 10). In einem vorgegebenen Feld sind sie die Basisstärke des Autos | 0 = generiert |
career_wins, career_titles, best_championship, founding_year | Bestenliste, die zu Saison 1 im Teamprofil steht | 0 = Vorgabe (Gründungsjahr 1990) |
history | Zeilen Saison für Saison, saison:position:siege, mit ; verbunden | keine |
drivers
Eine Zeile ohne Vor- und Nachnamen wird übersprungen.
| Spalte | Bedeutung | Wenn du sie weglässt |
|---|---|---|
id | Stabiler Schlüssel dieser Zeile | — |
first_name, last_name | — | einer von beiden erforderlich |
code | Drei Buchstaben, im ganzen Pack eindeutig — das Spiel indiziert Fahrer über das Kürzel und benennt eine Dopplung stillschweigend um | aus dem Nachnamen gebildet |
country | Ländername oder ISO-Code | generiert |
age | 1–55. Unter 16 geht nur per Mod: ein Kind-Talent altert jede Saison, bleibt bis 14 im Scouting verborgen und kann nicht eingesetzt werden, bevor die Serie es erlaubt (18 in der PFS) | 25 |
intelligence, pace, consistency, adaptability, stamina, aggressivity | Fähigkeiten, 1–20 | 10 |
pot_* (dieselben sechs) | Die Obergrenze jedes Werts. Nie unterhalb der Fähigkeit selbst angewandt | 0 = generiert |
curve_* (dieselben sechs) | Die Form der Entwicklung mit dem Alter — siehe unten | 255 = die Standardform dieses Werts |
traits | Das spieleigene Eigenschaftsformat, art:stufe-Paare — im Editor anlegen | generiert |
fame | Anfangsbekanntheit 0–100. Ein Startwert: Das Spiel kann ihn weiter bewegen | 0 = aus den Fähigkeiten errechnet |
salary | Gefordertes Gehalt, pro Saison | 500000 |
face_sheet, face_index, helmet_index, helmet_hue_0/1/2 | Porträt und Helm | 255 = generiert |
team_id | Setzt diesen Fahrer zu Saison 1 in dieses Team, über die stabile id des Teams — die Bindung, die das Spiel zuerst auflöst | — |
team | Dasselbe über den Anzeigenamen des Teams. Wird genutzt, wenn keine team_id da ist | freier Fahrer |
role | primary · secondary · reserve — das Cockpit ist das Auto: der Stammfahrer fährt Auto 1, der zweite Auto 2 | primary |
contract_years | Vertragslänge in Saisons | 0 = 2 |
career_starts, career_wins, career_podiums, career_titles, best_finish | Erfolgsbilanz, ab Saison 1 angezeigt | 0 = keine |
Wachstumskurven
Jede Fähigkeit entwickelt sich mit dem Alter nach einer von fünf Formen. Das Spiel hatte sie immer, je Wert eine fest verdrahtete; ein Pack kann jedem Wert jede Form zuweisen.
| Kurve | Verbessert sich | Fällt ab | Standard für |
|---|---|---|---|
| Frühes Hoch | schnell bis 26, langsam bis 30, dann nie | ab 30 | Pace |
| Körperlich | bis 28, dann nie | ab 28 | Ausdauer |
| Kopfarbeit | immer, langsamer ab 30 und ab 38 | nie | Intelligenz, Anpassungsfähigkeit |
| Erfahrung | bis 30, halb so schnell bis 34, dann nie | ab 34 | Konstanz |
| Jugend | nur bis 24 | ab 28 | Aggressivität |
Die Kurve ist die Form, nicht das Tempo: Wie schnell ein Wert den Abstand zu seiner Obergrenze schließt, bleibt eine Eigenschaft des Werts.
sponsors
| Spalte | Bedeutung | Wenn du sie weglässt |
|---|---|---|
name | Markenname — erforderlich | — |
sector | automotive, technology, energy, finance, luxury, fashion, telecom, beverage, insurance, aviation, industry, retail | generiert |
origin | Ländername oder ISO-Code | generiert |
budget | 1–10 — was der Deal wert ist | 5 |
prominence | 1–10 — wie oft die Marke auftaucht und wie schwer sie zu holen ist | 5 |
color | #RRGGBB | — |
logo | Ein images-Zeilenname oder ein Pfad relativ zu mods/ | ein prozedurales Logo |
team_id / team | Vorgegebene Felder: bindet diese Marke zu Saison 1 an dieses Team — über die stabile ID oder den Namen | offener Markt |
id | Stabiler Schlüssel dieser Zeile | — |
suppliers
Eine Zeile, deren category keine der drei ist, wird komplett übersprungen — das ist die einzige harte Anforderung der Tabelle.
| Spalte | Bedeutung | Wenn du sie weglässt |
|---|---|---|
name | Erforderlich | — |
category | engine · tires · fuel | Zeile übersprungen |
origin, color, logo | Wie bei Sponsoren | generiert |
budget, size | 1–10 | 5 |
power, reliability, endurance, potential, performance, heat, efficiency | Technische Werte 1–10 unter ihren echten Namen — nur die, die die Kategorie hat (siehe unten) | 0 = generiert |
stat_a … stat_d | Dieselben vier Werte in generischen Slots, für ältere Spielversionen erhalten. Eine benannte Spalte gewinnt gegen ihren generischen Slot | 0 = generiert |
money_per_gp | Deal-Wert in $/GP. Positiv = Partnerschaft (sie zahlen dir), negativ = Kunde (du zahlst ihnen) | 0 = generiert |
contract | partnership · client — gewinnt gegen das Vorzeichen von money_per_gp, wenn beide gesetzt sind | das Vorzeichen entscheidet |
duration | Vertragslänge in Saisons | 0 = generiert |
team_id / team | Vorgegebene Felder: eine Liste — Scarlet:partner; Azure:customer; Emerald — ein Lieferant kann mehrere Teams beliefern, jedes auf seiner Stufe. Ein Partner je Lieferant; ein Lieferant je Kategorie und Team | offener Markt |
id | Stabiler Schlüssel dieser Zeile | — |
| Kategorie | Slot A | Slot B | Slot C | Slot D |
|---|---|---|---|---|
| engine | power | reliability | endurance (angezeigt, nicht simuliert) | potential (angezeigt, nicht simuliert) |
| tires | performance | endurance | reliability | heat |
| fuel | efficiency | — | — | — |
Zwei Dinge kann ein Pack bewusst nicht setzen:
- Die Motorarchitektur (V8/V10/V12) liegt nicht beim Lieferanten — das Spiel schlägt den Namen in seinem Welt-Herstellerpool nach. Ein Name, den dieser Pool nicht kennt, fällt auf V10 zurück.
- Versteckte Reifeneigenschaften werden aus Markenname und Saison abgeleitet, einen Reifenhersteller umzubenennen würfelt sie also neu aus.
circuits und calendar
Diese beiden bauen eine Saison. Die Strecken kommen aus dem Strecken-Editor: Der Editor speichert eine .circuit-Datei, und der Mod-Editor importiert sie ins Pack.
Jede Strecke trägt eine id, und ein Kalenderrennen zeigt mit circuit_id darauf (der Name funktioniert weiterhin als Rückfalloption).
circuits enthält die Strecke selbst — Name, Ort, Ziellänge, Optik-Vorlage, Charakter, die gezeichnete Mittellinie sowie die optionalen Start/Ziel- und Boxenmarker. calendar enthält die Rennen in Reihenfolge: Jedes Rennen ist entweder ein circuit-Rennen (das eine deiner Strecken nennt) oder ein auto-Rennen (eine generierte Strecke mit gegebenem Charakter und gegebener Länge).
Ein Pack mit Kalender ersetzt die Saison dadurch. Ein Pack mit Strecken, aber ohne Kalender legt seine Strecken in den Weltpool und lässt sie die Rennen der Saison belegen.
Zwei Felder werden zur Information festgehalten, aber nicht simuliert: das year einer Strecke und ihre Werte downforce / tire_wear / overtaking — im Spiel werden diese drei aus dem character der Strecke abgeleitet.
images
name (der Schlüssel, auf den Zeilen zeigen) plus die PNG-Bytes. Logos werden mit 195×195 angelegt; ein eigener Auto-Sprite ist eine Seitenansicht nach rechts auf transparentem Hintergrund, 256 px hoch. Das Spiel entpackt sie bei der ersten Nutzung nach mods/.cache/.
Was immer generiert bleibt
| Abschnitt | Ein Pack überschreibt | Das Spiel erzeugt weiterhin |
|---|---|---|
| Teams | Name, Land, Ruf, Budget, Verhaltensprofil, Farben, Auto, Lackierung, Anzug, Logo | Budgetentwicklung, Kaderverhalten und (außer bei „imposed“) die Infrastruktur |
| Fahrer | Name, Kürzel, Land, Alter, die sechs Fähigkeiten und ihre Obergrenzen, Kurven, Eigenschaften, Porträt, Helm, Gehalt, Bekanntheit | Ehrgeiz, Saisonziele, verborgene Persönlichkeit |
| Sponsoren | Name, Branche, Farbe, Budget, Bekanntheitsgrad, Herkunft, Logo | Vertragsbedingungen, Marktverhalten |
| Lieferanten | Name, Kategorie, Farbe, Budget, Größe, Herkunft, Logo, technische Werte, Vertragsbedingungen | Marktverhalten, versteckte Reifeneigenschaften |
Fallen, die man kennen sollte
- Bindungen folgen der ID, nicht dem Namen. Ein Fahrer, Sponsor oder Lieferant zeigt auf die stabile
ideines Teams, ein Umbenennen behält sie also, und zwei Teams dürfen sich einen Namen teilen (nur die Lesbarkeit leidet — Wertungen und News zeigen ihn dann doppelt). Ein Pack, das vor den IDs geschrieben wurde oder von Hand nur mit Namen entstand, löst weiterhin über den Namen auf und behält das alte Verhalten: Benennst du das Team dort um, landet der Fahrer im Pool der freien Fahrer. Das Pack einmal im Mod-Editor zu öffnen aktualisiert es. - Zwei Fahrer pro Team, einer pro Cockpit. Ein Team mit zwei
primary-Fahrern lässt Auto 2 leer, und ein Auto ohne Fahrer startet nicht. Der Audit-Tab des Editors existiert vor allem dafür. - Fahrerkürzel müssen eindeutig sein. Eine Dopplung wird beim Laden stillschweigend umbenannt, und alles, was über das Kürzel läuft, folgt der Umbenennung.
- Die Pack-Datei muss dort bleiben, wo sie ist. Logos und eigene Auto-Sprites werden aus ihr gelesen; eine Karriere, die mit einem später verschwundenen Pack begonnen wurde, verliert sie.
- Ein Pack greift nur bei der Karriereerstellung. Ein Pack zu bearbeiten ändert nie eine schon laufende Karriere — starte eine neue, um die Änderung zu sehen.