Головна › Моддинг › Створити мозок
Розділ 07

Створити мозок

.oabrain, що грає за одне місце компʼютера: тека, кожен ключ маніфесту, теги, рівні, повна видимість, де виконується скрипт, бюджети і що стається, коли він зупиняється.

Цей розділ стисло викладає docs/brains/oabrain-standard.md, docs/brains/authoring.md і docs/playing-with-brains.md. Нормативний текст — саме ці документи.

Що таке мозок

Власний компʼютерний гравець рушія лишається типовим і лишається в рушії. Мозок грає за одне місце компʼютера, і лише за те, куди гравець його призначив. Порожній id мозку — це вбудований гравець. За місце без мозку, за мозок, який не підходить, і за мозок, що зупинився, грає той самий гравець. Classic написаний на Lua й грає так само, як цей гравець. Це документація цього гравця, а не заміна.

Скрипт виконує лише машина, яка садить компʼютерного гравця на місце, тож іншим гравцям нічого встановлювати не треба. Їхні машини віддзеркалюють юніти цього місця. Під час відтворення запису скрипт не виконується. Мозок — це вихідний код Lua і дані. У нього немає нативного коду, файлів, мережі й годинника. Повна видимість — прапорець у маніфесті. Мозок може його встановити, може грати з ним у мережевій грі, а місце показує цей прапорець.

Пакет

Мозок — це один файл .oabrain або тека, на яку цей файл розпаковується. Маніфест — той самий строгий YAML, що й у профілі моду: один документ, одне відображення верхнього рівня, без якорів і блокових скалярів. У корені пакета лежить oabrain.yaml. Поруч із ним може лежати лише файл із цього переліку. Файл поза переліком відхиляється.

my-brain.oabrainфайл, який отримує гравець├─ oabrain.yamlобовʼязково маніфест, щонайбільше 256 KiB├─ brain.luaвхідний скрипт. Типова назва — brain.lua. entry називає інший, і цей файл має бути в пакеті├─ lua/додатковий вихідний код Lua. require читає лише ці файли. Кожна частина — літери в нижньому регістрі, цифри й _├─ nets/мережа, яку називає маніфест: nets/ і основа імені із закінченням .oann├─ data/одна таблиця даних, на одну теку вглиб: .csv, .tdf, .json чи .txt├─ icon.pngзображення, лише коли його називає icon. Без цього ключа файл поза переліком├─ README.mdнотатка в корені. Гра її не завантажує└─ LICENSEліцензія в корені. Назва licence і readme в підтеці — поза переліком

Під час порівняння регістр літер ASCII не враховується, крім випадків, де стандарт вимагає збігу байтів. brain.lua — поза переліком, коли entry називає інший файл. Один файл Lua — щонайбільше 1 MiB. Іконка — квадратний PNG, кожна сторона щонайбільше 256 пікселів, щонайбільше 256 KiB. OA встановлює мозок у Brains/ під id з маніфесту.

Маніфест

Читач збирає всі порушені правила й лишає маніфест без змін, якщо порушено бодай одне. Ключ, якого немає в стандарті, відхиляється. Ключ профілю належить моду. Ключ мутатора відхиляється як ключ мутатора. Бери версію в лапки, бо 1.0 без лапок — це число, і зірочку теж, бо зірочка без лапок — це псевдонім YAML.

КлючОбовʼязковийЩо робить
oabrainтакФормат. Ціле число 1. 1.0 і 1 у лапках відхиляються.
idтакkebab-case у нижньому регістрі, від 1 до 64 байтів. Без дефіса на початку чи в кінці і без подвоєного дефіса. Назва теки в Brains/.
nameтакВід 1 до 64 байтів, без керівних символів. Назва, яку бачать гравці.
versionтакУ лапках, від однієї до трьох частин, як версія мутатора, наприклад "2.0". Просте число відхиляється. 2, 2.0 і 2.0.0 вважаються рівними.
authorтакВідображення. name обовʼязковий, від 1 до 128 байтів. email необовʼязковий.
descriptionтакОбовʼязково, від 1 до 2000 байтів. Символ нового рядка дозволено. Будь-який інший керівний символ відхиляється. Перший рядок, обрізаний до 200 байтів, — це короткий опис.
homepageніАдреса http або https.
iconніЛише icon.png — зображення в корені пакета. Усе інше відхиляється.
tagsтакВід 1 до 4 із девʼяти тегів нижче, без повторів.
works-withтакВід 1 до 32 умов, жоден id двічі. Зірочка означає будь-який мод і базову гру, і тоді це єдиний елемент. ta-3.1c означає базову гру без моду. Будь-який інший id — це мод, з необовʼязковим діапазоном версій.
requiresніЛише engine і expansions. engine — діапазон, у лапках, коли він починається зі знака «більше». expansions — від 1 до 16 id комплектів. Мозок не може вимагати мутатор.
levelsтакВід 1 до 6 рівнів. Кожне відображення містить рівно id, name і difficulty.
fullAwarenessніtrue або false. Відсутність означає false. true в лапках відхиляється.
networksніВід 1 до 16, кожна рівно з id, file і sha256. file — це nets/ і основа імені із закінченням .oann. sha256 — 64 шістнадцяткові цифри в нижньому регістрі в лапках.
optionsніЩонайбільше 16, за правилами параметрів мутатора. Перемикач — true або false, число — це число, а вибір — його текст. Їх читає me.options.
stringsніЩонайбільше 16 мов. Мова може містити name, description, options, labels і levels.
entryніФайл Lua в корені пакета, названий літерами в нижньому регістрі, цифрами й _. Відсутність означає brain.lua.

Девʼять тегів

Тег — один із цих девʼяти, порівняння побайтове. Понад чотири теги, коли спільне правило для тегів уже пройдено, — це окрема проблема. Тег, що не входить до цих девʼяти, відхиляється.

Ключ
classic
economy
rush
turtle
air
naval
learned
teaching
experimental

Рівні та складність

levels — це список від 1 до 6 відображень. Кожне містить рівно id, name і difficulty, усі обовʼязкові. id — kebab-case у нижньому регістрі від 1 до 32 байтів, і жоден id не повторюється. name — від 1 до 64 байтів без керівних символів. difficulty — easy, medium або hard, байт у байт.

Ці три назви — значення 0, 1 і 2. Місце, що обирає рівень, використовує це значення для правил доходу — ту саму складність, яку гра вже використовує.

Повна видимість

fullAwareness — true або false. Відсутність означає false. Мозок із цим прапорцем бачить юніти, яких місце в тумані війни не бачило б, так само, як вбудований компʼютерний гравець, а його перевірки ділянок для будівництва не потребують гравця, який розміщує будівлю. Прапорець дозволено в мережевій грі. Бібліотека показує Бачить усі підрозділи на мапі, як і компʼютер самої Total Annihilation. Прапорець належить самому маніфесту. Його не надає id пакета, і він не входить до того, що дають лише Classic.

Де виконується мозок

Пакет потрібен лише машині, яка садить компʼютерного гравця на місце, і лише ця машина виконує скрипт. Місце — це компʼютерний гравець цієї машини. Місце людини відхиляється. game.mode — skirmish, campaign або network.

СитуаціяЩо виконується
СутичкаКожне місце компʼютера, за яке грає ця машина, коли гравець призначив на нього мозок. Порожній id — вбудований компʼютерний гравець.
Місія кампаніїМісце в кампанії використовує типовий мозок, заданий гравцем. Місія не ігнорує цей типовий вибір.
Мережева граМозок, разом із повною видимістю, виконує машина, якій належить місце компʼютера. Інші машини — ні.
Збереження, завантажене пізнішеЗбереження називає кожне місце. Стандарт визначає, що стається, коли пакета бракує або версія інша.
Відтворення записуЗапис зберігає текст brains. Відтворення застосовує записані мережеві пакети. Воно не садить мозок на місце й не викликає його хуків.
Deathmatch або турнірПід час запуску компʼютерних гравців на місця не садять.

Мозок, що грає за місце, не є вхідними даними хешу симуляції. Два матчі, що відрізняються лише тим, який мозок посаджено, мають той самий хеш стану матчу. Значення хаків ai.* моду входять до профілю моду, який покриває цей хеш, тож вони все одно потрапляють на кожну машину.

Бюджети середовища виконання

Мозок виконується як Lua в одній пісочниці. Два мозки не мають спільних модулів, глобальних змінних і бюджетів. У скрипту немає файлів, годинника, оточення, процесів і мережі. Кожен фрагмент завантажується як текст. pcall і xpcall не можуть продовжити фазу, що вичерпала бюджет. Хід — це один виклик із накопиченого бюджету, у точці контролера місця, після обходу юнітів. Накази, які віддає хук, набувають чинності в наступному тіку.

БюджетЗначення
Інструкції в load, fits, start, save і report50,000,000
Інструкції, які додає один тік2,000,000
Тіки, які може накопичити банк, включно з поточним30, тож баланс починається з 60,000,000
Памʼять Lua64 MiB (67,108,864 байтів). Між фазами не скидається.
Памʼять мережі64 MiB, окремо від обмеження Lua
Реальний час фази, що не є ходом, у мілісекундах10,000
Реальний час одного ходу, у мілісекундах250
Один рядок, у байтах65,536

Коли мозок дає збій

Мозок зупиняється через помилку в хуку чи таймері, вичерпаний ліміт інструкцій, запобіжник реального часу, обмеження памʼяті Lua, рядок, довший за 65 536 байтів, або завантаження, яке відхиляє місце. Невдалий хід закриває пісочницю й очищає хуки, перш ніж цей хід завершиться. Невдалий хід однаково вважається зіграним. Наступний тік наказів не має хуків, тож його бере вбудований компʼютерний гравець. Мозок, який відхилено, який не запустився або не підходить, ніколи не має хуків, тож цей гравець грає з самого початку. Повідомлення використовує назву з маніфесту й причину, обрізану до 160 байтів:

- `{brain} stopped ({reason}); the engine plays this seat on`
- `{brain} could not start ({reason}); the engine plays this seat`
- `{brain} does not fit this game ({reason}); the engine plays this seat`

Коли місце не має власної причини, причина — the brain could not be seated. Переможеного гравця просто більше не викликають. Пісочниця закривається разом із матчем.