17.11.15

Die Highscore Datei (.dat) in Sierras 3D Ultra Pinball - Creep Night nach Belieben verändern (cheaten) mit HEX Editor

Creep Night
Wer dieses Pinball-Spiel kennt, weiß, dass es einen (oder die ganze Familie) für etliche Stunden fesseln kann: 3D Ultra Pinball - Creep Night. In diesem Blogpost soll es darum gehen, wie man das Spiel erstens bestmöglich unter den neuen Windows-Versionen wie Windows 7 oder Wondows 8 (inklusive x64) zum Laufen bringt mitsamt der Musik und Sprachansagen, andererseits lernen wir, wie man die Highscore-Datei beliebig verändert und sich damit an die Spitze "spielen" kann, was jedoch nur aus Interesse durchgeführt werden sollte und nicht um zu schummeln oder zu betrügen. Da meine Freunde mittlerweile wissen dass ich das kann gelten Highscores nur noch wenn andere es bezeugen :)


Also fangen wir mal kurz an mit der Installationsanleitung: Es wird (selbstverständlich) eine originale CD benötigt, und mit einer neuen Datei von dieser Sierra Hilfeseite kann das Spiel auf neuen Windows Versionen installiert werden, eine CD ist dann zum Spielen auch nicht mehr nötig.

Aber nun zu der Highscore-Datei. Sie liegt im Hauptverzeichnis mit der Bezeichnung PINBALL2.DAT und kann mit einem beliebigen Texteditor geöffnet werden, was allerdings wenig weiterhilft, man sieht dort nur die Spielernamen.
Was wir zum Öffnen benötigen ist ein Hex-Editor, da die Datei in diesem Format erstellt wurde. Ich verwende den kostenlosen xvi32, jeder andere sollte auch funktionieren. Sofern man noch nicht gespielt hat, sieht die Highscore-Liste im Spiel wie man rechts sieht aus: Demospieler wurden bereits angelegt, mit wenigen Punkten. Wir sehen schon, was prinzipiell verändert werden kann: der Name, der Punktestand und die Anzahl Bälle (3 oder 5) die man im Spiel zur Verfügung hatte.
Im Hexeditor öffnen wir die besagte Datei und sehen dann rechts sichtbares Bild: auf der linken Seite die Hex-codes (zB. 1A oder FF) und rechts eine Entsprechung in ASCII, also lesbaren Zeichen, die jedoch in diesem Fall wenig aussagt da es willkürliche Festlegungen sind, außer bei den Namen. Das Musik-Zeichen zum Beispiel hat keine Funktion als solches im Spiel nachher. Was interessiert sind die Werte, die sehen wir mit der Funktion Data Inspector oder einfach unten links im Programm nach Char Dec. Es macht übrigens einen Unterschied, ob wir im rechten Fenster Werte bearbeiten oder links. Links müssen wir Hex codes eingeben (z.B. F1), rechts Buchstaben zum Beispiel. Das rechte Fenster ist also eine Art "Übersetzung" des Linken in eine lesbare Sprache, so gut es geht. 
Sehen wir uns an, wie die Highscores abgespeichert sind. Wir erkennen ein Muster: 8 Kästchen vor dem Spielernamen, dann der Name, ein Leeres (leer nenne ich solche mit dem Hex Wert 00, sie müssen zwar dort sein wo sie sind aber wir dürfen das nicht verändern), ein Belegtes und wieder 7 Leere. Das ist die Abfolge die immer wiederkehrt, so wird ein Spieler mit seinen Punkten gespeichert. Diese Abfolge ist wichtig, denn das Programm liest die Zeichen nacheinander aus und rekonstruiert damit die Punkte und alles Weitere.
Wir sehen, dass das Ganze vier Mal analog stattfindet, für vier Highscore-Felder im Spiel (3 für 3 Levels und eines für "Global"). Es sind immer fünf Namen (oben sieht man vier da das Programm für den jeweils fünften noch keinen Namen aber schon Punkte vergeben hat), also die genannte Abfolge 20 Mal. 
Ich werde im Folgenden erklären, wie man einen solchen Speicherstand / Highscore verändert, andere zu ändern ist ja analog. Aufpassen muss man nur mit der Reihenfolge: Das Spiel zeigt nacheinander einfach die Scores an, hat man also einen hohen Highscore für einen Spieler weiter unten einprogrammiert (z.B. Player 4 oben im Beispiel) steht dieser auch nicht an erster Stelle; das Programm ändert die Rangfolge beim eigenständigen Speichern automatisch, hier mit dem Editor muss / müsste man es manuell für jeden Spieler machen!

Wir kümmern uns um Spieler 3 der ersten Fünfergruppe (erinnern Sie sich: der fünfte Spieler hat vom Programm noch keinen Namen zugewiesen bekommen, und die Gruppen stehen für die "Tische": die erste Fünfergruppe für Global, die Zweite für den ersten Flippertisch, die Dritte für den Dritten und die Vierte für den Zweiten (das Labor). Ein bisschen verwirrend aber so ist es nunmal :)
Sie sehen, ich habe mir das Programm schön positioniert damit ich genau den zu bearbeitenden Spieler in einer Zeile sehe, das macht vieles einfacher. Beginnen wir mit dem Highscore. Dieser ist in den Kästchen 1, 2, 3, 5 und 6 festgehalten. Befassen Sie sich kurz mit dem Hexadezimalsystem wenn noch nicht geschehen. Jeder Hex Wert steht für eine dezimale ("normale") Zahl von 0 bis 255, in Hex also 00 bzw. FF, siehe Link. Kästchen 1, 2 und 3 werden vom Programm für die Ziffern (nicht Zahlen!!) bis zur Stelle der Millionen verwendet, wir müssen unseren gewünschten Highscore später also zerlegen, aber das zeige ich noch. Dabei macht das Programm eigentlich nichts weiter als eine Aufsummation von Werten. es Nimmt den Wert (den dezimalen Wert) von Kästchen 1 mal 1, addiert den Wert von Kästchen 2 mal 256 und den von Kästchen 3 mal 65536 (das ist 256^2). Damit kann man alle Zahlen bis einer Million (ginge noch höher aber das brauchen wir nicht) darstellen. Im Beispiel ist es Hexadazimal 73, F1 0A, also 115, 241, 10 im Dezimalsystem. Wir nehmen also 115+241*266+10*65536 = 717171. Das Spiel verfährt jedoch anders bzw. von Neuem, wenn es um die Stellen der Millionen geht. Dabei wird der Wert von Kästchen 5 mal 1 genommen und der von 6 mal 266. Im Beispiel also 1*1 + 0*266 = 1 Million. Addieren wir Vorherige Überlegung der Ziffern bis zu einer Million mit diesem Wert gelangen wir zu 1717171 als Highscore-Wert. Und das steht auch im Spiel bei Player 3 im ersten "Globalen" Highscore-Register.

Die Anzahl Bälle versteckt sich nach dem Spielernamen, und zwar 2 Kästchen danach, und wird einfach dem Wert nach (3 oder 5) gespeichert, im Beispiel oben sehen wir dort den Wert 5.

Kommen wir zum Namen - diesen verändern wir am Besten rechts bei den "übersetzten" Werten, das Programm übersetzt es uns dann automatisch nach links zurück ins Hexadezimale. Wenn wir neue Stellen für den Namen brauchen gehen wir im Programm unter Edit auf insert String und dann Hex String, um neue Stellen zu bekommen. Wie lange der Name ist ist dem Pinball später beim Auslesen der Highscore Datei ziemlich egal, wichtig ist dass das Vorher (die 8 Kästchen inklusive der leeren mit 00 darin) und Nachher (leer, Ballanzahl, 7 leere) bestehen bleibt, denn das verwendet es um zischen den Spielern zu trennen. Wenn das Spiel beim Anzeigen der Highscores abstürzt heißt das es wurde etwas verändert das dann nicht mehr gelesen werden konnte - Sie haben sich nicht gut an meine Anweisungen gehalten dann wahrscheinlich :)

Ich verändere den Namen zu Patrick!!, was Sie in dem nächsten Screenshot wo ich die Ergebnisse vorstelle die wir hier zusammen im Editor bearbeiten sehen können. Die Ballanzahl setze ich auf 3 (also Hexadezimal 03). Und als Highscore wählen wir 4 Milliarden 444 Millionen 444 Tausend 444. Also 4444444444. Wir trennen wir besprochen bei der Million: 4444 Millionen und 444444.
Die Millionen teilen wir durch 256, das ergibt 17 komma irgendwas, das nach dem Komma lassen wir weg das müssen wir ausgleichen mit Kästchen 5 der 8 Highscore-Kästchen. Also bekommt Kästchen 6 den Wert 16. Rechnen wir 4444-(17*256) bleibt uns ein Rest von 92. Dieser Wert also für Kästchen 5. Dann zu den Werten unter der Million: 444444 geteilt durch 65536 ergibt 6,x (lies: Komma irgendwas). Also Wert 6 für Kästchen 3. Übrig bleiben 51228, geteilt durch 256 macht das 200,x. Wert 200 für Kästchen 2 also, und den Rest von 28 für das erste Kästchen. 
Phiu, gar nicht so einfach.
Aber wir haben es geschafft: Nach dem Speichern sieht es im Spiel wie man es oben sieht aus, alles passt. Im Editor habe ich die Werte in Hex eingegeben (also angefangen mit 1C für die 28 die wir oben berechnet hatten).
Es hat sich ein bisschen was verschoben weil ja mein Name länger ist als "Player 3" das vorher da stand, aber das ist ja kein Problem, wir erinnern uns: wichtig ist nur die Abfolge von leeren und besetzten Kästchen, die das Spiel später mithilfe der Datei umrechnet in die Highscore-Liste. Was rechts im Editor zu sehen ist ist völlig irrelevant außer dem Namen, die anderen Zeichen sind willkürlich zugewiesen.

Eine kleine Hintergrundinfo noch: die 256 als Unterteilung wurde natürlich nicht zufällig gewählt von den Programmierern. Im Hexadezimalsystem sind genau die Werte 0 bis 255 (also 256 Zahlen) pro "Wert" möglich, und 256 ist genau 2^8, also ein byte. Der Computer kann mit bytes gut umgehen, und ein byte sind übrigens meist 8 bits (ein bit kann entweder 0 oder 1 sein), was pro byte genau 256 Möglichkeiten zum Abspeichern einer Variable bietet. Wir hätten das Ganze auch im Binärsystem (anstatt im Hexadezimalen und schlussendlich im Dezimalen) durchrechnen können, aber glauben Sie mir - das macht noch weniger Spaß.

Viel Spaß beim Spielen, ich würde mich freuen wenn ihr euch in den Kommentaren kurz verweigt falls es euch geholfen hat ;)





1 Kommentar:

  1. Anonym26.11.24

    Ob für iOS oder Android, Sie können app programmieren lassen, indem Sie erfahrene Programmierer einstellen, die für erstklassige Leistung und Benutzerfreundlichkeit sorgen.

    AntwortenLöschen

Kommentare verfassen ist hier sehr einfach, man kann sogar ohne Anmeldung anonym Kommentare hinterlassen. Also, zeig' uns deine Meinung ...

Kontakt

Name

E-Mail *

Nachricht *

Haftungsausschluss

disclaimer