Я сейчас пишу некоторые сценарии для Bot Land . Bot Land - это стратегия в реальном времени, в которой вместо управления своими юнитами с помощью мыши и клавиатуры вы пишете код для управления своими ботами через API, а затем ваши боты начинают сражаться с ботами других. Если вы знакомы с юнитами в SC2, вы можете создавать ботов, похожих на мигающих сталкеров, осадных танков, медиков и ультралисков. (Это довольно забавная игра для разработчиков программного обеспечения, но это выходит за рамки этого вопроса.)
Управление ботом имеет три уровня возрастающей сложности: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
для создания каждого подпроекта.
Я смутно догадываюсь, что ответ, вероятно, включает что-то вроде Grunt в дополнение к tsc
, но яне знаю достаточно об этом, чтобы быть уверенным.