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.
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.json
lo relevante mirar allí?Respuestas:
Aquí está mi intento de responder a sus requisitos.
Archivos notables:
src/tsconfig-botland.json
mantiene 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 lastrict
configuración que utilicé.src/tsconfig.json
contiene 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.json
y uno o más.ts
archivos 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 ensrc
src/<newBotFolder>/tsconfig.json
para editar eloutFile
con el nombre de su botsrc/tsconfig.json
y agregar una referencia asrc/<newBotFolder>
Se ha establecido el siguiente
npm
/yarn
script:build
para construir todos los botsbuild-clean
que borra labuild
carpeta antes de ejecutar unbuild
format
ejecutar Prettier en todos los.ts
archivos bajosrc
lint
ejecutar 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.json
y 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
/import
declaració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
npm
scripts deberían aparecer en la lista de tareas de vsc (al menos lo hacen en la mía), lo que hacetasks.json
innecesario.fuente
types/bot-land
para las definiciones y por qué eligió lastrict
configuración?types
o 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.js
que se genera cuando crea el repositorio original.