Anno 1800 Seed Finder and Visualizer
Pencari melewati semua biji untuk menemukan mereka yang memiliki skor tertinggi. Skor default adalah jumlah ubin tanah yang dapat dibangun. Untuk mempercepat hal -hal, itu juga memungkinkan daftar pulau -pulau yang tidak diinginkan. Pulau -pulau ini mungkin tidak muncul di dunia masing -masing. Pilihan yang jelas di sini adalah pulau -pulau dengan sungai.
Jenis peta, ukuran peta, ukuran pulau, dan kesulitan pulau dapat disesuaikan. Pencari bekerja dalam dua iterasi, penyaringan dasar dan kemudian langkah penyempurnaan benih cepat. Keduanya melakukan hal yang sama tetapi mereka masih memiliki tujuan mereka.
- Pasukan brute penyaringan dasar melalui semua 2147483648 kemungkinan benih untuk membuang pulau -pulau buruk secara universal (misalnya dengan sungai). Hasil disimpan ke disk. Kinerja sekitar 1 juta biji per detik per inti CPU, yang berarti runtime 2,5 menit yang nyaman pada 5950X. Jika tidak ada pulau yang tidak diinginkan yang didefinisikan, runtime kira -kira 4 kali lebih lama. Baseline tanpa sungai untuk peta lima dunia lama sudah termasuk.
- Penyempurnaan benih memuat benih yang dibuat pada langkah 1 dari disk. Karena relatif sedikit biji yang tersisa, penyempurnaan hanya membutuhkan waktu satu detik untuk dijalankan. Ini membuatnya mudah untuk memvisualisasikan banyak biji atau mengubah persyaratan. Secara khusus, jumlah NPC dan bajak laut hanya memiliki dampak kecil pada skor dan tidak ada dampak pada apakah pulau -pulau memiliki sungai atau tidak, sehingga baseline yang sama dapat digunakan untuk kombinasi NPC/bajak laut apa pun.
Pencari akan secara agresif mencoba menggunakan kembali file dasar, jadi jika Anda mengubah pulau -pulau yang tidak diinginkan dan ingin membuat garis dasar dari awal, Anda harus masuk ke folder biji dan secara manual menghapus file baseline yang ada.
Pencari juga akan memvisualisasikan peta dengan pulau dan NPC. Peta itu berisi Dunia Lama, Area Cape dan Dunia Baru, karena ini adalah dunia di mana benih memiliki dampak.
Instalasi
- Anda harus memiliki Python: https://www.python.org/downloads/ Lakukan kebalikan dari rekomendasi instal: Aktifkan kotak centang jalur dan jangan menginstal untuk semua pengguna.
- Paket Python dapat diinstal dari jendela CMD dengan: Pip Instal Numpy Pandas Matplotlib Pillow
- Jika PIP tidak ditemukan, Anda tidak memilih kotak centang jalur dan Anda perlu mengatur variabel lingkungan Anda (atau hanya menginstal ulang).
- Jika gagal karena izin, maka Python diinstal untuk semua pengguna dan bukan di direktori pengguna, jadi CMD harus dijalankan dari mode admin (atau hanya menginstal ulang).
- Klik kanan pada file Main.py dan pilih Edit dengan Idle. Sesuaikan pengaturan sesuai kebutuhan dan tekan F5 untuk dijalankan.
Catatan
Pencari hanya dapat menyaring melalui pemilihan pulau. Hal -hal yang tidak dapat disaring adalah: rotasi pulau; posisi pulau; kesuburan; slot penambangan.
Kesuburan dan slot penambangan khususnya adalah masalah yang cukup sulit karena mereka datang pada akhir penciptaan pulau. Untuk menempatkan hal -hal ke dalam perspektif, seluruh penempatan dan rotasi pulau+NPC dilakukan dengan 70 angka acak pertama dari Mersenne Twister. Kemudian permainan menarik sekitar 18000 angka lebih sebelum kesuburan dan slot penambangan diputuskan. Ada banyak kode permainan tambahan untuk diuraikan dan penyaringan akan cukup lambat bahkan ketika hanya menggunakan biji baseline.
Jika Anda ingin menjalankan skrip pengambilan sendiri (copypics.py, maptemplatestocsv.py, maptocsv.py), mereka berharap bahwa repositori memiliki dua folder tetangga, satu untuk arsipbreader dan satu untuk semua aset game yang diekstraksi dengan RDAExplorer. Yaitu folder ../filedbreader dan ../data harus ada.
Kode C pada dasarnya adalah versi yang sangat ramping (dan dilucuti) dari pembuatan peta di util.py. Yang terakhir tidak menolak lebih awal dan ditulis sebagian besar dalam Python, menghasilkan hanya 25 biji per detik per inti, sehingga bahkan bekerja dengan hanya data dasar tanpa penolakan lebih lanjut akan sangat lambat.
Aliran kode keseluruhan untuk setiap dunia (misalnya Dunia Lama, Dunia Baru, CAPE) adalah sebagai berikut:
- Inisialisasi generator nomor acak Mersenne Twister dari Perpustakaan Standar (STD :: MT19937) dengan benih yang diberikan oleh pengguna.
- Dari data/config/ekspor/utama/aset/aset.xml, muat semua item maptemplate. Bandingkan input pengguna yang sebenarnya (jenis peta, ukuran peta, ...) dengan item -item ini dan hanya menyimpan item yang cocok. Pilih secara acak salah satu item ini (std :: uniform_int_distribution). ;
- Template peta yang dipilih berisi jalur ke file A7T, yang tidak kami minati. Tetapi di sebelah file A7Tinfo, yang memiliki informasi tentang ukuran dunia dan juga memiliki slot pulau. Slot pulau memiliki koordinat dan ukuran dan juga mengetik dan ID. Generasi peta nanti adalah tentang slot yang cocok dengan pulau -pulau yang kompatibel (dalam hal ukuran dan jenis dan ID). maptocsv.py mengambil data a7tinfo ini.
- Terlepas dari peta, semua pulau dimuat. Assets.xml memiliki entri Randomisland yang menentukan FilePath (untuk A7M), wilayah, kesulitan, pulau (yang sebenarnya adalah ID yang cocok dengan slot.id). Namun, tidak ada ukuran. Assets.xml juga memiliki entri pulau, yang memberi tahu kita bahwa pulau -pulau kecil tidak lebih dari 192 ubin per x dan y, pulau -pulau menengah adalah 272, pulau -pulau besar adalah 384. Ukuran pulau yang sebenarnya berada dalam file A7MINFO di sebelah A7M A7M File, di mana ActiveMaPrect berisi nilai x0, y0, x1, y1. Kami mengambil xsize = x1-x0 dan ysize = y1-y0 dan dari itu dapat mengidentifikasi ukuran pulau. Buat daftar terpisah untuk setiap ukuran pulau dan juga menjaga pulau hanya dengan ID <= 3 (normal; hanya pulau starter). Urutkan setiap daftar berdasarkan FilePath.
- Shuffle (std :: shuffle) semua slot starter (slot dengan id == 1).
- Tambahkan slot starter yang dikocok di ujung slot normal (slot dengan id == 0 dan type == 1).
- Kocok hasilnya.
- Urutkan hasilnya berdasarkan ID dalam urutan menurun, sehingga slot starter berada di atas.
- Untuk setiap slot:
- Ganti ID dengan 1 << ID.
- Dapatkan pulau dengan ukuran yang sama dengan slot.
- Buat daftar pulau yang kompatibel. Agar kompatibel, ID pulau harus kompatibel dengan ID slot (Island.id & slot.id) dan wilayah pulau harus kompatibel dengan wilayah dunia dan kesulitan pulau harus kompatibel dengan pengaturan pengguna dan pulau tersebut Gamemode harus kompatibel dengan pengaturan pengguna. (Semua cek kecuali ID dapat didorong jauh dari loop tetapi bukan itu yang dilakukan game.)
- Pilih satu pulau secara acak untuk slot ini (std :: uniform_int_distribution). Pilih secara acak rotasi (nilai dari 0 hingga 3, masing -masing 90 derajat, std :: uniform_int_distribution). Lepaskan pulau dan varian non -nonriver/sungai dari pulau -pulau yang tersedia untuk dunia ini.
- Shuffle All Pirates (tidak melakukan apa -apa) dan semua slot bajak laut (id == 4) dan letakkan bajak laut pada slot pertama. Gambar rotasi.
- Tambahkan slot bajak laut yang tidak digunakan di akhir slot NPC (id == 3).
- Shuffle semua NPC, tapi kemudian urutkan sehingga Archibald Blake menjadi yang utama. Cape memiliki NPC yang sama dengan Dunia Lama kecuali Archibald Blake.
- Shuffle semua slot dan letakkan NPC pada beberapa slot pertama. Gambar rotasi.
- Ambil semua slot yang tidak digunakan sejauh ini, urutkan sehingga id == 3 didahulukan, dan perlakukan mereka seperti slot normal (id = 0). Kemudian lakukan langkah 9) dengan mereka.
Cape World juga mengocok NPC Dunia Lama (tetapi tanpa Archibald Blake) tetapi tidak ada slot NPC sama sekali, sehingga penempatan pulau tidak terpengaruh. Saya pikir kesuburan dan slot tambang di Cape akan berbeda tergantung pada apakah Anda telah memilih NPC Dunia Lama atau tidak. (Shuffle tidak menggambar angka acak jika ada kurang dari 2 item untuk mengocok, jadi 0 NPC dan 1 NPC keduanya tidak memajukan RNG.)
Alat yang digunakan
- X64DBG: Alat utama untuk mengikuti kode. Gim ini memiliki beberapa string yang berguna untuk penebangan, misalnya "Pembuatan Peta Mulai, Seed MapGenerator: {}" yang memberikan ide bagus tentang apa yang sedang terjadi.
- Ghidra: Menentukan struct sangat berguna. Sayangnya itu tidak ingin berkomunikasi dengan X64DBG dan debugger buatannya macet.
- RDAExplorer
- FiledBreader