Apa ini
CastlevaniaBot adalah plugin untuk
emulator NES Nintaco yang diputar di Castlevania. Jika Anda menjalankannya di layar splash, plugin akan melewati seluruh permainan dari awal hingga selesai. Atau Anda bisa menjalankannya di mana saja di dalam gim sehingga bisa melewati sebagian gim.
Pada artikel ini saya akan memberi tahu Anda cara membuat bot yang mampu melewati Castlevania, dan bagaimana Anda bisa membuat sesuatu yang serupa untuk game apa pun di NES.
Struktur berbasis pengetahuan
Proyek ini tidak menggunakan pembelajaran mesin. Sebaliknya, pengembangan bisa disebut "pembelajaran mesin." Saya tahu cara melewati Castlevania. Kesulitannya dalam menulis pengetahuan saya ke dalam program komputer. Hasilnya adalah sistem yang mensimulasikan proses pengambilan keputusan yang sama yang saya lakukan dengan pengontrol di tangan saya. Untuk membuatnya, perlu untuk menyatakan dengan jelas rincian fisik yang mengendalikan dunia Simon Belmont, dan semua taktik yang diperlukan untuk pemburu vampir yang berpengalaman.
CastlevaniaBot memiliki akses ke serangkaian strategi untuk menangani berbagai situasi. Sebagian besar dirancang untuk bekerja dengan jenis objek game tertentu. Misalnya, ada strategi kontrol kerangka, yang lain untuk orang ikan, untuk memecahkan lilin, untuk mengumpulkan hati, dan sebagainya.
CastlevaniaBot terus memantau keadaan permainan dan, jika perlu, beralih di antara berbagai strategi. Dalam proses pengambilan keputusan, fungsi kebugaran digunakan, memberi peringkat semua objek game di layar. Di bagian atas daftar adalah tujuan utama, dan ketika itu berubah, bot mengubah strateginya. Misalnya, CastlevaniaBot mungkin siap untuk memukul lilin ketika kelelawar terbang ke bingkai. Tergantung pada jarak ke kelelawar, CastlevaniaBot dapat bereaksi dengan beralih dari strategi lilin ke strategi kelelawar. Menghancurkan kelelawar, ia akan terus bekerja dengan lilin.
Sebelum memutuskan untuk beralih, CastlevaniaBot meninjau tujuan dan strateginya saat ini. Jika dia tidak berhasil, dia mungkin akan terjebak dalam siklus tanpa akhir, beralih bolak-balik antara dua tujuan dengan prioritas yang sama atau hampir sama. Untuk menghindari ini, ketika tujuan utama baru muncul, yang hanya sedikit lebih tinggi dalam prioritas tujuan saat ini, CastlevaniaBot dapat memutuskan untuk melanjutkan strategi saat ini.
Beberapa strategi diluncurkan secara otomatis ketika mereka jatuh ke area tertentu. Biasanya mereka dimaksudkan untuk pemrosesan simultan dari beberapa objek game. Misalnya, di koridor dengan sekelompok kepala ubur-ubur terbang, yang terbaik adalah hanya melanjutkan dan tidak membidik masing-masing kepala secara individual.
Beberapa strategi dapat bervariasi tergantung pada senjata sekunder saat ini dan jumlah hati yang dikumpulkan, khususnya dalam pertarungan bos. CastlevaniaBot sedang berusaha membuat keputusan terbaik berdasarkan alat yang dimilikinya dan situasi saat ini.
Merencanakan dunia 8-bit
Ketika mengerjakan proyek-proyek semacam itu, saya terutama berusaha menyederhanakan tugas. Saya membayangkan seperti apa Castlevania jika tidak ada musuh, lilin, atau barang untuk dikumpulkan di level. Semua yang diperlukan dalam hal ini hanyalah untuk mendapatkan dari awal hingga akhir level. Saya bertanya-tanya - jika saya bisa mengajarkan bot bagaimana melakukan ini, seberapa sulitkah untuk menghancurkan beberapa musuh di sepanjang jalan?
Untuk mengajarkan bot untuk bergerak, saya membutuhkan peta latar belakang ubin dan pemahaman tentang bagaimana level diatur. Gim ini terdiri dari enam level, yang masing-masing berakhir dengan bos.
Setiap level dibagi menjadi 3 atau 4 tahap. Panggung biasanya dipisahkan oleh pintu kayu yang terbuka dengan derit dan bantingan di belakang punggung pemain.
Pintu adalah titik kontrol (pos pemeriksaan). Jika seorang pemain terbunuh, maka dia kembali ke awal panggung, tetapi hanya jika dia belum mengakhiri hidupnya. Jika Anda melanjutkan permainan setelah Game Over, maka pemain dikirim ke awal level.
Nomor panggung menunjukkan jumlah total pos pemeriksaan yang selesai sejak awal permainan. Tahap terakhir adalah nomor 18. Tetapi jika Anda membunuh Dracula, maka permainan dimulai dari awal dalam Mode Sulit, dan jumlah tahap terus meningkat menjadi 19 dan seterusnya. Jika Anda melalui Mode Sulit, maka siklus ketiga permainan tidak menjadi lebih sulit, tetapi jumlah tahap masih terus meningkat.
Setiap tahap terdiri dari satu atau lebih bilah gulir horizontal latar belakang, yang saya sebut "sub-langkah". Jika Anda keluar dari layar di sepanjang tangga yang mengarah ke atas atau ke bawah, permainan bergerak dari satu sub-tahap ke sub-tahap lainnya, dan tidak menggulir secara vertikal.
Gim ini menggunakan 3 byte untuk melacak nomor siklus gim, nomor panggung, dan nomor sub-tahap. Siklus permainan dalam mode normal (Mode Normal) memiliki nilai 0; nilai 1 dan di atasnya menunjukkan Mode Sulit. Terlepas dari siklus permainan, langkah-langkah selalu memiliki penomoran dari 0 hingga 18. Dan sub-langkah selalu memiliki nilai 0 atau 1, karena langkah-langkahnya tidak pernah mengandung lebih dari 2 garis horizontal. CastlevaniaBot melacak byte ini untuk mengetahui di mana itu.
Demi kenyamanan saya, saya mencatat strip latar belakang setiap sub-tahap dalam file grafik terpisah. Jika saya perlu menemukan koordinat yang tepat dari suatu objek, maka saya bisa dengan cepat mencari mereka menggunakan editor grafis. Saya merekam file menggunakan alat Pencipta Peta yang terintegrasi dengan Nintaco. Saya menyalakannya dan kemudian pergi melalui seluruh permainan. Beberapa gambar yang dihasilkan berisi beberapa sub-langkah yang terhubung bersama, yang mudah dipecah.
Setelah memeriksa gambar latar belakang, saya menyadari bahwa satu-satunya ubin penting adalah platform dan tangga. Segala sesuatu yang lain dapat dianggap ruang kosong. Tangga terdiri dari dua jenis: mengarah ke depan atau ke belakang (mereka dapat direpresentasikan sebagai tepi kiri dan kanan segitiga sama kaki). Terkadang tangga berakhir dengan platform tempat pemain dapat berjalan.
Hanya ada 5 jenis ubin penting, dan pada setiap level mereka memiliki penampilan yang berbeda. Saya menyalin dan menempelkannya ke file gambar 16 ร 16 yang terpisah. Lalu saya menulis sebuah program membandingkan setiap ubin di setiap sub-langkah dengan set gambar yang sesuai. Jadi saya mendapat jenis matriks ubin untuk semua sub-langkah.
Matriks dapat diekstraksi langsung dari ROM, tetapi saya tidak dapat menemukan dokumentasi tentang bagaimana dan di mana data disimpan. Karena ruang ROM terbatas, data level biasanya disajikan dalam bentuk terkompresi yang menyerupai format grafik vektor. Setiap game menggunakan formatnya sendiri, jadi saya tidak menganggap perlu untuk melakukan penelitian, karena saya memiliki Pencipta Peta. Selain itu, saya masih membutuhkan gambar grafis dari sub-langkah. Jika saya tidak menangkap garis-garis latar belakang, maka saya harus menulis sebuah program yang menghasilkan gambar dari matriks.
Menemukan jalan
Setelah membuat matriks, saya ingin menerapkan algoritma pencarian jalur, yaitu, algoritma
Floyd-Warshall , yang memberikan tabel output yang berisi jalur terpendek antara masing-masing pasangan simpul dari grafik yang diarahkan dengan tepi tertimbang. Idenya adalah untuk pra-menghitung tabel dan menulisnya ke file, dan kemudian memuatnya selama pertandingan. Memiliki tabel dalam memori, bot dapat mencari dan langsung menemukan jalur terpendek di antara dua petak platform.
Grafik terdiri dari tepi dan simpul. Jika ubin platform adalah simpul, maka hanya operasi tepi yang dapat dilakukan Simon untuk berpindah dari satu platform ke platform lainnya. Operasi yang dilakukan hanya dalam satu ubin dilarang. Misalnya, di pesawat dari ubin, Simon hanya bisa memindahkan satu ubin ke kiri atau satu ubin ke kanan.
Demikian pula, jika Simon ada di tangga, maka ia dapat memindahkan satu ubin di salah satu dari dua arah yang mungkin.
Ini adalah operasi yang valid. Tetapi tindakan seperti bergerak dari titik tengah ubin ke tepi ubin terlalu fraksional, karena mereka tidak sesuai dengan transisi dari satu titik grafik ke yang lain.
Selain berjalan ke kiri dan ke kanan, menurun dan menaiki tangga, Simon bisa melompat ke ubin lain. Dan dia dapat melompat ke kiri atau ke kanan, mulai dari salah satu dari 16 piksel permukaan ubin. Untuk mengurangi jumlah tepi dalam grafik (dan ukuran tabel pencarian), saya hanya mempertimbangkan lima kemungkinan titik tolak:
Menambahkan operasi "tidak melakukan apa-apa", saya mendapat 15 operasi. Semuanya cukup sederhana sehingga bot dapat dengan mudah menentukan urutan penekanan tombol yang diperlukan untuk eksekusi mereka selama eksekusi game.
Untuk membangun grafik yang lengkap, saya membuat simulasi fisika Simon dunia yang sangat sederhana. Dalam simulasi ini, semua 15 operasi dilakukan mulai dari setiap ubin platform. Grafik dibuat dengan hanya mengamati di mana Simon berada. Lebih khusus lagi, ketika menentukan koordinat awal dan operasi, simulasi memberikan koordinat akhir pada output. Jika tidak ada koordinat akhir, misalnya, ketika Simon mencoba masuk ke dinding atau ke dalam lubang, maka program kembali bahwa operasi tidak valid dan tepi ini bukan bagian dari grafik.
Untuk membuat simulasi ini, diperlukan penelitian menyeluruh tentang Simon Belmont. Tidak seperti platformer klasik lainnya, di mana pemain dapat berakselerasi dari berjalan ke berlari, Simon, ketika bergerak secara horizontal, selalu bergerak tepat 1 pixel per frame. Ini berlaku untuk berjalan, melompat, menaiki tangga, dan bahkan ketika melempar balik ketika menyerang musuh.
Membatasi kecepatan horizontal sangat menyederhanakan pengakuan hambatan. Permainan memeriksa apakah ada dinding dalam satu piksel di depan karakter, dan jika perlu menghentikan gerakan. Tes dilakukan di bawah tingkat kepala, yang memungkinkan kepala untuk lewat di bawah langit-langit rendah tanpa mengganggu gerakan horizontal.
Gerakan vertikal sedikit lebih rumit. Jika Simon keluar dari tepi platform, alih-alih akselerasi bertahap, ia langsung jatuh dengan kecepatan 8 piksel per frame. Karena setiap ubin memiliki tinggi 16 piksel (yang merupakan kelipatan dari 8), pengenalan tanah disederhanakan. Pada saat yang sama, pemain mempertahankan kecepatan horizontal 1 pixel per frame ke arah yang diperoleh segera sebelum jatuh.
Sprite Simon memiliki lebar 16 piksel, namun dapat melayang di atas blok dengan maksimum ยฑ 4 piksel dari titik tengahnya. Jika Anda bergerak sedikit lebih, maka itu akan jatuh di bawah.
Menariknya, jika dia meninggalkan platform dan jatuh tepat 1 ubin pada kecepatan 1 horizontal dan 8 piksel vertikal per frame, maka dia tidak akan berdiri di blok saat mendarat. Salah satu kakinya akan tetap berada di dalam dinding hingga kedalaman 2 piksel.
Setelah itu, dia akan bisa keluar dari tembok, tetapi tidak masuk ke dalamnya.
Simon tidak dapat mengubah arah selama lompat. Setelah menekan tombol A, ia membuat jalur tetap di sepanjang parabola.
Di bagian atas, Simon naik 36 piksel, yang memungkinkannya untuk melompat ke platform 2 ubin tinggi. Dan bagian atas "parabola" secara mengejutkan datar. Tampaknya membeku di ruang angkasa selama 9 frame penuh, mungkin untuk menyederhanakan pukulan cambuk di udara. Jika Simon tidak memiliki apa pun untuk mendarat, maka gerakan parabola berlanjut sampai ia kembali ke ketinggian aslinya. Setelah itu, mulai jatuh pada kecepatan 8 piksel per bingkai, yaitu, dengan kecepatan jatuh yang sama konstan dari platform.
Ketika ada platform tepat di atas kepala karakter, melompat tidak diperbolehkan.
Jika tidak, ia sebagian "melompat" ke ubin platform.
Seperti yang dinyatakan sebelumnya, jika Simon menyentuh lebih dari bagian atas kepalanya, dia berhenti bergerak secara horizontal. Ini cukup menjengkelkan di akhir tahap pertama level 4, ketika pemain mencoba untuk keluar dari gua.
Tangga memungkinkan Anda untuk bergerak bebas secara vertikal antar platform.
Dalam satu kasus, Simon naik tangga, melewati ubin platform. Berada di tangga, ia bisa leluasa melewati tembok.
Pada platform seluler level 4, pemain biasanya berjongkok di bawah stalaktit yang menggantung rendah. Namun, Anda bisa bangkit dan bersandar pada mereka. Dalam situasi seperti itu, permainan membatasi gerakan horizontal, dengan cepat menyeret Simon ke dalam perangkap air.
Sebuah simulator fisika yang menghasilkan grafik berorientasi menganggap Simon persegi panjang. Gerakan persegi panjang ini dibatasi oleh aturan gerakan yang dijelaskan di atas. Agar bot tidak melompat dari satu tempat ke tempat lain seperti kelinci, tepi lompatan hitungan diberi biaya yang lebih tinggi daripada tepi berjalan dan bergerak di sepanjang tangga.
Tabel yang dihasilkan oleh algoritma pencarian jalur berisi jarak terpendek untuk setiap ubin awal dan akhir (total biaya path) dan deskripsi langkah pertama path. Deskripsi ini mencakup operasi pertama yang harus dilakukan di jalur ini, dan ubin tempat karakter akan setelah itu selesai. Seluruh jalur dapat diciptakan kembali dengan pencarian berulang dalam tabel, yang masing-masing memberikan langkah berikutnya ke arah ubin terakhir.
Dalam beberapa sub-langkah, kolom tidak terhubung sepenuhnya. Misalnya, pada level 4, platform adalah satu-satunya cara untuk menyeberangi jurang. Dalam sub-langkah seperti itu, tabel berisi metode untuk bergerak di sekitar masing-masing pulau, tetapi tidak di antara mereka.
Beberapa blok destruktif berisi benda-benda tersembunyi. Dan penghancuran blok mengubah grafik ini. Untuk mengatasi masalah ini, algoritma untuk menemukan jalur dengan dan tanpa blok pisah diterapkan pada sub-langkah. Saat run time, CastlevaniaBot memonitor keadaan blok yang akan dipisah dan menggunakan tabel pencarian yang sesuai.
Status permainan
CastlevaniaBot terintegrasi ke dalam Nintaco melalui
API-nya . Ini mendaftar implementasi
FrameListener
untuk menerima pengembalian di setiap frame. Karena emulator berjalan sekitar 60 frame per detik, pendengar ini perlu dikembalikan tepat waktu; perhitungan panjang atau downtime akan memperlambat atau memblokir emulator. Dalam waktu singkat, CastlevaniaBot membaca keadaan permainan, menentukan tujuan utamanya, mengganti strategi jika tujuannya telah berubah dan memenuhi strategi saat ini.
CastlevaniaBot membaca keadaan Simon Belmont saat ini langsung dari RAM prosesor. Tapi saya tidak bisa menentukan bagaimana objek game lain diwakili dalam memori. Oleh karena itu, CastlevaniaBot membaca langsung dari memori atribut objek (Object Attribute Memory, OAM) - area yang menyimpan daftar sprite yang ditampilkan.
Teknik ini berfungsi dan umumnya berlaku untuk game lain, tetapi memiliki banyak kelemahan. Urutan sprite di OAM terus berubah. Jika ada beberapa contoh dari jenis musuh yang sama di layar pada saat yang sama, maka satu-satunya cara untuk melacak mereka adalah menentukan kedekatan mereka, untuk membandingkan koordinat sprite terakhir dengan koordinat dari frame sebelumnya.
Beberapa objek game terdiri dari sprite berulang, seperti menara tulang.
Pindah platform terdiri dari satu sprite berulang 4 kali.
Menyortir kedua kasus ini membutuhkan logika tambahan, yang mudah diterapkan. Pembaruan senjata sekunder dan beberapa jenis senjata sekunder sendiri menggunakan sprite yang sama. Lebih buruk lagi, pada level 5, para Ksatria meminjam sprite senjata sekunder Simon.
Untungnya, dengan pengecualian air suci, CastlevaniaBot hanya menggunakan senjata sekunder di mana peningkatan biasanya tidak tersedia, seperti dalam perkelahian bos. Dan sprite upgrade air suci berbeda dari sprite yang digunakan saat casting.
Beberapa objek permainan berkedip selama pembuatan, misalnya, bola kristal di ujung perkelahian bos, kepang kematian dan tubuh Dracula. Flashing sprite muncul dan menghilang dari OAM, jadi diperlukan logika tambahan untuk melacak objek-objek ini.
Perlu juga dicatat bahwa karena keterbatasan perangkat keras, SEN hanya dapat menampilkan 8 sprite per baris raster. Karena prioritas sprite sebagian tergantung pada indeks mereka dalam OAM, urutan di setiap frame dicampur secara acak untuk menghindari perubahan yang membuat satu sprite tidak terlihat terus-menerus. Beberapa sprite menyala pada gilirannya, secara bertahap mengubah prioritas mereka. Kedipan ini tidak memengaruhi pembacaan sprite dari OAM. Data masih tetap ada, tetapi perangkat keras yang ditiru tidak menampilkannya. Ini berbeda dari situasi yang dijelaskan di atas dengan berkedip ketika membuat sprite. Selain itu, Nintaco memiliki opsi yang secara signifikan mengurangi flashing perangkat keras.
Dan akhirnya, sebagian kecil dari status permainan dibaca dari tabel nama PPU - area memori yang berisi semua data latar belakang. Ini termasuk memeriksa blok yang dapat dirusak dan melacak posisi "crush" di level 2.
Mesin Negara Heuristik
Strategi adalah mesin negara. CastlevaniaBot mendefinisikan mereka sebagai kelas abstrak dengan metode
init
dan
step
. Metode
init
dipanggil ketika CastlevaniaBot beralih ke strategi yang sesuai, memungkinkan mesin negara untuk mengatur ulang. Dan metode
step
menjalankan strategi. Sebagai contoh, metode strategi
step
untuk memeriksa orang ikan untuk melihat apakah seekor ikan berada dalam kisaran cambuk, dan jika demikian, bot memukul dengan cambuk. Kalau tidak, ia memeriksa apakah mungkin untuk mencapai jarak serangan dengan lompatan, dan jika demikian, bot melompat. Dan akhirnya, jika bot terlalu dekat dengan musuh, maka bot menjauh darinya. Dengan aturan sederhana ini, CastlevaniaBot mengalahkan ikan manusia.
Untuk menyederhanakan strategi menulis sebanyak mungkin, saya membuat perpustakaan tindakan yang mungkin dilakukan. Misalnya, alih-alih menekan dan melepaskan tombol A untuk melompat, bot hanya memanggil metode lompat dari perpustakaan. Dan sebelum itu, dia bertanya ke perpustakaan apakah Simon ada di peron dan bisa melompat.
Mendekati dan menjauh dari target adalah tindakan standar yang dilakukan menggunakan operasi dari tabel yang dibuat oleh algoritma pencarian jalur. Misalnya, strategi lilin menggunakan metode pustaka
routeAndFace
, yang tidak hanya mengarahkan Simon ke beberapa koordinat tertentu, tetapi juga memutarnya ke kiri atau ke kanan setelah mengenai mereka. Selain itu, tergantung pada ketinggian lilin, strategi melakukan lompatan atau jongkok sebelum memukul cambuk. Sebuah benda yang jatuh dari lilin akan tercipta di udara dan akan jatuh atau perlahan-lahan jatuh ke tanah. Strategi pickup mengarahkan Simon ke ubin terdekat tepat di bawahnya sebelum item menyentuh tanah.
Untuk menjauh dari musuh, perpustakaan perlu tahu cara bergerak ke kiri atau kanan tanpa jatuh ke lubang. Secara umum, ini dicapai dengan mencari jalur ke tepi kiri atau kanan sub-tahap. Tetapi di beberapa daerah, jalur terpendek ke tepi kiri pada awalnya mengharuskan pindah ke kanan, dan sebaliknya. Ketika masalah seperti itu muncul, saya menambahkan logika khusus untuk sub-tahap, mengarahkan Simon ke tepi kiri dan kanan platform saat ini.
Panduan
Pada bagian ini, saya akan menjelaskan secara terperinci strategi yang digunakan oleh CastlevaniaBot, mengomentari keseluruhan langkah-langkah.
Permainan dimulai di halaman di depan kastil. Objek dalam bingkai diatur untuk memilih target utama, yang dalam hal ini adalah kolom dengan nyala api. Strategi kolom memberitahu bot untuk mendekati kolom dan menggunakan cambuk ketika itu dalam jangkauan.
Setelah memukul cambuk dan menghancurkan kolom, item dibuat. Prioritas semua item lebih tinggi daripada kolom nyala. Akibatnya, CastlevaniaBot bereaksi terhadap ini menggunakan strategi untuk mengumpulkan item yang muncul sebelum pindah ke kolom berikutnya.
Saat memeringkat objek, CastlevaniaBot selalu memperhitungkan tujuan jangka panjang - untuk menyelesaikan level sebelum waktu habis. Saat membuat daftar sasaran potensial, pintu ke tingkat berikutnya selalu ditambahkan ke sana. Pintu diberi prioritas rendah, tetapi setelah penghancuran semua kolom dan pengumpulan semua objek, itu menjadi prioritas. Dengan hanya satu pengecualian: CastlevaniaBot tahu cara mengungkap semua harta karun, dan melompati pintu masuk kastil untuk membuat kantong uang yang berkedip.
Setelah memasuki kastil, CastlevaniaBot melihat hantu dan lilin. Lilin dan barang-barang kerajinan didahulukan sampai hantu mendekat.
Seringkali cambuk menghancurkan musuh tanpa menyentuh mereka. Saya menemukan meja persegi panjang tabrakan di ROM game, jadi CastlevaniaBot tahu persis kapan sesuatu berada dalam lingkup cambuk. Dan karena tabrakan persegi panjang sering menonjol sedikit di luar batas sprite, cambuk bisa mengenai "bagian yang tak terlihat".
Dalam kebanyakan kasus, ketika menghancurkan lilin, CastlevaniaBot melompat secara vertikal, bukan maju. Ini adalah taktik penghindaran risiko. Karena berada di udara, mustahil untuk mengubah arah gerakan, kerumunan musuh yang mendekat dapat mempersulit pendaratan yang aman atau membuatnya tidak mungkin. Selain itu, dengan lompatan vertikal, CastlevaniaBot tetap berada di blok yang sama; dia tidak perlu memeriksa apakah lompatan itu akan menyebabkan jatuhnya platform yang lebih rendah atau dasar lubang.
Ketika tidak ada lilin yang harus dihancurkan atau benda yang akan dikumpulkan, CastlevaniaBot mulai mengejar hantu. Tetapi "Strategi Panther" memerintahkannya untuk berdiri diam, menunggu musuh jatuh dalam batas-batas serangan cambuk.
Selain fakta bahwa lilin berfungsi sebagai sumber hati dan benda lain, mereka memandu pemain di sepanjang jalan melalui panggung. Sebagai contoh, pada gambar di bawah ini, lilin di sudut kanan atas "mengundang" pemain untuk naik tangga. Namun, untuk naik tangga, pemain awalnya harus ke kiri, itulah sebabnya lilin menghilang dari layar. Karena solusi CastlevaniaBot didasarkan pada penentuan prioritas objek yang terlihat di layar, situasi ini dapat menyebabkan siklus tanpa akhir di mana bot secara bergantian memilih jalur terpendek ke lilin (ke kiri) atau jalur terpendek ke pintu keluar (ke kanan).
Masalah serupa dapat diselesaikan dengan beberapa cara. Misalnya, CastlevaniaBot dapat dilengkapi dengan menyimpan objek, memahami bahwa objek terus ada, bahkan jika mereka tidak terlihat. Tetapi untuk ini, semua sama, dari awal mereka perlu dilihat. Jika lilin bahkan lebih ke kanan, maka setelah deteksi mereka, akan perlu untuk kembali lebih jauh.
Dengan pemikiran ini, saya menambahkan insentif yang mendorong CastlevaniaBot untuk menjelajahi area panggung yang biasanya dia abaikan. Insentif ini bekerja dengan cara yang sama untuk keluar dari pintu, menggambar CastlevaniaBot ke mana ia harus pergi. Selain itu, saya menambahkan aturan yang membuatnya mengabaikan lilin dan benda yang terlalu jauh (dalam hal jarak yang ditempuh, dan tidak dalam garis lurus).
Setelah menaiki tangga dan menghancurkan lilin, air suci dibuat - yang paling berharga dari semua senjata sekunder. CastlevaniaBot memilihnya dengan menukar belati untuk itu.
Seperti halnya kantong uang di awal permainan, CastlevaniaBot tahu tentang semua balok yang dapat dirusak dengan benda tersembunyi, dan untuk menghancurkan balok dengan cambuk, ia menggunakan strategi yang mirip dengan strategi lilin.
Dengan pergerakan lebih lanjut dari CastlevaniaBot, Anda akan melihat bahwa itu mulai menggunakan air suci untuk menghancurkan hantu dan lilin. Ini mungkin tampak berlebihan, tetapi memiliki tujuan penting. Castlevania memberi penghargaan kepada pemain karena menggunakan senjata sekunder dengan eksposur ganda dan tiga kali lipat. Dengan kata lain, CastlevaniaBot melakukan upgrade senjata sekunder.
Setelah menekan tombol B ada penundaan 16 frame sebelum memukul cambuk. Cambuk tetap panjang untuk 10 bingkai tambahan, tetapi hanya berlaku di yang pertama dari sepuluh frame ini. CastlevaniaBot menggunakan fakta ini untuk meningkatkan tujuan. Secara khusus, ia melacak kecepatan semua objek dalam bingkai, dengan asumsi bahwa target utama akan terus bergerak di sepanjang jalur linier. Dia kemudian menekan tombol B 16 frame sebelum target harus bertemu dengan cambuk. Musuh selalu dapat mengubah arah selama 16 frame ini, tetapi biasanya ini berfungsi heuristik sederhana.
Namun, setelah melewati pintu, CastlevaniaBot bertemu kelelawar merah. Seperti kepala ubur-ubur, kelelawar merah terbang melintasi layar, terbang melalui sinusoid melalui platform dan tangga. Untuk memprediksi di mana kelelawar merah akan berada setelah 16 frame, saya mencatat pergerakan salah satu dari mereka dalam sebuah tabel. Selama pelaksanaan permainan, CastlevaniaBot melacak kelelawar dan menunggu puncak atau terendah lintasan di mana kecepatan vertikal mengubah tandanya. Kemudian dia dapat membandingkan koordinat dengan nilai-nilai dalam tabel yang telah dibuat sebelumnya. Ini memungkinkan strategi yang tepat untuk memukul kelelawar merah dengan cambuk, membungkuk, atau memantul.
Selama bagian (speedrana) dari Castlevania, pemain melakukan manuver yang membuat permainan set deterministik mungkin. Sebagai contoh, mereka menemukan bahwa jika pada akhir level 1 menghancurkan blok dan mengambil upgrade senjata dalam urutan waktu tertentu, bos akan berperilaku sesuai dengan pola yang diinginkan, yang memungkinkannya untuk dengan cepat mengalahkan.
Tidak peduli seberapa berpengalamannya orang, mereka tidak dapat sepenuhnya menjinakkan generator angka acak. Namun demikian, karena CastlevaniaBot dapat mengontrol penekanan tombol dengan akurasi frame-by-frame, itu dapat membawa konsep kecepatan bagian ke batasnya, setiap kali melewati permainan dengan cara yang benar-benar identik. Jika dia melakukannya, itu tidak akan lebih baik daripada melewati
TAS . Oleh karena itu, CastlevaniaBot secara sewenang-wenang menambah kesalahan dan menunda tindakannya menggunakan generator nomor acak eksternal untuk menghindari gameplay deterministik. Misalnya, ketika ia memukul dengan cambuk, lilin yang terletak tinggi, ia sengaja menambahkan penundaan untuk sejumlah frame acak untuk melompat dan menyerang. Perubahan kecil ini secara signifikan mempengaruhi kemajuan permainan.
Meskipun CastlevaniaBot berupaya menghindari determinisme, ia tetap meminjam satu konsep dari speedrunning:
damage boosts . Dalam 50% kasus, CastlevaniaBot sepenuhnya menghindari jalannya ruang bawah tanah ikan manusia dengan melompat kembali ke kelelawar merah, yang melemparkannya ke platform yang tidak terjangkau.
Dalam setengah kasus lainnya, CastlevaniaBot memilih untuk bertarung dengan ikan manusia. Bola api mereka memiliki prioritas tinggi dan CastlevaniaBot memukul mereka dengan cambuk, dodges, atau mental tergantung pada situasinya.
Karena sulitnya menciptakan musuh dan bola api mereka, sebagian besar pemain biasanya menjalankan bagian dengan ikan manusia. Tapi CastlevaniaBot menghabiskan waktu pada mereka, mengumpulkan semua hati dan bahkan harta karun di tepi paling kanan. Bot tahu persis barang apa yang terkandung di dalam setiap lilin, dan karena dia lebih suka menggunakan air suci, dia melewatkan lilin tempat kronometer disembunyikan. Namun, jika Anda tetap di bagian ini dan bertarung dengan orang-orang ikan, kadang-kadang Anda pasti bisa mengambil kronometer.
Tahapan sering berakhir dengan salib menghancurkan semua musuh di layar. Jika Anda penasaran, saya akan mengatakan bahwa salib tidak dapat membunuh bos di akhir level. Bahkan, persilangan terkadang dibuat bahkan saat bos berkelahi. Misalnya, dalam pertempuran dengan Medusa, salib terkadang muncul saat membunuh ular. Tapi persilangan ini hanya bisa membunuh ular lain.
Setelah melewati pintu, CastlevaniaBot bertemu hantu lagi. Pada tangkapan layar di bawah, ia ingin melompat ke platform yang lebih rendah, tetapi hantu mencegahnya bergerak. Ketika sebuah tabel yang dibuat oleh algoritma pencarian jalur memberitahu CastlevaniaBot untuk melompat, itu memeriksa ruang di sekitar platform target. Jika ternyata dia mendarat di musuh, maka lompatan tidak dilakukan. Dalam hal ini, mekanisme ini membuat CastlevaniaBot menunggu hantu untuk membebaskan tempatnya.

Aturan "periksa musuh sebelum melompat" ini mengilustrasikan salah satu prinsip struktur CastlevaniaBot: aturan ini harus diatur dengan aturan sederhana yang dibuat secara umum. Di beberapa bagian permainan, perlu untuk menggunakan strategi satu kali yang memecahkan masalah yang sangat spesifik. Namun dalam sebagian besar permainan, aksi bot didorong oleh heuristik yang dapat digunakan kembali. Saya tidak menulis tim yang membuatnya berhenti pada titik tertentu dan menunggu hantu keluar dari jalan mereka. Perilaku ini muncul sebagai akibat heuristik.
CastlevaniaBot menyelesaikan level dengan membunuh Phantom Bat dengan tiga air suci. Tetapi strategi serangannya ditentukan oleh senjata sekundernya. Faktanya, jika dia tidak memiliki senjata sekunder, dia siap untuk membunuh bos dengan cambuk tunggal. Kasus yang sangat menarik adalah pembunuhan seekor Phantom Bat dengan kapak. Demikian pula halnya dengan kelelawar merah, saya mencatat di meja gerakan kapak di sepanjang parabola. Selama pelaksanaan permainan, CastlevaniaBot melakukan offset meja dengan mencocokkannya dengan masing-masing ubin lantai. Ini memungkinkan Anda menghitung titik optimal untuk membunuh bos dengan kapak.
Tepat sebelum mengambil bola kristal, CastlevaniaBot melempar senjata kedua ke arah yang berbeda, mengetahui bahwa itu akan membeku di udara setelah menyentuh bola. Kemudian dia secara acak melompat berulang-ulang dan memukul dengan cambuk, berharap membeku dalam pose yang aneh.
Pada awal level 2, CastlevaniaBot menghindari lilin pertama di mana bumerang disembunyikan. Strategi bekerja dengan seorang ksatria-tombak adalah kampanye melawan strategi hantu atau orang ikan, tetapi ini adalah musuh pertama yang membunuh yang membutuhkan dua pukulan. Kelelawar hitam tidur siang sampai Anda dekat dengannya, setelah itu lepas landas dan bergerak cukup linier untuk dibunuh dengan cambuk menggunakan heuristik sederhana yang disebutkan di atas.
Setelah menghancurkan batu bata tembok, dalam 50% kasus, CastlevaniaBot tampaknya meninggalkan ruangan tanpa mengangkat mahkotanya. Tapi benarkah begitu? Bahkan, dalam kasus seperti itu, dia mengambil mahkota, menggunakan bug dari permainan. Karena ujung tangga atas bertepatan secara horizontal dengan lokasi mahkota, pemain, ketika melintas ke atas dan di belakang layar, turun sebentar. Jika Anda mendengarkan suara atau melihat kacamata, Anda dapat melihat bahwa bot benar-benar mengambil mahkota.
Pada level 2, musuh tidak menyerang pemain saat ia berada di platform bergerak. CastlevaniaBot hanya perlu menunggu platform mendekat, memasuki platform, menunggu hingga mencapai sisi lain, dan kemudian turun. Ada sedikit variasi untuk platform yang tidak menyentuh ubin di sisi lain. Dalam kasus seperti itu, CastlevaniaBot tidak turun, tetapi melompat dari platform.
Sebuah pintu mengarah ke koridor yang penuh dengan kepala terbang, dan CastlevaniaBot bereaksi terhadap ini dengan bergerak maju. Seperti halnya dengan platform seluler, CastlevaniaBot tahu bahwa strategi ini perlu diterapkan berdasarkan posisinya, daripada memprioritaskan objek game di layar. Namun, begitu semua kepala ubur-ubur terbang, ia beralih kembali ke teknik ini untuk memilih strategi yang akan digunakan lebih lanjut.
Strategi lain, tergantung pada posisinya, dipicu setelah menaiki tangga berikutnya yang mengarah ke daerah yang dipenuhi kepala ubur-ubur. Dalam 50% kasus, CastlevaniaBot sengaja melompat di atas kepala ubur-ubur untuk mendapatkan dorongan kerusakan, mendorongnya ke platform atas di sebelah pintu yang mengarah ke tahap berikutnya. Ini adalah satu-satunya dua peningkat kerusakan yang diketahui CastlevaniaBot. Tidak seperti pelari cepat, itu tidak mengeksekusinya untuk menghemat waktu, ini hanyalah kontribusi lain untuk non-determinisme bagian ini.
Melewati naksir adalah strategi berbasis posisi yang menarik, diulang tiga kali. CastlevaniaBot menunggu hingga "crush" terdekat di sebelah kiri mencapai posisi yang diinginkan, setelah itu berjalan melewatinya. Setelah melewatinya, ia berhenti, berbalik, memukul lilin dengan cambuk, mengambil objek yang dibuat dan mengulangi operasi dengan "himpitan" berikutnya. Salah satu objek berpotensi air suci, sehingga selalu menghancurkan lilin ini.Setelah "naksir", hantu dan menara tulang pertama kali muncul. Hantu sangat mudah dibidik, tetapi untuk membunuh mereka, Anda perlu beberapa serangan. Bahkan lebih mudah untuk membidik menara tulang karena mereka tidak bergerak. Strategi yang sama digunakan untuk bola api mereka seperti bola ikan-manusia.Level 2 biasanya berakhir dengan CastlevaniaBot langsung membunuh Medusa dengan aliran air suci yang tak ada habisnya. Namun, dia siap untuk bekerja dengan senjata jenis lain apa pun.Pada level 3 muncul jumper. CastlevaniaBot bereaksi terhadap mereka dengan menunggu mereka melompat ke batas cambuk. Jika jumper melompat pemain, maka CastlevaniaBot bergerak ke arah yang berlawanan dan memukul mereka dengan cambuk sebelum mereka menyentuh tanah.Kemudian kerangka putih muncul. Mereka memiliki pola yang sangat acak. Selain itu, mereka melempar tulang. Pada level 3, CastlevaniaBot mencoba menghindari pemukulan. Tetapi saya menemukan bahwa pada level berikutnya, tulang hanya mengganggu, dan akan lebih efisien jika mengabaikannya. Strategi CastlevaniaBot untuk kerangka putih adalah dengan hanya mengalahkan mereka.CastlevaniaBot menunggu burung gagak terbang. Kemudian, berdasarkan ketinggian gagak relatif terhadap pemain, ia secara akurat menghitung kapan harus memukul dengan cambuk setelah lompat.Setelah pindah ke tahap berikutnya, CastlevaniaBot secara independen mengenai lilin dari mana kronometer muncul, dan kemudian menunggu sampai menghilang. Sedikit di depan dan di belakang layar adalah gagak. Bot menghancurkan lilin sebelum pertarungan gagak untuk mengurangi risiko memukul mereka secara tidak sengaja dan mendapatkan senjata sekunder yang tidak diinginkan.Tepat di depan lokasi mumi, CastlevaniaBot berbelok ke kiri ke platform untuk memicu munculnya kantong uang tersembunyi. Dia melakukan ini hanya untuk kepentingan, karena dia tidak dapat mengangkatnya dengan cara apa pun.Selanjutnya, CastlevaniaBot sengaja memukul lilin dari mana belati jatuh. Seperti dalam kasus kronometer, ia melakukan ini agar tidak mengambilnya secara kebetulan selama tindakan selanjutnya.Dan akhirnya, mumi dikalahkan oleh hujan dari air suci.CastlevaniaBot siap menggunakan senjata sekunder apa pun untuk melawan semua bos. Faktanya, strategi untuk menggunakan senjata sekunder berubah sepenuhnya jika, karena suatu alasan, blok berisi sepotong daging babi dihancurkan. Tanpa blok ini, tidak mungkin untuk naik ke platform atas, itulah sebabnya Anda harus bertarung di level bawah.Pada level 4, platform seluler kembali. Dan kali ini ada kemungkinan kelelawar merah akan muncul di jalan. Untuk mengurangi kemungkinan serangan mereka, ia mengharapkan kedatangan platform bertepatan dengan penghancuran kelelawar merah. Karena tikus merah muncul pada interval tetap, ini memberi CastlevaniaBot cukup waktu untuk menyeberangi lubang air tanpa kelelawar. Dia siap berurusan dengan kelelawar dan orang ikan yang muncul secara acak saat berada di peron, tetapi ini membuat melompat ke dan dari peron sangat berbahaya. Strategi yang digunakan oleh CastlevaniaBot meningkatkan kemungkinan keberhasilannya.Strategi yang sama diulang di tengah panggung. Kali ini, lompatan ke platform yang bergerak jauh lebih lama, jadi sangat penting untuk menghancurkan kelelawar merah sebelum melompat.Seperti yang ditunjukkan pada tangkapan layar di atas, lilin selalu terletak pada jarak 64 piksel dari satu sama lain. Mungkin ini adalah artefak dari fakta bahwa data level disajikan dalam ROM dalam format yang mirip dengan grafik vektor, menghemat ruang. Tetapi untuk beberapa alasan, para desainer memutuskan untuk menyelaraskan lilin tidak dengan pusat, tetapi dengan tepi ubin. Dalam hal ini, lilin disejajarkan dengan kedua ujung platform. Karena itu, setelah mengenai mereka, sebuah objek yang muncul mungkin jatuh langsung ke dalam jurang air di bawahnya.Saya pikir pada tahap tertentu, para desainer menyadari masalah ini. Tetapi pada saat itu, menggeser seluruh rangkaian lilin di semua tingkat yang telah selesai untuk menyelaraskannya dengan pusat ubin bisa menyebabkan masalah lain. Sebagai gantinya, mereka memutuskan untuk secara acak menggeser lilin satu piksel ke kanan atau kiri tempat lilin itu dibuat. Oleh karena itu, setelah mengenai lilin di sisi kanan tangkapan layar, ada kemungkinan 50% bahwa air suci yang terkandung di dalamnya akan jatuh pada platform. Dalam sisa setengah dari kasus, itu jatuh ke air.CastlevaniaBot biasanya sepenuhnya menghindari lilin ini karena berhasil mempertahankan air suci. Tetapi jika dia membutuhkannya, maka dia bangun sangat dekat dengan lilin-lilin ini untuk menjamin pemilihan air suci yang telah jatuh dari mereka.Selanjutnya CastlevaniaBot bertemu banyak jumper. Di daerah ini, setelah membunuh jumper, kapak sering muncul. CastlevaniaBot menghindarinya, karena air suci sangat berguna saat melawan bos.Saat bergerak ke tahap terakhir level, CastlevaniaBot sepenuhnya mengabaikan tulang naga.Tapi dia menyingkirkan dua berikutnya dengan pukulan cambuk cepat.Monster dan Igor Frankenstein dihancurkan oleh aliran konstan pukulan dengan cambuk dan air suci. Seperti bos lainnya, CastlevaniaBot dapat menangani senjata sekunder lainnya juga, atau tanpa mereka sama sekali. Namun, peluang bertahan hidup tanpa air suci berkurang.Pada level 5, CastlevaniaBot sekali lagi berurusan dengan kerangka putih. Tapi kali ini, dia menggunakan variasi strategi yang jarang terlihat di level 3. Tergantung di mana mereka muncul, CastlevaniaBot melempar air suci dan kemudian melangkah mundur untuk menggambar kerangka ke dalam api. Di dekat tangga, dia lewat di bawah kerangka untuk mengarahkan mereka ke tempat mereka seharusnya.Pada level 5, kerangka merah terlahir kembali pertama kali muncul. CastlevaniaBot melacak waktu hit terakhir pada mereka, untuk mengetahui kapan aman melewati tulang merah.
Ruang pertama tahap 14 sepenuhnya diproses oleh satu strategi besar. CastlevaniaBot pertama yang membunuh pelompat. Kemudian dia menunggu ksatria bagian bawah untuk melemparkan kapak, menabrak kapak dengan cambuk dan perlahan-lahan menaiki tangga yang lebih rendah. Ini mendorong ksatria yang lebih rendah di belakang layar, yang mengarah pada kepergiannya. Kemudian dia menunggu sampai area atas bebas dari kapak, mengenai lilin dan mengumpulkan benda-benda yang muncul. Kemudian dia mendekati pijakan tangga menuju ke ksatria atas. Ketika ksatria atas melempar kapak tinggi, CastlevaniaBot mengejarnya. Ini mendorong ksatria atas ke kiri dan hampir sepenuhnya dari layar, tetapi tidak menghancurkannya. CastlevaniaBot membungkuk di bawah kapak yang kembali, dan mungkin di bawah kapak yang ditinggalkan kedua, dan akhirnya mendekati tangga ke sub-tahap berikutnya. Hore!
Setelah melewati beberapa tangga, CastlevaniaBot kembali bertemu dengan seorang ksatria dengan kapak. Dia menggunakan air suci untuk membiusnya, lalu menghabisinya dengan cambuk. Jika tidak ada air suci, dia terus memukul dengan cambuk, mengejar ksatria sampai dia mati.Pindah ke atas tangga tingkat 5, CastlevaniaBot sering harus menunggu kerangka merah untuk menjauh dari bagian atas atau bawah tangga. Menjelang akhir level, menara tulang membuat tugas ini semakin sulit. Tergantung pada bagaimana kerangka memutuskan untuk bergerak, CastlevaniaBot berjalan turun dan menaiki tangga hingga bisa lewat.
Untuk memproses kelompok kerangka merah, logika tambahan diperlukan agar bot tidak jatuh ke loop tanpa akhir. Jika CastlevaniaBot akan mengalahkan mereka secara terpisah dengan cambuk, dengan interval sehingga hit pertama punya waktu untuk menghidupkan kembali, maka itu akan jatuh ke dalam siklus di mana ia akan terus menghancurkan kerangka yang menghidupkan kembali tanpa henti. Untuk menghindari ini, CastlevaniaBot tidak akan memukul dengan cambuk kerangka merah yang berdiri di samping tumpukan tulang merah. Aturan ini memungkinkan tulang merah terlahir kembali di sebelah kerangka merah yang masih hidup, sehingga memungkinkan untuk mengenai keduanya secara bersamaan. Tanpa jeda antara kehancurannya, sebuah siklus tidak akan tercipta.
Untuk menghindari kepala ubur-ubur di koridor panjang menuju Kematian, bot tidak pernah berhenti, memukau para ksatria yang biasanya muncul di jalan. Dia mengambil keuntungan dari kenyataan bahwa pemain dapat melewati musuh yang terpana oleh air suci tanpa mengalami kerusakan.Jika tidak ada air suci, maka tepat di depan koridor CastlevaniaBot dapat mengambil bumerang. Dengan serangkaian keadaan yang berhasil, ia menggunakannya untuk menghancurkan para ksatria, serta untuk mendapatkan peningkatan senjata.CastlevaniaBot setrum Kematian dengan air suci sebelum dia mulai membuat kepang, dengan cepat membunuhnya. Dia mungkin juga mengalahkan Kematian dengan bumerang tiga, tetapi ini biasanya membutuhkan beberapa upaya.Strategi utama CastlevaniaBot melewati jembatan di awal level 6 adalah terus bergerak. Dia memukul cambuk kelelawar besar dari atas untuk menyetrum mereka, dan kemudian memantul pada kelelawar besar yang muncul dari bawah. Selain itu, dari waktu ke waktu ia perlu menghindari bola api yang dilemparkan oleh kelelawar, atau memukulinya dengan cambuk.Jalur jembatan tidak dijamin. Itu semua tergantung pada seberapa ramah kelelawar besar itu.Pada sub-langkah berikutnya, CastlevaniaBot menggunakan kronograf jembatan dua atau lebih kali untuk melewati elang dan jumper. Tanpa kronograf, ia mencoba membuat jalan dengan cambuk.Ketika CastlevaniaBot mencapai Menara Dracula, ia dapat memanjat dan menurunkan tangga beberapa kali untuk membuat lilin lagi, yang memungkinkan Anda mengumpulkan setidaknya 20 hati.Lilin paling kanan di ruang Dracula memberikan air suci, yang diperlukan untuk melawan bentuk kedua Dracula.Untuk mengalahkan bentuk pertama Dracula membutuhkan 16 pukulan ke kepala. CastlevaniaBot mendekati Dracula beberapa kali, menunggunya menembak dengan bola api, dan kemudian melompati bola dan mengenai kepala Dracula dengan cambuk.Bentuk kedua Dracula, yang disebut Cookie Monster, tertegun oleh air suci oleh bot dan beberapa kali mengenai kepala dengan cambuk. Dari waktu ke waktu Cookie Monster melompat ke pemain, sementara CastlevaniaBot berkelit. Cookie Monster juga melempar bola api, yang biasanya dapat dihancurkan dengan air suci dan cambuk. Terkadang Anda bisa mendapatkan upgrade senjata. Dan air suci ganda menangkap Cookie Monster dalam siklus setrum konstan yang mengarah ke kemenangan cepat.CastlevaniaBot tidak dapat melalui Mode Sulit, yang dimulai setelah kredit akhir. Namun, setelah memulai ulang game di halaman kastil, game akan mereset byte siklus game menjadi nol, dan mengubahnya ke Mode Normal. Ini memungkinkan CastlevaniaBot untuk bermain tanpa henti.
File
CastlevaniaBot_2018-12-09.zipFile ini .zip
berisi:src
- pohon sumber.CastlevaniaBot.jar
โ .lgpl-2.1.txt
โ .
Luncurkan
- Nintaco โ NES.
Castlevania (U) (PRG1) [!].nes
โ ROM .
- Nintaco
Castlevania (U) (PRG1) [!].nes
. CastlevaniaBot.jar
.zip
.- Run Program, Tools | Run Program...
- JAR , Find JAR....
- Load JAR, .
- Run.
Copyright ยฉ 2018 meatfighter.com
. / LGPLv2.1. |