J'écris actuellement des scripts pour Bot Land . Bot Land est un jeu de stratégie en temps réel où au lieu de contrôler vos unités avec une souris et un clavier, vous écrivez du code pour contrôler vos bots via une API, puis vos bots vont combattre les bots des autres. Si vous connaissez les unités de SC2, vous pouvez créer des robots similaires aux harceleurs clignotants, aux chars de siège, aux médecins et aux ultralisks. (C'est un jeu assez amusant pour les ingénieurs logiciels, mais cela sort du cadre de cette question.)
Le contrôle des bots a trois niveaux de complexité croissante: une IA par défaut, un langage de programmation de type Scratch et un ensemble réduit de JavaScript appelé BotLandScript. Bien que l'éditeur intégré pour BotLandScript soit raisonnable, vous devez télécharger tout votre code en un seul fichier avec des fonctions globales de premier niveau partout. Naturellement, cela commence à devenir douloureux après un certain temps si votre code commence à devenir long et que des robots différents partagent les mêmes fonctions.
Pour faciliter l'écriture de code pour plusieurs robots, réduire le risque d'erreurs involontaires lors du codage en JS nu et augmenter mes chances de battre les autres joueurs, j'ai configuré le projet TypeScript ci - dessus pour fournir une bibliothèque commune ainsi que du code pour chacun de mes robots . La structure de répertoire actuelle ressemble approximativement à la suivante:
lib/
bot.land.d.ts
common.ts
BlinkStalker/
BlinkStalker.ts
tsconfig.json
Artillery/
Artillery.ts
tsconfig.json
SmartMelee/
SmartMelee.ts
tsconfig.json
lib
est le code commun qui est partagé entre les bots et fournit des définitions TypeScript pour l'API Bot Land (non-TS). Chaque bot obtient alors son propre dossier, avec un fichier contenant le code du bot et l'autre un passe-partout tsconfig.json
:
{
"compilerOptions": {
"target": "es3",
"module": "none",
"sourceMap": false,
"outFile": "bot.js"
},
"files": [
"MissileKite.ts"
],
"include": [
"../lib/**/*"
]
}
Quand chacun tsconfig.json
est construit, il crée un correspondant bot.js
qui contient le code transpilé du bot lui-même ainsi que tout le code common.js
. Cette configuration est sous-optimale pour plusieurs raisons, entre autres: elle nécessite beaucoup de passe-partout en double, rend difficile l'ajout de nouveaux bots, inclut beaucoup de code inutile pour chaque bot et nécessite que chaque bot soit construit séparément.
Cependant, d'après mes recherches jusqu'à présent , il ne semble pas qu'il existe un moyen facile de faire ce que je veux. En particulier, l'utilisation de la nouvelle tsc -b
option et des nouvelles références ne fonctionne pas, car cela nécessite une modularisation du code et Bot Land nécessite un fichier unique avec toutes les fonctions définies au niveau supérieur.
Quelle est la meilleure façon d'obtenir le plus grand nombre possible des éléments suivants?
- Aucun nouveau passe-partout requis pour ajouter un nouveau bot (par exemple, aucun
tsconfig.json
par bot) - Utilisez
import
pour les fonctions courantes pour éviter de sortir du code inutilisé, mais alors ... - Toujours afficher toutes les fonctions dans un seul fichier au format spécifique de Bot Land
- Une seule étape de génération qui produit plusieurs fichiers de sortie, un pour chaque bot
- Bonus: intégration du processus de construction avec VS Code. Il existe actuellement un passe-partout correspondant
tasks.json
pour la construction de chaque sous-projet.
Je suppose vaguement que la réponse implique probablement quelque chose comme Grunt en plus tsc
, mais je n'en sais pas assez pour en être sûr.
la source
<root>/MissileKite.ts
)bot.js
?tsconfig.json
. Les fichiers bots transpilés peuvent être nommés n'importe quoi, de préférence la version .js du fichier d'origine. Je l'ai configuré de cette façon maintenant dans le repo en sortie versbuild/MissileKite.js
.tsconfig-gas.json
la chose pertinente à regarder là-bas?Réponses:
Voici ma tentative de répondre à vos besoins.
Fichiers notables:
src/tsconfig-botland.json
contient les paramètres de tout script bot.land (y compris vos déclarations personnalisées vers lesquelles je suis passétypes/bot-land/index.d.ts
). Vous pouvez modifier lesstrict
paramètres que j'ai utilisés.src/tsconfig.json
contient des références à tous vos robots. Il s'agit du fichier à modifier chaque fois que vous souhaitez ajouter un autre script de botUn script de bot est composé d'au moins deux fichiers: un minimaliste
tsconfig.json
et un ou plusieurs.ts
fichiers de script.Par exemple
src/AggroMiner/tsconfig.json
:Dans la plupart des cas, pour démarrer un nouveau script de bot, vous devez:
src/AggroMiner
) dans un nouveau dossier soussrc
src/<newBotFolder>/tsconfig.json
pour modifier leoutFile
avec le nom de votre botsrc/tsconfig.json
et ajouter une référence àsrc/<newBotFolder>
Le script
npm
/ suivantyarn
a été défini:build
pour construire tous les botsbuild-clean
qui efface lebuild
dossier avant d'exécuter unbuild
format
pour exécuter Prettier sur tous les.ts
fichiers soussrc
lint
exécuter une vérification tslint sur tous les scripts de botExécuter maintenant vos exigences:
Pour y parvenir, il faudrait créer un script qui énumérerait votre dossier / scripts de bots ... et configurer le bot approprié
tsconfig.json
et l'exécutertsc
. À moins que cela ne soit strictement nécessaire, une configuration minimale (décrite ci-dessus) peut être suffisante.Tout d'abord, sachez que si vous commencez à utiliser des modules
export
/import
instructions, vous aurez besoin de tiers supplémentaires pour emballer / arborescence afin d'obtenir une sortie de fichier unique. D'après ce que j'ai pu recueillir sur Bot.land, vos scripts s'exécutent sur le serveur. À moins que le code mort n'ait un impact sur les performances de votre bot, je ne me dérangerais pas vraiment.Terminé.
Terminé.
Les
npm
scripts devraient apparaître dans la liste des tâches de vsc (du moins ils le font dans la mienne), ce qui rendtasks.json
inutile.la source
types/bot-land
les définitions et pourquoi vous avez choisi lesstrict
paramètres?types
ou si c'était juste une façon spécifique d'organiser ce que vous avez choisi.Vous pouvez réellement utiliser des références de projet. Suivez ces étapes pour obtenir les mêmes résultats que vous obteniez pour vos fichiers d'origine, avec toutes les fonctions au niveau supérieur dans un seul fichier. Cependant, je n'ai pas trouvé de solution pour importer uniquement les fonctions nécessaires dans les bots. Autrement dit, sans utiliser les importations et les exportations.
Dans votre tsconfig.json à la racine
Ensuite, dans votre dossier lib, ajoutez un tsconfig.json comme ça
Nous devons faire quelques ajustements dans data.ts, movement.ts et utils.ts afin que ts ne nous dérange pas avec des erreurs de compilation.
data.ts
mouvement.ts
utils.ts
Ensuite, nous ajoutons base.json à la racine (le tsconfig.json des bots va l'étendre).
base.json
et tsconfig.json des bots (adapter en fonction des bots)
C'est ça. Maintenant lancez
la source
build/MissileKite.js
sortie lorsque vous créez le référentiel d'origine.