Outpost 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 από την Sierra και αναπτύχθηκε από την Dynamix.

Ασχολήθηκα κυρίως με την ανάλυση των δεδομένων του παιχνιδιού - και τι μπορεί να γίνει με αυτά - από τις 01 Νοεμβρίου 2015 έως τις 14 Νοεμβρίου 2015.

Από τις πληροφορίες που έχω συγκεντρώσει μέχρι στιγμής, η Dynamix - όπως πολλές εμπορικές εταιρείες - δεν ανέπτυξε ορισμένα μορφές δεδομένων ειδικά για το Outpost 2, αλλά χρησιμοποίησε (τροποποιημένα) και σε άλλες εξελίξεις όπως π.χ. στη σειρά Mechwarrior.
Ανεξάρτητα από αυτό, μπορεί επίσης να διαπιστωθεί ότι η καινοτομία των μορφών δεδομένων είναι πρακτικά περιορισμένη και συχνά βασίζεται σε παλαιότερες έννοιες από κοινά μορφές όπως τα JFIF και RIFF.

Για την ερμηνεία των πινάκων και των μορφών δεδομένων διατίθενται περισσότερες πληροφορίες υπό Τι είναι τι;.
Τα δεδομένα που αναφέρονται εδώ κατανοούνται γενικά ως Little Endian.

Τέλος, μπορεί να λεχθεί ότι η αντίστροφη μηχανική ήταν πολύ διασκεδαστική, αν και δεν είναι πλήρης.
Φυσικά, συνιστώ επίσης να παίξετε το παιχνίδι, καθώς προσφέρει ενδιαφέροντες μηχανισμούς παιχνιδιού.

Εισαγωγή

Τα δεδομένα που χρησιμοποιούνται από το Outpost 2 έχουν μια δομή που θυμίζει JFIF / PNG - τα διάφορα μπλοκ δεδομένων διαθέτουν πάντα έναν επικεφαλίδα 8 byte. Γι' αυτό και παραλείπω να τεκμηριώσω τις επιμέρους επικεφαλίδες στα αντίστοιχα συγκεκριμένα σημεία και καταγράφω μόνο τις αποκλίσεις εκεί.

Η μορφή είναι πάντα η εξής; τα πραγματικά χρήσιμα δεδομένα είναι ενσωματωμένα μέσα σε αυτήν:

Διεύθυνση 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) Μήκος μπλοκ

Περιέχει την πληροφορία σχετικά με το πόσο μεγάλος (σε Byte) είναι ο παρακάτω μπλοκ δεδομένων.

Εδώ αναφέρονται μόνο τα καθαρά δεδομένα - τα 8 Byte κεφαλίδας δεν περιλαμβάνονται σε αυτό.

0x0007 uint(8) Σημαίες;

Είναι άγνωστο ποιος είναι ο ακριβής σκοπός αυτού του μπλοκ.

Στα volumes, αυτή η τιμή είναι συχνά 0x80, ενώ σε άλλα αρχεία συχνά 0x00. Αυτό υποδηλώνει ότι πρόκειται για ένα σύνολο σημαίων.

Τόμοι

Τα volumes είναι ένα δοχείο δεδομένων για το παιχνίδι, παρόμοιο με ένα αρχείο αρχειοθέτησης όπως το Tarball. τουλάχιστον στο Outpost 2, η μορφή αυτή περιλαμβάνει μόνο αρχεία - όχι φακέλους. Πιθανώς θα μπορούσαν να προσομοιωθούν αυτοί μέσω κατάλληλων ονομάτων αρχείων.

Ένα volume αποτελείται από την κεφαλίδα του volume καθώς και από πολλαπλά blocks volume, που αντιστοιχούν στα συγκεκριμένα αρχεία.

"Volumes" είναι τα αρχεία με την κατάληξη '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) Μήκος Payload

Δηλώνει πόσα Bytes από τα παρακάτω δεδομένα είναι πραγματικά χρήσιμα δεδομένα.

Τα υπόλοιπα δεδομένα της λίστας Volume-Strings φαίνεται ότι πρέπει να θεωρούνται σκουπίδια.

Σε αρχεία με μεταγενέστερη ημερομηνία, αυτά τα 'υπόλοιπα δεδομένα' είναι 0x00, κάτι που θα μπορούσε να υποδηλώνει αδυναμίες με την εργαλειοθήκη κατά την ανάπτυξη του παιχνιδιού, δηλαδή ότι ένας προγραμματιστής ασχολήθηκε με την σωστή αρχικοποίηση των buffers πολύ αργά, καθώς δεν έχει επίδραση στο παιχνίδι το αν τα δεδομένα είναι αρχικοποιημένα ή όχι.

0x000c uint(8)[] Λίστα ονομάτων αρχείων

Αυτή είναι μια λίστα ονομάτων αρχείων τερματισμένη σε 0 bytes, η οποία - τουλάχιστον στο παρόν σύνολο δεδομένων - αναμένεται να περιέχει μόνο χαρακτήρες ASCII.

Δεν είναι απαραίτητο να αναλύσουμε αυτό το μπλοκ δεδομένων πιο προσεκτικά κατά την επεξεργασία των δεδομένων, καθώς στις πληροφορίες του τόμου αναφέρονται απευθείας οι offsets των ονομάτων αρχείων.

Οι Volume Strings είναι μια λίστα από ονόματα αρχείων που περιέχονται μέσα στο volume.

Πληροφορίες Όγκου

Διεύθυνση 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 byte.

Οι μεμονωμένες καταχωρίσεις του καταλόγου έχουν την εξής δομή:

Διεύθυνση x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF χαρ.
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Απόκλιση Τύπος Δεδομένων Ονομασία Εξήγηση
0x0000 uint(32) Απόκλιση ονόματος αρχείου

Δηλώνει σε ποιο offset (!) μέσα στη λίστα ονομάτων αρχείων (Volume-Strings) βρίσκεται το όνομα του αρχείου.

Αναφέρεται στην αρχή του μπλοκ χρηστικών δεδομένων.

0x0004 uint(32) Αναβάθμιση Αρχείου

Δηλώνει σε ποιο offset μέσα στο συνολικό αρχείο όγκου βρίσκεται το αρχείο.

0x0008 uint(32) Μέγεθος Αρχείου

Δηλώνει πόσο μεγάλη είναι η αρχείο σε byte.

0x000c uint(16) Σημαίες;

Φαίνεται ότι παρέχονται επιπλέον πληροφορίες σχετικά με την κωδικοποίηση αρχείων.

  • 0x03 είναι ενεργοποιημένο όταν το αρχείο είναι συμπιεσμένο. Εδώ φαίνεται ότι χρησιμοποιείται ένα δέντρο Huffman.
  • 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) Μαγικά Bytes
0x0004 uint(24) Μήκος μπλοκ
0x0007 uint(8) Σημαίες

Τα Tiles είναι μια συγκεκριμένη μορφή γραφικών Bitmap για το Outpost-2. Εκτείνονται σε 13 σύνολα Tiles, που ονομάζονται "wells" (well0000.bmp έως well0012.bmp), τα οποία βρίσκονται εντός του όγκου maps.vol.

Τα σύνολα Tiles / Wells περιλαμβάνουν τα εξής:

Όνομα Αρχείου Περιεχόμενο
well0000.bmp Μια μπλε γραφική εικόνα μεγέθους 32x32px - ιδανική για δοκιμή αν ο φορτωτής εικόνας λειτουργεί
well0001.bmp Περιέχει ανοιχτόχρωμο βράχο, ορεινές αλυσίδες πάνω σε ανοιχτόχρωμο βράχο και αμέτρητες παραλλαγές κρατήρων πρόσκρουσης σε ανοιχτόχρωμο βράχο
well0002.bmp Περιέχει 'Doodads' από ανοιχτόχρωμο βράχο - δηλαδή στοιχεία που μπορούν να τοποθετηθούν για να σπάσουν την ομοιομορφία (ή σκόπιμα ως δομή, όπως π.χ. τοίχοι) σε ανοιχτόχρωμο βράχο, συμπεριλαμβανομένης της βλάστησης
well0003.bmp Περιέχει μια κρούστα πάνω σε ανοιχτόχρωμο βράχο
well0004.bmp Περιέχει σκούρο βράχο, ορεινές αλυσίδες πάνω σε σκούρο βράχο και αμέτρητες παραλλαγές κρατήρων πρόσκρουσης σε σκούρο βράχο
well0005.bmp Περιέχει 'Doodads' από σκούρο βράχο - δηλαδή στοιχεία που μπορούν να τοποθετηθούν για να σπάσουν την ομοιομορφία (ή σκόπιμα ως δομή, όπως π.χ. τοίχοι) σε σκούρο βράχο
well0006.bmp Περιέχει μια κρούστα πάνω σε σκούρο βράχο, καθώς και μεταβάσεις μεταξύ ανοιχτόχρωμου και σκούρου βράχου
well0007.bmp Περιέχει λάβα, συμπεριλαμβανομένων 4-5 καρέ animation της
well0008.bmp Περιέχει άμμο και αμέτρητες παραλλαγές κρατήρων πρόσκρουσης σε άμμο
well0009.bmp Περιέχει 'Doodads' από άμμο - δηλαδή στοιχεία που μπορούν να τοποθετηθούν για να σπάσουν την ομοιομορφία (ή σκόπιμα ως δομή, όπως π.χ. τοίχοι) σε άμμο
well0010.bmp Περιέχει 48 μεταβάσεις από άμμο σε ανοιχτόχρωμο και σκούρο βράχο
well0011.bmp Περιέχει τις πολικές καλύψεις του χάρτη, με σκούρο βράχο ως υπόβαθρο
well0012.bmp Περιέχει τις πολικές καλύψεις του χάρτη, με ανοιχτόχρωμο βράχο ως υπόβαθρο

Είναι σκόπιμο για μια ακριβή εφαρμογή να μην αποδοθούν τα tiles εκ των προτέρων για να αποθηκευτούν στη μνήμη cache, καθώς τα δεδομένα για τον κύκλο ημέρας/νύχτας πρέπει ακόμα να επεξεργαστούν - και θα προκύψουν πολύ, πολύ περισσότερα δεδομένα.

Τα tiles είναι γραφικά 8bpp με δειγματοληπτική παλέτα, με ανάλυση 32x32 pixel, τα οποία είναι διατεταγμένα το ένα κάτω από το άλλο. Σε ένα τέτοιο δημιουργηθέν tileset μπορούν ωστόσο να περιλαμβάνονται πολύ περισσότερα.

Ο κύριος κοντέινερ αποτελείται από 2 ενότητες: 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) Μαγικά Bytes
0x0004 uint(24) Μήκος μπλοκ
0x0007 uint(8) Σημαίες
0x0008 uint(32) Έκδοση / Σημαίες;

Εδώ θα μπορούσε να πρόκειται για μια ένδειξη έκδοσης της μορφής αρχείου; Σε όλα τα αρχεία που έχω στη διάθεσή μου, η τιμή ήταν 0x02

0x000c uint(32) Πλάτος (Οριζόντια Ανάλυση)

Δηλώνει πόσο φαρδιά είναι η εικόνα (σε pixel).

Για όλα τα Wells του Outpost 2, η τιμή 0x20 ή 32 αναμένεται εδώ.

0x0010 uint(32) Ύψος (Κατακόρυφη Ανάλυση)

Δηλώνει πόσο υψηλή είναι η εικόνα (σε pixels).

Για όλα τα Wells του 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) Μαγικά Bytes
0x0004 uint(24) Μήκος μπλοκ
0x0007 uint(8) Σημαίες

Τέλος, ακολουθούν τα γυμνά δεδομένα pixel, από πάνω αριστερά προς τα κάτω δεξιά, γραμμή-γραμμή.
Η τιμή των δεδομένων για τις γραφικές παραστάσεις που συνήθως είναι σε μορφή 8bpp-Bitmaps αντιστοιχεί στον δείκτη του χρώματος στην παλέτα χρωμάτων.

Τα δεδομένα pixel ξεκινούν από πάνω αριστερά και τελειώνουν κάτω δεξιά.

Η μηχανή παιχνιδιών σχεδιάζει τα Tiles *πιθανώς* κατ' απαίτηση.
Αυτό φαίνεται να οφείλεται μεταξύ άλλων στον κύκλο ημέρας-νύχτας, ο οποίος έχει 32 κλίμακες για τα μεμονωμένα Tiles. Προφανώς, αφαιρείται 'λίγο' από την τιμή φωτεινότητας. Ακριβείς τιμές δεν έχουν ακόμη προσδιοριστεί, εργάζομαι με τη βάση υπολογισμού

v *= (daylight / 48) + 0.25;

με τα δεδομένα HSV των pixels, όπου το daylight είναι μια τιμή από 0-31 και το v είναι μια τιμή μεταξύ 0-1. Επιπλέον, πρέπει να ληφθεί υπόψη ότι στον χάρτη υπάρχει μια περιφέρεια 16 Tiles αριστερά και δεξιά (η οποία εξυπηρετεί την αόρατη εμφάνιση μονάδων).

Eπιπλέον, ο κύκλος ημέρας-νύχτας φαίνεται να ενημερώνει μόνο μια στήλη του χάρτη ανά κύκλο παιχνιδιού.
Ένας επιταχυμένος κύκλος ημέρας-νύχτας φαίνεται έτσι:

Οπτικοποίηση του κύκλου ημέρας-νύχτας

ΠΡΤ

Διεύθυνση 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) Μήκος παλετών

Δίνει, σε αντίθεση με τη κανονική μορφή μπλοκ, τον αριθμό των παλετών που μπορούν να βρεθούν σε αυτό το αρχείο - όχι το μήκος του μπλοκ σε byte.

0x0007 uint(8) Σημαίες

Πιθανώς, όπως συνήθως, σημαίες.

Ωστόσο, δεν γνωρίζω καμία σημαία; καθώς όλες οι τιμές που γνωρίζω είναι 0x00, θα μπορούσε επίσης να είναι πιθανό ότι ο αριθμός των παλετών είναι απλώς ένα uint(32).

Για τι ακριβώς σημαίνει PRT δεν είναι γνωστό σε μένα; Ένα πιθανό παράδειγμα θα ήταν 'Πίνακας Παλέτας και Πόρων' - καθώς αυτό το αρχείο - που βρίσκεται ως op2_art.prt στο maps.vol - αφορά κάτι τέτοιο, ή θα περιέγραφε τη λειτουργία αρκετά καλά.

Αυτό το αρχείο περιέχει μια λίστα παλετών, έναν πίνακα με όλες τις χρησιμοποιούμενες bitmap, όλους τους ορισμούς animations και μια σειρά από άγνωστα δεδομένα. Ακολουθεί χαλαρά την υπάρχουσα μορφή κοντέινερ, καθώς δεν όλα τα αρχεία δεδομένων ακολουθούν αυτό το σχήμα.

Η ενότητα CPAL (πιθανώς σημαίνει κοντέινερ παλετών) περιλαμβάνει μόνο τα δεδομένα της παλέτας, υποδεικνύοντας πόσες από τις συνήθως 1052 byte μεγάλες 8-bit παλέτες υπάρχουν.

Η αναφορά των 1052 byte δεν θεωρείται υποχρεωτική, καθώς η μορφή παλέτας θα μπορούσε ενδεχομένως να περιλαμβάνει διαφορετικά μεγέθη παλέτας. Ισχύει μόνο για το σύνολο των δεδομένων με το οποίο παραδίδεται το Outpost 2.

Μετά τις λίστες παλετών ακολουθεί άμεσα και χωρίς εισαγωγικό header, η λίστα των bitmap; ακριβώς μετά ακολουθούν οι λίστες animations.
Και οι δύο αρχίζουν αντίστοιχα με ένα 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) Μαγικά Bytes
0x0004 uint(24) Μήκος παλετών

Δίνει, σε αντίθεση με τη κανονική μορφή μπλοκ, τον αριθμό των παλετών που βρίσκονται σε αυτό το αρχείο - όχι το μήκος του μπλοκ σε byte.

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) Μαγικά Bytes
0x0004 uint(24) Μήκος παλετών

Δίνει, σε αντίθεση με τη κανονική μορφή μπλοκ, τον αριθμό των παλετών που βρίσκονται σε αυτό το αρχείο - όχι το μήκος του μπλοκ σε byte.

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) Μαγικά Bytes
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.

Για τις παλέτες, πρέπει να σημειωθεί ότι για τις παλέτες που χρησιμοποιούνται σε animation ισχύουν οι εξής κανόνες:

  • Το πρώτο χρώμα είναι ΠΑΝΤΑ διαφανές, ανεξαρτήτως της τιμής που έχει δηλωθεί εκεί.
  • Οι εγγραφές παλέτας 1-24 θεωρούνται ως χρώμα παίκτη στις παλέτες 1-8.
    Δεν είναι σαφές από πού προέρχονται ακριβώς τα χρώματα εκτός από τον παίκτη 1.
    Υποθέτω ότι τα υπόλοιπα χρώματα είναι hardcoded.

Αναφορά παλέτας

Εικόνες bitmap

Διεύθυνση x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF χαρ.
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
0x0010 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Απόκλιση Τύπος Δεδομένων Ονομασία Εξήγηση
0x0000 uint(32) Καθορισμένο πλάτος

Δίνει το πλάτος των γραμμών δεδομένων pixel σε byte - καθώς αυτές ευθυγραμμίζονται στα όρια των 4 byte.

Έτσι είναι γρήγορα δυνατή η προσπέλαση μιας συγκεκριμένης γραμμής εικόνας.

Γιατί αυτή η τιμή αποθηκεύεται ξεχωριστά, αν και θα μπορούσε να υπολογιστεί, δεν είναι σαφές.
Ίσως πρόκειται για μια βελτιστοποίηση για τον κώδικα απόδοσης.

0x0004 uint(32) Απόκλιση

Δίνει τη μετατόπιση της πρώτης γραμμής στην bitmap

0x0008 uint(32) Ύψος

Δηλώνει το ύψος της εικόνας σε πίξελ

0x000c uint(32) Πλάτος

Δηλώνει το πλάτος της εικόνας σε pixel

0x0010 uint(16) Τύπος

Δίνει τον τύπο της εικόνας. Φαίνεται ότι πρόκειται για μια μάσκα bit:

  • 0x04 είναι ενεργοποιημένο, αν πρόκειται για γραφικά 1bpp.
  • 0x40 είναι ενεργοποιημένο, αν πρόκειται για γραφικά που πρέπει να εφαρμόσουν windowing.
0x0012 uint(16) Παλέτα

Ορίζει ποια παλέτα από το αρχείο PRT θα χρησιμοποιηθεί

Αυτή η δομή δεδομένων του αρχείου PRT δείχνει πώς είναι δομημένες οι bitmap που χρησιμοποιούνται για τα sprites. Αυτές οι bitmap υπηρετούν ως μεμονωμένα στοιχεία, από τα οποία πολλά συγκεντρώνονται σε ένα καρέ animation ενός sprite.

Τα συγκεκριμένα δεδομένα εικόνας βρίσκονται στην op2_art.BMP στον φάκελο του παιχνιδιού.
Γιατί αυτό το αρχείο bitmap διαθέτει έναν (κυρίως σωστό) RIFF header bitmap, είναι ασαφές. Πιθανότατα, το Outpost 2 χρησιμοποιεί System APIs για να φορτώσει τα γραφικά, υιοθετώντας προσωρινά αυτόν τον header και αντικαθιστώντας τα αντίστοιχα, μεταβλητά πεδία.

Τα δεδομένα pixel βρίσκονται στο αρχείο BMP στην θέση Offset + το uint32-Offset, που μπορεί να βρεθεί στο αρχείο BMP στη διεύθυνση 0x000A (RIFF-Bitmap-Datenoffset), και αντιστοιχούν ξανά στη γραμμική διάταξη από πάνω αριστερά προς τα κάτω δεξιά.

Μονοχρωματικά γραφικά 1bpp μπορούν να σχεδιαστούν έτσι ώστε το χρώμα 0 να είναι πλήρης διαφάνεια, ενώ το χρώμα 1 να είναι ένα ημι-διαφανές μαύρο/γκρί, καθώς τα μονοχρωματικά γραφικά συνήθως χρησιμοποιούνται για σκιές οχημάτων και κτιρίων στις animations.

Έτσι, μπορεί κανείς να συνθέσει πολλές γραφικές παραστάσεις.

Προστατευμένο διαμέρισμα (Πλίμουθ)

Κινούμενα σχέδια

Τώρα φτάνουμε στην κορυφαία κατηγορία των τομέων μέσα στα φορμά δεδομένων του Outpost 2:
Στις κινήσεις.

Οι λίστες κινήσεων αρχίζουν με μια παγκόσμια κεφαλίδα, η οποία χρησιμεύει κυρίως για την επαλήθευση των δεδομένων. Ακολουθούν οι συγκεκριμένες ορισμοί κινήσεων, οι οποίοι διακρίνονται σε 3 επίπεδα:

  1. Κίνηση
    Μια κίνηση είναι η ανώτερη οντότητα; αναπαριστά μια κίνηση μιας μονάδας, ενός κτηρίου ή μιας 'κίνηση σωματιδίων' (πτώση κομήτη, καιρός, έκρηξη) σε μια συγκεκριμένη αρχική κατάσταση.
  2. Καρέ
    Ένα καρέ είναι μια μεμονωμένη εικόνα μέσα σε μια κίνηση. Μια κίνηση μπορεί να περιλαμβάνει ένα ή περισσότερα καρέ.
  3. Υποκαρέ
    Ένα υποκαρέ είναι η πληροφορία ότι μια συγκεκριμένη bitmap θα πρέπει να σχεδιαστεί σε μια συγκεκριμένη θέση ενός καρέ υπό συγκεκριμένα κριτήρια. Ένα καρέ μπορεί να περιλαμβάνει ένα ή περισσότερα υποκαρέ.

Αμέσως μετά ακολουθούν οι συγκεκριμένες ορισμοί κινήσεων.

Διεύθυνση x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF χαρ.
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Απόκλιση Τύπος Δεδομένων Ονομασία Εξήγηση
0x0000 uint(32) Αριθμός κινούμενων σχεδίων

Πόσες εγγραφές animation υπάρχουν

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) Πλαίσιο Περιοχής: Αριστερά

Δίνει την αριστερή αρχή (σε pixel) του Bounding Box.

0x0008 uint(32) Περίγραμμα: Πάνω

Δίνει την άνω αρχή (σε pixel) του Bounding Box.

0x000c uint(32) Περίγραμμα: Πλάτος

Δίνει το πλάτος (σε πίξελ) του Bounding Box.

0x0010 uint(32) Περίγραμμα: Ύψος

Δίνει το ύψος (σε pixel) του Bounding Box.

0x0014 uint(32) Απόκλιση: X

Δηλώνει το οριζόντιο κέντρο της κινούμενης εικόνας

0x0018 uint(32) Απόκλιση: Y

Δίνει το κατακόρυφο κέντρο της ανιμονής

0x001c uint(32) Άγνωστο 2

Άγνωστες Πληροφορίες

0x0020 uint(32) Αριθμός καρέ

Δηλώνει πόσα καρέ animation περιέχονται σε αυτή την animation

0x0024 uint(32) Αριθμός παραθύρων

Δηλώνει πόσα παράθυρα θα χρησιμοποιηθούν κατά τη σχεδίαση

Τα δεδομένα της ανώτερης στρώσης, της κινούμενης εικόνας, είναι κυρίως διοικητικά δεδομένα - η Boundingbox αναφέρεται στις συντεταγμένες της σήμανσης γύρω από το όχημα/κτίριο, όταν αυτό έχει επιλεγεί και υποδεικνύει ταυτόχρονα ποια περιοχή θα πρέπει να είναι κλικαριστή.

Η μετατόπιση (offset) προσδιορίζει κυρίως το "σημείο μηδέν"; το σημείο που πρέπει να προστεθεί ή να αφαιρεθεί στις εσωτερικές συντεταγμένες του παιχνιδιού. Θα μπορούσε κανείς να πει και μαθηματικά: η μετατόπιση αναφέρεται εδώ στην προέλευση των συντεταγμένων.

Όσον αφορά τα παράθυρα (Windows), όπως και η μετατόπιση, πρόκειται για 4 τιμές uint(32) ανά παράθυρο, οι οποίες υποδεικνύουν μια περιοχή που θεωρείται χρήσιμη για επιμέρους υποπλαίσια. Εκτός των παραθύρων δεν επιτρέπεται, αν δεν έχει προβλεφθεί κατάλληλα για την bitmap, να σχεδιαστεί.

Πλαίσιο

Διεύθυνση x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF χαρ.
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Απόκλιση Τύπος Δεδομένων Ονομασία Εξήγηση
0x0000 uint(8) Αριθμός υποπλαισίων και εναλλαγή για Προαιρετικό 1, 2

Αυτή η τιμή περιέχει:

  • 0x7F (Μάσκα bit): Ο αριθμός των υποπλαισίων που χρησιμοποιούνται σε αυτό το πλαίσιο
  • 0x80: Η πληροφορία σχετικά με το αν υπάρχουν οι Προαιρετικοί 1 και 2
0x0001 uint(8) Άγνωστο 1 και Toggle για Προαιρετικά 3, 4

Αυτή η τιμή περιέχει:

  • 0x7F (Μάσκα bit): Άγνωστο - Υποψιάζομαι έντονα ότι αναφέρεται στον αριθμό των Gameticks που περνούν μέχρι να εμφανιστεί το επόμενο καρέ
  • 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) Bitmap-Id

Υποδεικνύει ποια bitmap θα χρησιμοποιηθεί για αυτό το υποπλαίσιο

0x0002 uint(8) Άγνωστο 1

Είναι άγνωστο - υποψιάζομαι πάντως έντονα ότι πρόκειται για προτεραιότητα απόδοσης (Z-Layer).

0x0003 uint(8) Υποπλαίσιο-Id

Δηλώνει σε ποιο υποπλαίσιο βρισκόμαστε

0x0004 sint(16) Απόκλιση - Οριζόντια

Δηλώνει πού μέσα στο πλαίσιο θα πρέπει να τοποθετηθεί το υποπλαίσιο, ή πόσες pixel θα πρέπει να μετατοπιστεί η bitmap οριζόντια.

0x0006 sint(16) Απόκλιση - Κάθετη

Δηλώνει πού μέσα στο πλαίσιο θα τοποθετηθεί το υποπλαίσιο, ή πόσες πίξελ θα μετατοπιστεί η bitmap κατακόρυφα.

Έτσι μπορούμε τώρα να συνθέσουμε μεμονωμένα καρέ, καθώς και ολόκληρες κινούμενες εικόνες, όπως θα δείξουμε εδώ με ένα πιο σύνθετο παράδειγμα, την κινούμενη εικόνα με τον δείκτη 500.

Κίνηση 500

Η Animation 500 δείχνει πώς ένα Plymouth-μεταφορέας, που είναι φορτωμένος με συνηθισμένο μέταλλο, ξεφορτώνεται. Πρόκειται για μία από τις λίγες αναπαραστάσεις που αξιοποιούν τη λειτουργία παραθύρων.

Έτσι μπορεί να συνδυαστεί η πλήρης αναπαράσταση.
Δυστυχώς, υπάρχει ακόμα ένα πρόβλημα με την άνω πλευρά φόρτωσης, καθώς το αντίστοιχο bit στην πληροφορία τύπου γραφικών δεν έχει οριστεί.

Εδώ είναι μερικά ακόμα πανέμορφα κινούμενα sprites από το παιχνίδι:

Η αναπαραγωγή της Animation 500 απεικονίζεται

Η Animation 500 έχει ολοκληρωθεί

Κτίριο-εργοστάσιο Plymouth

Διαστημικό λιμάνι Eden

Ιατρικό κέντρο Eden

SCAT

Διαστημικό λιμάνι Plymouth

Easteregg:
Άγιος Βασίλης

Easteregg:
Σκύλος του Dans

Διεπαφή Χρήστη

Τώρα λείπει το περιβάλλον χρήστη του παιχνιδιού, το οποίο έχει σχεδιαστεί με την εμφάνιση βουρτσισμένου μετάλλου.

Αλλά και εδώ είναι σαφές ότι Dynamix δεν χρειάστηκε να εφεύρει τον τροχό εκ νέου; εδώ δεν χρησιμοποιούνται απλώς οι APIs User32 και GDI32 που παρέχονται από τα Windows - ιδίως χρησιμοποιείται και η διαχείριση πόρων από το User32.

Αυτά μπορούν να εξαχθούν, για παράδειγμα, μέσω προγραμμάτων όπως το Resource Hacker, που έχει αναπτυχθεί από τον Angus Johnson ως freeware, ή - αν κάποιος διστάζει να χρησιμοποιήσει το Wine σε Linux / Mac OS - με τη βοήθεια του wrestool που περιλαμβάνεται στο icoutils.

Όνομα αρχείου Περιεχόμενο
Outpost2.exe Περιέχει μόνο το εικονίδιο του παιχνιδιού, το οποίο δείχνει το διαστημικό σταθμό μπροστά από το New Terra
op2shres.dll Περιέχει εκτός από γραφικά για στοιχεία ελέγχου όπως περιγράμματα, κουμπιά, ραδιοκουμπιά και πλαίσια ελέγχου, επίσης φόντα διαλόγων, συνοδευτικές εικόνες για τα κείμενα αποστολών της ιστορίας και τη γραφική αναπαράσταση του κύριου μενού
out2res.dll Περιέχει τη διακόσμηση παραθύρων εντός του παιχνιδιού, εικονίδια για κοινό και ειδικό μέταλλο, την οθόνη φόρτωσης, γραφικά για διαλόγους καθώς και άλλα γραφικά δρομέα, επιπλέον των κινούμενων στο φάκελο του παιχνιδιού