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
libes 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.jsonse construye cada uno , crea un correspondiente bot.jsque 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 -bopció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.jsonpor bot) - Úselo
importpara 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.jsonpara construir cada subproyecto.
Supongo vagamente que la respuesta probablemente también incluye algo como Grunt tsc, pero no sé lo suficiente para estar seguro.
fuente



<root>/MissileKite.ts)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 abuild/MissileKite.js.tsconfig-gas.jsonlo relevante mirar allí?Respuestas:
Aquí está mi intento de responder a sus requisitos.
Archivos notables:
src/tsconfig-botland.jsonmantiene la configuración de cualquier script bot.land (incluidas sus declaraciones personalizadas a las que me mudétypes/bot-land/index.d.ts). Puede cambiar lastrictconfiguración que utilicé.src/tsconfig.jsoncontiene referencias a todos tus bots. Este es el archivo para editar cada vez que desee agregar otro script de botUn script de bot tiene al menos dos archivos: uno minimalista
tsconfig.jsony uno o más.tsarchivos de script.Por ejemplo
src/AggroMiner/tsconfig.json:En la mayoría de los casos, para iniciar una nueva secuencia de comandos de bot debe:
src/AggroMiner) a una nueva carpeta ensrcsrc/<newBotFolder>/tsconfig.jsonpara editar eloutFilecon el nombre de su botsrc/tsconfig.jsony agregar una referencia asrc/<newBotFolder>Se ha establecido el siguiente
npm/yarnscript:buildpara construir todos los botsbuild-cleanque borra labuildcarpeta antes de ejecutar unbuildformatejecutar Prettier en todos los.tsarchivos bajosrclintejecutar una comprobación tslint en todos los scripts de botAhora agotando sus requisitos:
Para lograr esto, sería necesario crear algún script que enumerara la carpeta / scripts de su bots ... y configurara el correspondiente por bot
tsconfig.jsony se ejecutetsc. A menos que sea estrictamente necesario, una configuración mínima (descrita anteriormente) podría ser suficiente.Primero, tenga en cuenta que si comienza a usar algún módulo
export/importdeclaración, necesitará un tercero adicional para empacar / sacudir árboles para lograr una salida de archivo único. Por lo que pude deducir de Bot.land, sus scripts se están ejecutando en el servidor. A menos que el código muerto tenga un impacto en el rendimiento de su bot, realmente no me molestaría.Hecho.
Hecho.
Los
npmscripts deberían aparecer en la lista de tareas de vsc (al menos lo hacen en la mía), lo que hacetasks.jsoninnecesario.fuente
types/bot-landpara las definiciones y por qué eligió lastrictconfiguración?typeso si esa era solo una forma específica de organizar lo que elegiste.En realidad, podría usar referencias de proyectos. Siga estos pasos para obtener los mismos resultados que estaba obteniendo para sus archivos originales, con todas las funciones en el nivel superior en un solo archivo. Sin embargo, no pude encontrar una solución para importar solo las funciones necesarias en los bots. Es decir, sin utilizar importaciones y exportaciones.
En su tsconfig.json en la raíz
Luego, en su carpeta lib, agregue un tsconfig.json así
Necesitamos hacer algunos ajustes en data.ts, movement.ts y utils.ts para que ts no nos moleste con errores de compilación.
data.ts
movimiento.ts
utils.ts
A continuación, agregamos base.json en la raíz (el tsconfig.json de los bots lo extenderá).
base.json
y tsconfig.json de los bots (adaptarse según los bots)
Eso es. Ahora solo corre
fuente
build/MissileKite.jsque se genera cuando crea el repositorio original.