Створити мозок
.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 і report | 50,000,000 |
| Інструкції, які додає один тік | 2,000,000 |
| Тіки, які може накопичити банк, включно з поточним | 30, тож баланс починається з 60,000,000 |
| Памʼять Lua | 64 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. Переможеного гравця просто більше не викликають. Пісочниця закривається разом із матчем.