IPS-Patch

Aus Makerpendium.de
Version vom 27. März 2020, 19:52 Uhr von MagiAkira (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

IPS (International Patch System) ist ein Format zum Festhalten von Unterschieden zwischen 2 Dateien, die allerdings nur in eine Richtung gespeichert werden. IPS-Patches werden vor allem dazu verwendet, Romhacks und Übersetzungen von alten Konsolenspielen zu veröffentlichen ohne dabei auf rechtliche Probleme zu stoßen, da die Dateien auf die der Patch angewendet werden soll immer noch auf anderen, in der Regel auch nicht weiter dokumentierten, Wegen beschafft werden müssen.

Der Nutzen von IPS-Patches beschränkt sich allerdings nicht auf diese Zwecke und Formate, im Grunde kann damit jeder beliebige Dateiunterschied gespeichert werden, so auch häufig bei EXE-Dateien. Im Zusammenhang mit dem RPG Maker 2000 und 2003 werden sie häufig dazu benutzt, meist relativ kleine Änderungen am Programm oder der Engine vorzunehmen, ohne auf ein Patchertool angewiesen zu sein.

DynPatches

Mit DynRPG können IPS-Dateien als DynPatches genutzt werden, was das direkte Anwenden auf und Ändern der RPG_RT.exe erspart und ein leicht zu handhabendes Modulsystem erschafft, mit dem nicht mehr erwünschte Patches einfach herausgenommen werden können. Diese Vorgehensweise ist im Groben vergleichbar mit der Funktion einiger Emulatoren, die auf Wunsch automatisch zur Laufzeit eine IPS anwendet, die im selben Verzeichnis den gleichen Namen wie das geladene Spiel trägt.

Formataufbau

Eine IPS besteht im Groben aus vier Teilen:

  • Der immergleiche Header "PATCH"
  • Datenblöcke mit Informationen, was der Patch an einer Datei verändert
  • Das Datenblöcke-Ende "EOF" (steht für "End Of File")
  • Eine 24bit-Maximalgrößenangabe zum Abschneiden der Datei nach dem Patchvorgang (optional)

Der letzte Teil wurde lange nach der Definition des Formats entworfen und wird nicht von jedem Patchprogramm unterstützt.

Datenblockinhalt

Ein Datenblock enthält eine 24bit-Adressangabe (z.B. "123456" für 0x123456), gefolgt von einer 16bit-Größenangabe und danach Bytes in Menge dieser Größe, die an die Adresse der Datei geschrieben werden sollen (z.B. "123456 0006 A752CE9EF32D").

Ist die Größenangabe jedoch 0, werden weitere 16bit gelesen, die eine Mengenangabe darstellen, wie oft hintereinander das Byte danach geschrieben wird (z.B. "123456 0000 0008 5C" für 8mal 0x5C ab Adresse 0x123456).