Home › Info modding › Portare un mutatore storico
Capitolo 05

Portare un mutatore storico

KroggyComm 1.1, dai suoi archivi a un pacchetto, e un file di regole di TA: Mutation tenuto con sm o riscritto in Lua.

Questo capitolo riassume docs/mutators/authoring.md e docs/mutators/oamut-standard.md.

Gli archivi originali

KroggyComm 1.1, di Immerman, usciva come }{KroggyComm11.tam e }{KroggyComm11.ccx. Il .tam è la scheda TA: Mutation: il nome, il testo che accredita l'autore e i codici di compatibilità TACC e UH. Il .ccx contiene il modello del Krogoth, uno script del comandante salvato due volte (per Arm e per Core), i file unità dei due comandanti, il sorgente dello script e un cadavere. Questo capitolo non incolla quegli archivi. Mostra che cosa tiene il pacchetto curato, e dove è finito ogni pezzo.

Partire dall'import

oa-tool mutator import legge il .tam e trova il .ccx accanto. Scrivi la cartella in un posto diverso dalla cartella che contiene il .tam. Gli avvisi dicono che cosa curare: il tag è quello predefinito, TACC diventa ta-3.1c e UH non ha una mod corrispondente.

$ 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

L'import tiene l'intero .ccx in files/kroggycomm-1-1.ccx, e lo script che scrive aggiunge solo quella cartella. Il suo manifesto ha la versione 1.0, il tag gameplay, works-with ta-3.1c, lo strato files e la scheda legacy. Quella cartella funziona, ed è l'inizio del pacchetto, non il mutatore finito.

Importazione · 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

Modello e script diventano files/

Il pacchetto curato tiene solo ciò che il gioco legge dall'archivio: tre percorsi sotto files/, ciascuno dove il gioco lo cerca.

files/objects3d/KROGCOM.3doil modello, da objects3d/KROGCOM.3do nel .ccxfiles/scripts/armcom.coblo script di Arm, da scripts/armcom.cobfiles/scripts/corcom.coblo script di Core: gli stessi byte di quello di Arm, salvati nell'archivio come scripts/Corcom.cob

Nemmeno i due file unità vengono distribuiti: i loro campi diventano regole, sotto. Altre due cose dell'archivio restano fuori. scripts/KroggyCom.bos è il sorgente dello script, e il gioco non lo legge mai. features/corpses/Corkrog_dead.tdf è il cadavere di Core Contingency, invariato.

Le modifiche FBI diventano regole

I campi unità del Krogoth diventano le regole nel mutator.lua curato. Entrambi i comandanti prendono l'oggetto KROGCOM, le armi CORKROG_FIRE, CORKROG_ROCKET e CORKROG_HEAD, i costi, l'impronta e il movimento. I campi di occultamento e di bersaglio sgradito vengono rimossi, e questo appartiene a quel disegno. HealTime, OvrAdjust e DefaultMissionType tengono i valori di 3.1c: i file unità del 2001 sono più vecchi di quei campi, quindi la loro assenza non è il disegno del Krogoth. La categoria suono di Arm diventa KROGOTH. Core tiene CORE_COM, quindi lo script passa nil e non imposta soundcategory. L'hook units rifiuta la partita quando mancano quelle tre armi.

Script di ingresso · 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

Il blocco legacy e il credito

legacy nomina l'originale. Tieni la scheda che l'import ha scritto: il nome KroggyComm 1.1, il prefisso }{, compatibility TACC e UH, e files }{KroggyComm11.tam e }{KroggyComm11.ccx. L'autore resta Immerman, e la descrizione nomina l'originale che sostituisce e il suo autore: questo è il credito. Il resto è curato: la versione 1, i tag commanders e new-units, works-with con un asterisco, quindi il pacchetto sta con qualsiasi mod e con il gioco base, e gli strati files e units per i file, le regole e l'hook. conflicts-with nomina anni-comm, special-tech-comm, commander-blast e tribe-commander, che scrivono gli stessi campi del comandante o pubblicano lo stesso script. Il manifesto sotto è il file intero.

Manifesto · 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"]

Controlla e confronta con l'import

Da fuori della cartella, pack scrive kroggy-comm-1.oamut. oa-tool mutator check legge quel file. Su questo pacchetto l'ultima riga è result: ok. Il diff confronta la cartella curata con l'import kroggycomm-1-1. È stato eseguito dalla cartella di build di commanders, con il file allow della famiglia, e DIR sta per la cartella di gioco. Il file allow dice che cosa può restare.

$ 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 quel file allow il confronto esce con 0. Dopo le sue righe di intestazione, che iniziano con #, stampa le righe sotto: 0 differences, 7 allowed, 0 unused allowances. Le sette righe sono l'import, il lato destro, che toglie defaultmissiontype, healtime e ovradjust su entrambi i comandanti e aggiunge scripts/kroggycom.bos. Il pacchetto curato tiene quei tre campi e non pubblica il .bos. Nella cartella di gioco di quell'esecuzione l'hook units non ha rifiutato il pacchetto: le tre armi del Krogoth c'erano.

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 file di regole TA: Mutation

I pacchetti curati non pubblicano un file .sm. oa-tool mutator import tiene il file di regole originale e lo nomina dal piano con sm. Hide Damage, di Kirk, è quello corto. L'import scrive rules/hide-damage.sm e un mutator.lua la cui voce rules è sm "rules/hide-damage.sm". Lo .sm sotto è quel file, fini riga compresi.

Importazione · 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
File di regole · rules/hide-damage.sm
[*all*]
{
HideDamage=1;
}

La stessa regola in Lua è all():change { hidedamage = set(1) }. È ciò che diventano [*all*] e HideDamage=1. Il pacchetto curato pubblica quello script, non lo .sm. La sua scheda legacy nomina ancora {}HideDamage.tam e {}HideDamage.sm, e l'autore resta Kirk.

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

Il comando è oa-tool mutator import INPUT... --out DIR. Aggiungi --id, --version, --tag, --works-with, --pack e --force quando ti servono. Un .sm viene copiato sotto rules/, e il piano lo nomina con sm. L'import è l'inizio del pacchetto. Prima di pubblicare, trasforma le varianti in opzioni, trasforma i file di regole nelle forme Lua o lasciali nominati con sm, e tieni un file solo dove un modello o uno script ne ha bisogno.