Atualmente, estou escrevendo alguns scripts para o Bot Land . Bot Land é um jogo de estratégia em tempo real onde, em vez de controlar suas unidades com um mouse e teclado, você escreve código para controlar seus bots por meio de uma API e depois seus bots lutam contra os bots de outros. Se você conhece as unidades do SC2, pode criar bots semelhantes a perseguidores, tanques de cerco, médicos e ultraliscos. (É um jogo bastante divertido para engenheiros de software, mas está fora do escopo desta pergunta.)
O controle de bot tem três níveis de complexidade crescente: uma IA padrão, uma linguagem de programação semelhante a Scratch e um conjunto reduzido de JavaScript chamado BotLandScript. Embora o editor interno do BotLandScript seja razoável, você precisa fazer o upload de todo o seu código como um único arquivo com funções globais de nível superior em qualquer lugar. Naturalmente, isso começa a ficar doloroso depois de um tempo, se o seu código começar a ficar longo e diferentes robôs compartilham as mesmas funções.
Para facilitar a escrita do código para vários bots, reduzir a chance de erros não intencionais ao codificar em JS básico e aumentar minhas chances de derrotar outros jogadores, configurei o projeto TypeScript acima para fornecer uma biblioteca comum e código para cada um dos meus bots . A estrutura de diretórios atual se parece aproximadamente com o seguinte:
lib/
bot.land.d.ts
common.ts
BlinkStalker/
BlinkStalker.ts
tsconfig.json
Artillery/
Artillery.ts
tsconfig.json
SmartMelee/
SmartMelee.ts
tsconfig.json
lib
é o código comum que é compartilhado entre os bots e fornece definições TypeScript para a API Bot Land (não TS). Cada bot recebe sua própria pasta, com um arquivo contendo o código do bot e o outro um clichê tsconfig.json
:
{
"compilerOptions": {
"target": "es3",
"module": "none",
"sourceMap": false,
"outFile": "bot.js"
},
"files": [
"MissileKite.ts"
],
"include": [
"../lib/**/*"
]
}
Quando cada um tsconfig.json
é criado, ele cria um correspondente bot.js
que contém o código transpilado do próprio bot, bem como todo o código common.js
. Essa configuração é subótima por alguns motivos, entre outros: requer muita clichê duplicada, dificulta a adição de novos bots, inclui muitos códigos desnecessários para cada bot e exige que cada bot seja construído separadamente.
No entanto, com base em minha pesquisa até agora , não parece haver uma maneira fácil de fazer o que eu quero. Em particular, o uso da nova tsc -b
opção e referências não funciona, porque isso exige que o código seja modularizado e o Bot Land exige um único arquivo com todas as funções definidas no nível superior.
Qual é a melhor maneira de obter o maior número possível de opções a seguir?
- Não é necessário nenhum novo padrão para adicionar um novo bot (por exemplo, não
tsconfig.json
por bot) - Use
import
para funções comuns para evitar a saída de código não utilizado, mas depois ... - Ainda gera todas as funções como um único arquivo no formato específico do Bot Land
- Uma única etapa de construção que produz vários arquivos de saída, um para cada bot
- Bônus: integrando o processo de compilação com o VS Code. Atualmente, existe um modelo correspondente
tasks.json
para a construção de cada subprojeto.
Eu suponho vagamente que a resposta provavelmente envolva algo como Grunt, além de tsc
, mas eu não sei o suficiente sobre isso para ter certeza.
bot.js
?
tsconfig.json
. Os arquivos bot transpilados podem ter qualquer nome, de preferência a versão .js do arquivo original. Eu tenho que configurar desta maneira agora no repo saída para build/MissileKite.js
.
tsconfig-gas.json
relevante para olhar lá?
<root>/MissileKite.ts
)