Attualmente sto scrivendo alcuni script per Bot Land . Bot Land è un gioco di strategia in tempo reale in cui invece di controllare le tue unità con un mouse e una tastiera, scrivi codice per controllare i tuoi robot tramite un'API, quindi i tuoi robot vanno a combattere i robot degli altri. Se hai familiarità con le unità in SC2, puoi creare robot simili a stalker, carri armati d'assedio, medici e ultralischi simili. (È un gioco abbastanza divertente per gli ingegneri del software, ma non rientra nell'ambito di questa domanda.)
Il controllo bot ha tre livelli di crescente complessità: un'intelligenza artificiale predefinita, un linguaggio di programmazione simile a Scratch e un set ridotto di JavaScript chiamato BotLandScript. Sebbene l'editor integrato per BotLandScript sia ragionevole, devi caricare tutto il tuo codice come un singolo file con funzioni globali di alto livello ovunque. Naturalmente, questo inizia a diventare doloroso dopo un po 'se il codice inizia a diventare lungo e diversi robot condividono le stesse funzioni.
Per facilitare la scrittura di codice per più robot, ridurre la possibilità di errori involontari durante la codifica in JS nudo e aumentare le mie possibilità di battere altri giocatori, ho impostato il progetto TypeScript sopra riportato per fornire una libreria comune e un codice per ciascuno dei miei robot . La struttura della directory corrente è simile approssimativamente alla seguente:
lib/
bot.land.d.ts
common.ts
BlinkStalker/
BlinkStalker.ts
tsconfig.json
Artillery/
Artillery.ts
tsconfig.json
SmartMelee/
SmartMelee.ts
tsconfig.json
lib
è il codice comune condiviso tra i bot e fornisce definizioni TypeScript per l'API Bot Land (non TS). Ogni bot ottiene quindi la propria cartella, con un file contenente il codice del bot e l'altro una piastra di caldaia tsconfig.json
:
{
"compilerOptions": {
"target": "es3",
"module": "none",
"sourceMap": false,
"outFile": "bot.js"
},
"files": [
"MissileKite.ts"
],
"include": [
"../lib/**/*"
]
}
Quando ciascuno di essi tsconfig.json
viene creato, crea un corrispondente bot.js
che contiene codice traspilato dal bot stesso e tutto il codice in common.js
. Questa configurazione non è ottimale per alcuni motivi, tra gli altri: richiede un sacco di duplicati del boilerplate, rende difficile l'aggiunta di nuovi robot, include un sacco di codice non necessario per ciascun bot e richiede che ogni bot sia costruito separatamente.
Tuttavia, sulla base delle mie ricerche finora , non sembra che ci sia un modo semplice per fare quello che voglio. In particolare, l'utilizzo della nuova tsc -b
opzione e dei riferimenti non funziona, poiché ciò richiede la modularizzazione del codice e Bot Land richiede un singolo file con tutte le funzioni definite al livello superiore.
Qual è il modo migliore per ottenere il maggior numero possibile di seguenti?
- Non è necessario un nuovo boilerplate per aggiungere un nuovo bot (es. No
tsconfig.json
per bot) - Utilizzare
import
per le funzioni comuni per evitare di generare codice inutilizzato, ma poi ... - Stampa comunque tutte le funzioni come un singolo file nel formato specifico di Bot Land
- Un singolo passo di generazione che produce più file di output, uno per ciascun bot
- Bonus: integrazione del processo di compilazione con VS Code. Al momento esiste un corrispondente boiler
tasks.json
per la costruzione di ciascun sottoprogetto.
Suppongo vagamente che la risposta implichi probabilmente qualcosa di simile a Grunt tsc
, ma non ne so abbastanza per esserne sicuro.
bot.js
?
tsconfig.json
. I file bot traspilati possono essere nominati con qualsiasi nome, preferibilmente la versione .js del file originale. L'ho impostato in questo modo ora nel repo in uscita a build/MissileKite.js
.
tsconfig-gas.json
cosa rilevante da guardare lì?
<root>/MissileKite.ts
)