D2S هو محلل ثنائي مكتوب في GO يستخدم لتحليل ملفات .d2s . هذا هو التنسيق الثنائي الذي تستخدمه لعبة Diablo II لحفظ جميع المعلومات حول حرف معين.
تم تصميم هذه الحزمة لخادم خاص من Diablo II يسمى Slash Diablo لبناء أرسل لجميع الأحرف على الخادم. حيث يمكن لأي شخص رؤية كل شيء عن شخصية معينة في أي وقت من الأوقات. إليك بعض الأمثلة.
$ 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 )
} الرأس هو 765 byte بنية طويلة التي تحتوي على معظم بيانات التعريف الشخصية.
| الإزاحة | بايت | وصف |
|---|---|---|
| 0 | 4 | المعرف |
| 4 | 4 | معرف الإصدار |
| 8 | 4 | حجم الملف |
| 12 | 4 | الشيكومات |
| 16 | 4 | سلاح نشط |
| 20 | 16 | اسم الشخصية |
| 36 | 1 | حالة الشخصية |
| 37 | 1 | تطور الشخصية |
| 38 | 2 | مجهول |
| 40 | 1 | فئة الشخصية |
| 41 | 2 | مجهول |
| 43 | 1 | مستوى الشخصية |
| 44 | 4 | مجهول |
| 48 | 4 | لعب آخر مرة |
| 52 | 4 | مجهول |
| 56 | 64 | مهارات مخصصة |
| 120 | 4 | معرف مهارة زر الماوس الأيسر |
| 124 | 4 | معرف مهارة زر الماوس الصحيح |
| 128 | 4 | معرف مهارة زر الماوس المتبادلة اليسرى |
| 132 | 4 | معرف مهارة زر الماوس الصحيح المبادلة |
| 136 | 32 | مظهر قائمة الأحرف |
| 168 | 3 | صعوبة |
| 171 | 4 | معرف الخريطة |
| 175 | 2 | مجهول |
| 177 | 2 | مرتزق ميت |
| 179 | 4 | معرف المرتزقة |
| 183 | 2 | معرف اسم المرتزقة |
| 185 | 2 | نوع المرتزقة |
| 187 | 4 | تجربة المرتزقة |
| 191 | 144 | مجهول |
| 335 | 298 | المهام |
| 633 | 81 | نقاط الطريق |
| 714 | 51 | مقدمات NPC |
يتم وضع أسماء الأحرف [16]byte الذي سيحتوي على الاسم ، حرف واحد لكل byte . يمكن أن يكون الاسم 16 حرفًا ، ويكون الاسم الأقصر هو المبطن 0x00 خلف الاسم حتى نصل إلى 16 bytes .
- أو _ . حالة الأحرف هي byte حيث سيتم تعيين بتات مختلفة ، اعتمادًا على حالة الحرف. ما زلت لم أحسب كل منهم ، ولكن إليكم أهمهم.
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|
| ؟ | سُلُّم | توسع | ؟ | مات | المتشددين | ؟ | ؟ |
لم ينفذ بعد.
يتم زيادة القيمة في كل مرة تقتل فيها مدرب ACT.
| قيمة | معيار | المتشددين |
|---|---|---|
| 0-3 | - | - |
| 4-7 | سيدي/سيدي | العد/الكونتيسة |
| 8-11 | رب/سيدة | دوق/دوقة |
| 12 | البارون/البارونة | الملك/الملكة |
| قيمة | توسع | التوسع المتشددين |
|---|---|---|
| 0-3 | - | - |
| 5-8 | القاتل | مدمرة |
| 10-13 | بطل | الفاتح |
| 15 | البطريرك/الأم | الوصي |
فئة الأحرف هي byte حيث تمثل القيم المختلفة فئة.
| فصل | قيمة |
|---|---|
| أمازون | 0x00 |
| الساحرة | 0x01 |
| مستحضر الأرواح | 0x02 |
| بالادين | 0x03 |
| البربرة | 0x04 |
| درويد | 0x05 |
| قاتل | 0x06 |
تم حفظ آخر مرة في unit32 Unix Timestamp EG 1495882861 .
قسم المهارات المعين هو مجموعة من 16 معرفات المهارة ، كل عدد صحيح 4 byte (UINT32). إذا لم يتم تعيين أي مهارة ، فإن القيمة هي 0x00 .
هيكل المهام هو قسم 298 byte يصف جميع المهام في اللعبة ولكنه يحتوي أيضًا على بيانات حول ACT Travel و NPC مقدمات. كل مسعى 2 byte طويل.
| الإزاحة | بايت | محتوى |
|---|---|---|
| 335 | 4 | وو! |
| 339 | 6 | مجهول |
السعي هو 2 byte طويل ، لقد قمت بإنشاء بنية quest العامة التي تحمل أهم بيانات السعي ، إذا تم الانتهاء منها أم لا. يحتوي كل مسعى على الكثير من البتات الفريدة وفقًا لمعالم مختلفة من البحث. على سبيل المثال ، إذا كنت قد استهلكت تمرير المقاومة من مسعى "سجن الجليد" أم لا.
| قليل | وصف |
|---|---|
| 0 | أكمل السعي |
يعد سجن ICE هو المسعى الوحيد الذي أزعجت التنفيذ ، لأنني كنت بحاجة إلى معرفة ما إذا كانت الشخصية قد زادت من المقاومة من التمرير أم لا.
| قليل | وصف |
|---|---|
| 0 | أكمل السعي |
| 7 | تمرير مستهلك |
هذا الهيكل يكرره ذاتيا 3 مرات ، مرة واحدة للعيان العادي والكابوس والجحيم. الإزاحة هي الإزاحة في بنية البحث.
| الإزاحة | بايت | وصف |
|---|---|---|
| 0 | 2 | تم تعيينه على 1 إذا كنت قد تعرفت على Warriv in Act I. |
| 2 | [6]quest | جميع المهام الستة من أجل القانون الأول |
| 14 | 2 | تعيين إلى 1 إذا كنت قد سافرت إلى الفصل الثاني. |
| 16 | 2 | تعيين على 1 إذا كنت قد تعرفت على Jerhyn. |
| 18 | [6]quest | جميع المهام الستة ل ACT II. |
| 30 | 2 | تعيين إلى 1 إذا كنت قد سافرت إلى الفصل الثالث. |
| 32 | 2 | ضبط على 1 إذا كنت قد تعرفت على Hratli. |
| 34 | [6]quest | جميع المهام الستة ل ACT III. |
| 46 | 2 | تعيين إلى 1 إذا كنت قد سافرت إلى الفصل الرابع. |
| 48 | 2 | تعيين إلى 1 إذا كنت قد تعرفت على الفصل الرابع. (الذي لديك إذا كنت قد سافرت) |
| 50 | [6]quest | يحتوي الفصل الرابع فقط على 3 أسئلة ، وبالتالي فإن الهيكل لديه 6 بايتات فارغة هنا. |
| 62 | 2 | تم تعيينه على 1 إذا كنت قد سافرت إلى Act V. |
| 64 | 2 | يبدو أنه تم تعيينه على 1 بعد الانتهاء من نهاية الإرهاب والتحدث إلى قابيل في الفصل الرابع. |
| 66 | 4 | يبدو أن نوعا من الحشو. |
| 70 | [6]quest | جميع المهام الستة ل ACT V. |
| 82 | 14 | نوع من الحشو بعد كل بيانات البحث. |
لم ينفذ
لم ينفذ
بعد الرأس هو قسم السمات ، يتكون تخطيط الأقسام من صفيف من معرف سمة 9 bit ، تليها قيمة سمة طول n bit . يتم إنهاء القسم بقيمة 9 bit من 0x1ff . تجدر الإشارة إلى أن هذه الحقول قد انعكست قليلاً. في الأساس إذا وجدت البتات 00100111 يتم عكسها إلى 11100100 .
| بطاقة تعريف | يصف |
|---|---|
| 0 | قوة |
| 1 | طاقة |
| 2 | البراعة |
| 3 | حيوية |
| 4 | احصائيات غير مستخدمة |
| 5 | مهارات غير مستخدمة |
| 6 | HP الحالي |
| 7 | ماكس HP |
| 8 | مانا الحالية |
| 9 | ماكس مانا |
| 10 | القدرة على التحمل الحالي |
| 11 | ماكس القدرة على التحمل |
| 12 | مستوى |
| 13 | خبرة |
| 14 | ذهب |
| 15 | الذهب المخبأ |
| طول بت | يصف |
|---|---|
| 10 | قوة |
| 10 | طاقة |
| 10 | البراعة |
| 10 | حيوية |
| 10 | احصائيات غير مستخدمة |
| 8 | مهارات غير مستخدمة |
| 21 | HP الحالي |
| 21 | ماكس HP |
| 21 | مانا الحالية |
| 21 | ماكس مانا |
| 21 | القدرة على التحمل الحالي |
| 21 | ماكس القدرة على التحمل |
| 7 | مستوى |
| 32 | خبرة |
| 25 | ذهب |
| 25 | الذهب المخبأ |
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.
} المهارات هي قسم 32 byte يحتوي على رأس 2 byte مع القيمة if و 30 byte من بيانات المهارة. كل فصل لديه 30 مهارات متاحة لهم ، لذلك كل مهارة تحصل على 1 byte لكل منها. الجزء الصعب حول تعيين المهارات هو أن كل فصل لديه إزاحة مختلفة في خريطة المهارة حيث تبدأ مهاراتهم في الصف المحدد ، ثم يذهب 30 فهارس في الخريطة. لذلك على سبيل المثال Assassin لديه إزاحة 251 . مما يعني أن مهارات القاتل هي بين فهارس 251 و 281 وهو بالضبط 30 فهرسة.
| يكتب | بايت | قيمة |
|---|---|---|
| رأس | 2 | if |
| مهارات | 30 | [30] مهارة |
| فصل | الإزاحة |
|---|---|
| أمازون | 6 |
| الساحرة | 36 |
| مستحضر الأرواح | 66 |
| بالادين | 96 |
| البربرة | 126 |
| درويد | 221 |
| قاتل | 251 |
هذا إلى حد بعيد الجزء الأكثر صعوبة للقراءة. يبدأ قسم العناصر برأس 4 byte ، يحتوي على القيمة JM ، وقيمة uint16 وهي عدد العناصر التي يتمتع بها شخصيتك حاليًا. مجهزة ، مخزون ، مخبأ ، مكعب وحزام كلها مدرجة.
طول البايت للقسم غير معروف قبل قراءته بالكامل ، لأن طول البت لكل عنصر يختلف حسب جودته وعدد المآخذ والسمات السحرية التي تمتلكها.
يتبع كل عنصر نمطًا معينًا ، وهو:
يبدأ كل عنصر بـ 111 بت من البيانات البسيطة ، والتي تحتوي عليها جميع العناصر. هذه هي معلومات مثل نوع العنصر ، إذا تم مقبسها ، أو معرف الموضع مثل المجهز أو المخبأ وما إلى ذلك.
يحتوي كل عنصر أيضًا على منطقية تسمى SimpleItem التي يبلغ طولها 1 بت ، إذا تم تعيين هذا على 1 ، فإن العنصر لا يحتوي على مزيد من البتات ، ويبدأ العنصر التالي.
إذا لم يكن العنصر عناصر بسيطة ، فهذا يعني أنه سيكون له الكثير من البيانات بعد 111 بت الأولي. بعض الأمثلة على ذلك هي مستوى الندرة ، واللاحقة السحرية ، واللوائح السحرية ، إذا كانت شركة للوظائف ، شخصية ، جزء من مجموعة ، فئة محددة وما إلى ذلك.
أخيرًا وليس آخرًا إذا كان لدى العنصر قوائم بالخصائص السحرية اعتمادًا على ما إذا كانت شركة ذات عوائد ، سحرية ، نادرة ، مصنوعة ، فريدة من نوعها من المجموعة وما إلى ذلك.
تشبه هذه القوائم قسم السمات حيث سنقرأ:
9 bit idn bits of magical properties0x1ff terminator عندما نضغط على Terminator 0x1ff يبدأ العنصر التالي.
خاصية سحرية هي خاصية فريدة يمكن أن تحدث على عنصر ، وكل خاصية لها طول بت مختلف ، والخريطة ضخمة.
هذه هي الخاصية السحرية مع المعرف 83 الذي يحتوي على 2 بت حقل كل 3 بتات.
83 : {Bits: [] uint { 3 , 3 }, Name : "+{1} to {0} Skill Levels" },يتم تعيين جميع الخصائص السحرية في ملف item.go.
إذا كانت شخصيتك قد ماتت حاليًا ، وكانت الجثة على الأرض عند إدخال لعبة ، فستكون العناصر المجهزة في هيكل العنصر هذا. إنه رأس جثة 16 bytes يحتوي على رأس JM متبوعًا بعدد عنصر مشابه لقائمة العناصر.
تتم قراءة عناصر الجثة بالطريقة الدقيقة مثل القسم السابق من العناصر.
إذا تم إنشاء شخصيتك في توسع Lord of Drestruction إذا كان سيحتوي على قسمين آخرين.
تبدأ أقسام المرتزقة برأس 2 byte مع القيمة jf وتتبعها رأس عنصر 4 byte يحتوي على عدد العناصر التي يرتديها المرتزق حاليًا. تتم قراءة العناصر مثل أي قائمة عناصر أخرى.
إذا كانت شخصيتك عبارة عن مستحضر الأرواح وطرف توسع ، فسيبدأ هذا القسم برأس 3 byte ، حيث يكون أول بايتان هما الرأس kf يتبعه منطقية تسمى hasGolem ، إذا كانت هذه القيمة صحيحة ، فهناك قائمة عنصر مع الطول 1 بعد الرأس.
يرجى الاطلاع على المساهمة.