D2S adalah parser biner yang ditulis di Go yang digunakan untuk menguraikan file .d2s . Ini adalah format biner yang digunakan Game Diablo II untuk menyimpan semua informasi tentang karakter tertentu.
Paket ini dibangun untuk server pribadi Diablo II bernama Slash Diablo untuk membangun gudang senjata untuk semua karakter di server. Di mana orang bisa melihat segalanya tentang karakter tertentu pada titik waktu tertentu. Berikut beberapa contoh.
$ go get github.com/nokka/d2s package main
import (
"fmt"
"log"
"os"
"github.com/nokka/d2s"
)
func main () {
path := "nokka.d2s"
file , err := os . Open ( path )
if err != nil {
log . Fatal ( "Error while opening .d2s file" , err )
}
defer file . Close ()
char , err := d2s . Parse ( file )
if err != nil {
log . Fatal ( err )
}
// Prints character name and class.
fmt . Println ( char . Header . Name )
fmt . Println ( char . Header . Class )
} Headernya adalah 765 byte struct panjang yang berisi sebagian besar data meta karakter.
| Mengimbangi | Byte | Keterangan |
|---|---|---|
| 0 | 4 | Pengidentifikasi |
| 4 | 4 | ID Versi |
| 8 | 4 | Ukuran file |
| 12 | 4 | Checksum |
| 16 | 4 | Senjata aktif |
| 20 | 16 | Nama Karakter |
| 36 | 1 | Status karakter |
| 37 | 1 | Perkembangan karakter |
| 38 | 2 | Tidak dikenal |
| 40 | 1 | Kelas Karakter |
| 41 | 2 | Tidak dikenal |
| 43 | 1 | Level Karakter |
| 44 | 4 | Tidak dikenal |
| 48 | 4 | Terakhir dimainkan |
| 52 | 4 | Tidak dikenal |
| 56 | 64 | Keterampilan yang ditugaskan |
| 120 | 4 | ID Keterampilan Tombol Left Mouse |
| 124 | 4 | ID Keterampilan Tombol Mouse Kanan |
| 128 | 4 | ID Keterampilan Tombol Mouse Tukar Kiri |
| 132 | 4 | ID Keterampilan Tombol Mouse Tukar Kanan |
| 136 | 32 | Penampilan Menu Karakter |
| 168 | 3 | Kesulitan |
| 171 | 4 | ID peta |
| 175 | 2 | Tidak dikenal |
| 177 | 2 | Tentara bayaran mati |
| 179 | 4 | ID tentara bayaran |
| 183 | 2 | ID Nama Mercenary |
| 185 | 2 | Tipe tentara bayaran |
| 187 | 4 | Pengalaman tentara bayaran |
| 191 | 144 | Tidak dikenal |
| 335 | 298 | Pencarian |
| 633 | 81 | Titik arah |
| 714 | 51 | Perkenalan NPC |
Nama karakter disimpan sebagai [16]byte yang akan berisi nama, satu huruf per byte . Namanya bisa 16 karakter, dan nama yang lebih pendek akan memiliki empuk 0x00 di belakang nama sampai kita mencapai 16 bytes .
- atau _ . Status karakter adalah byte di mana bit yang berbeda akan ditetapkan, tergantung pada status karakter. Masih belum menemukan semuanya, tapi inilah yang paling penting.
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|
| ? | Tangga | Ekspansi | ? | Mati | Hardcore | ? | ? |
Belum diimplementasikan.
Nilainya bertambah setiap kali Anda membunuh bos akting.
| Nilai | Standar | Hardcore |
|---|---|---|
| 0-3 | - | - |
| 4-7 | Pak/Dame | Count/Countess |
| 8-11 | Tuan/wanita | Duke/Duchess |
| 12 | Baron/Baroness | Raja/ratu |
| Nilai | Ekspansi | Hardcore ekspansi |
|---|---|---|
| 0-3 | - | - |
| 5-8 | Pembunuh | Perusak |
| 10-13 | Juara | Penakluk |
| 15 | Patriark/Matriark | Wali |
Kelas karakter adalah byte di mana nilai yang berbeda mewakili kelas.
| Kelas | Nilai |
|---|---|
| Amazon | 0x00 |
| Penyihir | 0x01 |
| Ahli nujum | 0x02 |
| Paladin | 0x03 |
| Barbar | 0x04 |
| Druid | 0x05 |
| Pembunuh | 0x06 |
Terakhir dimainkan disimpan sebagai cap waktu unit32 Unix misalnya 1495882861 .
Bagian Keterampilan yang Ditugaskan adalah array 16 ID keterampilan, masing -masing A 4 byte integer (UInt32). Jika tidak ada keterampilan yang ditetapkan, nilainya adalah 0x00 .
Quests Struct adalah bagian 298 byte yang menjelaskan semua pencarian dalam permainan tetapi juga berisi data tentang perjalanan ACT bepergian dan NPC. Setiap pencarian panjangnya 2 byte .
| Mengimbangi | Byte | Isi |
|---|---|---|
| 335 | 4 | Merayu! |
| 339 | 6 | Tidak dikenal |
Sebuah pencarian adalah 2 byte , saya telah membuat struct quest umum yang menyimpan data paling penting dari sebuah pencarian, jika selesai atau tidak. Setiap pencarian memiliki banyak bit unik yang ditetapkan tergantung pada tonggak pencarian yang berbeda. Misalnya jika Anda telah mengonsumsi gulungan perlawanan dari pencarian "penjara es" atau tidak.
| Sedikit | Keterangan |
|---|---|
| 0 | Quest selesai |
Penjara es adalah satu -satunya pencarian yang saya repot -repot terapkan, karena saya perlu tahu apakah karakter tersebut telah meningkatkan resistensi dari gulungan atau tidak.
| Sedikit | Keterangan |
|---|---|
| 0 | Quest selesai |
| 7 | Gulungan yang dikonsumsi |
Struktur ini mengulanginya 3 kali, sekali untuk normal, mimpi buruk dan neraka. Offset adalah offset ke struct pencarian.
| Mengimbangi | Byte | Keterangan |
|---|---|---|
| 0 | 2 | Diatur ke 1 jika Anda telah diperkenalkan ke Warriv dalam Undang -Undang I. |
| 2 | [6]quest | Semua enam pencarian untuk Act I. |
| 14 | 2 | Diatur ke 1 jika Anda telah melakukan perjalanan ke Act II. |
| 16 | 2 | Ditetapkan ke 1 jika Anda telah diperkenalkan ke Jerhyn. |
| 18 | [6]quest | Semua enam pencarian untuk Babak II. |
| 30 | 2 | Diatur ke 1 jika Anda telah melakukan perjalanan ke Act III. |
| 32 | 2 | Setel ke 1 jika Anda telah diperkenalkan ke Hratli. |
| 34 | [6]quest | Keenam pencarian untuk Act III. |
| 46 | 2 | Diatur ke 1 jika Anda telah melakukan perjalanan ke ACT IV. |
| 48 | 2 | Diatur ke 1 jika Anda telah diperkenalkan ke ACT IV. (yang Anda miliki jika Anda telah bepergian) |
| 50 | [6]quest | Babak IV hanya memiliki 3 pencarian, sehingga struct memiliki 6 byte kosong di sini. |
| 62 | 2 | Diatur ke 1 jika Anda telah melakukan perjalanan ke Act V. |
| 64 | 2 | Tampaknya ditetapkan ke 1 setelah menyelesaikan akhir teror dan berbicara dengan Kain di Act IV. |
| 66 | 4 | Tampaknya semacam bantalan. |
| 70 | [6]quest | Semua enam pencarian untuk Act V. |
| 82 | 14 | Beberapa jenis bantalan setelah semua data pencarian. |
Tidak diimplementasikan
Tidak diimplementasikan
Mengikuti header adalah bagian atribut, tata letak bagian ini terdiri dari array ID atribut 9 bit , diikuti oleh nilai atribut panjang n bit . Bagian ini diakhiri dengan nilai 9 bit 0x1ff . Perlu disebutkan bahwa bidang -bidang ini sedikit terbalik. Pada dasarnya jika Anda menemukan bit 00100111 mereka dibalik menjadi 11100100 .
| PENGENAL | Atribut |
|---|---|
| 0 | Kekuatan |
| 1 | Energi |
| 2 | Ketangkasan |
| 3 | Daya hidup |
| 4 | Statistik yang tidak digunakan |
| 5 | Keterampilan yang tidak digunakan |
| 6 | HP saat ini |
| 7 | Max HP |
| 8 | Mana saat ini |
| 9 | Max Mana |
| 10 | Stamina saat ini |
| 11 | Max Stamina |
| 12 | Tingkat |
| 13 | Pengalaman |
| 14 | Emas |
| 15 | Emas menyimpan |
| Panjang Bit | Atribut |
|---|---|
| 10 | Kekuatan |
| 10 | Energi |
| 10 | Ketangkasan |
| 10 | Daya hidup |
| 10 | Statistik yang tidak digunakan |
| 8 | Keterampilan yang tidak digunakan |
| 21 | HP saat ini |
| 21 | Max HP |
| 21 | Mana saat ini |
| 21 | Max Mana |
| 21 | Stamina saat ini |
| 21 | Max Stamina |
| 7 | Tingkat |
| 32 | Pengalaman |
| 25 | Emas |
| 25 | Emas menyimpan |
for {
// 1. read 9 bits id. (reverse them)
// 2. if the id is 0x1ff, terminate the loop
// 3. read bit length from attribute map for that id.
// 4. read bit length nr of bits.
} Keterampilan adalah bagian 32 byte yang berisi header 2 byte dengan nilai if dan 30 byte data keterampilan. Setiap kelas memiliki 30 keterampilan yang tersedia untuk mereka, sehingga setiap keterampilan mendapatkan masing -masing 1 byte . Bagian rumit tentang pemetaan keterampilan adalah bahwa setiap kelas memiliki offset yang berbeda ke peta keterampilan di mana keterampilan khusus kelas mereka dimulai, dan kemudian masuk 30 indeks ke peta. Jadi misalnya Assassin memiliki offset 251 . Yang berarti keterampilan pembunuh adalah antara indeks 251 dan 281 yang tepatnya 30 indeks.
| Jenis | Byte | Nilai |
|---|---|---|
| Header | 2 | if |
| Keterampilan | 30 | [30] Keterampilan |
| Kelas | Mengimbangi |
|---|---|
| Amazon | 6 |
| Penyihir | 36 |
| Ahli nujum | 66 |
| Paladin | 96 |
| Barbar | 126 |
| Druid | 221 |
| Pembunuh | 251 |
Sejauh ini, ini adalah bagian yang paling sulit dibaca. Bagian item dimulai dengan header 4 byte , yang berisi nilai JM , dan nilai uint16 yang merupakan barang yang dihitung oleh karakter Anda saat ini. Dilengkapi, inventaris, simpanan, kubus, dan sabuk semua termasuk.
Panjang byte bagian tidak diketahui sebelum membacanya secara keseluruhan, karena panjang bit dari setiap item bervariasi tergantung pada kualitasnya, jumlah soket dan atribut magis yang dimilikinya.
Setiap item mengikuti pola tertentu, yaitu:
Setiap item dimulai dengan 111 bit data sederhana, yang berisi semua item. Ini adalah informasi seperti jenis item, jika disimpan, posisi ID seperti dilengkapi atau penyimpanan dan sebagainya.
Setiap item juga memiliki boolean yang disebut SimpleItem yang panjangnya 1 bit, jika ini diatur ke 1 , item tidak mengandung bit lagi, dan item berikutnya dimulai.
Jika item ini bukan item sederhana, ini berarti ia akan memiliki banyak data mengikuti 111 bit awal. Beberapa contoh dari ini adalah tingkat kelangkaan, akhiran magis, imbuhan magis, jika itu adalah runeword, personalisasi, bagian dari satu set, spesifik kelas dan sebagainya.
Last but not least jika item akan memiliki daftar properti magis tergantung pada apakah itu bagian runeword, ajaib, langka, dibuat, unik dari set dan sebagainya.
Daftar ini mirip dengan bagian atribut tempat kami akan membaca:
9 bit idn bits of magical properties0x1ff terminator Ketika kita menekan terminator 0x1ff item berikutnya dimulai.
Properti ajaib adalah properti unik yang dapat terjadi pada suatu barang, setiap properti memiliki panjang bit yang berbeda, dan peta sangat besar.
Ini adalah properti ajaib dengan ID 83 yang berisi 2 bidang bit masing -masing panjang 3 bit.
83 : {Bits: [] uint { 3 , 3 }, Name : "+{1} to {0} Skill Levels" },Semua properti magis dipetakan dalam file item.go.
Jika karakter Anda saat ini sudah mati, dan mayat ada di tanah saat Anda memasuki permainan, item Anda yang dilengkapi akan ada di item ini struct. Ini adalah header mayat 16 bytes yang berisi header JM diikuti oleh jumlah item yang mirip dengan daftar item.
Membaca item mayat dilakukan dengan cara yang tepat seperti bagian item sebelumnya.
Jika karakter Anda dibuat dalam ekspansi Lord of Destruction jika akan berisi 2 bagian lagi.
Bagian tentara bayaran dimulai dengan header 2 byte dengan nilai jf dan diikuti oleh header item 4 byte yang berisi jumlah item yang saat ini dipakai oleh tentara bayaran. Item dibaca seperti daftar item lainnya.
Jika karakter Anda adalah necromancer dan karakter ekspansi, bagian ini dimulai dengan header 3 byte , di mana dua byte pertama adalah header kf diikuti oleh boolean yang disebut hasGolem , jika nilai ini benar, ada daftar item dengan panjang 1 mengikuti header.
Silakan lihat Contributing.md.