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.
źródło
<root>/MissileKite.ts
)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 dobuild/MissileKite.js
.tsconfig-gas.json
warto tam spojrzeć?Odpowiedzi:
Oto moja próba odpowiedzi na twoje wymagania.
Ważne pliki:
src/tsconfig-botland.json
przechowuje ustawienia dla dowolnego skryptu bot.land (w tym niestandardowych deklaracji, do których przeprowadziłem siętypes/bot-land/index.d.ts
). Możesz zmienićstrict
ustawienia, których użyłem.src/tsconfig.json
zawiera odniesienia do wszystkich twoich botów. Jest to plik do edycji za każdym razem, gdy chcesz dodać kolejny skrypt botaSkrypt bota to co najmniej dwa pliki: minimalistyczny
tsconfig.json
i jeden lub więcej.ts
plików skryptowych.Na przykład
src/AggroMiner/tsconfig.json
:W większości przypadków, aby uruchomić nowy skrypt bota, powinieneś:
src/AggroMiner
) do nowego folderu podsrc
src/<newBotFolder>/tsconfig.json
aby edytowaćoutFile
z nazwą twojego botasrc/tsconfig.json
i dodaj odniesienie dosrc/<newBotFolder>
Ustawiono następujące
npm
/yarn
skrypt:build
zbudować wszystkie botybuild-clean
które usuwająbuild
folder przed uruchomieniembuild
format
uruchomić Prettier na wszystkich.ts
plikach poniżejsrc
lint
aby uruchomić sprawdzanie tslint na wszystkich skryptach botaTeraz wyczerpują się twoje wymagania:
Aby to osiągnąć, należy utworzyć skrypt, który wyliczy folder / skrypty bota ... i skonfiguruje odpowiedni dla każdego bota
tsconfig.json
i uruchomtsc
. O ile nie jest to absolutnie konieczne, minimalna konfiguracja (opis powyżej) może być wystarczająca.Po pierwsze, pamiętaj, że jeśli zaczniesz używać dowolnego modułu
export
/import
instrukcji, będziesz potrzebować dodatkowej strony trzeciej do spakowania / uzgadniania drzewa w celu uzyskania pojedynczego pliku wyjściowego. Z tego, co mogłem zebrać w Bot.land, twoje skrypty działają na serwerze. O ile deadcode nie wpływa na wydajność twojego bota, tak naprawdę nie zawracałbym sobie głowy.Gotowy.
Gotowy.
Te
npm
skrypty powinien pojawić się na liście zadań VSC (przynajmniej robią w kopalni) co powoduje, żetasks.json
zbędne.źródło
types/bot-land
definicji i dlaczego wybrałeśstrict
ustawienia?types
czy też był to tylko określony sposób organizacji, który wybrałeś.Możesz użyć referencji projektu. Wykonaj następujące kroki, aby uzyskać takie same wyniki, jak w przypadku oryginalnych plików, ze wszystkimi funkcjami na najwyższym poziomie w jednym pliku. Jednak nie mogłem znaleźć rozwiązania, aby zaimportować tylko potrzebne funkcje do botów. To znaczy bez korzystania z importu i eksportu.
W tsconfig.json w katalogu głównym
Następnie w folderze lib dodaj plik tsconfig.json
Musimy wprowadzić kilka zmian w data.ts, move.ts i utils.ts, aby ts nie przeszkadzał nam w błędach kompilacji.
data.ts
move.ts
utils.ts
Następnie dodajemy base.json w katalogu głównym (tsconfig.json botów go przedłuży).
base.json
i tsconfig.json bots (dostosuj zgodnie z botami)
Otóż to. Teraz po prostu biegnij
źródło
build/MissileKite.js
co jest generowane podczas budowania oryginalnego repo.