أوتبوست 2 تنسيقات الملفات · bei.pm

تمت ترجمة هذا النص تلقائيًا بواسطة OpenAI GPT-4o Mini.

تنسيق الملفات الموصوفة في هذه الصفحة يستند إلى التحليل الفني للملكية الفكرية من قبل Dynamix, Inc. و Sierra Entertainment.
الملكية الفكرية هي اليوم جزء من مجموعة Activision Publishing, Inc. / Activision Blizzard, Inc. وهي حالياً مملوكة لـ Microsoft Corp..

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

يمكن شراء اللعبة حاليًا كتنزيل من gog.com.

فن اللعبة

تسجل سلسلة المقالات التالية اكتشافاتي حول تنسيقات البيانات في لعبة استراتيجية الوقت الحقيقي "Outpost 2: Divided Destiny"، التي صدرت في عام 1997 بواسطة شركة سييرا وتم تطويرها من قبل دايناميكس.

لقد قمت بالتركيز على تحليل بيانات اللعبة - وما يمكن فعله بها - في الفترة من 1 نوفمبر 2015 حتى 14 نوفمبر 2015.

وفقًا للمعلومات التي تمكنت من الحصول عليها حتى الآن، قامت دايناميكس - مثل العديد من الشركات التجارية الأخرى - بتطوير بعض تنسيقات البيانات ليس فقط من أجل "Outpost 2" ولكن أيضًا استخدمتها في تطويرات أخرى مثل سلسلة "Mechwarrior" (بشكل معدل).
بغض النظر عن ذلك، يمكن أيضًا ملاحظة أن الابتكار في تنسيقات البيانات يظل محدودًا وغالبًا ما يعتمد على مفاهيم قائمة منذ زمن طويل من تنسيقات شائعة مثل JFIF وRIFF.

للحصول على مزيد من المعلومات حول تفسير الجداول وتنسيقات البيانات، يمكنك الاطلاع على ما هو ما؟.
البيانات المقدمة هنا تُفهم عمومًا كـ Little Endian.

في الختام، يمكن القول إن عملية الهندسة العكسية كانت ممتعة للغاية، حتى وإن لم تكن مكتملة.
بالطبع أوصي أيضًا بلعب اللعبة بنفسك، لأنها تقدم آليات لعب مثيرة للاهتمام.

مقدمة

تتبع الصيغ البيانية المستخدمة في Outpost 2 هيكلًا يشبه JFIF / PNG - حيث تحتوي كتل البيانات الفردية دائمًا على رأس بطول 8 بايت. لذلك، سأوفر على نفسي عناء توثيق الرؤوس الفردية في الأماكن المحددة ذات الصلة وسأقوم بتوثيق الانحرافات فقط.

الصيغة دائمًا هي كما يلي؛ حيث تكون البيانات الفعلية مضمنة داخلها:

عنوان x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF حرف
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
الإزاحة نوع البيانات التسمية شرح
0x0000 uint(32) بايتات السحر

يتضمن المعلومات حول ما يمكن توقعه في كتلة البيانات التالية.

القيم المعروفة:

  • 0x204C4F56 ('VOL '):
    الحجم
  • 0x686C6F76 ('VOLH'):
    رأس الحجم
  • 0x736C6F76 ('VOLS'):
    سلاسل الحجم
  • 0x696C6F76 ('VOLI'):
    معلومات الحجم
  • 0x4B4C4256 ('BLCK'):
    كتلة الحجم
  • 0x504D4250 ('PBMP'):
    بيانات الرسوم
  • 0x4C415050 ('PPAL'):
    لوحة الألوان
  • 0x4C415043 ('CPAL'):
    حاوية لوحات الألوان
  • 0x64616568 ('head'):
    الرأس
  • 0x61746164 ('data'):
    البيانات المفيدة
0x0004 uint(24) طول الكتلة

يتضمن المعلومات حول حجم (بالبايت) كتلة البيانات التالية.

هنا يُقصد بالبيانات الفعلية فقط - حيث لا تشمل 8 بايت الخاصة بالرأس.

0x0007 uint(8) أعلام؟

من غير المعروف ما هو الغرض الدقيق من هذه الكتلة.

في الأحجام، غالبًا ما تكون هذه القيمة 0x80، وفي ملفات أخرى غالبًا ما تكون 0x00. هذا يشير إلى أنه قد يكون مجموعة من العلامات.

الأحجام

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

يتكون الحجم من رأس الحجم بالإضافة إلى عدة كتل حجم، تمثل الملفات المحددة.

"الأحجام" هي الملفات التي تنتهي بالامتداد 'vol' في دليل اللعبة.

عنوان x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF حرف
0x0000 56 4f 4c 20 -- -- -- -- -- -- -- -- -- -- -- -- V O L . . . . . . . . . . . .
الإزاحة نوع البيانات التسمية شرح
0x0000 uint(32) بايتات السحر
0x0004 uint(24) طول الكتلة
0x0007 uint(8) رايات

رأس الحجم

عنوان x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF حرف
0x0000 76 6f 6c 68 -- -- -- -- -- -- -- -- -- -- -- -- v o l h . . . . . . . . . . . .
الإزاحة نوع البيانات التسمية شرح
0x0000 uint(32) بايتات السحر
0x0004 uint(24) طول الكتلة
0x0007 uint(8) رايات

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

يجب أن تحتوي أول بيانات في رأس الحجم على سلاسل الحجم؛ تليها معلومات الحجم.

سلاسل الحجم

عنوان x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF حرف
0x0000 76 6f 6c 69 -- -- -- -- -- -- -- -- -- -- -- -- v o l i . . . . . . . . . . . .
الإزاحة نوع البيانات التسمية شرح
0x0000 uint(32) بايتات السحر
0x0004 uint(24) طول الكتلة
0x0007 uint(8) رايات
عنوان x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF حرف
0x0000 76 6f 6c 73 -- -- -- -- -- -- -- -- -- -- -- -- v o l s . . . . . . . . . . . .
الإزاحة نوع البيانات التسمية شرح
0x0000 uint(32) بايتات السحر
0x0004 uint(24) طول الكتلة
0x0007 uint(8) رايات
0x0008 uint(32) طول الحمولة

يحدد عدد البايتات التي تعتبر بيانات مفيدة من البيانات التالية.

أما البيانات المتبقية من قائمة سلاسل الحجم، فتُعتبر بشكل واضح قمامة.

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

0x000c uint(8)[] قائمة أسماء الملفات

هذه قائمة بأسماء الملفات محددة بحجم 0 بايت، والتي - على الأقل في هذا الجزء من البيانات - تتوقع فقط وجود أحرف ASCII.

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

سلاسل الحجم هي قائمة بأسماء الملفات الموجودة داخل الحجم.

معلومات الحجم

عنوان x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF حرف
0x0000 76 6f 6c 69 -- -- -- -- -- -- -- -- -- -- -- -- v o l i . . . . . . . . . . . .
الإزاحة نوع البيانات التسمية شرح
0x0000 uint(32) بايتات السحر
0x0004 uint(24) طول الكتلة
0x0007 uint(8) رايات

تحتوي معلومات الحجم على تفاصيل أكثر عن الملفات. وهي نوع من إدخالات الدليل FAT (FAT = جدول تخصيص الملفات) بطريقة ما.

عدد الملفات يتم حسابه من خلال حجم الكتلة مقسومًا على طول إدخالات الدليل - 14 بايت.

تتكون إدخالات الدليل الفردية من التكوين التالي:

عنوان x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF حرف
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
الإزاحة نوع البيانات التسمية شرح
0x0000 uint(32) تعويض أسماء الملفات

يحدد موضع (Offset) اسم الملف داخل قائمة أسماء الملفات (سلاسل الحجم).

يشير إلى بداية كتلة البيانات المستخدمة.

0x0004 uint(32) تعويض الملف

يُشير إلى الموضع داخل ملف الحجم الكامل الذي توجد فيه الملف.

0x0008 uint(32) حجم الملف

يشير إلى حجم الملف بالبايت.

0x000c uint(16) علامات؟

يبدو أنها تقدم معلومات إضافية حول ترميز الملف.

  • 0x03 مُعَيّن عندما يكون الملف مضغوطًا. يبدو أن هناك شجرة هوفمان مستخدمة هنا.
  • 0x80 يبدو أنها مُعَيّنة دائمًا.

كتلة الحجم

عنوان x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF حرف
0x0000 56 42 4c 48 -- -- -- -- -- -- -- -- -- -- -- -- V B L H . . . . . . . . . . . .
الإزاحة نوع البيانات التسمية شرح
0x0000 uint(32) بايتات السحر
0x0004 uint(24) طول الكتلة
0x0007 uint(8) رايات

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

بلاط

عنوان x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF حرف
0x0000 50 42 4d 50 -- -- -- -- -- -- -- -- -- -- -- -- P B M P . . . . . . . . . . . .
الإزاحة نوع البيانات التسمية شرح
0x0000 uint(32) بايتات السحر
0x0004 uint(24) طول الكتلة
0x0007 uint(8) أعلام

تتعلق البلاطات بترميز رسومي من نوع Bitmap خاص بلعبة Outpost-2. تمتد عبر 13 مجموعة بلاطات، تُسمى "آبار" (well0000.bmp حتى well0012.bmp)، الموجودة داخل الملف maps.vol.

تحتوي مجموعات البلاطات / الآبار على ما يلي:

اسم الملف المحتوى
well0000.bmp صورة زرقاء بحجم 32x32 بكسل - مثالية كاختبار لمعرفة ما إذا كان محمّل الصور الخاص بك يعمل
well0001.bmp تحتوي على صخور فاتحة، وسلاسل جبال على صخور فاتحة، والعديد من أنواع حفريات الاصطدام في الصخور الفاتحة
well0002.bmp تحتوي على "دودادز" من الصخور الفاتحة - أي عناصر يمكن وضعها لتفكيك (أو بشكل متعمد كهيكل، مثل الجدران) على الصخور الفاتحة، بما في ذلك النبات
well0003.bmp تحتوي على هيكل قشري على الصخور الفاتحة
well0004.bmp تحتوي على صخور داكنة، وسلاسل جبال على صخور داكنة، والعديد من أنواع حفريات الاصطدام في الصخور الداكنة
well0005.bmp تحتوي على "دودادز" من الصخور الداكنة - أي عناصر يمكن وضعها لتفكيك (أو بشكل متعمد كهيكل، مثل الجدران) على الصخور الداكنة
well0006.bmp تحتوي على هيكل قشري على الصخور الداكنة، بالإضافة إلى انتقالات بين الصخور الفاتحة والداكنة
well0007.bmp تحتوي على حمم بركانية تشمل 4-5 إطارات متحركة لكل منها
well0008.bmp تحتوي على رمل والعديد من أنواع حفريات الاصطدام في الرمل
well0009.bmp تحتوي على "دودادز" من الرمل - أي عناصر يمكن وضعها لتفكيك (أو بشكل متعمد كهيكل، مثل الجدران) على الرمل
well0010.bmp تحتوي على 48 انتقالًا من الرمل إلى الصخور الفاتحة والداكنة
well0011.bmp تحتوي على الأغطية القطبية للخريطة، مع الصخور الداكنة كقاعدة
well0012.bmp تحتوي على الأغطية القطبية للخريطة، مع الصخور الفاتحة كقاعدة

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

المربعات هي رسومات بدقة 8 بت مع لوحة ألوان مؤشرة بحجم 32x32 بكسل، مرتبة جنبًا إلى جنب. في مجموعة المربعات الناتجة يمكن أن توجد الكثير من

الحاوية الرئيسية تتكون من قسمين: head و data.

عنوان البلاط

عنوان x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF حرف
0x0000 68 65 61 64 -- -- -- -- -- -- -- -- -- -- -- -- h e a d . . . . . . . . . . . .
0x0010 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
الإزاحة نوع البيانات التسمية شرح
0x0000 uint(32) بايتات السحر
0x0004 uint(24) طول الكتلة
0x0007 uint(8) أعلام
0x0008 uint(32) الإصدار / الأعلام؟

قد يتعلق الأمر ببيان إصدار تنسيق الملف؛ في جميع الملفات التي لدي، كانت القيمة هنا 0x02

0x000c uint(32) عرض (الدقة الأفقية)

يحدد عرض ملف الصورة (بالبكسل).

في جميع الآبار في Outpost 2، من المتوقع أن تكون القيمة هنا 0x20 أو 32.

0x0010 uint(32) الارتفاع (الدقة الرأسية)

يشير إلى ارتفاع ملف الصورة (بالبكسل).

في جميع آبار Outpost 2، من المتوقع أن تكون القيمة هنا 0x20 أو 32.

0x0014 uint(32) عمق اللون؟

معنى هذه القيمة غير معروف.

نظرًا لأنه يحتوي على القيمة 8 في جميع الملفات التي تم فحصها، فقد يكون متعلقًا بتحديد عمق اللون.

0x0018 uint(32) عمق اللون 2؟

إن معنى هذه القيمة غير معروف.

ربما يتعلق الأمر بعمق لون 'الهدف'.

بعد هذه المعلومات، ستظهر أيضًا ملف لوحة بالألوان بصيغة RIFF القياسية. يمكن العثور على المواصفات الدقيقة - حيث تظهر اللوحات في أماكن أخرى أيضًا - تحت لوحات الألوان.

بيانات البلاط

عنوان x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF حرف
0x0000 64 61 74 61 -- -- -- -- -- -- -- -- -- -- -- -- d a t a . . . . . . . . . . . .
الإزاحة نوع البيانات التسمية شرح
0x0000 uint(32) بايتات السحر
0x0004 uint(24) طول الكتلة
0x0007 uint(8) أعلام

أخيرًا، تتبع بيانات البكسل العارية من الأعلى إلى اليسار إلى الأسفل إلى اليمين.
تتوافق قيمة البيانات في الرسومات التي تكون عادةً بتنسيق 8bpp مع فهرس اللون في لوحة الألوان.

تبدأ بيانات البكسل من أعلى اليسار وتنتهي في أسفل اليمين.

محرك اللعبة يقوم برسم البلاطات *ربما* عند الطلب.
يبدو أن هذا مرتبط بدورة الليل والنهار، التي تعرف 32 درجة من البلاطات الفردية. ومن الواضح أنه يتم طرح 'قليل' من قيمة السطوع في كل مرة. لم يتمكن من تحديد القيم الدقيقة بعد، وأنا أعمل على أساس الحساب

v *= (daylight / 48) + 0.25;

مع بيانات HSV للبكسلات، حيث تكون قيمة daylight تتراوح بين 0-31 و v تتراوح بين 0-1. علاوة على ذلك، يجب أن نأخذ في الاعتبار أنه يوجد على الخريطة حدود من 16 بلاطة على اليسار واليمين (وهذا يخدم إنجاب الوحدات بشكل غير مرئي).

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

تصور دورة الليل والنهار

بي آر تي

عنوان x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF حرف
0x0000 43 50 41 4c -- -- -- -- -- -- -- -- -- -- -- -- C P A L . . . . . . . . . . . .
الإزاحة نوع البيانات التسمية شرح
0x0000 uint(32) بايتات السحر
0x0004 uint(24) طول المنصة

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

0x0007 uint(8) أعلام

من المحتمل، كما هو معتاد، أن تكون هناك علامات.

ومع ذلك، لا أعرف أي علامات؛ حيث أن جميع القيم المعروفة لي تتوافق مع 0x00، لذا من المحتمل أيضًا أن يكون عدد اللوحات ببساطة عبارة عن uint(32).

ما هو المقصود تمامًا بـ PRT ليس معروفًا لي؛ من الممكن أن يكون مثلًا 'جدول اللوحات والموارد' - حيث أن هذه الملف - الموجود باسم op2_art.prt في maps.vol - هو من هذا القبيل، أو قد تصف هذه الوظيفة بشكل جيد.

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

قسم CPAL (من المحتمل أن يعني حاوية اللوحات) يحوي فقط بيانات اللوحات، من خلال الإشارة إلى عدد اللوحات التي عادةً ما تكون بحجم 1052 بايت 8-بت.

لا تعتبر بيانات حجم 1052 بايت ملزمة، حيث أن تنسيق اللوحات قد يتضمن أحجام لوحات مختلفة. هي مجرد إشارة للبيانات التي تم تسليم Outpost 2 بها.

بعد قوائم اللوحات، تأتي مباشرة ودون رأس تمهيدي، قائمة الصور النقطية؛ تليها قوائم الرسوم المتحركة بشكل مماثل.
كل منهما يبدأ برمز uint(32) (أو مرة أخرى uint24+uint8 flags؟) الذي يحتوي على عدد السجلات.

لوحات الألوان

عنوان x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF حرف
0x0000 50 50 41 4c -- -- -- -- -- -- -- -- -- -- -- -- P P A L . . . . . . . . . . . .
الإزاحة نوع البيانات التسمية شرح
0x0000 uint(32) بايتات السحر
0x0004 uint(24) طول البالتة

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

0x0007 uint(8) الأعلام

من المحتمل، كما هو معتاد، أن تكون هناك أعلام.

ومع ذلك، لا أعرف أي أعلام؛ حيث أن جميع القيم المعروفة لدي تتوافق مع 0x00، لذا فمن المحتمل أيضًا أن يكون عدد اللوحات ببساطة عبارة عن uint(32).

معلومات الباليت سهلة القراءة جداً.
تتكون كل منها من رأس وقطعة بيانات.

رأس اللوحات

عنوان x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF حرف
0x0000 68 65 61 64 -- -- -- -- -- -- -- -- -- -- -- -- h e a d . . . . . . . . . . . .
الإزاحة نوع البيانات التسمية شرح
0x0000 uint(32) بايتات السحر
0x0004 uint(24) طول البالتة

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

0x0007 uint(8) الأعلام

من المحتمل، كما هو معتاد، أن تكون هناك أعلام.

ومع ذلك، لا أعرف أي أعلام؛ حيث أن جميع القيم المعروفة لدي تتوافق مع 0x00، لذا فمن المحتمل أيضًا أن يكون عدد اللوحات ببساطة عبارة عن uint(32).

0x0008 uint(32) نسخة تنسيق الباليات؟

يحدد على الأرجح أي إصدار من تنسيق الباليت يتبعه الباليت.

تبدو جميع باليتات Outpost2 أنها تحمل الإصدار 0x01.

بيانات المنصات

عنوان x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF حرف
0x0000 64 61 74 61 -- -- -- -- -- -- -- -- -- -- -- -- d a t a . . . . . . . . . . . .
الإزاحة نوع البيانات التسمية شرح
0x0000 uint(32) بايتات السحر
0x0004 uint(24) طول الكتلة
0x0007 uint(8) الأعلام

يحتوي قسم البيانات على إدخالات البالات الفردية. تتحدد عدد إدخالات البالات من خلال طول الكتلة / 4.

تتمتع الإدخالات الفردية بالبنية البسيطة التالية؛

عنوان x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF حرف
0x0000 -- -- -- 04 -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
الإزاحة نوع البيانات التسمية شرح
0x0000 uint(8) مكون الأحمر

يشير إلى نسبة اللون الأحمر

0x0001 uint(8) مكون الأخضر

يعبر عن نسبة اللون الأخضر

0x0002 uint(8) مكون الأزرق

يشير إلى نسبة اللون الأزرق

0x0003 uint(8) غير معروف - الأعلام؟

ليس من الواضح ما معنى هذه القيمة، لأنها تبدو في الأساس 0x04.

بالنسبة للألوان، يجب أن يقال أيضًا أنه عند استخدام الألوان للرسوم المتحركة، تنطبق القواعد التالية:

  • اللون الأول هو دائمًا شفاف، بغض النظر عن القيمة المحددة هناك.
  • تعتبر إدخالات الألوان من 1 إلى 24 كألوان لاعبين في الألوان من 1 إلى 8.
    من غير الواضح بالنسبة لي من أين تأتي الألوان بخلاف اللاعب 1.
    أفترض أن الألوان المتبقية مشفرة في البرنامج.

مرجع الألوان

الصور النقطية

عنوان x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF حرف
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
0x0010 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
الإزاحة نوع البيانات التسمية شرح
0x0000 uint(32) عرض موجه

يحدد عرض صفوف بيانات البكسل بالبايت - حيث إنها محاذاة على حدود 4 بايت.

لذلك من السهل بسرعة الوصول إلى صف صورة معين.

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

0x0004 uint(32) تعويض

يوضح إزاحة السطر الأول في خريطة البتات

0x0008 uint(32) ارتفاع

حدد ارتفاع الصورة بالبكسل

0x000c uint(32) عرض

يحدد عرض الصورة بالبكسل

0x0010 uint(16) نوع

تحدد نوع الصورة. يبدو أنها تتعلق بقناع بت:

  • 0x04 تكون مفعّلة إذا كانت الصورة بحجم 1 بت لكل بكسل.
  • 0x40 تكون مفعّلة إذا كانت الصورة تتطلب تنفيذ نظام النوافذ.
0x0012 uint(16) لوحة الألوان

يحدد أي لوحة يجب استخدامها من ملف PRT

تحدد بنية بيانات ملف PRT كيفية بناء الصور النقطية (Bitmaps) المستخدمة في الرسوم المتحركة. وتعمل هذه الصور النقطية كجزء منفرد، يتم تجميع عدة منها لتشكيل إطار رسوم متحركة لرسوم متحركة (Sprite).

توجد بيانات الصورة الفعلية في op2_art.BMP في دليل اللعبة.
من غير الواضح لماذا تحتوي هذه الصورة النقطية على رأس ملف RIFF (الذي يعد صحيحًا في الغالب)، من المحتمل أن تستخدم لعبة Outpost 2 واجهات برمجة تطبيقات النظام لتحميل الرسوميات، عن طريق أخذ هذا الرأس مؤقتًا وكتابة الحقول المتغيرة المناسبة.

توجد بيانات البكسل في ملف BMP عند موضع Offset + uint32-Offset، الذي يمكن العثور عليه في ملف BMP عند العنوان 0x000A (إزاحة بيانات RIFF-Bitmap)، وهي مرتبة بشكل صفوف من أعلى اليسار إلى أسفل اليمين.

يمكن رسم الرسوميات الأحادية اللون (1bpp) بحيث تمثل اللون 0 الشفافية الكاملة، بينما يمثل اللون 1 لونًا أسود/رمادي نصف شفاف، حيث تُستخدم الرسوميات الأحادية عادةً لظلال المركبات والمباني في الرسوم المتحركة.

بهذه الطريقة يمكن تجميع العديد من الرسوميات.

وحدة سكنية محمية (بليموث)

الرسوم المتحركة

الآن نأتي إلى الفئة العليا من التخصصات ضمن تنسيقات بيانات Outpost 2:
الرسوم المتحركة.

تبدأ قوائم الرسوم المتحركة بعنوان رئيسي عالمي، والذي يخدم بشكل أساسي للتحقق من البيانات. تلي ذلك تعريفات الرسوم المتحركة المحددة، والتي تنقسم إلى 3 مستويات:

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

بعد ذلك، تأتي على الفور تعريفات الرسوم المتحركة الفردية.

عنوان x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF حرف
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
الإزاحة نوع البيانات التسمية شرح
0x0000 uint(32) عدد الرسوم المتحركة

كم عدد سجلات الرسوم المتحركة الموجودة

0x0004 uint(32) عدد الإطارات

كم عدد الإطارات التي يجب أن تكون موجودة إجمالاً

0x0008 uint(32) عدد الإطارات الفرعية

كم عدد الإطارات الفرعية التي يجب أن تكون موجودة في المجموع

0x000c uint(32) عدد الإدخالات الاختيارية

كم عدد "المدخلات الاختيارية" الموجودة.

الرسوم المتحركة

عنوان x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF حرف
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
0x0010 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
0x0020 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
الإزاحة نوع البيانات التسمية شرح
0x0000 uint(32) غير معروف 1

معلومات مجهولة

0x0004 uint(32) صندوق الحدود: اليسار

يحدد بداية الجانب الأيسر (بالبكسل) لـ Bounding Box.

0x0008 uint(32) الصندوق المحيط: الأعلى

يحدد الجزء العلوي من Bounding Box (بالبكسل).

0x000c uint(32) حدود الصندوق: العرض

يحدد عرض الصندوق المحيط (بالبكسل).

0x0010 uint(32) صندوق التحديد: الارتفاع

يحدد ارتفاع صندوق الإحاطة (بالبكسل).

0x0014 uint(32) إزاحة: X

يحدد منتصف الرسوم المتحركة الأفقي

0x0018 uint(32) الإزاحة: Y

يحدد منتصف العمودي للرسوم المتحركة

0x001c uint(32) غير معروف 2

معلومات غير معروفة

0x0020 uint(32) عدد الإطارات

يحدد عدد إطارات الرسوم المتحركة الموجودة في هذه الرسوم المتحركة

0x0024 uint(32) عدد النوافذ

حدد عدد النوافذ التي يجب استخدامها أثناء الرسم

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

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

بالنسبة للنوافذ، فهي، مثل الإزاحة، تتكون من 4 قيم uint(32) لكل نافذة، تحدد منطقة تعتبر قابلة للاستخدام للإطارات الفرعية الفردية. لا يجوز الرسم خارج النوافذ، طالما أنه مخصص لذلك في صورة البت.

إطار

عنوان x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF حرف
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
الإزاحة نوع البيانات التسمية شرح
0x0000 uint(8) عدد الإطارات الفرعية وزر التبديل للخيار 1، 2

تحتوي هذه القيمة على:

  • 0x7F (قناع بت): عدد الإطارات الفرعية المستخدمة في هذه الإطار
  • 0x80: المعلومات حول ما إذا كانت الخيارات 1 و 2 موجودة
0x0001 uint(8) غير معروف 1 و تبديل للخيار 3 و 4

تحتوي هذه القيمة على:

  • 0x7F (قناع بت): غير معروف - أشتبه بشدة في أن هذا يتعلق بعدد الدورات اللعبية التي تمر حتى يتم عرض الإطار التالي
  • 0x80: المعلومات حول ما إذا كانت الخيارات 3 و 4 موجودة
0x0002 uint(8) اختياري 1

مجهول

0x0003 uint(8) اختياري 2

مجهول

0x0004 uint(8) اختياري 3

مجهول

0x0005 uint(8) اختياري 4

مجهول

الإطار الفرعي

عنوان x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF حرف
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
الإزاحة نوع البيانات التسمية شرح
0x0000 uint(16) معرّف البت ماب

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

0x0002 uint(8) غير معروف 1

غير معروف - لكنني أفترض بقوة أن هذا يتعلق بأولوية العرض (Z-Layer).

0x0003 uint(8) معرف الإطار الفرعي

يشير إلى الإطار الفرعي الذي نحن فيه

0x0004 sint(16) الإزاحة - أفقي

حدد المكان داخل الإطار الذي يجب أن يوضع فيه الإطار الفرعي، أو بمقدار عدد البيكسلات التي يجب أن تُزاح الصورة Bitmap أفقيًا

0x0006 sint(16) التعويض - عمودي

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

وبذلك يمكننا الآن تجميع إطارات فردية، وكذلك الرسوم المتحركة الكاملة، وهنا نوضح ذلك بشكل مثالي من خلال رسوم متحركة أكثر تعقيدًا، وهي الرسوم المتحركة ذات الفهرس 500

الرسوم المتحركة 500

الرسوم المتحركة 500 توضح كيفية تفريغ شاحنة بليموث محملة بالمعادن العادية. هذه واحدة من القلائل التي تستخدم وظيفة النوافذ.

وهكذا يمكن تجميع الرسوم المتحركة بالكامل.
لسوء الحظ، لا يزال هناك مشكلة في فتحة التحميل العلوية، حيث لم يتم تعيين البت المناسب في معلومات نوع الرسوم.

إليكم بعض الرسوم المتحركة الجميلة الأخرى من اللعبة:

عرض الرسوم المتحركة 500 موضحًا

الرسوم المتحركة 500 مكتملة

مصنع مباني بليموث

ميناء إيدن الفضائي

المركز الطبي في إيدن

SCAT

ميناء بليموث الفضائي

بيضة عيد الفصح:
سانتا كلوز

بيضة عيد الفصح:
كلب دان

واجهة المستخدم

الآن ينقص واجهة المستخدم للعبة، التي تأتي بتصميم معدني مصقول.

ولكن هنا أيضًا يتضح أن Dynamix لم يكن بحاجة لإعادة اختراع العجلة؛ حيث لا يتم استخدام واجهات برمجة التطبيقات User32 و GDI32 التي توفرها Windows بشكل بسيط فقط - بل يتم أيضًا استخدام إدارة الموارد من User32.

يمكن استخراج هذه الموارد على سبيل المثال من خلال برامج مثل Resource Hacker الذي تم تطويره كبرمجيات مجانية بواسطة Angus Johnson، أو - إذا كنت تتجنب استخدام Wine على Linux / Mac OS - باستخدام wrestool المضمن في icoutils.

اسم الملف المحتوى
Outpost2.exe يحتوي فقط على أيقونة اللعبة، التي تُظهر محطة الفضاء أمام نيو تيرا
op2shres.dll يحتوي بالإضافة إلى الرسوميات لعناصر التحكم مثل الحدود، الأزرار، أزرار الراديو وصناديق الاختيار، على خلفيات حوار وصور مرافقة لنصوص المهام في القصة وخلفية القائمة الرئيسية
out2res.dll يحتوي على زخرفة نوافذ اللعبة، أيقونات للمعادن العادية والخاصة، شاشة التحميل، رسومات للحوار بالإضافة إلى رسومات المؤشرات الأخرى، بالإضافة إلى الرسومات المتحركة في دليل اللعبة