"لن أعطي حجرًا" أو كيف يتم ترتيب موارد لعبة "الأراضي الملعونة"


هل تتذكر العديد من الألعاب الروسية؟ النوعية؟ لا تنسى؟ نعم كانوا كذلك. إذا كان عمرك أكثر من 35 عامًا أو كنت من محبي صناعة الألعاب الروسية ، فمن المحتمل أن تكون معتادًا على لعبة Cursed Lands.


بدأت القصة بشكل عملي للغاية: الصيف ، الحرارة. لا يوجد شيء خاص يمكن القيام به ، وعند استعراض محتويات القرص الصلب للكمبيوتر المحمول بتكاسل ، اشتعلت نظرتي في مجلد يحمل أيقونة تنين مألوفة ظلت خامدة منذ عامين.


أي من محبي اللعبة لن يهتم بمعرفة ما بداخله؟


مقدمة


معلومات اللعبة


لعن الأراضي - أو ، كما كان يطلق عليها خارج رابطة الدول المستقلة ، جزر الشر: لعنة الروح المفقودة ، لعبة آر بي جي الشبح التي صدرت في عام 2000. تم تطوير اللعبة بواسطة Nival Interactive ، والتي كانت في ذلك الوقت قد رسخت نفسها بالفعل كسلسلة من ألعاب Alloda (Rage of Mages في الخارج). عمل معظمهم من خريجي جامعة موسكو الحكومية - وكانوا قادرين تمامًا على تحقيق إحدى الألعاب الأولى في عالم ثلاثي الأبعاد تمامًا.
في عام 2010 ، نقل Mail.Ru ( المعلومات ) العنوان ، ولكن لا تزال اللعبة تُباع في متجر GOG نيابة عن Nival.


نسبيا في الآونة الأخيرة ، أصبحت اللعبة 18 سنة - يعتبر عيد ميلاد 26 أكتوبر ، تاريخ الإصدار في رابطة الدول المستقلة. على الرغم من العمر ، لا يزال الخادم الرئيسي الرسمي في الخدمة: بشكل دوري ، يقرر شخص ما الزحف عبر غابات جيبات وضرب أكثر من عشرة هياكل عظمية مع مجموعة من الرفاق.


باختصار عن المقال


في البداية ، كان هدفي هو فقط كتابة محول أحادي الاتجاه "لنفسي" في Python 3 ، باستخدام مكتبات قياسية حصرية. ومع ذلك ، في هذه العملية ، بدأت الوثائق المتعلقة بالتنسيقات بسلاسة ، وهي محاولات لتوحيد الإخراج بطريقة أو بأخرى. بالنسبة لبعض التنسيقات ، تم وصف الهيكل باستخدام Kaitai Struct . نتيجة لذلك ، كل شيء أدى إلى كتابة هذه المقالة ويكي في الأشكال.


ألاحظ على الفور: بالنسبة للجزء الأكبر ، تم بالفعل البحث في ملفات اللعبة ، وتم كتابة محرري المعجبين لهم. ومع ذلك ، فإن المعلومات مجزأة للغاية ، ولا يوجد وصف كامل أو أقل للتنسيقات في المجال العام ، ولا توجد مجموعة كافية لإنشاء التعديلات.


... وكيفية قراءتها


يتم توفير مخططات (ملفات .ksy) لجميع التنسيقات ، والتي يمكن تحويلها بنقرتين إلى رمز في العديد من اللغات الأكثر شعبية.


لسوء الحظ ، في المراحل الأخيرة من كتابة هذا المقال ، وجدت أن هابر المحترم غير قادر على تسليط الضوء على YAML (و JSON) ، وجميع المخططات استخدامه. لا ينبغي أن تكون هذه مشكلة كبيرة ، ولكن إذا كان من غير المريح قراءة المخطط ، فيمكنني أن أنصحك بنسخه إلى محرر جهة خارجية ، على سبيل المثال ، NPP.


الموارد وأين يعيشون


اللعبة عبارة عن تطبيق محمول يحتوي على محرك به مكتبات وقاذفة ، وفي الواقع ، موارد معبأة.


هذا مثير للاهتمام: يتم تخزين إعدادات اللعبة بالكامل تقريبًا في السجل. يرجع خطأ الكاميرا في إصدار GOG إلى حقيقة أن المثبت لا يقوم بتسجيل القيم الافتراضية الصحيحة.

للوهلة الأولى على محتويات مجلد اللعبة ، نلاحظ على الفور اثنين من امتدادات الملفات الجديدة: ASI و REG.
الأولى هي مكتبة ديناميكية ، والتي لن نأخذها في الاعتبار (يتم ذلك بواسطة متخصصين في الهندسة العكسية) ، أما الثانية فهي أول تنسيق لملف الملكية للعبة.


REG


الملفات من هذا النوع هي تسلسل ثنائي لملفات INI النصية المعروفة.
ينقسم المحتوى إلى أقسام تخزين المفاتيح وقيمها. يحتفظ ملف REG بهذا التسلسل الهرمي ، لكنه يسرع من قراءة البيانات وتحليلها - في عام 2000 ، كان هذا أمرًا مهمًا على ما يبدو.


بشكل عام ، يمكنك وصف بنية هذا المخطط:


وصف الهيكل
meta: id: reg title: Evil Islands, REG file (packed INI) application: Evil Islands file-extension: reg license: MIT endian: le doc: Packed INI file seq: - id: magic contents: [0xFB, 0x3E, 0xAB, 0x45] doc: Magic bytes - id: sections_count type: u2 doc: Number of sections - id: sections_offsets type: section_offset doc: Sections offset table repeat: expr repeat-expr: sections_count types: section_offset: doc: Section position in file seq: - id: order type: s2 doc: Section order number - id: offset type: u4 doc: Global offset of section in file instances: section: pos: offset type: section types: section: doc: Section representation seq: - id: keys_count type: u2 doc: Number of keys in section - id: name_len type: u2 doc: Section name lenght - id: name type: str encoding: cp1251 size: name_len doc: Section name - id: keys type: key doc: Section's keys repeat: expr repeat-expr: keys_count types: key: doc: Named key seq: - id: order type: s2 doc: Key order in section - id: offset type: u4 doc: Key offset in section instances: key_record: pos: _parent._parent.offset + offset type: key_data key_data: seq: - id: packed_type type: u1 doc: Key value info - id: name_len type: u2 doc: Key name lenght - id: name type: str encoding: cp1251 size: name_len doc: Key name - id: value type: value doc: Key value instances: is_array: value: packed_type > 127 doc: Is this key contain array value_type: value: packed_type & 0x7F doc: Key value type types: value: doc: Key value seq: - id: array_size type: u2 if: _parent.is_array doc: Value array size - id: data type: switch-on: _parent.value_type cases: 0: s4 1: f4 2: string repeat: expr repeat-expr: '_parent.is_array ? array_size : 1' doc: Key value data string: doc: Sized string seq: - id: len type: u2 doc: String lenght - id: value type: str encoding: cp1251 size: len doc: String 

هذا مثير للاهتمام: في عام 2002 ، قام Nival بمشاركة بعض الأدوات مع مجتمع اللعبة ( لقطة موقع ) - أحدها كان مسلسل INI في REG. كما قد تتخيل ، ظهر مزيل إزالة الفور على الفور تقريبًا ، وإن لم يكن رسميًا.

مع فرز مجلد البدء ، دعنا ننتقل إلى الدلائل الفرعية.
تقع النظرة الأولى على مجلد Cameras الذي يحتوي على ملفات CAM.


كام


التنسيق البسيط هو تعبئة مواقف الكاميرات بمرور الوقت. يتم وصف الكاميرا حسب الموضع والدوران. الحقلان الآخران هما الوقت والخطوة المفترضة في تسلسل الحركات.



وصف الهيكل
 meta: id: cam title: Evil Islands, CAM file (cameras) application: Evil Islands file-extension: cam license: MIT endian: le doc: Camera representation seq: - id: cams type: camera repeat: eos types: vec3: doc: 3d vector seq: - id: x type: f4 doc: x axis - id: y type: f4 doc: y axis - id: z type: f4 doc: z axis quat: doc: quaternion seq: - id: w type: f4 doc: w component - id: x type: f4 doc: x component - id: y type: f4 doc: y component - id: z type: f4 doc: z component camera: doc: Camera parameters seq: - id: unkn0 type: u4 doc: unknown - id: unkn1 type: u4 doc: unknown - id: position type: vec3 doc: camera's position - id: rotation type: quat doc: camera's rotation 

في المجلد التالي - Res ، (بشكل غير متوقع!) يتم تخزين ملفات RES المحفوظة.


RES


أحيانًا ما يكون هذا التنسيق مخفيًا تحت امتدادات أخرى ، لكن الأصل لا يزال هو RES بالضبط.
تعتبر بنية البيانات نموذجية للغاية بالنسبة لأرشيف مع وصول عشوائي إلى الملفات: هناك جداول لتخزين المعلومات حول الملفات الموجودة في الداخل ، وجدول الأسماء ، ومحتويات الملفات.
بنية الدليل موجودة مباشرة في الأسماء.


تجدر الإشارة إلى حقيقتين مهمتين للغاية:


  1. تم تحسين الأرشيف لتحميل معلومات الملف إلى قائمة مرتبطة مع التجزئة المغلق.
  2. يمكنك تخزين محتويات الملف مرة واحدة ، لكن يمكنك الرجوع إليها تحت أسماء مختلفة. بقدر ما أعرف ، تم استخدام هذه الحقيقة في إعادة تحضير المعجبين ، حيث تم تقليل حجم اللعبة بشكل كبير بسبب هذا. في التوزيع الأصلي ، لم يتم استخدام تحسين الأرشيف.


وصف الهيكل
 meta: id: res title: Evil Islands, RES file (resources archive) application: Evil Islands file-extension: res license: MIT endian: le doc: Resources archive seq: - id: magic contents: [0x3C, 0xE2, 0x9C, 0x01] doc: Magic bytes - id: files_count type: u4 doc: Number of files in archive - id: filetable_offset type: u4 doc: Filetable offset - id: nametable_size type: u4 doc: Size of filenames instances: nametable_offset: value: filetable_offset + 22 * files_count doc: Offset of filenames table filetable: pos: filetable_offset type: file_record repeat: expr repeat-expr: files_count doc: Files metadata table types: file_record: doc: File metadata seq: - id: next_index type: s4 doc: Next file index - id: file_size type: u4 doc: Size of file in bytes - id: file_offset type: u4 doc: File data offset - id: last_change type: u4 doc: Unix timestamp of last change time - id: name_len type: u2 doc: Lenght of filename - id: name_offset type: u4 doc: Filename offset in name array instances: name: io: _root._io pos: name_offset + _parent.nametable_offset type: str encoding: cp1251 size: name_len doc: File name data: io: _root._io pos: file_offset size: file_size doc: Content of file 

هذا مثير للاهتمام: في الإصدار الروسي من اللعبة ، يحتوي أرشيف Speech.res على دليتين فرعيتين s و t مع محتويات متطابقة تمامًا ، وهذا هو السبب في أن حجم الأرشيف أكبر من الضعف - وهذا هو السبب في أن اللعبة لا تتلاءم مع قرص مضغوط واحد.

يمكنك الآن فك ضغط جميع الأرشيفات (يمكن تداخلها):


  • RES مجرد أرشيف ،
  • MPR - المشهد من مستويات اللعبة ،
  • MQ - معلومات حول مهام متعددة اللاعبين ،
  • ANM - مجموعة من الرسوم المتحركة ،
  • مدير الجلسة - نموذج ثلاثي الأبعاد ،
  • بون - موقع عظام النموذج.

إذا كانت الملفات الموجودة داخل الأرشيف لا تحتوي على امتداد ، فسوف نضع الامتداد الأصلي - لأرشيفات BON و ANM.


يمكنك أيضًا تقسيم جميع الملفات المستلمة إلى أربع مجموعات:


  1. القوام
  2. قواعد البيانات
  3. النماذج
  4. ملفات المستوى.

لنبدأ بالبساطة - مع القوام.


MMP


في الواقع ، والملمس. له عنوان صغير يشير إلى معلمات الصورة ، وعدد مستويات MIP والضغط المستخدم. بعد الرأس توجد مستويات صور MIP بترتيب تنازلي للحجم.



وصف الهيكل
 meta: id: mmp title: Evil Islands, MMP file (texture) application: Evil Islands file-extension: mmp license: MIT endian: le doc: MIP-mapping texture seq: - id: magic contents: [0x4D, 0x4D, 0x50, 0x00] doc: Magic bytes - id: width type: u4 doc: Texture width - id: height type: u4 doc: Texture height - id: mip_levels_count type: u4 doc: Number of MIP-mapping stored levels - id: fourcc type: u4 enum: pixel_formats doc: FourCC label of pixel format - id: bits_per_pixel type: u4 doc: Number of bits per pixel - id: alpha_format type: channel_format doc: Description of alpha bits - id: red_format type: channel_format doc: Description of red bits - id: green_format type: channel_format doc: Description of green bits - id: blue_format type: channel_format doc: Description of blue bits - id: unused size: 4 doc: Empty space - id: base_texture type: switch-on: fourcc cases: 'pixel_formats::argb4': block_custom 'pixel_formats::dxt1': block_dxt1 'pixel_formats::dxt3': block_dxt3 'pixel_formats::pnt3': block_pnt3 'pixel_formats::r5g6b5': block_custom 'pixel_formats::a1r5g5b5': block_custom 'pixel_formats::argb8': block_custom _: block_custom types: block_pnt3: seq: - id: raw size: _root.bits_per_pixel block_dxt1: seq: - id: raw size: _root.width * _root.height >> 1 block_dxt3: seq: - id: raw size: _root.width * _root.height block_custom: seq: - id: lines type: line_custom repeat: expr repeat-expr: _root.height types: line_custom: seq: - id: pixels type: pixel_custom repeat: expr repeat-expr: _root.width types: pixel_custom: seq: - id: raw type: switch-on: _root.bits_per_pixel cases: 8: u1 16: u2 32: u4 instances: alpha: value: '_root.alpha_format.count == 0 ? 255 : 255 * ((raw & _root.alpha_format.mask) >> _root.alpha_format.shift) / (_root.alpha_format.mask >> _root.alpha_format.shift)' red: value: '255 * ((raw & _root.red_format.mask) >> _root.red_format.shift) / (_root.red_format.mask >> _root.red_format.shift)' green: value: '255 * ((raw & _root.green_format.mask) >> _root.green_format.shift) / (_root.green_format.mask >> _root.green_format.shift)' blue: value: '255 * ((raw & _root.blue_format.mask) >> _root.blue_format.shift) / (_root.blue_format.mask >> _root.blue_format.shift)' channel_format: doc: Description of bits for color channel seq: - id: mask type: u4 doc: Binary mask for channel bits - id: shift type: u4 doc: Binary shift for channel bits - id: count type: u4 doc: Count of channel bits enums: pixel_formats: 0x00004444: argb4 0x31545844: dxt1 0x33545844: dxt3 0x33544E50: pnt3 0x00005650: r5g6b5 0x00005551: a1r5g5b5 0x00008888: argb8 

تنسيقات تغليف البكسل الممكنة:


fourccالوصف
44 44 00 00ARGB4
44 58 54 31Dxt1
44 58 54 33Dxt3
50 4E 54 33PNT3 - RLE مضغوط ARGB8
50 56 00 00R5G5B5
51 55 00 00A1R5G5B5
88 88 00 00ARGB8

حول PNT3

إذا كان تنسيق الصورة هو PNT3 ، فإن بنية البكسل بعد التفريغ هي ARGB8 ؛ bits_per_pixel - حجم الصورة المضغوطة بالبايت.


تفريغ PNT3


 n = 0 destination = b"" while src < size: v = int.from_bytes(source[src:src + 4], byteorder='little') src += 4 if v > 1000000 or v == 0: n += 1 else: destination += source[src - (1 + n) * 4:src - 4] destination += b"\x00" * v n = 0 

هذا مثير للاهتمام: بعض القوام تنعكس رأسياً (أو بعضها لا ينعكس؟).
وتكون اللعبة غيور للغاية من الشفافية - إذا كانت الصورة مع قناة ألفا ، فيجب أن يكون لون البكسلات الشفافة أسود تمامًا. أو أبيض - هذا هو الحظ.

لقد انتهت التنسيقات البسيطة ، دعنا ننتقل إلى أشكال أكثر صلابة - في وقت واحد ، احتفظت صفوف صانعي وزارة الدفاع بشراسة بأدوات التحرير الخاصة بهم للتنسيقات التالية ، ولكن دون جدوى. لقد حذرتك


قواعد البيانات (* DB وغيرها)


هذا التنسيق غير مريح للغاية لوصفه - في جوهره ، هذه شجرة متسلسلة من العقد (أو جداول التسجيلات). يتكون الملف من عدة جداول مع أنواع الحقول المحددة. الهيكل العام: الجداول متداخلة في عقدة "جذر" شائعة ، والسجلات عبارة عن عقد داخل جدول.


في كل عقدة ، يتم تحديد نوعه وحجمه:


 unsigned char type_index; unsigned char raw_size; //      unsigned length; //     read(raw_size); if (raw_size & 1) { length = raw_size >> 1; for (int i = 0; i < 3; i++) length <<= 8; read(raw_size); length += raw_size; } else length = raw_size >> 1; 

يتم أخذ نوع حقل الجدول بواسطة الفهرس من سلسلة التنسيق للجدول ، ويتم تحديد النوع الحقيقي حسب القيمة التي تم الحصول عليها.


أنواع الحقول
التعيينالوصف
سسلسلة
أنا4b كثافة العمليات
يو4 ب غير موقعة
ف4B تطفو
اكسبايت بايت
ومجموعة تعويم
أنامجموعة كثافة العمليات
بمنطقي
بمجموعة منطقية
حبايت عرافة غير معروف
تالوقت
0لم يذكر
10FII
2SUFF
3FFFF
40SISS
50SISS00000U

وصف القواعد

العناصر (.idb)


الجدولالهيكل
الموادSSSIFFFIFIFfIX
سلاحSSISIIIFFFFIFIXB00000IHFFFfHHFF
درعSSISIIIFFFFIFIXB00000ffBiHH
عناصر سريعةSSISIIIFFFFIFIXB00000IIFFSbH
السعي البنودSSISIIIFFFFIFIXB00000Is
بيع الأصنافSSISIIIFFFFIFIXB00000IHI

مفاتيح (.ldb)


الجدولالهيكل
تبديل النموذج الأوليSfIFTSSS

المهارات والمهارات (.pdb)


الجدولالهيكل
القدراتSSI0000000s
المهاراتSSI0000000SSIIIFFFIIIIBI

آثار أقدام (prints.db)


الجدولالهيكل
آثار الدم0S11
آثار اللهب0S110000001
آثار أقدام0S11

نوبات (.sdb)


الجدولالهيكل
النماذج الأوليةSSSFIFIFFFFIIIIUSSIIbIXFFFFF
المعدلاتSSFIFFISX
أنماط0SssSX
قوالب دروع0SssSX
أنماط الأسلحة0SssSX

المخلوقات (.udb)


الجدولالهيكل
الأجزاء التالفةSffUU
سباقSUFFUUFfFUUf222222000000000000SssFSsfUUfUUIUSBFUUUU
نماذج الوحشSSIUIFFFSFFFFFFFFFUFFFFFFff33sfssSFFFFFUFUSF
مجلس الشعبSUFFFFbbssssFUB

صيحات (acks.db)


الجدولالهيكل
الإجابات0S0000000044444444444444444444445444444444444
صرخات0S0000000044444
أخرى0S0000000044

أسئلة (.qdb)


الجدولالهيكل
المهماتSFIISIIs
إحاطاتSFFsSsssssI

هذا مثير للاهتمام: 16 يناير 2002 نشر Nival قواعد المصدر للاعبين المتعددين بتنسيق csv ، بالإضافة إلى محول أداة مساعدة في تنسيق اللعبة ( لقطة موقع ). وبطبيعة الحال ، لم يكن المحول معكوسًا بطيئًا في الظهور. هناك أيضًا وثيقتان على الأقل تصفان الحقول وأنواعها من المودمات ، لكن قراءتها صعبة جدًا.

Adb


قاعدة بيانات الرسوم المتحركة لنوع معين من الوحدة. على النقيض من * DB المذكورة أعلاه ، فهو "بشري" تمامًا - إنه جدول بمستوى واحد بأحجام ثابتة للحقل.



وصف الهيكل
 meta: id: adb title: Evil Islands, ADB file (animations database) application: Evil Islands file-extension: adb license: MIT endian: le doc: Animations database seq: - id: magic contents: [0x41, 0x44, 0x42, 0x00] doc: Magic bytes - id: animations_count type: u4 doc: Number of animations in base - id: unit_name type: str encoding: cp1251 size: 24 doc: Name of unit - id: min_height type: f4 doc: Minimal height of unit - id: mid_height type: f4 doc: Middle height of unit - id: max_height type: f4 doc: Maximal height of unit - id: animations type: animation doc: Array of animations repeat: expr repeat-expr: animations_count types: animation: doc: Animation's parameters seq: - id: name type: str encoding: cp1251 size: 16 doc: Animation's name - id: number type: u4 doc: Index in animations array - id: additionals type: additional doc: Packed structure with animation parameters - id: action_probability type: u4 doc: Percents of action probability - id: animation_length type: u4 doc: Lenght of animation in game ticks - id: movement_speed type: f4 doc: Movement speed - id: start_show_hide1 type: u4 - id: start_show_hide2 type: u4 - id: start_step_sound1 type: u4 - id: start_step_sound2 type: u4 - id: start_step_sound3 type: u4 - id: start_step_sound4 type: u4 - id: start_hit_frame type: u4 - id: start_special_sound type: u4 - id: spec_sound_id1 type: u4 - id: spec_sound_id2 type: u4 - id: spec_sound_id3 type: u4 - id: spec_sound_id4 type: u4 types: additional: seq: - id: packed type: u8 instances: weapons: value: 'packed & 127' allowed_states: value: '(packed >> 15) & 7' action_type: value: '(packed >> 18) & 15' action_modifyer: value: '(packed >> 22) & 255' animation_stage: value: '(packed >> 30) & 3' action_forms: value: '(packed >> 36) & 63' 

هذا مثير للاهتمام: بالنسبة للعديد من الوحدات ، يتم استخدام تنسيق قاعدة بيانات مقطوع جزئيًا ، والذي لم يتم استكشافه.

بعد أن تعاملنا مع قواعد البيانات ، نعلن استراحة إعلانية. لكننا لن نعلن عن أي شيء - وليس طريقتنا. من الأفضل الإشارة إلى ما يأتي في متناول يديك - كيفية تسمية ملفات المخلوقات.


تنسيق اسم النموذج


يتم جمع الاسم من مجموعات من حرفين - اختصارات "المستوى" المنطقي.
على سبيل المثال ، ستكون الشخصية الأنثوية غير unhufe - Unit > Human > Female ، initwesp - Inventory > Item > Weapon > Spear ، أي رمح في المخزون (وليس الخلف ، وهذا جيد).


شجرة كاملة من عناصر الاسم:
 un: # unit an: # animal wi: # wild ti # tiger ba # bat bo # boar hy # hyen de # deer gi # rat ra # rat cr # crawler wo # wolf ho: # home co # cow pi # pig do # dog ho # horse ha # hare or: # orc fe # female ma # male mo: # monster co # column (menu) un # unicorn cu # Curse be # beholder tr # troll el # elemental su # succub (harpie) ba # banshee dr # driad sh # shadow li # lizard sk # skeleton sp # spider go # golem, goblin ri # Rick og # ogre zo # zombie bi # Rik's dragon cy # cyclope dg # dragon wi # willwisp mi # octopus to # toad hu: # human fe # female ma # male in: # inventory it: # item qu # quest qi # interactive ar: # armor pl # plate gl # gloves lg # leggins bt # boots sh # shirt hl # helm pt # pants li: # loot mt # material tr # trade we: # weapon hm # hammer dg # dagger sp # spear cb # crossbow sw # sword ax # axe bw # bow gm # game menu fa: # faces un: # unit an: # animal wi: # wild ti: # tiger face # face ba: # bat face # face bo: # boar face # face de: # deer face # face ra: # rat face # face cr: # crawler face # face wo: # wolf face # face ho: # home co: # cow face # face pi: # pig face # face do: # dog face # face ho: # horse face # face ha: # hare face # face hu: # human fe: # female fa # me # th # ma: # male fa # me # th # mo: # monster to: # toad face # face tr: # troll face # face or: # orc face # face sp: # spider face # face li: # lizard face # face na: # nature fl: # flora bu # bush te # termitary tr # tree li # waterplant wa # waterfall sk # sky st # stone ef: # effects cu # ar # co # components st: # static si # switch bu: # building to # tower ho # house tr # trap br # bridge ga # gate we # well (waterhole) wa: # wall me # medium li # light to # torch st # static 

هذا مثير للاهتمام: وفقًا لهذا التصنيف ، فإن الفطر عبارة عن أشجار ، أما غوليمس العفاريت فهو أشقاء ، وتيكا ريك وحش. هنا أيضًا ، يمكنك رؤية أسماء الوحوش "العاملة" ، التي تشبه بشكل مثير للريبة أسماء D&D - الناظر (العين الشريرة) ، الشجيرة (القيثارة) ، الغول (آكلي لحوم البشر) ، درياد (الغابات).

بعد أن استراحنا من الناحية الأخلاقية ، نغرق في هذا النموذج. يتم تقديمها في العديد من التنسيقات المرتبطة معًا.


Lnk


منطقيا - أساس النموذج. يصف التسلسل الهرمي لأجزاء النموذج ، من حيث النمذجة ثلاثية الأبعاد الحديثة - التسلسل الهرمي للعظام.



وصف الهيكل
 meta: id: lnk title: Evil Islands, LNK file (bones hierarchy) application: Evil Islands file-extension: lnk license: MIT endian: le doc: Bones hierarchy seq: - id: bones_count type: u4 doc: Number of bones - id: bones_array type: bone repeat: expr repeat-expr: bones_count doc: Array of bones types: bone: doc: Bone node seq: - id: bone_name_len type: u4 doc: Length of bone's name - id: bone_name type: str encoding: cp1251 size: bone_name_len doc: Bone's name - id: parent_name_len type: u4 doc: Length of bone's parent name - id: parent_name type: str encoding: cp1251 size: parent_name_len doc: Bone's parent name 

اسم أصل العظم الأصل عبارة عن سلسلة فارغة (الطول 0).


هناك عظام ، لكن لا يكفي تسميتها ووضعها معًا - تحتاج إلى تجميعها في هيكل عظمي.


بون


سبق ذكره ، أن هذا التنسيق (إن لم يكن أرشيفًا) يعين موضع أجزاء (عظام) النموذج بالنسبة للجزء الأصل. يتم تخزين الإزاحة فقط ، بدون تدوير - أحد الاختلافات في التنسيقات الحديثة.



وصف الهيكل
 meta: id: bon title: Evil Islands, BON file (bone position) application: Evil Islands file-extension: bon license: MIT endian: le doc: Bone position seq: - id: position type: vec3 doc: Bone translation repeat: eos types: vec3: doc: 3d vector seq: - id: x type: f4 doc: x axis - id: y type: f4 doc: y axis - id: z type: f4 doc: z axis 

كما ترون ، هناك الكثير من الأرقام للإزاحة الواحدة - والحقيقة أننا هنا صادفنا أولاً إحدى الميزات الرئيسية لمحرك اللعبة - الاستيفاء ثلاثي الأبعاد للنموذج.


كيف يعمل: يحتوي النموذج على ثلاثة معلمات استيفاء - مشروطة ، القوة ، البراعة ، النمو. هناك أيضًا 8 حالات متطرفة من النموذج. باستخدام المعلمات ، يمكننا الحصول على النموذج النهائي عن طريق الاستيفاء الثلاثي.


الخوارزمية نفسها
 def trilinear(val, coefs=[0, 0, 0]): # Linear interpolation by str t1 = val[0] + (val[1] - val[0]) * coefs[1] t2 = val[2] + (val[3] - val[2]) * coefs[1] # Bilinear interpolation by dex v1 = t1 + (t2 - t1) * coefs[0] # Linear interpolation by str t1 = val[4] + (val[5] - val[4]) * coefs[1] t2 = val[6] + (val[7] - val[6]) * coefs[1] # Bilinear interpolation by dex v2 = t1 + (t2 - t1) * coefs[0] # Trilinear interpolation by height return v1 + (v2 - v1) * coefs[2] 

هذا مثير للاهتمام: يستخدم نموذج الاستيفاء الثلاثي لتحريك بعض الأشياء ، على سبيل المثال ، فتح باب حجري وخزائن.

لقد حان الوقت لإلقاء نظرة على أجزاء النموذج نفسها.


FIG


ربما من المستحيل فهم هذا التجمع. يمكنك العثور على وصفه والمكون الإضافي للخلاط على الشبكة ، ولكن حتى معهم لا يأتي الوعي على الفور. ألقِ نظرة:



وصف الهيكل
 meta: id: fig title: Evil Islands, FIG file (figure) application: Evil Islands file-extension: fig license: MIT endian: le doc: 3d mesh seq: - id: magic contents: [0x46, 0x49, 0x47, 0x38] doc: Magic bytes - id: vertex_count type: u4 doc: Number of vertices blocks - id: normal_count type: u4 doc: Number of normals blocks - id: texcoord_count type: u4 doc: Number of UV pairs - id: index_count type: u4 doc: Number of indeces - id: vertex_components_count type: u4 doc: Number of vertex components - id: morph_components_count type: u4 doc: Number of morphing components - id: unknown contents: [0, 0, 0, 0] doc: Unknown (aligment) - id: group type: u4 doc: Render group - id: texture_index type: u4 doc: Texture offset - id: center type: vec3 doc: Center of mesh repeat: expr repeat-expr: 8 - id: aabb_min type: vec3 doc: AABB point of mesh repeat: expr repeat-expr: 8 - id: aabb_max type: vec3 doc: AABB point of mesh repeat: expr repeat-expr: 8 - id: radius type: f4 doc: Radius of boundings repeat: expr repeat-expr: 8 - id: vertex_array type: vertex_block doc: Blocks of raw vertex data repeat: expr repeat-expr: 8 - id: normal_array type: vec4x4 doc: Packed normal data repeat: expr repeat-expr: normal_count - id: texcoord_array type: vec2 doc: Texture coordinates data repeat: expr repeat-expr: texcoord_count - id: index_array type: u2 doc: Triangles indeces repeat: expr repeat-expr: index_count - id: vertex_components_array type: vertex_component doc: Vertex components array repeat: expr repeat-expr: vertex_components_count - id: morph_components_array type: morph_component doc: Morphing components array repeat: expr repeat-expr: morph_components_count types: morph_component: doc: Morphing components indeces seq: - id: morph_index type: u2 doc: Index of morphing data - id: vertex_index type: u2 doc: Index of vertex vertex_component: doc: Vertex components indeces seq: - id: position_index type: u2 doc: Index of position data - id: normal_index type: u2 doc: Index of normal data - id: texture_index type: u2 doc: Index of texcoord data vec2: doc: 2d vector seq: - id: u type: f4 doc: u axis - id: v type: f4 doc: v axis vec3: doc: 3d vector seq: - id: x type: f4 doc: x axis - id: y type: f4 doc: y axis - id: z type: f4 doc: z axis vec3x4: doc: 3d vector with 4 values per axis seq: - id: x type: f4 doc: x axis repeat: expr repeat-expr: 4 - id: y type: f4 doc: y axis repeat: expr repeat-expr: 4 - id: z type: f4 doc: z axis repeat: expr repeat-expr: 4 vertex_block: doc: Vertex raw block seq: - id: block type: vec3x4 doc: Vertex data repeat: expr repeat-expr: _root.vertex_count vec4x4: doc: 4d vector with 4 values per axis seq: - id: x type: f4 doc: x axis repeat: expr repeat-expr: 4 - id: y type: f4 doc: y axis repeat: expr repeat-expr: 4 - id: z type: f4 doc: z axis repeat: expr repeat-expr: 4 - id: w type: f4 doc: w axis repeat: expr repeat-expr: 4 

ما هي الصعوبة؟ لذلك ، بعد كل شيء ، يتم تخزين بيانات القيم الطبيعية والرؤوس في كتل من 4 ، ويتم ترتيب القمم أيضًا في 8 كتل للاستيفاء.


هذا أمر مثير للاهتمام: من المفترض أن مثل هذا التجمع تم إعداده لتسريع المعالجة بمساعدة تعليمات SSE التي ظهرت في معالجات Intel منذ عام 1999.

حسنًا ، لقد قرأنا هذا النموذج وألّفناه ، ولكن هناك شيء مفقود. بالضبط - الرسوم المتحركة!


Anm


يتم تخزين الرسوم المتحركة في شكل مكون كحالات رئيسية. هناك حقيقة مثيرة للاهتمام وهي أنها لا تدعم الرسوم المتحركة الهيكلية فحسب ، ولكن أيضًا تتحول قمة الرأس.



وصف الهيكل
 meta: id: anm title: Evil Islands, ANM file (bone animation) application: Evil Islands file-extension: anm license: MIT endian: le doc: Bone animation seq: - id: rotation_frames_count type: u4 doc: Number of rotation frames - id: rotation_frames type: quat repeat: expr repeat-expr: rotation_frames_count doc: Bone rotations - id: translation_frames_count type: u4 doc: Number of translation frames - id: translation_frames type: vec3 repeat: expr repeat-expr: translation_frames_count doc: Bone translation - id: morphing_frames_count type: u4 doc: Number of morphing frames - id: morphing_vertex_count type: u4 doc: Number of vertices with morphing - id: morphing_frames type: morphing_frame repeat: expr repeat-expr: morphing_frames_count doc: Array of morphing frames types: vec3: doc: 3d vector seq: - id: x type: f4 doc: x axis - id: y type: f4 doc: y axis - id: z type: f4 doc: z axis quat: doc: quaternion seq: - id: w type: f4 doc: w component - id: x type: f4 doc: x component - id: y type: f4 doc: y component - id: z type: f4 doc: z component morphing_frame: doc: Array of verteces morphing seq: - id: vertex_shift type: vec3 repeat: expr repeat-expr: _parent.morphing_vertex_count doc: Morphing shift per vertex 

هذا كل شيء - الآن لدينا نموذج كامل ، يمكنك أن تعجبك سحلية الناسك المقدمة حديثًا:



لحظة من الحنين إلى الماضي

معرفة ما يحتاج السحلية


التحدث مع السحلية في منزله


الناسك السحلية: لقد أتيت يا رجل. هذا جيد


زاك: هل هذا كل ما تريد أن تخبرني؟


الناسك السحلية: أنت في عجلة من جديد. أتذكر أسئلتك وسوف أجيب عليها. جئت إلى الناس في الحديد لعقد صفقة. ولكن رأيت كيف فعلوا لك. إنهم لا يحملون كلمة ، لقد توقفت عن تصديقهم. لقد حافظت على كلمتك. وسيتم تقديم صفقة لك.


الناسك السحلية: الناس يحبون الذهب. السحالي الذهبية غير مثيرة للاهتمام. سوف تكمل مهمتي ، وسأعطيك الذهب الذي أمتلكه. هناك الكثير من الذهب.


زاك (مدروس ودون اهتمام كبير) : هم ... الذهب ... بالتأكيد لن يضر ...


زاك: سيكون من الأفضل لو تمكنت من مساعدتي في معرفة مكان الساحر القديم الذي كنت أبحث عنه. بعد كل شيء ، السحالي شعب عريق ، ويمكنك أن تعرف ذلك!


الناسك السحلية: أنت على حق. السحالي شعب عريق. يمكنني جمع كل ما نعرفه عن الرجل العجوز. هل توافق على إكمال مهمتي؟


زاك: يا له من حديث! النظر في أن كل شيء قد تم بالفعل.


سحلية الناسك (على محمل الجد) : فعلت بالفعل؟ هل تريد خداع لي؟


زاك: في الواقع ، كنت أرغب في مزحة ، وإلا كنت جادًا.


سحلية الناسك: أرى. هذه مزحة. أعتقد أنني يمكن أن تجعل مزحة للغاية. ثم. والآن أحتاجك لإعادة الماء إلى القناة. العفاريت سرقت المياه منا.


سحلية الناسك: الذهاب جنوبا على طول المياه. سترى السد والقناة. يجب رفع السد. الرافعة المالية. سوف أعطيه. يجب حظر القناة. الحجر. لن اعطي حجر. إنه يقع بالفعل على حافة القناة. المنبع من السد. الحجر ثقيل. عندما حفرت العفاريت ، رفعوه لفترة طويلة. إذا دفعته ، فسوف يتراجع بسرعة.


الناسك السحلية: بعد ذلك ، أعود. سأخبرك بكل ما تعلمته عن الساحر القديم.


زاك: يدا بيد! لكن بالمناسبة ، إذا أضفت القليل من العملات المعدنية إلى القصة ، فلن أتعرض للإهانة على الإطلاق.


سحلية الناسك: بالنسبة للعملات المعدنية ، انتقل إلى أقاربي الذين يعيشون على المياه الضحلة في الجنوب. انتقل إلى أبعد جزيرة رملية ، والثالثة على التوالي. الكنوز ستكون لك!


سحلية الناسك (لنفسه) : غريب. هذا الرجل يحب الفكاهة. كنت أمزح. الرجل لم يضحك. غريب جدا


الآن - الأكثر إثارة للاهتمام: كيف يتم تخزين الخريطة.


النائب


هذا هو ملف رأس الخريطة. نظرًا لصدفة مؤسفة ، يتزامن الامتداد مع امتداد ملفات الحفظ المتعددة ، والتي لن نأخذها في الاعتبار.


تحتاج أولاً إلى تقديم وصف عام للمشهد:


  • عدد "القطع" - قطعة من البطاقة 32x32 متر ؛
  • أقصى ارتفاع (حيث يتم تخزين ارتفاع القمم في مقياس عدد صحيح) ؛
  • عدد أطلس البلاط.

, — , .



 meta: id: mp title: Evil Islands, MP file (map header) application: Evil Islands file-extension: mp license: MIT endian: le doc: Map header seq: - id: magic contents: [0x72, 0xF6, 0x4A, 0xCE] doc: Magic bytes - id: max_altitude type: f4 doc: Maximal height of terrain - id: x_chunks_count type: u4 doc: Number of sectors by x - id: y_chunks_count type: u4 doc: Number of sectors by y - id: textures_count type: u4 doc: Number of texture files - id: texture_size type: u4 doc: Size of texture in pixels by side - id: tiles_count type: u4 doc: Number of tiles - id: tile_size type: u4 doc: Size of tile in pixels by side - id: materials_count type: u2 doc: Number of materials - id: animated_tiles_count type: u4 doc: Number of animated tiles - id: materials type: material doc: Map materials repeat: expr repeat-expr: materials_count - id: id_array type: u4 doc: Tile type repeat: expr repeat-expr: tiles_count enum: tile_type - id: animated_tiles type: animated_tile doc: Animated tiles repeat: expr repeat-expr: animated_tiles_count types: material: doc: Material parameters seq: - id: type type: u4 doc: Material type by enum: terrain_type - id: color type: rgba doc: RGBA diffuse color - id: self_illumination type: f4 doc: Self illumination - id: wave_multiplier type: f4 doc: Wave speed multiplier - id: warp_speed type: f4 doc: Warp speed multiplier - id: unknown size: 12 types: rgba: doc: RGBA color seq: - id: r type: f4 doc: Red channel - id: g type: f4 doc: Green channel - id: b type: f4 doc: Blue channel - id: a type: f4 doc: Alpha channel enums: terrain_type: 0: base 1: water_notexture 2: grass 3: water animated_tile: doc: Animated tile parameters seq: - id: start_index type: u2 doc: First tile of animation - id: length type: u2 doc: Animation frames count enums: tile_type: 0: grass 1: ground 2: stone 3: sand 4: rock 5: field 6: water 7: road 8: empty 9: snow 10: ice 11: drygrass 12: snowballs 13: lava 14: swamp 15: highrock 

terrain typeاكتب
0
1
2
3

material typeاكتب
0grass
1ground
2stone
3sand
4rock
5field
6water
7road
8(empty)
9snow
10ice
11drygrass
12snowballs
13lava
14swamp
15highrock

, Res/aiinfo.res/tileDesc.reg .


: , — .
: .

. !


SEC


— 3232 . , ZonenameXXXYYY .



 meta: id: sec title: Evil Islands, SEC file (map sector) application: Evil Islands file-extension: sec license: MIT endian: le doc: Map sector seq: - id: magic contents: [0x74, 0xF7, 0x4B, 0xCF] doc: Magic bytes - id: liquids type: u1 doc: Liquids layer indicator - id: vertexes type: vertex doc: Vertex array 33x33 repeat: expr repeat-expr: 1089 - id: liquid_vertexes type: vertex doc: Vertex array 33x33 if: liquids != 0 repeat: expr repeat-expr: 'liquids != 0 ? 1089 : 0' - id: tiles type: tile doc: Tile array 16x16 repeat: expr repeat-expr: 256 - id: liquid_tiles type: tile doc: Tile array 16x16 if: liquids != 0 repeat: expr repeat-expr: 'liquids != 0 ? 256 : 0' - id: liquid_material type: u2 doc: Index of material if: liquids != 0 repeat: expr repeat-expr: 'liquids != 0 ? 256 : 0' types: vertex: doc: Vertex data seq: - id: x_shift type: s1 doc: Shift by x axis - id: y_shift type: s1 doc: Shift by y axis - id: altitude type: u2 doc: Height (z position) - id: packed_normal type: normal doc: Packed normal normal: doc: Normal (3d vector) seq: - id: packed type: u4 doc: Normal packed in 4b instances: x: doc: Unpacked x component value: packed >> 11 & 0x7FF y: doc: Unpacked y component value: packed & 0x7FF z: doc: Unpacked z component value: packed >> 22 tile: doc: Tile parameters seq: - id: packed type: u2 doc: Tile information packed in 2b instances: index: doc: Tile index in texture value: packed & 63 texture: doc: Texture index value: packed >> 6 & 255 rotation: doc: Tile rotation (*90 degrees) value: packed >> 14 & 3 

— .



10 z, 11 x y


 unsigned packed_normal; float x = ((float)((packed_normal >> 11) & 0x7FF) - 1000.0f) / 1000.0f; float y = ((float)(packed_normal & 0x7FF) - 1000.0f) / 1000.0f; float z = (float)(packed_normal >> 22) / 1000.0f; 


6 , 8 , 2


 unsigned short texture; unsigned char tile_index = f & 63; unsigned char texture_index = (f >> 6) & 255; unsigned char rotation = (f >> 14) & 3; 

3d


33 33 , , 3232 . — 1 .


:
x = x + x_offset / 254
y = y + y_offset / 254
z = altitude / 65535 * max_altitude ( .mp )


"", :


  0 1 2 *-*-* |\|\| ~ 33 *-*-* |\|\| ~ 66 *-*-* ~ ~ ~ 

, , 1616 . — 2 . , 90 .


. , , ID , MP .


: MP, , : ID , - .
ID — .

— :



- — , .


MOB


( ) , , : . — " ", .
, ( ).


:


 typedef structure { unsigned type_id; unsigned size; byte data[size - 8]; } node; 

(, !)


( , )


 meta: id: mob title: Evil Islands, MOB file (map entities) application: Evil Islands file-extension: mob license: MIT endian: le doc: Map entities tree seq: - id: root_node type: node doc: Root node types: node: doc: Entity node seq: - id: type_id type: u4 doc: Node children type ID - id: size type: u4 doc: Node full size - id: data type: node_data size: size - 8 doc: Node stored data node_data: doc: Node data seq: - id: value type: switch-on: _parent.type_id cases: 0xA000: node 0x00001E00: node 0x00001E01: node 0x00001E02: node 0x00001E03: node 0x00001E0B: node 0x00001E0E: node 0x0000A000: node 0x0000AA01: node 0x0000ABD0: node 0x0000B000: node 0x0000B001: node 0x0000CC01: node 0x0000DD01: node 0x0000E000: node 0x0000E001: node 0x0000F000: node 0x0000FF00: node 0x0000FF01: node 0x0000FF02: node 0xBBAB0000: node 0xBBAC0000: node 0xBBBB0000: node 0xBBBC0000: node 0xBBBD0000: node 0xBBBE0000: node 0xBBBF0000: node 0xDDDDDDD1: node _: u1 doc: Node elements repeat: eos 

()
AiGraph
AreaArray
Byte11
Diplomacy409632x32 2
Dword44
تعويم44
LeverStats12
Null0
Plot123 floats (vec3)
Plot2DArray
Quaternion164 floats (vec4)
Record>8
Rectangle
سلسلة
StringArray>4
StringEncrypted>4
UnitStats180
Unknown

type_id
type_id
0x00000000RecordROOT
0x00001E00RecordVSS_SECTION
0x00001E01RecordVSS_TRIGER
0x00001E02RecordVSS_CHECK
0x00001E03RecordVSS_PATH
0x00001E04DwordVSS_ID
0x00001E05RectangleVSS_RECT
0x00001E06DwordVSS_SRC_ID
0x00001E07DwordVSS_DST_ID
0x00001E08سلسلةVSS_TITLE
0x00001E09سلسلةVSS_COMMANDS
0x00001E0AByteVSS_ISSTART
0x00001E0BRecordVSS_LINK
0x00001E0CسلسلةVSS_GROUP
0x00001E0DByteVSS_IS_USE_GROUP
0x00001E0ERecordVSS_VARIABLE
0x00001E0FStringArrayVSS_BS_CHECK
0x00001E10StringArrayVSS_BS_COMMANDS
0x00001E11سلسلةVSS_CUSTOM_SRIPT
0x0000A000RecordOBJECTDBFILE
0x0000AA00NullLIGHT_SECTION
0x0000AA01RecordLIGHT
0x0000AA02تعويمLIGHT_RANGE
0x0000AA03سلسلةLIGHT_NAME
0x0000AA04PlotLIGHT_POSITION
0x0000AA05DwordLIGHT_ID
0x0000AA06ByteLIGHT_SHADOW
0x0000AA07PlotLIGHT_COLOR
0x0000AA08سلسلةLIGHT_COMMENTS
0x0000ABD0RecordWORLD_SET
0x0000ABD1PlotWS_WIND_DIR
0x0000ABD2تعويمWS_WIND_STR
0x0000ABD3تعويمWS_TIME
0x0000ABD4تعويمWS_AMBIENT
0x0000ABD5تعويمWS_SUN_LIGHT
0x0000B000RecordOBJECTSECTION
0x0000B001RecordOBJECT
0x0000B002DwordNID
0x0000B003DwordOBJTYPE
0x0000B004سلسلةOBJNAME
0x0000B005NullOBJINDEX
0x0000B006سلسلةOBJTEMPLATE
0x0000B007سلسلةOBJPRIMTXTR
0x0000B008سلسلةOBJSECTXTR
0x0000B009PlotOBJPOSITION
0x0000B00AQuaternionOBJROTATION
0x0000B00BNullOBJTEXTURE
0x0000B00CPlotOBJCOMPLECTION
0x0000B00DStringArrayOBJBODYPARTS
0x0000B00EسلسلةPARENTTEMPLATE
0x0000B00FسلسلةOBJCOMMENTS
0x0000B010NullOBJ_DEF_LOGIC
0x0000B011ByteOBJ_PLAYER
0x0000B012DwordOBJ_PARENT_ID
0x0000B013ByteOBJ_USE_IN_SCRIPT
0x0000B014ByteOBJ_IS_SHADOW
0x0000B015NullOBJ_R
0x0000B016سلسلةOBJ_QUEST_INFO
0x0000C000NullSC_OBJECTDBFILE
0x0000CC00NullSOUND_SECTION
0x0000CC01RecordSOUND
0x0000CC02DwordSOUND_ID
0x0000CC03PlotSOUND_POSITION
0x0000CC04DwordSOUND_RANGE
0x0000CC05سلسلةSOUND_NAME
0x0000CC06DwordSOUND_MIN
0x0000CC07DwordSOUND_MAX
0x0000CC08سلسلةSOUND_COMMENTS
0x0000CC09NullSOUND_VOLUME
0x0000CC0AStringArraySOUND_RESNAME
0x0000CC0BDwordSOUND_RANGE2
0x0000CC0DByteSOUND_AMBIENT
0x0000CC0EByteSOUND_IS_MUSIC
0x0000D000NullPR_OBJECTDBFILE
0x0000DD00NullPARTICL_SECTION
0x0000DD01RecordPARTICL
0x0000DD02DwordPARTICL_ID
0x0000DD03PlotPARTICL_POSITION
0x0000DD04سلسلةPARTICL_COMMENTS
0x0000DD05سلسلةPARTICL_NAME
0x0000DD06DwordPARTICL_TYPE
0x0000DD07تعويمPARTICL_SCALE
0x0000E000RecordDIRICTORY
0x0000E001RecordFOLDER
0x0000E002سلسلةDIR_NAME
0x0000E003DwordDIR_NINST
0x0000E004DwordDIR_PARENT_FOLDER
0x0000E005ByteDIR_TYPE
0x0000F000RecordDIRICTORY_ELEMENTS
0x0000FF00RecordSEC_RANGE
0x0000FF01RecordMAIN_RANGE
0x0000FF02RecordRANGE
0x0000FF05DwordMIN_ID
0x0000FF06DwordMAX_ID
0x31415926AiGraphAIGRAPH
0xACCEECCAسلسلةSS_TEXT_OLD
0xACCEECCBStringEncryptedSS_TEXT
0xBBAB0000RecordMAGIC_TRAP
0xBBAB0001DwordMT_DIPLOMACY
0xBBAB0002سلسلةMT_SPELL
0xBBAB0003AreaArrayMT_AREAS
0xBBAB0004Plot2DArrayMT_TARGETS
0xBBAB0005DwordMT_CAST_INTERVAL
0xBBAC0000RecordLEVER
0xBBAC0001NullLEVER_SCIENCE_STATS
0xBBAC0002ByteLEVER_CUR_STATE
0xBBAC0003ByteLEVER_TOTAL_STATE
0xBBAC0004ByteLEVER_IS_CYCLED
0xBBAC0005ByteLEVER_CAST_ONCE
0xBBAC0006LeverStatsLEVER_SCIENCE_STATS_NEW
0xBBAC0007ByteLEVER_IS_DOOR
0xBBAC0008ByteLEVER_RECALC_GRAPH
0xBBBB0000RecordUNIT
0xBBBB0001NullUNIT_R
0xBBBB0002سلسلةUNIT_PROTOTYPE
0xBBBB0003NullUNIT_ITEMS
0xBBBB0004UnitStatsUNIT_STATS
0xBBBB0005StringArrayUNIT_QUEST_ITEMS
0xBBBB0006StringArrayUNIT_QUICK_ITEMS
0xBBBB0007StringArrayUNIT_SPELLS
0xBBBB0008StringArrayUNIT_WEAPONS
0xBBBB0009StringArrayUNIT_ARMORS
0xBBBB000AByteUNIT_NEED_IMPORT
0xBBBC0000RecordUNIT_LOGIC
0xBBBC0001NullUNIT_LOGIC_AGRESSIV
0xBBBC0002ByteUNIT_LOGIC_CYCLIC
0xBBBC0003DwordUNIT_LOGIC_MODEL
0xBBBC0004تعويمUNIT_LOGIC_GUARD_R
0xBBBC0005PlotUNIT_LOGIC_GUARD_PT
0xBBBC0006ByteUNIT_LOGIC_NALARM
0xBBBC0007ByteUNIT_LOGIC_USE
0xBBBC0008NullUNIT_LOGIC_REVENGE
0xBBBC0009NullUNIT_LOGIC_FEAR
0xBBBC000AتعويمUNIT_LOGIC_WAIT
0xBBBC000BByteUNIT_LOGIC_ALARM_CONDITION
0xBBBC000CتعويمUNIT_LOGIC_HELP
0xBBBC000DByteUNIT_LOGIC_ALWAYS_ACTIVE
0xBBBC000EByteUNIT_LOGIC_AGRESSION_MODE
0xBBBD0000RecordGUARD_PT
0xBBBD0001PlotGUARD_PT_POSITION
0xBBBD0002NullGUARD_PT_ACTION
0xBBBE0000RecordACTION_PT
0xBBBE0001PlotACTION_PT_LOOK_PT
0xBBBE0002DwordACTION_PT_WAIT_SEG
0xBBBE0003DwordACTION_PT_TURN_SPEED
0xBBBE0004ByteACTION_PT_FLAGS
0xBBBF0000RecordTORCH
0xBBBF0001تعويمTORCH_STRENGHT
0xBBBF0002PlotTORCH_PTLINK
0xBBBF0003سلسلةTORCH_SOUND
0xDDDDDDD1RecordDIPLOMATION
0xDDDDDDD2DiplomacyDIPLOMATION_FOF
0xDDDDDDD3StringArrayDIPLOMATION_PL_NAMES
0xFFFFFFFFUnknownUNKNOWN

— , , Nival, — , ( , ).


 unsigned key; for (size_t i = 0; i < size; i++) { key += (((((key * 13) << 4) + key) << 8) - key) * 4 + 2531011; data[i] ^= key >> 16; } 

: , ( ) . , , , .

( , , — Windows 98):



: , . , ( , , " : ", ).

, , - - , , Collada :




. , .


, . - , — - , . , -...


— !


UPD (23.01.2019):
, : github .
, (, "" ).


Source: https://habr.com/ru/post/ar434802/


All Articles