Actualmente estoy escribiendo algunos guiones para Bot Land . Bot Land es un juego de estrategia en tiempo real en el que, en lugar de controlar tus unidades con un mouse y un teclado, escribes un código para controlar tus bots a través de una API, y luego tus bots van a luchar contra los bots de otros. Si está familiarizado con las unidades en SC2, puede crear bots que sean similares a los acechadores de parpadeo, tanques de asedio, médicos y ultraliscos. (Es un juego bastante divertido para los ingenieros de software, pero eso está fuera del alcance de esta pregunta).
El control de bot tiene tres niveles de complejidad creciente: una IA predeterminada, un lenguaje de programación similar a Scratch y un conjunto reducido de JavaScript llamado BotLandScript. Aunque el editor incorporado para BotLandScript es razonable, debe cargar todo su código como un solo archivo con funciones globales de nivel superior en todas partes. Naturalmente, esto comienza a ser doloroso después de un tiempo si su código comienza a alargarse y los diferentes robots comparten las mismas funciones.
Para facilitar la escritura de código para múltiples bots, reducir la posibilidad de errores involuntarios al codificar en JS desnudo y aumentar mis posibilidades de vencer a otros jugadores, configuré el proyecto TypeScript anterior para proporcionar una biblioteca común y un código para cada uno de mis bots . La estructura del directorio actual se parece aproximadamente a la siguiente:
lib/
bot.land.d.ts
common.ts
BlinkStalker/
BlinkStalker.ts
tsconfig.json
Artillery/
Artillery.ts
tsconfig.json
SmartMelee/
SmartMelee.ts
tsconfig.json
lib
es el código común que se comparte entre los bots y proporciona definiciones de TypeScript para la API de Bot Land (no TS). Cada bot obtiene su propia carpeta, con un archivo que contiene el código del bot y el otro una placa repetitiva tsconfig.json
:
{
"compilerOptions": {
"target": "es3",
"module": "none",
"sourceMap": false,
"outFile": "bot.js"
},
"files": [
"MissileKite.ts"
],
"include": [
"../lib/**/*"
]
}
Cuando tsconfig.json
se construye cada uno , crea un correspondiente bot.js
que contiene el código transpilado del propio bot, así como todo el código que contiene common.js
. Esta configuración es subóptima por varias razones, entre otras: requiere una gran cantidad de repeticiones, dificulta agregar nuevos bots, incluye muchos códigos innecesarios para cada bot y requiere que cada bot se construya por separado.
Sin embargo, según mi investigación hasta ahora , no parece que haya una manera fácil de hacer lo que quiero. En particular, el uso de la nueva tsc -b
opción y referencias no funciona, porque eso requiere que el código se modularice y Bot Land requiere un solo archivo con todas las funciones definidas en el nivel superior.
¿Cuál es la mejor manera de lograr la mayor cantidad posible de lo siguiente?
- No se requiere una nueva plantilla para agregar un nuevo bot (por ejemplo, no
tsconfig.json
por bot) - Úselo
import
para funciones comunes para evitar generar código no utilizado, pero luego ... - Todavía se muestran todas las funciones como un solo archivo en el formato específico de Bot Land
- Un solo paso de compilación que produce múltiples archivos de salida, uno para cada bot
- Bonificación: integración del proceso de compilación con VS Code. Actualmente hay una plantilla correspondiente
tasks.json
para construir cada subproyecto.
Supongo vagamente que la respuesta probablemente también incluye algo como Grunt tsc
, pero no sé lo suficiente para estar seguro.
bot.js
?
tsconfig.json
. Los archivos bot transpilados se pueden nombrar de cualquier forma, preferiblemente la versión .js del archivo original. Lo configuré de esta manera ahora en el repositorio que se envía a build/MissileKite.js
.
tsconfig-gas.json
lo relevante mirar allí?
<root>/MissileKite.ts
)