Obecnie piszę kilka skryptów dla Bot Land . Bot Land to gra strategiczna w czasie rzeczywistym, w której zamiast kontrolować jednostki za pomocą myszy i klawiatury, piszesz kod kontrolujący boty za pośrednictwem interfejsu API, a następnie boty walczą z botami innych. Jeśli znasz jednostki w SC2, możesz tworzyć boty podobne do mrugających prześladowców, czołgów oblężniczych, medyków i ultralisk. (To dość zabawna gra dla inżynierów oprogramowania, ale to nie wchodzi w zakres tego pytania).
Kontrola botów ma trzy poziomy rosnącej złożoności: domyślną sztuczną inteligencję, język programowania podobny do Scratch oraz ograniczony zestaw JavaScript o nazwie BotLandScript. Chociaż wbudowany edytor BotLandScript jest rozsądny, musisz przesłać cały kod jako jeden plik z globalnymi funkcjami najwyższego poziomu wszędzie. Oczywiście zaczyna to boleć po pewnym czasie, jeśli twój kod zaczyna się wydłużać, a różne boty mają te same funkcje.
Aby ułatwić pisanie kodu dla wielu botów, zmniejszyć ryzyko niezamierzonych błędów podczas kodowania w czystym JS i zwiększyć moje szanse na pokonanie innych graczy, skonfigurowałem powyższy projekt TypeScript, aby zapewnić wspólną bibliotekę oraz kod dla każdego z moich botów . Obecna struktura katalogów wygląda mniej więcej tak:
lib/
bot.land.d.ts
common.ts
BlinkStalker/
BlinkStalker.ts
tsconfig.json
Artillery/
Artillery.ts
tsconfig.json
SmartMelee/
SmartMelee.ts
tsconfig.json
lib
jest wspólnym kodem dzielonym przez boty i zawiera definicje TypeScript dla (nie-TS) Bot Land API. Każdy bot otrzymuje następnie swój własny folder, z jednym plikiem zawierającym kod bota, a drugim - płytką zbiorczą tsconfig.json
:
{
"compilerOptions": {
"target": "es3",
"module": "none",
"sourceMap": false,
"outFile": "bot.js"
},
"files": [
"MissileKite.ts"
],
"include": [
"../lib/**/*"
]
}
Po tsconfig.json
zbudowaniu każdego z nich tworzony jest odpowiedni bot.js
kod, który zawiera transpilowany kod z samego bota, a także cały kod common.js
. Ta konfiguracja jest nieoptymalna z kilku powodów, między innymi: wymaga dużej ilości zduplikowanych płyt kotłowych, utrudnia dodawanie nowych botów, zawiera wiele niepotrzebnego kodu dla każdego bota i wymaga, aby każdy bot był budowany osobno.
Jednak na podstawie moich dotychczasowych badań nie wydaje się, że istnieje prosty sposób na robienie tego, co chcę. W szczególności użycie nowej tsc -b
opcji i odniesień nie działa, ponieważ wymaga to modularyzacji kodu, a Bot Land wymaga jednego pliku ze wszystkimi funkcjami zdefiniowanymi na najwyższym poziomie.
Jaki jest najlepszy sposób na uzyskanie jak największej liczby poniższych możliwości?
- Nie jest wymagana nowa płyta kotła, aby dodać nowego bota (np. Nie
tsconfig.json
na bota) - Użyj
import
dla typowych funkcji, aby uniknąć generowania nieużywanego kodu, ale potem ... - Nadal wyprowadzasz wszystkie funkcje jako jeden plik w specyficznym formacie Bot Land
- Jeden krok kompilacji, w którym powstaje wiele plików wyjściowych, po jednym dla każdego bota
- Bonus: zintegrowanie procesu kompilacji z VS Code. Obecnie istnieje odpowiednio plansza
tasks.json
do budowy każdego podprojektu.
Domyślam się, że odpowiedź prawdopodobnie wiąże się z czymś takim jak Grunt tsc
, ale nie wiem wystarczająco dużo na ten temat.
bot.js
?
tsconfig.json
. Przeszczepione pliki botów mogą mieć dowolną nazwę, najlepiej wersję oryginalnego pliku .js. Mam to ustawione w ten sposób teraz w repozytorium wyjściowym do build/MissileKite.js
.
tsconfig-gas.json
warto tam spojrzeć?
<root>/MissileKite.ts
)