Перенести старий мутатор
KroggyComm 1.1 з архівів у пакет, а файл правил TA: Mutation — або залишений через sm, або переписаний на Lua.
Цей розділ стисло викладає docs/mutators/authoring.md і docs/mutators/oamut-standard.md.
Оригінальні архіви
KroggyComm 1.1 від Immerman поширювався як }{KroggyComm11.tam і }{KroggyComm11.ccx. Файл .tam — це запис TA: Mutation: назва, текст, що вказує автора, і коди сумісності TACC та UH. .ccx містить модель Krogoth, один скрипт командира, збережений двічі (для ARM і для CORE), файли юнітів обох командирів, вихідний код скрипту й уламки. Цей розділ не вставляє вміст цих архівів. Він показує, що зберігає впорядкований пакет і куди поділася кожна частина.
Почни з імпорту
oa-tool mutator import читає .tam і знаходить .ccx поруч із ним. Записуй теку деінде, не в ту теку, де лежить .tam. Попередження кажуть, що треба впорядкувати: тег — типовий, TACC стає ta-3.1c, а для UH немає моду, на який його можна відобразити.
$ 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
Імпорт зберігає весь .ccx у files/kroggycomm-1-1.ccx, а скрипт, який він записує, лише додає цю теку. Його маніфест має версію 1.0, тег gameplay, works-with ta-3.1c, шар files і запис legacy. З цією текою вже можна грати, але це початок пакета, а не готовий мутатор.
Імпорт ·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
Модель і скрипти стають files/
Упорядкований пакет зберігає лише те, що гра читає з архіву: три шляхи в files/, кожен там, де гра його шукає.
files/objects3d/KROGCOM.3doмодель, з objects3d/KROGCOM.3do у .ccxfiles/scripts/armcom.cobскрипт ARM, зі scripts/armcom.cobfiles/scripts/corcom.cobскрипт CORE: ті самі байти, що й в ARM, збережені в архіві як scripts/Corcom.cobДва файли юнітів теж не постачаються: їхні поля стають правилами, див. нижче. Ще дві речі з архіву не включено. scripts/KroggyCom.bos — вихідний код скрипту, і гра його ніколи не читає. features/corpses/Corkrog_dead.tdf — уламки з Core Contingency, без змін.
Зміни FBI стають правилами
Поля юніта Krogoth стають правилами в упорядкованому mutator.lua. Обидва командири отримують модель (object) KROGCOM, зброю CORKROG_FIRE, CORKROG_ROCKET і CORKROG_HEAD, вартість, площу основи й рух. Поля маскування й bad-target видаляються — це частина того задуму. HealTime, OvrAdjust і DefaultMissionType зберігають значення з 3.1c: файли юнітів 2001 року старші за ці поля, тож їхня відсутність не є задумом Krogoth. Звукова категорія ARM стає KROGOTH. CORE зберігає CORE_COM, тож скрипт передає nil і не задає soundcategory. Хук units відхиляє матч, коли цих трьох видів зброї бракує.
Вхідний скрипт ·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
Блок legacy і авторство
legacy називає оригінал. Залиш запис, який створив імпорт: назву KroggyComm 1.1, префікс }{, сумісність TACC і UH та файли }{KroggyComm11.tam і }{KroggyComm11.ccx. Автором лишається Immerman, а опис називає оригінал, який замінює пакет, і його автора: так і вказується авторство. Решту впорядковано: версія 1, теги commanders і new-units, works-with із зірочкою, тож пакет підходить для будь-якого моду й базової гри, і шари files та units — для файлів, правил і хука. conflicts-with називає anni-comm, special-tech-comm, commander-blast і tribe-commander, які записують ті самі поля командира або постачають той самий скрипт. Маніфест нижче — це весь файл.
Маніфест ·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"]
Перевір і порівняй з імпортом
Ззовні теки pack записує kroggy-comm-1.oamut. oa-tool mutator check читає цей файл. Для цього пакета останній рядок — result: ok. diff порівнює впорядковану теку з імпортом kroggycomm-1-1. Його запускали з теки збірки commanders із файлом allow цієї родини, а DIR позначає теку гри. Файл allow визначає, що може лишитися.
$ 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
З цим файлом allow порівняння завершується з кодом 0. Після рядків заголовка, що починаються з #, воно друкує рядки нижче: 0 differences, 7 allowed, 0 unused allowances. Сім рядків — це імпорт, права сторона: вилучення defaultmissiontype, healtime і ovradjust в обох командирів і додавання scripts/kroggycom.bos. Упорядкований пакет зберігає ці три поля й не постачає .bos. На теці гри з того запуску хук units не відхилив пакет: три види зброї Krogoth були на місці.
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
Файл правил TA: Mutation
Упорядковані пакети не постачають файлів .sm. oa-tool mutator import зберігає оригінальний файл правил і називає його з плану через sm. Hide Damage від Kirk — короткий приклад. Імпорт записує rules/hide-damage.sm і mutator.lua, у якому елемент rules — sm "rules/hide-damage.sm". Файл .sm нижче — саме цей файл, разом із його закінченнями рядків.
Імпорт ·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
Файл правил · rules/hide-damage.sm[*all*]
{
HideDamage=1;
}Те саме правило на Lua — all():change { hidedamage = set(1) }. Саме цим стають [*all*] і HideDamage=1. Упорядкований пакет постачає цей скрипт, а не .sm. Його запис legacy і далі називає {}HideDamage.tam і {}HideDamage.sm, а автором лишається Kirk.
Вхідний скрипт ·mutator.luafunction mutate(ctx)
return {
rules = {
all():change { hidedamage = set(1) },
},
}
end
Маніфест · 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"]
Команда — oa-tool mutator import INPUT... --out DIR. За потреби додай --id, --version, --tag, --works-with, --pack і --force. .sm копіюється в rules/, а план називає його через sm. Імпорт — це початок пакета. Перед публікацією перетвори варіанти на параметри, файли правил — на форми Lua або залиш їх названими через sm, і лишай файл лише там, де він потрібен моделі чи скрипту.