Saat ini saya sedang menulis beberapa skrip untuk Bot Land . Bot Land adalah gim strategi real-time di mana alih-alih mengendalikan unit Anda dengan mouse dan keyboard, Anda menulis kode untuk mengontrol bot Anda melalui API, dan kemudian bot Anda bertarung melawan bot orang lain. Jika Anda terbiasa dengan unit di SC2, Anda dapat membuat bot yang mirip dengan penguntit kedip, tangki pengepungan, petugas medis, dan ultralis. (Ini adalah permainan yang cukup menyenangkan untuk insinyur perangkat lunak, tapi itu di luar cakupan pertanyaan ini.)
Kontrol bot memiliki tiga tingkat peningkatan kompleksitas: AI default, bahasa pemrograman seperti Scratch , dan serangkaian JavaScript yang dikurangi yang disebut BotLandScript. Meskipun editor bawaan untuk BotLandScript masuk akal, Anda harus mengunggah semua kode Anda sebagai satu file tunggal dengan fungsi tingkat global di mana-mana. Secara alami, ini mulai menyakitkan setelah beberapa saat jika kode Anda mulai menjadi panjang dan berbagai bot berbagi fungsi yang sama.
Untuk memfasilitasi penulisan kode untuk banyak bot, kurangi peluang untuk kesalahan yang tidak disengaja saat pengkodean di bare JS, dan tingkatkan peluang saya untuk mengalahkan pemain lain, saya menyiapkan proyek TypeScript di atas untuk menyediakan perpustakaan umum serta kode untuk setiap bot saya . Struktur direktori saat ini terlihat kira-kira seperti berikut ini:
lib/
bot.land.d.ts
common.ts
BlinkStalker/
BlinkStalker.ts
tsconfig.json
Artillery/
Artillery.ts
tsconfig.json
SmartMelee/
SmartMelee.ts
tsconfig.json
lib
adalah kode umum yang dibagikan di antara bot, dan memberikan definisi TypeScript untuk API Bot Tanah (non-TS). Setiap bot kemudian mendapatkan foldernya sendiri, dengan satu file yang berisi kode bot dan satunya lagi adalah boilerplate tsconfig.json
:
{
"compilerOptions": {
"target": "es3",
"module": "none",
"sourceMap": false,
"outFile": "bot.js"
},
"files": [
"MissileKite.ts"
],
"include": [
"../lib/**/*"
]
}
Ketika masing tsconfig.json
- masing dibangun, itu menciptakan yang sesuai bot.js
yang berisi kode yang diubah dari bot itu sendiri serta semua kode di dalamnya common.js
. Pengaturan ini tidak optimal karena beberapa alasan, antara lain: memerlukan banyak duplikat boilerplate, membuatnya sulit untuk menambahkan bot baru, termasuk banyak kode yang tidak perlu untuk setiap bot, dan mengharuskan setiap bot dibangun secara terpisah.
Namun, berdasarkan penelitian saya sejauh ini , sepertinya tidak ada cara mudah untuk melakukan apa yang saya inginkan. Secara khusus, menggunakan tsc -b
opsi baru dan referensi tidak berfungsi, karena itu memerlukan kode untuk dimodulasi dan Bot Land memerlukan satu file dengan semua fungsi yang didefinisikan di tingkat atas.
Apa cara terbaik untuk mencapai sebanyak mungkin hal berikut ini?
- Tidak diperlukan boilerplate baru untuk menambahkan bot baru (mis. Tidak ada
tsconfig.json
per bot) - Gunakan
import
untuk fungsi-fungsi umum untuk menghindari mengeluarkan kode yang tidak digunakan, tetapi kemudian ... - Masih menampilkan semua fungsi sebagai satu file tunggal dalam format spesifik Bot Land
- Langkah build tunggal yang menghasilkan banyak file output, satu untuk setiap bot
- Bonus: mengintegrasikan proses pembuatan dengan VS Code. Ada boilerplate saat ini sesuai
tasks.json
untuk membangun setiap sub-proyek.
Samar-samar aku menduga jawabannya mungkin melibatkan sesuatu seperti Grunt tsc
, tapi aku tidak cukup tahu tentang itu.
sumber
<root>/MissileKite.ts
)bot.js
?tsconfig.json
. File bot yang di-transpile dapat dinamai apa saja, lebih disukai versi .js dari file asli. Saya sudah mengaturnya sekarang di repo keluaran kebuild/MissileKite.js
.tsconfig-gas.json
hal yang relevan untuk dilihat di sana?Jawaban:
Ini adalah upaya saya untuk menjawab kebutuhan Anda.
File penting:
src/tsconfig-botland.json
menyimpan pengaturan untuk skrip bot.land (termasuk deklarasi khusus yang saya pindahkan ketypes/bot-land/index.d.ts
). Anda dapat mengubahstrict
pengaturan yang saya gunakan.src/tsconfig.json
memegang referensi ke semua bot Anda. Ini adalah file yang akan diedit setiap kali Anda ingin menambahkan skrip bot lainSkrip bot setidaknya terdiri dari dua file: file skrip minimalis
tsconfig.json
dan satu atau lebih.ts
.Sebagai contoh
src/AggroMiner/tsconfig.json
:Dalam kebanyakan kasus, untuk memulai skrip bot baru Anda harus:
src/AggroMiner
) ke folder baru di bawahsrc
src/<newBotFolder>/tsconfig.json
untuk mengeditoutFile
dengan nama bot Andasrc/tsconfig.json
dan tambahkan referensi kesrc/<newBotFolder>
Script
npm
/ berikutyarn
ini telah ditetapkan:build
untuk membangun semua botbuild-clean
yang menghapusbuild
folder sebelum menjalankanbuild
format
untuk menjalankan Prettier pada semua.ts
file di bawahsrc
lint
untuk menjalankan pemeriksaan tslint pada semua skrip botSekarang menjalankan persyaratan Anda:
Untuk mencapai ini diperlukan pembuatan beberapa skrip yang akan menyebutkan folder / skrip bot Anda ... dan mengatur per bot yang relevan
tsconfig.json
dan menjalankannyatsc
. Kecuali sangat diperlukan, pengaturan minimal (yang dijelaskan di atas) mungkin cukup.Pertama, perlu diketahui bahwa jika Anda mulai menggunakan modul
export
/import
pernyataan apa pun , Anda akan membutuhkan pihak ke-3 tambahan untuk mengepak / treeshake untuk mencapai satu output file. Dari apa yang saya dapat kumpulkan dari Bot.land, skrip Anda berjalan di server. Kecuali jika deadcode berdampak pada kinerja bot Anda, saya tidak akan terlalu repot.Selesai
Selesai
The
npm
Script akan muncul dalam daftar tugas VSC (setidaknya mereka lakukan di tambang) sehingga membuattasks.json
yang tidak perlu.sumber
types/bot-land
definisi dan mengapa Anda memilihstrict
pengaturan?types
atau jika itu hanya cara khusus untuk mengatur yang Anda pilih.Anda sebenarnya bisa menggunakan referensi proyek. Ikuti langkah-langkah ini untuk mendapatkan hasil yang sama dengan yang Anda dapatkan untuk file asli Anda, dengan semua fungsi di tingkat atas dalam satu file. Namun, saya tidak dapat menemukan solusi untuk mengimpor hanya fungsi yang diperlukan dalam bot. Artinya, tanpa menggunakan impor dan ekspor.
Di tsconfig.json Anda di root
Selanjutnya, di folder lib Anda, tambahkan tsconfig.json seperti itu
Kita perlu membuat beberapa penyesuaian dalam data.ts, movement.ts dan utils.ts sehingga ts tidak mengganggu kita dengan kesalahan kompilasi.
data.ts
gerakan
utils.ts
Selanjutnya, kita tambahkan base.json di root (tsconfig.json dari bot akan memperpanjangnya).
base.json
dan tsconfig.json dari bot (sesuaikan dengan bot)
Itu dia. Sekarang jalankan
sumber
build/MissileKite.js
yang dihasilkan saat Anda membangun repo asli.