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.
fonte
<root>/MissileKite.ts
)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 parabuild/MissileKite.js
.tsconfig-gas.json
relevante para olhar lá?Respostas:
Aqui está minha tentativa de responder às suas necessidades.
Arquivos notáveis:
src/tsconfig-botland.json
mantém configurações para qualquer script bot.land (incluindo suas declarações personalizadas para as quais mudeitypes/bot-land/index.d.ts
). Você pode alterar asstrict
configurações que eu usei.src/tsconfig.json
mantém referências a todos os seus bots. Este é o arquivo para editar sempre que você quiser adicionar outro script botUm script de bot tem pelo menos dois arquivos: um minimalista
tsconfig.json
e um ou mais.ts
arquivos de script.Por exemplo
src/AggroMiner/tsconfig.json
:Na maioria dos casos, para iniciar um novo script de bot, você deve:
src/AggroMiner
) para uma nova pasta emsrc
src/<newBotFolder>/tsconfig.json
para editar ooutFile
com o nome do seu botsrc/tsconfig.json
e adicionar uma referência asrc/<newBotFolder>
O seguinte
npm
/yarn
script foi definido:build
construir todos os botsbuild-clean
que limpa abuild
pasta antes de executar umbuild
format
para executar o Prettier em todos os.ts
arquivos emsrc
lint
executar uma verificação tslint em todos os scripts de botAgora, executando seus requisitos:
Para conseguir isso, seria necessário criar um script que enumere sua pasta / scripts de bots ... e configure o relevante por bot
tsconfig.json
e executetsc
. A menos que seja estritamente necessário, uma configuração mínima (descrita acima) pode ser suficiente.Primeiro, esteja ciente de que, se você começar a usar qualquer módulo
export
/import
instrução, precisará de terceiros adicionais para compactar / treeshake, a fim de obter uma única saída de arquivo. Pelo que pude reunir do Bot.land, seus scripts estão em execução no servidor. A menos que o código morto tenha um impacto no desempenho do seu bot, eu realmente não me incomodaria.Feito.
Feito.
Os
npm
scripts devem aparecer na lista de tarefas do vsc (pelo menos na minha), tornando otasks.json
desnecessário.fonte
types/bot-land
as definições e por que escolheu asstrict
configurações?types
ou se foi apenas uma maneira específica de organizar a sua escolha.Você poderia realmente usar referências de projeto. Siga estas etapas para obter os mesmos resultados dos arquivos originais, com todas as funções no nível superior em um arquivo. No entanto, não consegui encontrar uma solução para importar apenas as funções necessárias em bots. Ou seja, sem usar importações e exportações.
No seu tsconfig.json na raiz
Em seguida, na sua pasta lib, adicione um tsconfig.json assim
Precisamos fazer alguns ajustes em data.ts, motion.ts e utils.ts para que ts não nos incomode com erros de compilação.
data.ts
Movement.ts
utils.ts
Em seguida, adicionamos base.json na raiz (o tsconfig.json dos bots o estenderá).
base.json
e o tsconfig.json dos bots (adaptar de acordo com os bots)
É isso aí. Agora apenas corra
fonte
build/MissileKite.js
que é produzido quando você cria o repositório original.