Ich schreibe gerade einige Skripte für Bot Land . Bot Land ist ein Echtzeit-Strategiespiel, bei dem Sie anstelle der Steuerung Ihrer Einheiten mit Maus und Tastatur Code schreiben, um Ihre Bots über eine API zu steuern, und dann Ihre Bots gegen die Bots anderer kämpfen. Wenn Sie mit Einheiten in SC2 vertraut sind, können Sie Bots erstellen, die Blink-Stalkern, Belagerungspanzern, Medizinern und Ultralisken ähneln. (Es ist ein ziemlich lustiges Spiel für Softwareentwickler, aber das liegt außerhalb des Rahmens dieser Frage.)
Die Bot-Steuerung weist drei Ebenen zunehmender Komplexität auf: eine Standard-KI, eine Scratch- ähnliche Programmiersprache und einen reduzierten JavaScript-Satz namens BotLandScript. Obwohl der integrierte Editor für BotLandScript sinnvoll ist, müssen Sie Ihren gesamten Code als eine einzige Datei mit globalen Funktionen der obersten Ebene überall hochladen . Natürlich wird dies nach einer Weile schmerzhaft, wenn Ihr Code langsam wird und verschiedene Bots die gleichen Funktionen haben.
Um das Schreiben von Code für mehrere Bots zu vereinfachen, die Wahrscheinlichkeit unbeabsichtigter Fehler beim Codieren in Bare JS zu verringern und meine Chancen zu erhöhen, andere Spieler zu schlagen, habe ich das obige TypeScript-Projekt eingerichtet , um eine gemeinsame Bibliothek sowie Code für jeden meiner Bots bereitzustellen . Die aktuelle Verzeichnisstruktur sieht ungefähr so aus:
lib/
bot.land.d.ts
common.ts
BlinkStalker/
BlinkStalker.ts
tsconfig.json
Artillery/
Artillery.ts
tsconfig.json
SmartMelee/
SmartMelee.ts
tsconfig.json
lib
ist der allgemeine Code, der von Bots gemeinsam genutzt wird und TypeScript-Definitionen für die Bot Land-API (ohne TS) enthält. Jeder Bot erhält dann einen eigenen Ordner, wobei eine Datei den Bot-Code und die andere ein Boilerplate enthält tsconfig.json
:
{
"compilerOptions": {
"target": "es3",
"module": "none",
"sourceMap": false,
"outFile": "bot.js"
},
"files": [
"MissileKite.ts"
],
"include": [
"../lib/**/*"
]
}
Wenn jeder erstellt tsconfig.json
wird, wird ein entsprechender bot.js
Code erstellt, der den vom Bot selbst transpilierten Code sowie den gesamten Code enthält common.js
. Dieses Setup ist unter anderem aus mehreren Gründen nicht optimal: Es erfordert viel doppeltes Boilerplate, erschwert das Hinzufügen neuer Bots, enthält viel unnötigen Code für jeden Bot und erfordert, dass jeder Bot separat erstellt wird.
Aufgrund meiner bisherigen Forschung scheint es jedoch nicht einfach zu sein, das zu tun, was ich will. Insbesondere die Verwendung der neuen tsc -b
Option und der neuen Referenzen funktioniert nicht, da hierfür der Code modularisiert werden muss und für Bot Land eine einzige Datei mit allen auf der obersten Ebene definierten Funktionen erforderlich ist.
Was ist der beste Weg, um so viele der folgenden Ziele wie möglich zu erreichen?
- Es ist keine neue Boilerplate erforderlich, um einen neuen Bot hinzuzufügen (z. B. keine
tsconfig.json
pro Bot). - Verwenden Sie diese Option
import
für allgemeine Funktionen, um die Ausgabe von nicht verwendetem Code zu vermeiden. - Geben Sie weiterhin alle Funktionen als eine einzige Datei im spezifischen Format von Bot Land aus
- Ein einzelner Erstellungsschritt, der mehrere Ausgabedateien erzeugt, eine für jeden Bot
- Bonus: Integration des Build-Prozesses in VS Code. Für die Erstellung
tasks.json
jedes Teilprojekts gibt es derzeit eine entsprechende Kesselplatte .
Ich vermute vage, dass die Antwort wahrscheinlich zusätzlich etwas wie Grunzen beinhaltet tsc
, aber ich weiß nicht genug darüber, um sicher zu sein.
bot.js
?
tsconfig.json
. Transpilierte Bot-Dateien können beliebig benannt werden, vorzugsweise die .js-Version der Originaldatei. Ich habe es jetzt so in der Repo-Ausgabe an eingerichtet build/MissileKite.js
.
tsconfig-gas.json
das Relevante dort zu sehen?
<root>/MissileKite.ts
)