Accueil › Infos modding › Porter un mutateur ancien
Chapitre 05

Porter un mutateur ancien

KroggyComm 1.1, de ses archives à un paquet, et un fichier de règles TA: Mutation gardé avec sm ou réécrit en Lua.

Ce chapitre résume docs/mutators/authoring.md et docs/mutators/oamut-standard.md.

Les archives d'origine

KroggyComm 1.1, par Immerman, était livré comme }{KroggyComm11.tam et }{KroggyComm11.ccx. Le .tam est la fiche TA: Mutation : le nom, le texte qui crédite l'auteur, et les codes de compatibilité TACC et UH. Le .ccx contient le modèle du Krogoth, un script de commandant rangé deux fois (pour Arm et pour Core), les fichiers d'unité des deux commandants, la source du script et un cadavre. Ce chapitre ne colle pas ces archives. Il montre ce que le paquet retravaillé garde, et où chaque pièce est allée.

Partir de l'import

oa-tool mutator import lit le .tam et trouve le .ccx à côté. Écrivez le dossier ailleurs que dans le dossier qui contient le .tam. Les avertissements disent quoi retravailler : l'étiquette est celle par défaut, TACC devient ta-3.1c, et UH n'a pas de mod correspondant.

$ 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 garde le .ccx entier dans files/kroggycomm-1-1.ccx, et le script qu'il écrit n'ajoute que ce dossier. Son manifeste a la version 1.0, l'étiquette gameplay, works-with ta-3.1c, la couche files et la fiche legacy. Ce dossier tourne, et c'est le début du paquet, pas le mutateur fini.

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

Le modèle et les scripts deviennent files/

Le paquet retravaillé ne garde que ce que le jeu lit dans l'archive : trois chemins sous files/, chacun là où le jeu le cherche.

files/objects3d/KROGCOM.3dole modèle, depuis objects3d/KROGCOM.3do dans le .ccxfiles/scripts/armcom.coble script d'Arm, depuis scripts/armcom.cobfiles/scripts/corcom.coble script de Core : les mêmes octets que celui d'Arm, rangés dans l'archive sous scripts/Corcom.cob

Les deux fichiers d'unité ne sont pas livrés non plus : leurs champs deviennent des règles, ci-dessous. Deux autres choses de l'archive sont laissées de côté. scripts/KroggyCom.bos est la source du script, et le jeu ne la lit jamais. features/corpses/Corkrog_dead.tdf est le cadavre de Core Contingency, inchangé.

Les changements FBI deviennent des règles

Les champs d'unité du Krogoth deviennent les règles du mutator.lua retravaillé. Les deux commandants prennent l'objet KROGCOM, les armes CORKROG_FIRE, CORKROG_ROCKET et CORKROG_HEAD, les coûts, l'empreinte et le mouvement. Les champs de camouflage et de mauvaise cible sont retirés, et cela appartient à ce dessin. HealTime, OvrAdjust et DefaultMissionType gardent leurs valeurs de 3.1c : les fichiers d'unité de 2001 précèdent ces champs, donc leur absence n'est pas le dessin du Krogoth. La catégorie de son d'Arm devient KROGOTH. Core garde CORE_COM, donc le script passe nil et ne règle pas soundcategory. Le hook units refuse la partie quand ces trois armes manquent.

Script d'entrée · 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

Le bloc legacy, et le crédit

legacy nomme l'original. Gardez la fiche que l'import a écrite : le nom KroggyComm 1.1, le préfixe }{, compatibility TACC et UH, et files }{KroggyComm11.tam et }{KroggyComm11.ccx. L'auteur reste Immerman, et la description nomme l'original remplacé et son auteur : c'est le crédit. Le reste est retravaillé : la version 1, les étiquettes commanders et new-units, works-with en étoile, donc le paquet convient à tout mod et au jeu de base, et les couches files et units pour les fichiers, les règles et le hook. conflicts-with nomme anni-comm, special-tech-comm, commander-blast et tribe-commander, qui écrivent les mêmes champs de commandant ou livrent le même script. Le manifeste ci-dessous est le fichier entier.

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

Vérifiez, et comparez avec l'import

Depuis l'extérieur du dossier, pack écrit kroggy-comm-1.oamut. oa-tool mutator check lit ce fichier. Sur ce paquet, la dernière ligne est result: ok. Le diff compare le dossier retravaillé à l'import kroggycomm-1-1. Il a été lancé depuis le dossier de build de commanders, avec le fichier allow de la famille, et DIR désigne le dossier du jeu. Le fichier allow dit ce qui peut rester.

$ 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

Avec ce fichier allow, la comparaison se termine sur 0. Après ses lignes d'en-tête, qui commencent par #, elle imprime les lignes ci-dessous : 0 differences, 7 allowed, 0 unused allowances. Les sept lignes sont l'import, le côté droit, qui retire defaultmissiontype, healtime et ovradjust sur les deux commandants et ajoute scripts/kroggycom.bos. Le paquet retravaillé garde ces trois champs et ne livre pas le .bos. Dans le dossier de jeu de cette exécution, le hook units n'a pas refusé le paquet : les trois armes du Krogoth étaient présentes.

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 fichier de règles TA: Mutation

Les paquets retravaillés ne livrent pas de fichier .sm. oa-tool mutator import garde le fichier de règles d'origine et le nomme depuis le plan avec sm. Hide Damage, par Kirk, est le court. L'import écrit rules/hide-damage.sm et un mutator.lua dont l'entrée rules est sm "rules/hide-damage.sm". Le .sm ci-dessous est ce fichier, fins de ligne comprises.

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
Fichier de règles · rules/hide-damage.sm
[*all*]
{
HideDamage=1;
}

La même règle en Lua est all():change { hidedamage = set(1) }. C'est ce que deviennent [*all*] et HideDamage=1. Le paquet retravaillé livre ce script, pas le .sm. Sa fiche legacy nomme encore {}HideDamage.tam et {}HideDamage.sm, et l'auteur reste Kirk.

Script d'entrée · mutator.lua
function mutate(ctx)
  return {
    rules = {
      all():change { hidedamage = set(1) },
    },
  }
end
Manifeste · 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"]

La commande est oa-tool mutator import INPUT... --out DIR. Ajoutez --id, --version, --tag, --works-with, --pack et --force quand vous en avez besoin. Un .sm est copié sous rules/, et le plan le nomme avec sm. L'import est le début du paquet. Avant de publier, transformez les variantes en options, réécrivez les fichiers de règles sous les formes Lua ou laissez-les nommés avec sm, et ne gardez un fichier que là où un modèle ou un script en a besoin.