Start › Modding-Infos › Einen alten Mutator übertragen
Kapitel 05

Einen alten Mutator übertragen

KroggyComm 1.1 von seinen Archiven zum Paket, und eine Regeldatei von TA: Mutation, die mit sm bleibt oder als Lua neu geschrieben wird.

Dieses Kapitel fasst docs/mutators/authoring.md und docs/mutators/oamut-standard.md zusammen.

Die ursprünglichen Archive

KroggyComm 1.1, von Immerman, wurde als }{KroggyComm11.tam und }{KroggyComm11.ccx ausgeliefert. Die .tam ist der TA: Mutation-Eintrag: der Name, der Text, der den Autor nennt, und die Kompatibilitätscodes TACC und UH. Die .ccx hält das Krogoth-Modell, ein Kommandantenskript, zweimal gespeichert (für Arm und für Core), die Einheiten-Dateien der beiden Kommandanten, den Quelltext des Skripts und eine Leiche. Dieses Kapitel fügt diese Archive nicht ein. Es zeigt, was das gepflegte Paket behält und wohin jedes Stück ging.

Mit dem Import beginnen

oa-tool mutator import liest die .tam und findet die .ccx daneben. Schreibe den Ordner an einen anderen Ort als den Ordner, der die .tam hält. Die Warnungen sagen, was zu pflegen ist: das Tag ist der Standard, TACC wird ta-3.1c, und für UH gibt es keinen Mod.

$ 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

Der Import behält die ganze .ccx unter files/kroggycomm-1-1.ccx, und das Skript, das er schreibt, fügt nur diesen Ordner hinzu. Sein Manifest hat die Version 1.0, das Tag gameplay, works-with ta-3.1c, die Schicht files und den legacy-Eintrag. Dieser Ordner läuft, und er ist der Anfang des Pakets, nicht der fertige Mutator.

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

Modell und Skripte werden files/

Das gepflegte Paket behält nur, was das Spiel aus dem Archiv liest: drei Pfade unter files/, jeder dort, wo das Spiel ihn sucht.

files/objects3d/KROGCOM.3dodas Modell, aus objects3d/KROGCOM.3do in der .ccxfiles/scripts/armcom.cobArms Skript, aus scripts/armcom.cobfiles/scripts/corcom.cobCores Skript: dieselben Bytes wie das von Arm, im Archiv als scripts/Corcom.cob gespeichert

Die beiden Einheiten-Dateien werden auch nicht mitgeliefert: ihre Felder werden Regeln, unten. Zwei weitere Dinge im Archiv bleiben weg. scripts/KroggyCom.bos ist der Quelltext des Skripts, und das Spiel liest ihn nie. features/corpses/Corkrog_dead.tdf ist die Leiche aus Core Contingency, unverändert.

FBI-Änderungen werden Regeln

Die Einheitenfelder des Krogoth werden die Regeln in der gepflegten mutator.lua. Beide Kommandanten bekommen das Objekt KROGCOM, die Waffen CORKROG_FIRE, CORKROG_ROCKET und CORKROG_HEAD, die Kosten, den Fußabdruck und die Bewegung. Tarn- und Schlechtziel-Felder werden entfernt, und das gehört zu diesem Entwurf. HealTime, OvrAdjust und DefaultMissionType behalten ihre Werte aus 3.1c: die Einheiten-Dateien von 2001 sind älter als diese Felder, ihr Fehlen ist also nicht der Entwurf des Krogoth. Arms Soundkategorie wird KROGOTH. Core behält CORE_COM, darum übergibt das Skript nil und setzt soundcategory nicht. Der units-Hook lehnt die Partie ab, wenn diese drei Waffen fehlen.

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

Der legacy-Block und die Nennung

legacy nennt das Original. Behalte den Eintrag, den der Import geschrieben hat: den Namen KroggyComm 1.1, das Präfix }{, compatibility TACC und UH, und files }{KroggyComm11.tam und }{KroggyComm11.ccx. Der Autor bleibt Immerman, und die Beschreibung nennt das Original, das das Paket ersetzt, und seinen Autor: das ist die Nennung. Der Rest ist gepflegt: Version 1, die Tags commanders und new-units, works-with als Stern, damit das Paket zu jedem Mod und zum Grundspiel passt, und die Schichten files und units für die Dateien, die Regeln und den Hook. conflicts-with nennt anni-comm, special-tech-comm, commander-blast und tribe-commander, die dieselben Kommandantenfelder schreiben oder dasselbe Skript mitliefern. Das Manifest unten ist die ganze Datei.

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

Prüfen und mit dem Import vergleichen

Von außerhalb des Ordners schreibt pack die Datei kroggy-comm-1.oamut. oa-tool mutator check liest diese Datei. Bei diesem Paket lautet die letzte Zeile result: ok. Der Diff vergleicht den gepflegten Ordner mit dem Import kroggycomm-1-1. Er lief aus dem Build-Ordner von commanders, mit der Allow-Datei der Familie, und DIR steht für den Spielordner. Die Allow-Datei nennt, was bleiben darf.

$ 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

Mit dieser Allow-Datei endet der Vergleich mit Code 0. Nach seinen Kopfzeilen, die mit # beginnen, druckt er die Zeilen unten: 0 differences, 7 allowed, 0 unused allowances. Die sieben Zeilen sind der Import, die rechte Seite: defaultmissiontype, healtime und ovradjust fallen bei beiden Kommandanten weg, und scripts/kroggycom.bos kommt hinzu. Das gepflegte Paket behält diese drei Felder und liefert die .bos nicht mit. Im Spielordner dieses Laufs hat der units-Hook das Paket nicht abgelehnt: die drei Krogoth-Waffen waren da.

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

Eine TA: Mutation-Regeldatei

Die gepflegten Pakete liefern keine .sm-Datei mit. oa-tool mutator import behält die ursprüngliche Regeldatei und nennt sie aus dem Plan mit sm. Hide Damage, von Kirk, ist die kurze. Der Import schreibt rules/hide-damage.sm und eine mutator.lua, deren rules-Eintrag sm "rules/hide-damage.sm" ist. Die .sm unten ist diese Datei, einschließlich ihrer Zeilenenden.

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

Dieselbe Regel als Lua ist all():change { hidedamage = set(1) }. Das wird aus [*all*] und HideDamage=1. Das gepflegte Paket liefert dieses Skript aus, nicht die .sm. Sein legacy-Eintrag nennt weiter {}HideDamage.tam und {}HideDamage.sm, und der Autor bleibt Kirk.

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

Der Befehl ist oa-tool mutator import INPUT... --out DIR. Hänge --id, --version, --tag, --works-with, --pack und --force an, wenn du sie brauchst. Eine .sm wird unter rules/ kopiert, und der Plan nennt sie mit sm. Der Import ist der Anfang des Pakets. Bevor du veröffentlichst, mache aus Varianten Optionen, mache aus Regeldateien die Lua-Formen oder lass sie mit sm genannt, und behalte eine Datei nur, wo ein Modell oder ein Skript eine braucht.