أوتبوست 2 تنسيقات الملفات · bei.pm
تنسيق الملفات الموصوفة في هذه الصفحة يستند إلى التحليل الفني للملكية الفكرية من قبل 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) | بايتات السحر | يتضمن المعلومات حول ما يمكن توقعه في كتلة البيانات التالية. القيم المعروفة:
|
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) | علامات؟ | يبدو أنها تقدم معلومات إضافية حول ترميز الملف.
|
كتلة الحجم
عنوان | 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) | الإصدار / الأعلام؟ | قد يتعلق الأمر ببيان إصدار تنسيق الملف؛ في جميع الملفات التي لدي، كانت القيمة هنا |
0x000c | uint(32) | عرض (الدقة الأفقية) | يحدد عرض ملف الصورة (بالبكسل). في جميع الآبار في Outpost 2، من المتوقع أن تكون القيمة هنا |
0x0010 | uint(32) | الارتفاع (الدقة الرأسية) | يشير إلى ارتفاع ملف الصورة (بالبكسل). في جميع آبار Outpost 2، من المتوقع أن تكون القيمة هنا |
0x0014 | uint(32) | عمق اللون؟ | معنى هذه القيمة غير معروف. نظرًا لأنه يحتوي على القيمة |
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) | أعلام | من المحتمل، كما هو معتاد، أن تكون هناك علامات. ومع ذلك، لا أعرف أي علامات؛ حيث أن جميع القيم المعروفة لي تتوافق مع |
ما هو المقصود تمامًا بـ 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) | الأعلام | من المحتمل، كما هو معتاد، أن تكون هناك أعلام. ومع ذلك، لا أعرف أي أعلام؛ حيث أن جميع القيم المعروفة لدي تتوافق مع |
معلومات الباليت سهلة القراءة جداً.
تتكون كل منها من رأس وقطعة بيانات.
رأس اللوحات
عنوان | 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) | الأعلام | من المحتمل، كما هو معتاد، أن تكون هناك أعلام. ومع ذلك، لا أعرف أي أعلام؛ حيث أن جميع القيم المعروفة لدي تتوافق مع |
0x0008 | uint(32) | نسخة تنسيق الباليات؟ | يحدد على الأرجح أي إصدار من تنسيق الباليت يتبعه الباليت. تبدو جميع باليتات Outpost2 أنها تحمل الإصدار |
بيانات المنصات
عنوان | 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) | غير معروف - الأعلام؟ | ليس من الواضح ما معنى هذه القيمة، لأنها تبدو في الأساس |
بالنسبة للألوان، يجب أن يقال أيضًا أنه عند استخدام الألوان للرسوم المتحركة، تنطبق القواعد التالية:
- اللون الأول هو دائمًا شفاف، بغض النظر عن القيمة المحددة هناك.
-
تعتبر إدخالات الألوان من 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) | نوع | تحدد نوع الصورة. يبدو أنها تتعلق بقناع بت:
|
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 مستويات:
-
الرسوم المتحركة
الرسوم المتحركة هي الكيان الأعلى؛ تمثل رسوم متحركة لوحدة أو مبنى أو "رسوم متحركة جزيئية" (مثل اصطدام نيزك، الطقس، انفجار) في وضعية معينة. -
الإطار
الإطار هو صورة واحدة داخل رسوم متحركة. يمكن أن تحتوي الرسوم المتحركة على إطار واحد أو أكثر. -
الإطار الفرعي
الإطار الفرعي هو المعلومات التي تشير إلى أنه يجب رسم صورة معينة تحت معايير معينة في موقع معين من الإطار. يمكن أن يحتوي الإطار على إطار فرعي واحد أو أكثر.
بعد ذلك، تأتي على الفور تعريفات الرسوم المتحركة الفردية.
عنوان | 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 | تحتوي هذه القيمة على:
|
0x0001 | uint(8) | غير معروف 1 و تبديل للخيار 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 توضح كيفية تفريغ شاحنة بليموث محملة بالمعادن العادية. هذه واحدة من القلائل التي تستخدم وظيفة النوافذ.
وهكذا يمكن تجميع الرسوم المتحركة بالكامل.
لسوء الحظ، لا يزال هناك مشكلة في فتحة التحميل العلوية، حيث لم يتم تعيين البت المناسب في معلومات نوع الرسوم.
إليكم بعض الرسوم المتحركة الجميلة الأخرى من اللعبة:
واجهة المستخدم
الآن ينقص واجهة المستخدم للعبة، التي تأتي بتصميم معدني مصقول.
ولكن هنا أيضًا يتضح أن Dynamix لم يكن بحاجة لإعادة اختراع العجلة؛ حيث لا يتم استخدام واجهات برمجة التطبيقات User32 و GDI32 التي توفرها Windows بشكل بسيط فقط - بل يتم أيضًا استخدام إدارة الموارد من User32.
يمكن استخراج هذه الموارد على سبيل المثال من خلال برامج مثل Resource Hacker الذي تم تطويره كبرمجيات مجانية بواسطة Angus Johnson، أو - إذا كنت تتجنب استخدام Wine على Linux / Mac OS - باستخدام wrestool المضمن في icoutils.
اسم الملف | المحتوى |
---|---|
Outpost2.exe | يحتوي فقط على أيقونة اللعبة، التي تُظهر محطة الفضاء أمام نيو تيرا |
op2shres.dll | يحتوي بالإضافة إلى الرسوميات لعناصر التحكم مثل الحدود، الأزرار، أزرار الراديو وصناديق الاختيار، على خلفيات حوار وصور مرافقة لنصوص المهام في القصة وخلفية القائمة الرئيسية |
out2res.dll | يحتوي على زخرفة نوافذ اللعبة، أيقونات للمعادن العادية والخاصة، شاشة التحميل، رسومات للحوار بالإضافة إلى رسومات المؤشرات الأخرى، بالإضافة إلى الرسومات المتحركة في دليل اللعبة |