Un pack de contenido es un solo archivo: una base de datos SQLite que vive en tu carpeta de mods (%APPDATA%\TheUndercut\mods\ en Windows — ver dónde van los archivos). Lleva las filas y las imágenes de los logos, de modo que un pack es una única cosa que compartir, respaldar o publicar.
mods/
my_pack.db ← el mod entero
No hace falta saber SQL para crear uno: el Editor de mods que viene con el juego escribe exactamente este archivo. Si sí quieres abrir el archivo tú mismo — para cambios masivos, o para generar un pack desde un script — la referencia SQL documenta cada tabla y cada columna. Esta página documenta lo que el archivo significa, que es lo que necesitas tanto si usas el editor, como si escribes un script propio o lees el pack de otra persona.
La regla de oro del formato: cada tabla y cada columna es opcional. Un pack que solo renombra dos equipos es válido. Todo lo que dejes fuera sigue siendo procedural, y un pack creado para una versión anterior sigue cargando en un juego más nuevo.
El formato actual es v2. Un pack registra en qué versión se escribió, y el juego lo indica en la fila del pack cuando solo lo entiende a medias: nunca te quedas preguntándote por qué una parte del pack no hizo nada. El Editor de mods actualiza un pack antiguo en cuanto lo abres.
Qué hay dentro de un pack
| Tabla | Contiene |
|---|---|
meta | Los ajustes del propio pack: su nombre, los modos de sección, el escenario, el año inicial |
teams | La parrilla — identidad, colores, coche, presupuesto y (packs impuestos) infraestructuras y palmarés |
drivers | Perfiles de pilotos — aptitudes, techos, curvas de crecimiento, rasgos, retrato, salario, asiento |
sponsors | Marcas disponibles en el mercado de patrocinio |
suppliers | Fabricantes de motores, neumáticos y combustible |
circuits | Trazados importados de archivos .circuit — ver modding de circuitos |
calendar | Las rondas de la temporada, en orden |
images | Los archivos PNG a los que apuntan las filas: logos y sprites de coche personalizados |
extend o replace
Cada sección lleva un modo, guardado en meta como <sección>_mode:
extend es el valor por defecto y es el propio patrón del juego base: un núcleo estático más relleno procedural. replace es lo que quieres para una temporada real completa.
Qué significa exactamente replace depende de la sección — conviene saberlo antes de preguntarte por qué ha sobrevivido un proveedor:
| Sección | replace hace |
|---|---|
teams | Recorta la parrilla a tu lista: acaba teniendo exactamente la longitud de tu tabla de equipos |
drivers | El grupo de pilotos es solo el tuyo; no se genera nadie más para tu serie |
sponsors | El mercado de patrocinio es solo el tuyo |
suppliers | Solo se sustituyen las categorías que cubres. Un pack con dos fabricantes de motores y ninguno de neumáticos conserva los de neumáticos generados, porque una temporada no puede correrse sin uno |
circuits | Se aplica al grupo de circuitos del mundo, las sedes de las que beben los calendarios futuros. replace significa que el mundo nunca vuelve a trazados generados; en todo caso, el calendario que construyas siempre corre los trazados que colocaste en él |
Una cosa que replace no hace
Los pilotos de un pack llenan tu serie. El mundo también hace correr diez campeonatos no jugables, cada uno con una parrilla que llenar, y el juego completa el grupo de pilotos para que sus asientos no queden vacíos; por eso un pack con parrilla propia completa puede seguir rodeado de agentes libres generados.
meta.active_series es la respuesta: enumera los campeonatos que el mundo debe hacer correr (PFS es el jugable) y el resto de series se apaga. Desmarca todo menos la tuya y los pilotos de tu pack serán las únicas personas del mundo. No digas nada y correrán todas las series, como antes.
Dos maneras de empezar una carrera con un pack
meta.scenario decide qué ocurre cuando el jugador elige tu pack.
| Escenario | Lo que obtiene el jugador |
|---|---|
| New Series (por defecto) | El jugador crea un equipo nuevo que se suma a la parrilla y juega la pretemporada. Tus equipos son rivales. |
| Imposed | La parrilla queda fija tal como la creaste: cada equipo con su personal, su material y sus contratos. El jugador toma uno de tus equipos y la temporada arranca en la carrera 1, sin pretemporada. |
Un pack impuesto desbloquea campos que de otro modo no tendrían sentido, y esa es la única diferencia en el formato: niveles de infraestructura, palmarés de equipos y pilotos, año de fundación y los vínculos de «firmado con» que rellenan por adelantado los pilotos, patrocinadores y proveedores de cada equipo. Usa replace en equipos para una parrilla impuesta, de modo que solo corran los tuyos.
meta — los ajustes del pack
| Clave | Valor | Por defecto |
|---|---|---|
name | Lo que muestra el selector de packs | el nombre del archivo |
author | Texto libre | — |
schema_version | Versión del formato de pack con la que se escribió este archivo (actual: 2) | 1 |
min_game_version | Build del juego que necesita el pack. Un juego anterior lo indica en la fila del pack en vez de cargarlo a medias | — |
scenario | new_series · imposed | new_series |
start_year | Año natural de la temporada 1 — un pack puede arrancar en cualquier época | 1990 |
teams_mode, drivers_mode, sponsors_mode, suppliers_mode, circuits_mode | extend · replace | extend |
active_series | Campeonatos que hace correr el mundo, separados por comas (PFS,PF2) | ausente = todos |
rules | Ids de los reglamentos de la serie, separados por comas (escala de puntos, regla del 107 % en clasificación) | los valores por defecto del juego |
teams
Una fila sin name se salta. Los equipos se aplican a la parrilla en orden, así que la primera fila es el primer equipo.
| Columna | Significado | Si la omites |
|---|---|---|
id | Clave estable. Todos los vínculos del pack apuntan a ella, así que un equipo puede renombrarse sin perder sus pilotos, patrocinadores y proveedores | se usa el nombre visible |
name | Nombre del equipo — lo que el juego muestra en todas partes | obligatorio |
country | Nombre de país o código ISO | generado |
budget_tier | small · medium · large — el perfil de comportamiento: reservas de caja de la IA, tope de infraestructuras, prestigio, ambición en I+D | deducido del presupuesto |
budget_musd | Caja inicial, en millones | 0 = la cantidad propia del nivel (40 M$ / 60 M$ / 90 M$) |
reputation | 0–100 | 0 = generado |
color1, color2, color3 | #RRGGBB — las tres zonas de decoración | vacío = conservar la decoración generada |
car_index | 0–11, qué modelo de coche en vista lateral | vacío = conservar el modelo generado (0 es un modelo real, así que no puede significar «sin definir») |
car_image | Nombre de una fila images: un sprite lateral propio que sustituye al modelo | modelo integrado |
livery | Patrón de decoración cenital usado en carreras en vivo | 255 = elige el juego |
suit | Mono que visten los pilotos del equipo | 255 = por piloto |
logo | Un nombre de fila images, o un número (uno de los logos que trae el juego), o una ruta relativa a mods/ | una marca procedural a partir del nombre del equipo |
infra_engineering … infra_academy | Los nueve niveles de departamento (la academia llega a 3, el resto a 10). En una parrilla impuesta, estos son la fuerza base del coche | 0 = generado |
career_wins, career_titles, best_championship, founding_year | Registro histórico mostrado en el perfil del equipo en la temporada 1 | 0 = por defecto (año de fundación 1990) |
history | Filas temporada a temporada, temporada:posición:victorias, unidas por ; | ninguna |
drivers
Una fila sin nombre ni apellido se salta.
| Columna | Significado | Si la omites |
|---|---|---|
id | Clave estable de esta fila | — |
first_name, last_name | — | uno de los dos obligatorio |
code | Tres letras, único en todo el pack: el juego indexa a los pilotos por código y renombra un choque en silencio | construido desde el apellido |
country | Nombre de país o código ISO | generado |
age | 1–55. Por debajo de 16 es exclusivo de mods: una promesa infantil envejece cada temporada, permanece oculta en Ojeadores hasta los 14 y no puede sentarse antes de que la serie lo permita (18 en la PFS) | 25 |
intelligence, pace, consistency, adaptability, stamina, aggressivity | Aptitudes, 1–20 | 10 |
pot_* (las mismas seis) | El techo de cada estadística. Nunca se aplica por debajo de la aptitud misma | 0 = generado |
curve_* (las mismas seis) | La forma de crecimiento de la estadística con la edad — ver abajo | 255 = la forma por defecto de esa estadística |
traits | El formato de rasgos del propio juego, pares tipo:nivel — créalos en el editor | generados |
fame | Renombre inicial 0–100. Un valor inicial: el juego puede seguir moviéndolo | 0 = calculado a partir de las aptitudes |
salary | Salario pedido, por temporada | 500000 |
face_sheet, face_index, helmet_index, helmet_hue_0/1/2 | Retrato y casco | 255 = generado |
team_id | Sienta a este piloto en ese equipo en la temporada 1, por el id estable del equipo — el vínculo que el juego resuelve primero | — |
team | Lo mismo, por el nombre visible del equipo. Se usa cuando no hay team_id | agente libre |
role | primary · secondary · reserve — el asiento es el coche: el titular conduce el coche 1, el segundo el coche 2 | primary |
contract_years | Duración del contrato en temporadas | 0 = 2 |
career_starts, career_wins, career_podiums, career_titles, best_finish | Palmarés mostrado desde la temporada 1 | 0 = ninguno |
Curvas de crecimiento
Cada aptitud se desarrolla con la edad según una de cinco formas. El juego siempre las tuvo, una fija por estadística; un pack puede asignar cualquier forma a cualquier estadística.
| Curva | Mejora | Declina | Por defecto para |
|---|---|---|---|
| Pico temprano | rápido hasta 26, lento hasta 30, luego nunca | desde 30 | Ritmo |
| Física | hasta 28, luego nunca | desde 28 | Resistencia |
| Cerebral | siempre, frenando tras 30 y luego 38 | nunca | Inteligencia, Adaptabilidad |
| Experiencia | hasta 30, a media velocidad hasta 34, luego nunca | desde 34 | Regularidad |
| Juventud | solo hasta 24 | desde 28 | Agresividad |
La curva es la forma, no la velocidad: lo rápido que una estadística cierra la distancia con su techo sigue siendo propiedad de la estadística.
sponsors
| Columna | Significado | Si la omites |
|---|---|---|
name | Nombre de la marca — obligatorio | — |
sector | automotive, technology, energy, finance, luxury, fashion, telecom, beverage, insurance, aviation, industry, retail | generado |
origin | Nombre de país o código ISO | generado |
budget | 1–10 — lo que vale el acuerdo | 5 |
prominence | 1–10 — con qué frecuencia aparece la marca y lo difícil que es conseguirla | 5 |
color | #RRGGBB | — |
logo | Un nombre de fila images, o una ruta relativa a mods/ | un logo procedural |
team_id / team | Parrillas impuestas: firma esta marca con ese equipo en la temporada 1 — por id estable o por nombre | mercado abierto |
id | Clave estable de esta fila | — |
suppliers
Una fila cuya category no sea una de las tres se salta por completo: es el único requisito estricto de la tabla.
| Columna | Significado | Si la omites |
|---|---|---|
name | Obligatorio | — |
category | engine · tires · fuel | fila saltada |
origin, color, logo | Como en los patrocinadores | generado |
budget, size | 1–10 | 5 |
power, reliability, endurance, potential, performance, heat, efficiency | Estadísticas técnicas 1–10 con sus nombres reales: solo las que tiene su categoría (ver abajo) | 0 = generado |
stat_a … stat_d | Los mismos cuatro valores en huecos genéricos, conservados para builds antiguas. Una columna con nombre gana a su hueco genérico | 0 = generado |
money_per_gp | Valor del acuerdo en $/GP. Positivo = asociación (te pagan), negativo = cliente (les pagas) | 0 = generado |
contract | partnership · client — gana sobre el signo de money_per_gp cuando ambos están puestos | decide el signo |
duration | Duración del contrato en temporadas | 0 = generado |
team_id / team | Parrillas impuestas: una lista — Scarlet:partner; Azure:customer; Emerald — un proveedor puede respaldar a varios equipos, cada uno en su nivel. Un socio por proveedor; un proveedor por categoría y equipo | mercado abierto |
id | Clave estable de esta fila | — |
| Categoría | hueco A | hueco B | hueco C | hueco D |
|---|---|---|---|---|
| engine | power | reliability | endurance (se muestra, no se simula) | potential (se muestra, no se simula) |
| tires | performance | endurance | reliability | heat |
| fuel | efficiency | — | — | — |
Dos cosas que un pack deliberadamente no puede fijar:
- La arquitectura del motor (V8/V10/V12) no se guarda en el proveedor: el juego busca el nombre en su grupo mundial de fabricantes. Un nombre que ese grupo no conoce recae en V10.
- Los rasgos ocultos de los neumáticos se generan a partir del nombre de la marca y la temporada, así que renombrar un fabricante vuelve a tirarlos.
circuits y calendar
Estas dos construyen una temporada. Los circuitos vienen del Editor de circuitos: el editor guarda un archivo .circuit y el Editor de mods lo importa al pack.
Cada circuito lleva un id, y una ronda del calendario apunta a él con circuit_id (su nombre sigue funcionando como recurso).
circuits guarda el trazado en sí — su nombre, lugar, longitud objetivo, preajuste visual, carácter, la línea central dibujada y los marcadores opcionales de salida/meta y boxes. calendar guarda las rondas, en orden: cada ronda es una ronda circuit (nombrando uno de tus trazados) o una ronda auto (un trazado generado de un carácter y una longitud dados).
Un pack con calendario sustituye la temporada por él. Un pack con circuitos pero sin calendario mete sus trazados en el grupo del mundo y deja que ocupen las rondas de la temporada.
Dos campos se registran a título informativo pero no se simulan: el year de un circuito y sus valores downforce / tire_wear / overtaking; en juego, esos tres se derivan del character del trazado.
images
name (la clave a la que apuntan las filas) más los bytes del PNG. Los logos se crean a 195×195; un sprite de coche personalizado es una vista lateral mirando a la derecha sobre fondo transparente, de 256 px de alto. El juego los descomprime en mods/.cache/ en el primer uso.
Lo que siempre sigue siendo generado
| Sección | Un pack sustituye | El juego sigue generando |
|---|---|---|
| Equipos | Nombre, país, reputación, presupuesto, perfil de comportamiento, colores, coche, decoración, mono, logo | La evolución del presupuesto, el comportamiento de la plantilla y (fuera del modo impuesto) las infraestructuras |
| Pilotos | Nombre, código, país, edad, las seis aptitudes y sus techos, curvas, rasgos, retrato, casco, salario, fama | La ambición, los objetivos de temporada, la personalidad oculta |
| Patrocinadores | Nombre, sector, color, presupuesto, notoriedad, origen, logo | Los términos de los contratos, el comportamiento del mercado |
| Proveedores | Nombre, categoría, color, presupuesto, tamaño, origen, logo, estadísticas técnicas, términos del acuerdo | El comportamiento del mercado, los rasgos ocultos de los neumáticos |
Trampas que conviene conocer
- Los vínculos siguen al id, no al nombre. Un piloto, patrocinador o proveedor apunta al
idestable de un equipo, así que renombrarlo los conserva, y dos equipos pueden compartir nombre (solo sufre la lectura: clasificaciones y noticias lo muestran dos veces). Un pack escrito antes de que existieran los ids, o hecho a mano solo con nombres, sigue resolviéndose por nombre y mantiene el comportamiento antiguo: renombra ahí el equipo y el piloto pasa al grupo de agentes libres. Abrir el pack una vez en el Editor de mods lo actualiza. - Dos pilotos por equipo, uno por asiento. Un equipo con dos pilotos
primarydeja el coche 2 vacío, y un coche sin piloto no toma la salida. La pestaña Auditoría del editor existe sobre todo por esto. - Los códigos de piloto deben ser únicos. Un choque se renombra al cargar, en silencio, y todo lo indexado por código sigue el cambio.
- El archivo del pack debe quedarse donde está. Los logos y los sprites de coche personalizados se leen de él; una carrera empezada con un pack que luego desaparece los pierde.
- Un pack solo se aplica al crear la carrera. Editar un pack nunca cambia una carrera ya en marcha: empieza otra para ver el cambio.