Um pacote de conteúdo é um único ficheiro: uma base de dados SQLite colocada na sua pasta de mods (%APPDATA%\TheUndercut\mods\ no Windows — ver onde ficam os ficheiros). Leva as linhas e as imagens dos logótipos, por isso um pacote é uma coisa só para partilhar, guardar ou publicar.
mods/
my_pack.db ← a mod inteira
Não é preciso saber SQL para criar um — o Editor de mods que vem com o jogo escreve exatamente este ficheiro. Se mesmo assim quiser abrir o ficheiro por si — para alterações em massa, ou para gerar um pacote a partir de um script — a referência SQL documenta cada tabela e cada coluna. Esta página documenta o que o ficheiro significa, que é o que precisa quer use o editor, um script seu, ou leia o pacote de outra pessoa.
A regra de ouro do formato: cada tabela e cada coluna é opcional. Um pacote que apenas renomeia duas equipas é válido. Tudo o que deixar de fora continua procedural, e um pacote criado para uma versão anterior continua a carregar num jogo mais recente.
O formato atual é a v2. Um pacote regista em que versão foi escrito, e o jogo indica-o na linha do pacote quando só o percebe em parte — nunca fica a pensar porque é que uma parte do pacote não fez nada. O Editor de mods atualiza um pacote antigo assim que o abre.
O que há dentro de um pacote
| Tabela | Contém |
|---|---|
meta | As definições do pacote: o nome, os modos de secção, o cenário, o ano inicial |
teams | A grelha — identidade, cores, carro, orçamento e (pacotes impostos) infraestruturas e palmarés |
drivers | Perfis de pilotos — aptidões, tetos, curvas de crescimento, traços, retrato, salário, lugar |
sponsors | Marcas disponíveis no mercado de patrocínio |
suppliers | Fabricantes de motores, pneus e combustível |
circuits | Traçados importados de ficheiros .circuit — ver modding de circuitos |
calendar | As rondas da época, por ordem |
images | Os ficheiros PNG para os quais as linhas apontam: logótipos e sprites de carro personalizados |
extend ou replace
Cada secção tem um modo, guardado em meta como <secção>_mode:
extend é o valor predefinido e é o próprio padrão do jogo base: um núcleo estático mais enchimento procedural. replace é o que quer para uma época real completa.
O que replace significa ao certo depende da secção — vale a pena saber antes de se perguntar porque é que um fornecedor sobreviveu:
| Secção | replace faz |
|---|---|
teams | Corta a grelha para a sua lista — fica exatamente com o comprimento da sua tabela de equipas |
drivers | A bolsa de pilotos é só a sua; mais ninguém é gerado para a sua série |
sponsors | O mercado de patrocínio é só o seu |
suppliers | Só as categorias que cobre são substituídas. Um pacote com dois fabricantes de motores e nenhum de pneus mantém os de pneus gerados, porque não se corre uma época sem um |
circuits | Aplica-se ao conjunto de circuitos do mundo — os palcos de onde os calendários futuros saem. replace significa que o mundo nunca volta a traçados gerados; de qualquer forma, o calendário que construir corre sempre os traçados que lá colocou |
Uma coisa que replace não faz
Os pilotos de um pacote preenchem a sua série. O mundo também faz correr dez campeonatos não jogáveis, cada um com uma grelha para encher, e o jogo reforça a bolsa de pilotos para que os lugares deles não fiquem vazios — é por isso que um pacote com uma grelha completa sua pode continuar rodeado de agentes livres gerados.
meta.active_series é a resposta: liste os campeonatos que o mundo deve fazer correr (PFS é o jogável) e todas as outras séries ficam desligadas. Desmarque tudo menos a sua e os pilotos do seu pacote serão as únicas pessoas do mundo. Não diga nada e todas as séries correm, como antes.
Duas formas de um pacote iniciar uma carreira
meta.scenario decide o que acontece quando o jogador escolhe o seu pacote.
| Cenário | O que o jogador recebe |
|---|---|
| New Series (predefinido) | O jogador cria uma equipa nova que entra na grelha e joga a pré-época. As suas equipas são as rivais. |
| Imposed | A grelha fica fixa tal como a criou — cada equipa com pessoal, material e contratos. O jogador assume uma das suas equipas e a época abre na corrida 1, sem pré-época. |
Um pacote imposto desbloqueia campos que de outro modo não fariam sentido, e essa é a única diferença no formato: níveis de infraestrutura, palmarés de equipas e pilotos, ano de fundação e as ligações de «contratado por» que pré-preenchem os pilotos, patrocinadores e fornecedores de cada equipa. Use replace nas equipas para uma grelha imposta, para que só as suas corram.
meta — as definições do pacote
| Chave | Valor | Predefinição |
|---|---|---|
name | Mostrado no seletor de pacotes | o nome do ficheiro |
author | Texto livre | — |
schema_version | Versão do formato de pacote em que este ficheiro foi escrito (atual: 2) | 1 |
min_game_version | Build do jogo de que o pacote precisa. Um jogo mais antigo indica-o na linha do pacote em vez de o carregar meio aplicado | — |
scenario | new_series · imposed | new_series |
start_year | Ano civil da época 1 — um pacote pode abrir em qualquer era | 1990 |
teams_mode, drivers_mode, sponsors_mode, suppliers_mode, circuits_mode | extend · replace | extend |
active_series | Campeonatos que o mundo faz correr, separados por vírgulas (PFS,PF2) | ausente = todos |
rules | Ids dos conjuntos de regras da série, separados por vírgulas (escala de pontos, regra dos 107 % na qualificação) | as predefinições do jogo |
teams
Uma linha sem name é ignorada. As equipas são aplicadas à grelha por ordem, por isso a primeira linha é a primeira equipa.
| Coluna | Significado | Se a omitir |
|---|---|---|
id | Chave estável. Todas as ligações do pacote apontam para ela, por isso uma equipa pode ser renomeada sem perder pilotos, patrocinadores e fornecedores | é usado o nome visível |
name | Nome da equipa — o que o jogo mostra por todo o lado | obrigatório |
country | Nome do país ou código ISO | gerado |
budget_tier | small · medium · large — o perfil de comportamento: reservas de caixa da IA, teto de infraestruturas, prestígio, ambição em I&D | deduzido do orçamento |
budget_musd | Caixa inicial, em milhões | 0 = o montante próprio do escalão (40 M$ / 60 M$ / 90 M$) |
reputation | 0–100 | 0 = gerada |
color1, color2, color3 | #RRGGBB — as três zonas da decoração | vazio = manter a decoração gerada |
car_index | 0–11, qual o modelo de carro em vista lateral | vazio = manter o modelo gerado (0 é um modelo real, por isso não pode significar «por definir») |
car_image | Nome de uma linha images: um sprite lateral próprio que substitui o modelo | modelo integrado |
livery | Padrão de decoração visto de cima, usado nas corridas em direto | 255 = o jogo escolhe |
suit | Fato usado pelos pilotos da equipa | 255 = por piloto |
logo | Um nome de linha images, ou um número (um dos logótipos que vêm com o jogo), ou um caminho relativo a mods/ | uma marca procedural a partir do nome da equipa |
infra_engineering … infra_academy | Os nove níveis de departamento (a academia vai até 3, os restantes até 10). Numa grelha imposta, estes são a força base do carro | 0 = gerado |
career_wins, career_titles, best_championship, founding_year | Registo histórico mostrado no perfil da equipa na época 1 | 0 = predefinição (ano de fundação 1990) |
history | Linhas época a época, época:posição:vitórias, unidas por ; | nenhuma |
drivers
Uma linha sem nome próprio nem apelido é ignorada.
| Coluna | Significado | Se a omitir |
|---|---|---|
id | Chave estável desta linha | — |
first_name, last_name | — | um dos dois obrigatório |
code | Três letras, único em todo o pacote — o jogo indexa os pilotos por código e renomeia um conflito em silêncio | construído a partir do apelido |
country | Nome do país ou código ISO | gerado |
age | 1–55. Abaixo dos 16 é exclusivo das mods: uma promessa criança envelhece a cada época, fica invisível no Recrutamento até aos 14 e não pode ser alinhada antes do que a série permite (18 na PFS) | 25 |
intelligence, pace, consistency, adaptability, stamina, aggressivity | Aptidões, 1–20 | 10 |
pot_* (as mesmas seis) | O teto de cada estatística. Nunca aplicado abaixo da própria aptidão | 0 = gerado |
curve_* (as mesmas seis) | A forma de crescimento da estatística com a idade — ver abaixo | 255 = a forma predefinida dessa estatística |
traits | O formato de traços do próprio jogo, pares tipo:nível — crie-os no editor | gerados |
fame | Notoriedade inicial 0–100. Um valor inicial: o jogo pode continuar a mexer nele | 0 = calculada a partir das aptidões |
salary | Salário pedido, por época | 500000 |
face_sheet, face_index, helmet_index, helmet_hue_0/1/2 | Retrato e capacete | 255 = gerado |
team_id | Coloca este piloto nessa equipa na época 1, pelo id estável da equipa — a ligação que o jogo resolve primeiro | — |
team | O mesmo, pelo nome visível da equipa. Usado quando não há team_id | agente livre |
role | primary · secondary · reserve — o lugar é o carro: o titular guia o carro 1, o segundo o carro 2 | primary |
contract_years | Duração do contrato em épocas | 0 = 2 |
career_starts, career_wins, career_podiums, career_titles, best_finish | Palmarés mostrado desde a época 1 | 0 = nenhum |
Curvas de crescimento
Cada aptidão desenvolve-se com a idade segundo uma de cinco formas. O jogo sempre as teve, uma fixa por estatística; um pacote pode atribuir qualquer forma a qualquer estatística.
| Curva | Melhora | Declina | Predefinida para |
|---|---|---|---|
| Pico precoce | depressa até aos 26, devagar até aos 30, depois nunca | a partir dos 30 | Ritmo |
| Física | até aos 28, depois nunca | a partir dos 28 | Resistência |
| Cerebral | sempre, abrandando após os 30 e depois os 38 | nunca | Inteligência, Adaptabilidade |
| Experiência | até aos 30, a meia velocidade até aos 34, depois nunca | a partir dos 34 | Regularidade |
| Juventude | só até aos 24 | a partir dos 28 | Agressividade |
A curva é a forma, não a velocidade: a rapidez com que uma estatística fecha a distância para o seu teto continua a ser uma propriedade da estatística.
sponsors
| Coluna | Significado | Se a omitir |
|---|---|---|
name | Nome da marca — obrigatório | — |
sector | automotive, technology, energy, finance, luxury, fashion, telecom, beverage, insurance, aviation, industry, retail | gerado |
origin | Nome do país ou código ISO | gerado |
budget | 1–10 — quanto vale o acordo | 5 |
prominence | 1–10 — com que frequência a marca aparece e a dificuldade em consegui-la | 5 |
color | #RRGGBB | — |
logo | Um nome de linha images, ou um caminho relativo a mods/ | um logótipo procedural |
team_id / team | Grelhas impostas: assina esta marca com essa equipa na época 1 — por id estável ou por nome | mercado aberto |
id | Chave estável desta linha | — |
suppliers
Uma linha cuja category não seja uma das três é totalmente ignorada — é a única exigência rígida da tabela.
| Coluna | Significado | Se a omitir |
|---|---|---|
name | Obrigatório | — |
category | engine · tires · fuel | linha ignorada |
origin, color, logo | Como nos patrocinadores | gerado |
budget, size | 1–10 | 5 |
power, reliability, endurance, potential, performance, heat, efficiency | Estatísticas técnicas 1–10 com os nomes reais — só as que a categoria tem (ver abaixo) | 0 = gerada |
stat_a … stat_d | Os mesmos quatro valores em espaços genéricos, mantidos para builds antigas. Uma coluna com nome ganha ao seu espaço genérico | 0 = gerada |
money_per_gp | Valor do acordo em $/GP. Positivo = parceria (pagam-lhe), negativo = cliente (paga-lhes) | 0 = gerado |
contract | partnership · client — ganha ao sinal de money_per_gp quando ambos estão definidos | decide o sinal |
duration | Duração do contrato em épocas | 0 = gerada |
team_id / team | Grelhas impostas: uma lista — Scarlet:partner; Azure:customer; Emerald — um fornecedor pode apoiar várias equipas, cada uma ao seu nível. Um parceiro por fornecedor; um fornecedor por categoria e por equipa | mercado aberto |
id | Chave estável desta linha | — |
| Categoria | espaço A | espaço B | espaço C | espaço D |
|---|---|---|---|---|
| engine | power | reliability | endurance (mostrado, não simulado) | potential (mostrado, não simulado) |
| tires | performance | endurance | reliability | heat |
| fuel | efficiency | — | — | — |
Duas coisas que um pacote deliberadamente não pode definir:
- A arquitetura do motor (V8/V10/V12) não fica guardada no fornecedor — o jogo procura o nome no seu conjunto mundial de construtores. Um nome que esse conjunto não conhece recai em V10.
- Os traços ocultos dos pneus são gerados a partir do nome da marca e da época, por isso renomear um fabricante volta a sorteá-los.
circuits e calendar
Estas duas constroem uma época. Os circuitos vêm do Editor de circuitos: o editor guarda um ficheiro .circuit e o Editor de mods importa-o para o pacote.
Cada circuito tem um id, e uma ronda do calendário aponta para ele com circuit_id (o nome ainda funciona como recurso).
circuits guarda o traçado em si — nome, local, comprimento pretendido, predefinição visual, carácter, a linha central desenhada e os marcadores opcionais de partida/meta e boxes. calendar guarda as rondas, por ordem: cada ronda é uma ronda circuit (que nomeia um dos seus traçados) ou uma ronda auto (um traçado gerado com determinado carácter e comprimento).
Um pacote que leve um calendário substitui a época por ele. Um pacote com circuitos mas sem calendário mete os seus traçados no conjunto do mundo e deixa-os ocupar as rondas da época.
Dois campos são registados a título informativo mas não simulados: o year de um circuito e as suas classificações downforce / tire_wear / overtaking — em jogo, esses três derivam do character do traçado.
images
name (a chave para onde as linhas apontam) mais os bytes do PNG. Os logótipos são criados a 195×195; um sprite de carro personalizado é uma vista lateral virada à direita sobre fundo transparente, com 256 px de altura. O jogo extrai-os para mods/.cache/ na primeira utilização.
O que fica sempre gerado
| Secção | Um pacote substitui | O jogo continua a gerar |
|---|---|---|
| Equipas | Nome, país, reputação, orçamento, perfil de comportamento, cores, carro, decoração, fato, logótipo | A evolução do orçamento, o comportamento do plantel e (fora do modo imposto) as infraestruturas |
| Pilotos | Nome, código, país, idade, as seis aptidões e os seus tetos, curvas, traços, retrato, capacete, salário, fama | A ambição, os objetivos da época, a personalidade oculta |
| Patrocinadores | Nome, setor, cor, orçamento, notoriedade, origem, logótipo | Os termos dos contratos, o comportamento do mercado |
| Fornecedores | Nome, categoria, cor, orçamento, dimensão, origem, logótipo, estatísticas técnicas, termos do acordo | O comportamento do mercado, os traços ocultos dos pneus |
Armadilhas a conhecer
- As ligações seguem o id, não o nome. Um piloto, patrocinador ou fornecedor aponta para o
idestável de uma equipa, por isso renomeá-la mantém-nos, e duas equipas podem partilhar um nome (só a leitura sofre — classificações e notícias mostram-no duas vezes). Um pacote escrito antes de existirem ids, ou feito à mão só com nomes, continua a resolver por nome e mantém o comportamento antigo: renomeie aí a equipa e o piloto passa para a bolsa de agentes livres. Abrir o pacote uma vez no Editor de mods atualiza-o. - Dois pilotos por equipa, um por lugar. Uma equipa com dois pilotos
primarydeixa o carro 2 vazio, e um carro sem piloto não parte. O separador Auditoria do editor existe sobretudo para isto. - Os códigos dos pilotos têm de ser únicos. Um conflito é renomeado ao carregar, em silêncio, e tudo o que é indexado por código acompanha a mudança.
- O ficheiro do pacote tem de ficar onde está. Os logótipos e os sprites de carro personalizados são lidos a partir dele; uma carreira iniciada com um pacote que depois desaparece perde-os.
- Um pacote só se aplica na criação da carreira. Editar um pacote nunca muda uma carreira já a decorrer — comece outra para ver a alteração.