В настоящее время я пишу несколько сценариев для Bot Land . Bot Land - это стратегия в реальном времени, в которой вместо управления своими юнитами с помощью мыши и клавиатуры вы пишете код для управления своими ботами через API, а затем ваши боты начинают сражаться с ботами других. Если вы знакомы с юнитами в SC2, вы можете создавать ботов, похожих на мигающих сталкеров, осадных танков, медиков и ультралисков. (Это довольно забавная игра для разработчиков программного обеспечения, но это выходит за рамки этого вопроса.)
Элемент управления Bot имеет три уровня возрастающей сложности: AI по умолчанию, Scratch- подобный язык программирования и сокращенный набор JavaScript, называемый BotLandScript. Хотя встроенный редактор для BotLandScript является разумным, вы должны загрузить весь свой код в виде одного файла с глобальными функциями верхнего уровня повсюду. Естественно, через некоторое время это начинает становиться болезненным, если ваш код начинает становиться длинным и разные боты совместно используют одни и те же функции.
Чтобы упростить написание кода для нескольких ботов, уменьшить вероятность непреднамеренных ошибок при кодировании на голом JS и увеличить мои шансы побить других игроков, я настроил вышеупомянутый проект TypeScript, чтобы предоставить общую библиотеку, а также код для каждого из моих ботов. , Текущая структура каталогов выглядит примерно так:
lib/
bot.land.d.ts
common.ts
BlinkStalker/
BlinkStalker.ts
tsconfig.json
Artillery/
Artillery.ts
tsconfig.json
SmartMelee/
SmartMelee.ts
tsconfig.json
lib
это общий код, который используется совместно ботами и предоставляет определения TypeScript для API-интерфейса Bot Land (не TS). Затем каждый бот получает свою собственную папку, в которой один файл содержит код бота, а другой - шаблон tsconfig.json
:
{
"compilerOptions": {
"target": "es3",
"module": "none",
"sourceMap": false,
"outFile": "bot.js"
},
"files": [
"MissileKite.ts"
],
"include": [
"../lib/**/*"
]
}
Когда каждый собран tsconfig.json
, он создает соответствующий, bot.js
который содержит переданный код от самого бота, а также весь код в common.js
. Эта настройка является неоптимальной по нескольким причинам, среди прочего: она требует большого количества дубликатов, затрудняет добавление новых ботов, включает в себя много ненужного кода для каждого бота и требует, чтобы каждый бот создавался отдельно.
Однако, основываясь на моих исследованиях , не кажется, что есть простой способ сделать то, что я хочу. В частности, использование новой tsc -b
опции и ссылок не работает, потому что для этого требуется, чтобы код был модульным, а Bot Land требует одного файла со всеми функциями, определенными на верхнем уровне.
Каков наилучший способ достичь как можно большего числа следующих действий?
- Не требуется новый шаблон для добавления нового бота (например, нет
tsconfig.json
на бот) - Используйте
import
для общих функций, чтобы избежать вывода неиспользуемого кода, но затем ... - По-прежнему выводить все функции в виде одного файла в определенном формате Bot Land
- Один шаг сборки, который создает несколько выходных файлов, по одному для каждого бота
- Бонус: интеграция процесса сборки с VS Code. В настоящее время существует соответствующий шаблон
tasks.json
для строительства каждого подпроекта.
Я смутно предполагаю, что ответ, вероятно, включает в себя что-то вроде Гранта tsc
, но я не знаю достаточно об этом, чтобы быть уверенным.
источник
<root>/MissileKite.ts
)bot.js
?tsconfig.json
. Транспортируемые файлы ботов могут быть названы как угодно, желательно в формате .js исходного файла. У меня это настроено сейчас в репо с выводом наbuild/MissileKite.js
.tsconfig-gas.json
на что посмотреть?Ответы:
Вот моя попытка ответить на ваши требования.
Известные файлы:
src/tsconfig-botland.json
содержит настройки для любого скрипта bot.land (включая ваши пользовательские объявления, на которые я перешелtypes/bot-land/index.d.ts
). Вы можете изменитьstrict
настройки, которые я использовал.src/tsconfig.json
содержит ссылки на всех ваших ботов. Это файл для редактирования всякий раз, когда вы хотите добавить другой скрипт ботаСценарий бота представляет собой как минимум два файла: минималистский
tsconfig.json
и один или несколько.ts
файлов сценария.Например
src/AggroMiner/tsconfig.json
:В большинстве случаев для запуска нового скрипта бота вам необходимо:
src/AggroMiner
) в новую папку вsrc
src/<newBotFolder>/tsconfig.json
чтобы редактироватьoutFile
с именем вашего ботаsrc/tsconfig.json
и добавьте ссылку наsrc/<newBotFolder>
Следующее
npm
/yarn
скрипт был установлен:build
собрать всех ботовbuild-clean
которые очищаютbuild
папку перед запускомbuild
format
запустить Prettier для всех.ts
файлов вsrc
lint
запустить проверку tslint на всех скриптах ботаТеперь выполняем ваши требования:
Для этого потребуется создать какой-нибудь скрипт, который будет перечислять вашу папку / скрипты ботов ... и настраивать соответствующий бот
tsconfig.json
и запускатьtsc
. Если это не является строго необходимым, минимальной установки (описанной выше) может быть достаточно.Во-первых, имейте в виду, что если вы начнете использовать какой-либо модуль
export
/import
операторы, вам понадобится дополнительная сторонняя программа для упаковки / treehake, чтобы добиться вывода одного файла. Из того, что я мог собрать из Bot.land, ваши скрипты работают на сервере. Если бы deadcode не повлиял на производительность вашего бота, я бы не стал беспокоиться.Выполнено.
Выполнено.
В
npm
сценарии должен появиться в списке задач VSC (по крайней мере они делают в шахте) , таким образом , делаяtasks.json
ненужным.источник
types/bot-land
определения и почему выбралиstrict
настройки?types
или это был просто особый способ организации, который вы выбрали.Вы могли бы на самом деле использовать ссылки на проекты. Выполните следующие действия, чтобы получить те же результаты, которые вы получали для исходных файлов, со всеми функциями верхнего уровня в одном файле. Однако я не смог найти решение для импорта только необходимых функций в ботах. То есть без использования импорта и экспорта.
В вашем tsconfig.json в корне
Затем, в вашей папке lib, добавьте tsconfig.json как
Нам нужно внести некоторые изменения в data.ts, motion.ts и utils.ts, чтобы ts не беспокоил нас ошибками компиляции.
data.ts
movement.ts
utils.ts
Затем мы добавляем base.json в корень (tsconfig.json ботов расширит его).
base.json
и боты 'tsconfig.json (адаптируются в соответствии с ботами)
Вот и все. Теперь просто беги
источник
build/MissileKite.js
что выводится при построении исходного репо.