Modificar uma unidade, do princípio ao fim
Fonte: coreprime/kbot @ 0ab97bf · Editar no GitHub
Este percurso leva-o de uma instalação original do Total Annihilation até um pequeno mod que acrescenta uma nova variante do tanque Flash do ARM: uma reskin com o dobro da velocidade. No fim terá um arquivo
.ufopronto a distribuir, que carrega quando é colocado na pasta do jogo, e uma ideia funcional de todos os formatos que o kbot suporta.O exercício completo demora cerca de 20 minutos e passa por HPI, FBI, COB, 3DO, PCX, TDF e
sidedata.tdf.
Important
Os passos partem do princípio de que usa uma shell de tipo UNIX. A
linha de comandos do kbot é idêntica no Windows; use \ em vez de /
nos caminhos, se for preciso.
0. Pré-requisitos
- Uma instalação completa do TA em
$TA(GoG, Steam ou o CD original). - O kbot instalado:
go install github.com/coreprime/kbot/cmd/kbot@latest kbot ctx add "$TA" --alias ta --game totala - Espaço em disco para uma cópia de trabalho desempacotada (~120 MB).
1. Desempacotar a instalação
Vai editar ficheiros individuais; desempacote os arquivos uma vez para os poder ler com as ferramentas habituais.
kbot mount "$TA" flatten --target ./ta-flat
Veja o que obteve:
ls ta-flat/ # ai/ anims/ features/ ... weapons/
ls ta-flat/units/ | head # ARMCOM.FBI, ARMFLASH.FBI, ...
A estrutura de pastas corresponde à forma do VFS; veja HPI para saber como os arquivos se sobrepõem em camadas durante a execução.
2. Criar uma pasta de trabalho para o mod
Modificar o TA é aditivo: coloque um .ufo ao lado dos arquivos
existentes e os seus ficheiros sobrepõem-se aos do jogo base. Construa o
mod numa árvore espelhada:
mkdir -p mymod/{units,scripts,objects3d,unitpics,download}
Note
Só precisa de distribuir os ficheiros que altera. Não copie o jogo
inteiro para mymod/: isso incha o .ufo e arrisca tapar coisas que
não pretendia. A pasta download/ é o sítio habitual do registo no menu
de construção que vamos acrescentar no passo 5.
3. Escolher uma unidade como base
Vamos basear o nosso MYFLASH no Flash do ARM existente. Copie quatro
ficheiros:
cp ta-flat/units/armflash.fbi mymod/units/myflash.fbi
cp ta-flat/scripts/ARMFLASH.cob mymod/scripts/MYFLASH.cob
cp ta-flat/objects3d/armflash.3do mymod/objects3d/myflash.3do
cp ta-flat/unitpics/armflash.pcx mymod/unitpics/myflash.pcx
Porquê estes quatro? Todas as unidades precisam de:
| Ficheiro | Função | Página |
|---|---|---|
units/X.fbi |
Atributos e metadados | FBI |
scripts/X.cob |
Bytecode de animação/comportamento | COB |
objects3d/X.3do |
Malha 3D | 3DO |
unitpics/X.pcx |
Retrato de 96×96 para o menu de construção | PCX |
download/X.tdf |
Registo no menu de construção (acrescentado no passo 5) | TDF |
Por convenção, os nomes dos ficheiros são o Objectname do FBI em
minúsculas, com o próprio .fbi às vezes em maiúsculas. O motor não
distingue maiúsculas de minúsculas em lado nenhum.
4. Reconfigurar o FBI
Abra mymod/units/myflash.fbi. Os dois campos essenciais a alterar são
UnitName (a chave de pesquisa) e Objectname (a referência à base dos
nomes de ficheiro):
[UNITINFO]
{
UnitName=MYFLASH; // ← was ARMFLASH
Objectname=myflash; // ← was armflash
Side=ARM;
Designation=ARM-MV;
Name=Super Flash; // ← display name
Description=Twice-as-fast Flash variant;
...
}
Depois aumente um atributo para provar que a alteração funciona, duplicando a velocidade:
MaxVelocity=4.0; // was 2.0
Acceleration=0.30; // was 0.15
Veja o Apêndice do FBI para o catálogo completo dos campos. Tudo o que não for definido herda os valores por omissão do motor.
Warning
Todos os valores precisam de um ; no fim. É a causa número 1 de
"a minha alteração não teve efeito": um ponto e vírgula em falta junta
silenciosamente o valor à linha seguinte.
5. Registar a unidade no menu de construção
Uma unidade que existe mas não está acessível a partir de nenhum
construtor não pode ser construída. A forma correta de acrescentar uma
posição de construção para uma unidade nova é colocar um ficheiro
download/<UNITNAME>.tdf no mod: a própria expansão Core Contingency
da Cavedog distribui assim as suas unidades novas, e todos os
complementos .ufo de uma só unidade que encontrar (AFark.ufo,
AFlea.ufo, CorNecro.ufo, …) seguem a mesma convenção.
Crie mymod/download/MYFLASH.tdf:
[MENUENTRY1]
{
UNITMENU=ARMVP; // The builder this unit appears under
MENU=3; // Build-menu page number (1-indexed)
BUTTON=4; // Slot within that page (0–5 in a 2×3 grid;
// 4 = bottom-left)
UNITNAME=MYFLASH; // The unit being placed (matches your FBI's UnitName)
}
O menu de construção do TA é uma grelha de 2 colunas × 3 linhas por
página, por isso BUTTON aceita valores de 0 a 5, distribuídos
assim:
┌─────┬─────┐
│ 0 │ 1 │ page N, top row
├─────┼─────┤
│ 2 │ 3 │ page N, middle row
├─────┼─────┤
│ 4 │ 5 │ page N, bottom row
└─────┴─────┘
Escolha uma posição livre na disposição existente do construtor de destino; veja a referência da árvore de construção do TA para a disposição completa, página a página, de todos os construtores do jogo base.
O motor lê todos os download/*.tdf no arranque, analisa cada
[MENUENTRY<N>] e junta as entradas aos menus de construção que o
sidedata.tdf declarou. Não é preciso editar o sidedata.tdf.
Porque é que isto é melhor do que editar o sidedata.tdf
| Abordagem | Vantagens | Desvantagens |
|---|---|---|
Editar o sidedata.tdf |
Uma única fonte de verdade | Substitui o ficheiro inteiro (~50 KB); entra em conflito com qualquer outro mod que lhe mexa; perde as suas adições da próxima vez que o jogo base receber um patch |
download/*.tdf |
Aditivo, ~150 bytes, sem conflitos com outros mods, fácil de combinar com outros mods | Um ficheiro por unidade acrescentada (que é, de qualquer forma, a unidade natural de modificação) |
Este é o ponto de extensão oficial da Cavedog: existe precisamente para
que os complementos de uma só unidade não tenham de fazer uma cópia
própria do sidedata.tdf.
Construir a partir de vários construtores
Para que a unidade possa ser construída por vários construtores, basta
acrescentar mais secções [MENUENTRY<N>]. O download/Armfort.tdf da
própria Cavedog (a Muralha de Fortificação ARM, incluída em
ccdata.ccx) faz exatamente isso:
[MENUENTRY1] { UNITMENU=ARMACK; MENU=3; BUTTON=4; UNITNAME=ARMFORT; }
[MENUENTRY2] { UNITMENU=ARMACV; MENU=3; BUTTON=4; UNITNAME=ARMFORT; }
[MENUENTRY3] { UNITMENU=ARMACA; MENU=3; BUTTON=4; UNITNAME=ARMFORT; }
— o que permite ao Kbot de Construção Avançado, ao Veículo de Construção Avançado e à Aeronave de Construção Avançada construírem o ARMFORT. Uma entrada por construtor.
Escolher os valores de MENU e BUTTON
O TA original reserva as duas primeiras páginas do menu (MENU=1,
MENU=2) para as unidades do jogo base. A convenção da comunidade é pôr
as unidades transferíveis em MENU=3 (ou numa página superior), para não
colidirem com nada que a Cavedog distribua. BUTTON é a posição dentro
dessa página.
Na dúvida, copie os valores de um download/*.tdf existente que
acrescente unidades ao mesmo construtor. Extraia o Armfort.tdf, o
Armmark.tdf, o Cormort.tdf, etc. da Cavedog para ter referências que
funcionam:
kbot hpi extract /path/to/ccdata.ccx "*.tdf" -t /tmp/cc-downloads
ls /tmp/cc-downloads/download/
Note
Dois mods com o mesmo trio (UNITMENU, MENU, BUTTON) colidem de
forma imprevisível: a posição fica para o que carregar depois.
Escolha um número de página alto (MENU=4 ou 5) quando distribuir um
mod feito para coexistir com outros.
Veja TDF: [MENUENTRY] para a
referência dos campos.
6. Recompilar o COB (opcional)
O MYFLASH.cob é uma cópia do ARMFLASH.cob e funciona tal como está.
Se quiser afinar a animação, descompile, edite e volte a compilar:
# Decompile to readable BOS
kbot cob decompile mymod/scripts/MYFLASH.cob -t mymod/scripts/MYFLASH.bos
# Edit MYFLASH.bos in any text editor
# (See cob.md for the BOS language reference.)
# Compile back to bytecode
kbot cob compile mymod/scripts/MYFLASH.bos -t mymod/scripts/MYFLASH.cob
# Lint for common issues
kbot cob lint mymod/scripts/MYFLASH.cob
A ida e volta descompilar→compilar é idêntica byte a byte para todos os
scripts comerciais da Cavedog; o kbot cob roundtrip confirma-o em todo
o catálogo do jogo.
7. (Opcional) Mudar o aspeto do retrato
O unitpics/myflash.pcx é um PCX de 96×96 com paleta. Edite-o em
qualquer editor de imagens que trate PCX de 8 bits (GIMP, Aseprite,
Krita), preservando a paleta do TA. Para confirmar que a paleta
sobreviveu:
kbot pcx describe mymod/unitpics/myflash.pcx
# Expected: BitsPerPixel: 8, embedded palette present
Se a paleta ficou estragada, volte a importar a paleta canónica do TA
(palettes/palette.pal) antes de guardar. Veja PCX para as
armadilhas dos marcadores 0x0C e do preenchimento de BytesPerLine.
8. (Opcional) Mudar o aspeto do modelo 3D
O objects3d/myflash.3do é uma malha hierárquica: vértices, primitivas,
referências a texturas. O editor da Cavedog (3DO Builder) continua a ser
o editor de 3DO mais prático, apesar da idade. O kbot não edita .3do
diretamente; a interface web só os renderiza para inspeção:
kbot mount $(kbot ctx path) --server
# → browse to objects3d/myflash.3do for the piece tree and textures
Veja 3DO para a estrutura no disco, se estiver a criar ferramentas.
9. Empacotar num .ufo
kbot hpi pack ./mymod --target myflash.ufo
Por omissão, o kbot usa compressão LZ77 por blocos com a chave de cabeçalho normal da Cavedog e o rodapé de direitos de autor da Cavedog que o jogo exige; ou seja, o motor aceita o ficheiro sem protestar. Confirme:
kbot hpi info myflash.ufo
# Should show ~5–8 files, marker 0x49504148 (HAPI), decrypt key 0xBF,
# and "TA 3.1c would mount: yes". A "no" names the reason (for example
# a missing Cavedog trailer), and the game would silently skip the file.
kbot hpi list myflash.ufo -v
# units/myflash.fbi, scripts/MYFLASH.cob, objects3d/myflash.3do, ...
10. Instalar e testar
Porquê um .ufo? O TA 3.1c monta rev31.gp3, depois todos os .ccx,
todos os .ufo e só os dez primeiros .hpi, cada grupo por ordem do
nome em maiúsculas ASCII, e lê cada ficheiro do primeiro arquivo que o
contém (veja a
ordem de carregamento do HPI). Um .ufo é
sempre montado e fica acima de todos os .hpi; um mod .hpi competiria
pelas dez posições *.hpi que uma instalação comercial já preencheu. Os
ficheiros que o rev31.gp3 ou um .ccx também contêm (por exemplo
units/ARMCOM.FBI ou gamedata/sidedata.tdf) continuam a vir desses
arquivos: distribua essas substituições como ficheiros soltos na raiz da
instalação. A caixa de diálogo Export mod… do estúdio lista-os para um
espaço de trabalho antes de fazer a transferência.
Coloque o .ufo na raiz da instalação do TA, ao lado do totala1.hpi:
cp myflash.ufo "$TA/"
Inicie o TA. Comece uma escaramuça, construa uma Fábrica de Veículos ARM e o seu Super Flash deve aparecer no menu de construção, com o dobro da velocidade de um Flash normal.
Tip
Iterar depressa. Em vez de voltar a empacotar a cada alteração, pode
colocar mymod/ diretamente numa instalação desempacotada (onde os
ficheiros têm prioridade sobre o conteúdo dos arquivos). Volte a
empacotar só quando estiver pronto para distribuir.
Resolução de problemas
| Sintoma | Causa provável |
|---|---|
| A unidade não aparece no menu de construção. | Falta o download/<UNITNAME>.tdf, o UNITMENU= está errado (gralha no nome do construtor) ou a posição (MENU, BUTTON) já está ocupada por outra unidade. |
| O menu de construção mostra a unidade, mas clicar nela não faz nada. | O UNITNAME= do TDF de download não corresponde ao UnitName= do FBI. Ou então o Bmcode= da unidade no FBI é 0 (o que significa "não construível"). |
| O jogo falha ao carregar. | Valor errado no FBI (falta um ;, [SECTION] mal formada). Execute kbot mount mymod --server e examine o FBI no visualizador de TDF da interface web: os erros de análise aparecem realçados. |
| A unidade aparece como uma mancha magenta. | O Objectname do FBI aponta para um nome de ficheiro .3do que não existe. Verifique objects3d/<Objectname>.3do. |
| A unidade não se mexe. | MovementClass refere uma classe que não está em moveinfo.tdf. Acrescente a classe ou use uma que exista. |
| A unidade mexe-se, mas a malha não é animada. | O script COB refere um nome de peça que não existe no 3DO. Compare kbot cob decompile myflash.cob | grep piece com a árvore de peças do 3DO na interface web. |
| A unidade tem a velocidade certa, mas o retrato errado. | unitpics/<Objectname>.pcx não existe, ou o motor continua a ver o armflash.pcx original (o mod foi carregado depois do arquivo base?). |
| O menu de construção mostra um ícone em branco. | O PCX não foi guardado com 8 bits e paleta. Execute kbot pcx describe para confirmar. |
Próximos passos
- Acrescentar uma arma nova: copie um
.tdfdeweapons/, edite-o e refira-o noWeapon1=do seu FBI. Veja a referência do weapons.tdf. - Acrescentar uma classe de movimento nova: acrescente-a ao
moveinfo.tdf. Veja Gamedata. - Criar um mapa personalizado: monte um
.tnta partir de secções.sct(ou escreva o TNT diretamente à mão comkbot tnt pack). Veja TNT. - Acrescentar sons novos: coloque WAVs em
sounds/e ligue-os emgamedata/sound.tdf. Veja Som. - Afinar a IA: acrescente regras
Weight/Limitemai/default.txtpara a sua unidade nova. Veja IA. - Examinar um mod existente:
kbot hpi listekbot hpi extracttambém funcionam com.ufode terceiros. Estudar a forma como outros construíram os seus arquivos é a maneira mais rápida de interiorizar as convenções do modding.
Ver também
- HPI — pormenores do empacotamento de arquivos.
- FBI / TDF — linguagem de definição de unidades, com o dicionário completo de campos.
- COB / BOS — linguagem de scripting.
- 3DO — formato das malhas.
- Gamedata — referências do
sidedata.tdf, domoveinfo.tdfe doweapons.tdf. - Glossário — referência de terminologia.