Portar um mutador legado
O KroggyComm 1.1, dos seus arquivos até um pacote, e um ficheiro de regras do TA: Mutation mantido com sm ou reescrito em Lua.
Este capítulo resume docs/mutators/authoring.md e docs/mutators/oamut-standard.md.
Os arquivos originais
O KroggyComm 1.1, de Immerman, foi distribuído como }{KroggyComm11.tam e }{KroggyComm11.ccx. O .tam é o registo do TA: Mutation: o nome, o texto que dá o crédito ao autor e os códigos de compatibilidade TACC e UH. O .ccx contém o modelo do Krogoth, um script de comandante guardado duas vezes (para o ARM e para o CORE), os ficheiros de unidade dos dois comandantes, o código-fonte do script e uns destroços. Este capítulo não reproduz esses arquivos. Mostra o que o pacote curado mantém e para onde foi cada peça.
Começar pela importação
O oa-tool mutator import lê o .tam e encontra o .ccx ao lado. Escreva a pasta noutro sítio que não a pasta que contém o .tam. Os avisos indicam o que curar: a etiqueta é a predefinida, TACC passa a ta-3.1c e UH não tem mod a que corresponder.
$ oa-tool mutator import 'originals/}{KroggyComm11.tam' --out imports
imported kroggycomm-1-1 from originals/}{KroggyComm11.tam: 0 rule files, 1 archives
tags default to gameplay
TACC maps to ta-3.1c; Core Contingency's units are only there when it is on
UH is not mapped to a mod
A importação mantém o .ccx inteiro em files/kroggycomm-1-1.ccx, e o script que escreve só acrescenta essa pasta. O seu manifesto tem a versão 1.0, a etiqueta gameplay, works-with ta-3.1c, a camada files e o registo legacy. Essa pasta joga-se, e é o início do pacote, não o mutador acabado.
Importação ·mutator.lua-- Made by oa-tool mutator import from the TA: Mutation mutator "KroggyComm 1.1".
-- Its rule file is in rules/ and its archives in files/; files OA protects are left out.
function mutate(ctx)
return {
files = { add = { "files" } },
}
end
O modelo e os scripts passam para files/
O pacote curado só mantém o que o jogo lê do arquivo: três caminhos em files/, cada um onde o jogo o procura.
files/objects3d/KROGCOM.3doo modelo, a partir de objects3d/KROGCOM.3do no .ccxfiles/scripts/armcom.cobo script do ARM, a partir de scripts/armcom.cobfiles/scripts/corcom.cobo script do CORE: os mesmos bytes que o do ARM, guardados no arquivo como scripts/Corcom.cobOs dois ficheiros de unidade também não são incluídos: os seus campos passam a regras, mais abaixo. Ficam de fora mais duas coisas do arquivo. scripts/KroggyCom.bos é o código-fonte do script, e o jogo nunca o lê. features/corpses/Corkrog_dead.tdf são os destroços da The Core Contingency, sem alterações.
As alterações ao FBI passam a regras
Os campos de unidade do Krogoth passam a ser as regras do mutator.lua curado. Os dois comandantes recebem o objeto KROGCOM, as armas CORKROG_FIRE, CORKROG_ROCKET e CORKROG_HEAD, os custos, a área ocupada e o movimento. Os campos de camuflagem e de alvo fraco são removidos, o que faz parte desse design. HealTime, OvrAdjust e DefaultMissionType mantêm os valores da 3.1c: os ficheiros de unidade de 2001 são anteriores a esses campos, por isso a sua ausência não faz parte do design do Krogoth. A categoria de som do ARM passa a KROGOTH. O CORE mantém CORE_COM, por isso o script passa nil e não define soundcategory. O hook de unidades recusa a partida quando faltam essas três armas.
Script de entrada ·mutator.lua-- HealTime, OvrAdjust, DefaultMissionType and the localized names stay.
-- The 2001 unit files predate those 3.1c fields, so their absence is not the Krogoth's design.
local function krogoth_changes(sound)
local changes = {
acceleration = set(0.09),
badtargetcategory = remove(),
brakerate = set(0.19),
buildcostenergy = set(116664),
buildcostmetal = set(29489),
builddistance = set(120),
buildtime = set(382193),
cantbetransported = set(1),
cloakcost = remove(),
cloakcostmoving = remove(),
corpse = set("corkrog_dead"),
downloadable = set(1),
energymake = set(32),
energyuse = set(7),
explodeas = set("NUCLEAR_MISSILE"),
footprintx = set(3),
footprintz = set(3),
maxdamage = set(29918),
maxslope = set(17),
maxvelocity = set(1),
maxwaterdepth = set(12),
mincloakdistance = remove(),
movementclass = set("TANKDH3"),
noautofire = set(0),
objectname = set("KROGCOM"),
onoffable = set(1),
selfdestructas = set("NUCLEAR_MISSILE"),
sightdistance = set(255),
turnrate = set(960),
weapon1 = set("CORKROG_FIRE"),
weapon2 = set("CORKROG_ROCKET"),
weapon3 = set("CORKROG_HEAD"),
wpri_badtargetcategory = remove(),
}
if sound ~= nil then
changes.soundcategory = set(sound)
end
return changes
end
function mutate(ctx)
return {
files = { add = { "files" } },
rules = {
named("ARMCOM"):change(krogoth_changes("KROGOTH")),
named("CORCOM"):change(krogoth_changes(nil)),
},
units = function(units, ctx)
local weapons = ctx.weapons
if weapons["CORKROG_FIRE"] == nil or weapons["CORKROG_ROCKET"] == nil or weapons["CORKROG_HEAD"] == nil then
ctx.incompatible("KroggyComm needs Core Contingency's Krogoth weapons")
end
end,
}
end
O bloco legacy e o crédito
legacy indica o original. Mantenha o registo que a importação escreveu: o nome KroggyComm 1.1, o prefixo }{, a compatibilidade TACC e UH, e os ficheiros }{KroggyComm11.tam e }{KroggyComm11.ccx. O autor continua a ser Immerman, e a descrição indica o original que substitui e o seu autor: esse é o crédito. O resto é curado: a versão 1, as etiquetas commanders e new-units, works-with com um asterisco, para que o pacote sirva para qualquer mod e para o jogo base, e as camadas files e units para os ficheiros, as regras e o hook. conflicts-with indica anni-comm, special-tech-comm, commander-blast e tribe-commander, que escrevem os mesmos campos do comandante ou incluem o mesmo script. O manifesto abaixo é o ficheiro completo.
Manifesto ·oamut.yamloamut: 1
id: "kroggy-comm"
name: "Krogoth Commander"
version: "1"
author:
name: "Immerman"
description: "Use an amphibious Krogoth as a commander. Turn it off to disable the radar, the sonar and the head laser in exchange for 7 energy. The D-gun aims the head laser. Arm and Core are both named because one script is shipped for each commander. This package replaces KroggyComm 1.1 by Immerman. The model and the scripts stay as files, and the Krogoth's stats are rules, including the cloak and bad-target removals that belong to that design. Heal time, the override adjust, the default mission and the localized names stay, because the 2001 unit files left them out. It needs Core Contingency's Krogoth weapons."
tags: ["commanders", "new-units"]
works-with: ["*"]
requires:
engine: ">= 0.8.5"
conflicts-with: ["anni-comm", "special-tech-comm", "commander-blast", "tribe-commander"]
layers: ["files", "units"]
legacy:
- name: "KroggyComm 1.1"
prefix: "}{"
compatibility: ["TACC", "UH"]
files: ["}{KroggyComm11.tam", "}{KroggyComm11.ccx"]
Verificar e comparar com a importação
A partir de fora da pasta, pack escreve kroggy-comm-1.oamut. O oa-tool mutator check lê esse ficheiro. Neste pacote, a última linha é result: ok. O diff compara a pasta curada com a importação kroggycomm-1-1. Foi executado a partir da pasta de compilação de commanders, com o ficheiro allow da família, e DIR representa a pasta do jogo. O ficheiro allow é o que pode ficar.
$ oa-tool mutator pack kroggy-comm
$ oa-tool mutator check kroggy-comm-1.oamut
$ oa-tool mutator diff --game-dir DIR --mutator ./kroggy-comm --versus ./_imports/kroggycomm-1-1 --allow _verify/kroggy-comm.allowed
Com esse ficheiro allow, a comparação termina com 0. Depois das linhas de cabeçalho, que começam por #, imprime as linhas abaixo: 0 diferenças, 7 permitidas, 0 permissões não usadas. As sete linhas são a importação, o lado direito, que retira defaultmissiontype, healtime e ovradjust nos dois comandantes e acrescenta scripts/kroggycom.bos. O pacote curado mantém esses três campos e não inclui o .bos. Na pasta do jogo dessa execução, o hook de unidades não recusou o pacote: as três armas do Krogoth estavam presentes.
allowed right only field units/armcom.fbi [unitinfo] defaultmissiontype: Standby -> (absent)
allowed right only field units/armcom.fbi [unitinfo] healtime: 27 -> (absent)
allowed right only field units/armcom.fbi [unitinfo] ovradjust: 1 -> (absent)
allowed right only field units/corcom.fbi [unitinfo] defaultmissiontype: Standby -> (absent)
allowed right only field units/corcom.fbi [unitinfo] healtime: 27 -> (absent)
allowed right only field units/corcom.fbi [unitinfo] ovradjust: 1 -> (absent)
allowed right only file added scripts/kroggycom.bos aef95595e9dc1a1e543cf87c954c0b19e6523a227e89c4abaa40e6d264043889
mutator diff: 0 differences, 7 allowed, 0 unused allowances
Um ficheiro de regras do TA: Mutation
Os pacotes curados não incluem nenhum ficheiro .sm. O oa-tool mutator import mantém o ficheiro de regras original e indica-o no plano com sm. O Hide Damage, de Kirk, é o mais curto. A importação escreve rules/hide-damage.sm e um mutator.lua cuja entrada rules é sm "rules/hide-damage.sm". O .sm abaixo é esse ficheiro, incluindo os seus fins de linha.
Importação ·mutator.lua-- Made by oa-tool mutator import from the TA: Mutation mutator "Hide Damage".
-- Its rule file is in rules/ and its archives in files/; files OA protects are left out.
function mutate(ctx)
return {
rules = { sm "rules/hide-damage.sm" },
}
end
Ficheiro de regras · rules/hide-damage.sm[*all*]
{
HideDamage=1;
}A mesma regra em Lua é all():change { hidedamage = set(1) }. É nisso que [*all*] e HideDamage=1 se tornam. O pacote curado inclui esse script, não o .sm. O seu registo legacy continua a indicar {}HideDamage.tam e {}HideDamage.sm, e o autor continua a ser Kirk.
Script de entrada ·mutator.luafunction mutate(ctx)
return {
rules = {
all():change { hidedamage = set(1) },
},
}
end
Manifesto · oamut.yamloamut: 1
id: "hide-damage"
name: "Hide Damage"
version: "1"
author:
name: "Kirk"
description: "Opponents cannot see how much health a unit has left.\n\nKirk's Hide Damage sets that flag on every unit.\n\nThis package keeps the flag."
tags: ["gameplay"]
works-with: ["*"]
requires:
engine: ">= 0.8.5"
layers: ["units"]
legacy:
- name: "Hide Damage"
prefix: "{}"
compatibility: ["*"]
files: ["{}HideDamage.tam", "{}HideDamage.sm"]
O comando é oa-tool mutator import INPUT... --out DIR. Acrescente --id, --version, --tag, --works-with, --pack e --force quando precisar deles. Um .sm é copiado para rules/, e o plano indica-o com sm. A importação é o início do pacote. Antes de publicar, transforme as variantes em opções, transforme os ficheiros de regras nas formas Lua ou deixe-os indicados com sm, e mantenha um ficheiro apenas onde um modelo ou um script precise dele.