Inicio › Info de modding › Portar un mutador antiguo
Capítulo 05

Portar un mutador antiguo

KroggyComm 1.1, de sus archivos a un paquete, y un archivo de reglas de TA: Mutation que se conserva con sm o se reescribe en Lua.

Este capítulo resume docs/mutators/authoring.md y docs/mutators/oamut-standard.md.

Los archivos originales

KroggyComm 1.1, de Immerman, se publicó como }{KroggyComm11.tam y }{KroggyComm11.ccx. El .tam es el registro de TA: Mutation: el nombre, el texto que acredita al autor y los códigos de compatibilidad TACC y UH. El .ccx contiene el modelo del Krogoth, un script de comandante guardado dos veces (para Arm y para Core), los archivos de unidad de los dos comandantes, el fuente del script y un cadáver. Este capítulo no pega esos archivos. Muestra lo que conserva el paquete curado y adónde fue cada pieza.

Empezar por la importación

oa-tool mutator import lee el .tam y encuentra el .ccx a su lado. Escribe la carpeta en otro sitio que no sea la carpeta que tiene el .tam. Los avisos dicen qué curar: la etiqueta es la de por defecto, TACC pasa a ta-3.1c y UH no tiene un mod al 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

La importación conserva el .ccx entero en files/kroggycomm-1-1.ccx, y el script que escribe solo añade esa carpeta. Su manifiesto tiene la versión 1.0, la etiqueta gameplay, works-with ta-3.1c, la capa files y el registro legacy. Esa carpeta funciona, y es el comienzo del paquete, no el mutador terminado.

Importación · 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

El modelo y los scripts pasan a files/

El paquete curado conserva solo lo que el juego lee del archivo: tres rutas bajo files/, cada una donde el juego la busca.

files/objects3d/KROGCOM.3doel modelo, de objects3d/KROGCOM.3do en el .ccxfiles/scripts/armcom.cobel script de Arm, de scripts/armcom.cobfiles/scripts/corcom.cobel script de Core: los mismos bytes que el de Arm, guardados en el archivo como scripts/Corcom.cob

Los dos archivos de unidad tampoco se publican: sus campos pasan a ser reglas, abajo. Otras dos cosas del archivo se dejan fuera. scripts/KroggyCom.bos es el fuente del script, y el juego nunca lo lee. features/corpses/Corkrog_dead.tdf es el cadáver de Core Contingency, sin cambios.

Los cambios del FBI pasan a reglas

Los campos de unidad del Krogoth pasan a ser las reglas del mutator.lua curado. Los dos comandantes toman el objeto KROGCOM, las armas CORKROG_FIRE, CORKROG_ROCKET y CORKROG_HEAD, los costes, la huella y el movimiento. Los campos de camuflaje y de mal objetivo se quitan, y eso pertenece a ese diseño. HealTime, OvrAdjust y DefaultMissionType conservan sus valores de 3.1c: los archivos de unidad de 2001 son anteriores a esos campos, así que su ausencia no es el diseño del Krogoth. La categoría de sonido de Arm pasa a KROGOTH. Core conserva CORE_COM, así que el script pasa nil y no pone soundcategory. El hook units rechaza la partida cuando faltan esas tres 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

El bloque legacy y el crédito

legacy nombra el original. Conserva el registro que escribió la importación: el nombre KroggyComm 1.1, el prefijo }{, compatibility TACC y UH, y files }{KroggyComm11.tam y }{KroggyComm11.ccx. El autor sigue siendo Immerman, y la descripción nombra el original que sustituye y a su autor: ese es el crédito. El resto se cura: la versión 1, las etiquetas commanders y new-units, works-with con un asterisco, así que el paquete encaja con cualquier mod y con el juego base, y las capas files y units para los archivos, las reglas y el hook. conflicts-with nombra anni-comm, special-tech-comm, commander-blast y tribe-commander, que escriben los mismos campos del comandante o publican el mismo script. El manifiesto de abajo es el archivo entero.

Manifiesto · oamut.yaml
oamut: 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"]

Comprueba y compara con la importación

Desde fuera de la carpeta, pack escribe kroggy-comm-1.oamut. oa-tool mutator check lee ese archivo. En este paquete la última línea es result: ok. El diff compara la carpeta curada con la importación kroggycomm-1-1. Se ejecutó desde la carpeta de build de commanders, con el archivo allow de la familia, y DIR es la carpeta del juego. El archivo allow dice lo que puede quedar.

$ 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

Con ese archivo allow la comparación sale con 0. Tras sus líneas de cabecera, que empiezan por #, imprime las líneas de abajo: 0 differences, 7 allowed, 0 unused allowances. Las siete líneas son la importación, el lado derecho, que quita defaultmissiontype, healtime y ovradjust en los dos comandantes y añade scripts/kroggycom.bos. El paquete curado conserva esos tres campos y no publica el .bos. En la carpeta de juego de esa ejecución el hook units no rechazó el paquete: las tres armas del Krogoth estaban.

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

Un archivo de reglas de TA: Mutation

Los paquetes curados no publican un archivo .sm. oa-tool mutator import conserva el archivo de reglas original y lo nombra desde el plan con sm. Hide Damage, de Kirk, es el corto. La importación escribe rules/hide-damage.sm y un mutator.lua cuya entrada rules es sm "rules/hide-damage.sm". El .sm de abajo es ese archivo, incluidos sus finales de línea.

Importación · 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
Archivo de reglas · rules/hide-damage.sm
[*all*]
{
HideDamage=1;
}

La misma regla en Lua es all():change { hidedamage = set(1) }. En eso se convierten [*all*] y HideDamage=1. El paquete curado publica ese script, no el .sm. Su registro legacy sigue nombrando {}HideDamage.tam y {}HideDamage.sm, y el autor sigue siendo Kirk.

Script de entrada · mutator.lua
function mutate(ctx)
  return {
    rules = {
      all():change { hidedamage = set(1) },
    },
  }
end
Manifiesto · oamut.yaml
oamut: 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"]

El comando es oa-tool mutator import INPUT... --out DIR. Añade --id, --version, --tag, --works-with, --pack y --force cuando los necesites. Un .sm se copia bajo rules/, y el plan lo nombra con sm. La importación es el comienzo del paquete. Antes de publicar, convierte las variantes en opciones, convierte los archivos de reglas a las formas Lua o déjalos nombrados con sm, y conserva un archivo solo donde un modelo o un script lo necesite.