Oni (folder)/persist.dat: Difference between revisions

From OniGalore
m (+tmp)
(moved OBD-type documentation to new article OBD:Persist.dat as geyser originally suggested when he wrote this article; tweaked remaining material accordingly)
 
(16 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{merge|[[Persist.dat]]}}
{{UpdatedForOniX|1.0.0}}
{{Hatnote|See [[OBD:Persist.dat]] for technical documentation of this file's format.}}
'''persist.dat''', found next to the game application, is the save-game and preference file for Oni. It can be edited most easily with GUI tools such as [[OSGE]] for Windows and [http://mods.oni2.net/node/155 OniLib] for Mac.


The savegame file '''persist.dat''' corresponds to a dump of Oni's memory. It is written at specific moments during the game, e.g. after a new level is loaded, or after a new savepoint is reached. It also registers settings from the option menu and remembers whether the cheats are enabled (i.e. whether you have beaten the game) and whether you have killed [[Griffin]].
==Progress saving==
As players of Oni are well aware, the game does not allow arbitrary saving ("save anywhere"), but relies on the use of fixed save points activated by reaching certain places in each level, at which point the level scripting uses the [[BSL]] function <tt>save_game</tt> to mark your progress. This means that by deciding on a maximum number of levels and save points, Bungie West could store the total state of the player's progress in a fixed-size file – 206,496 bytes, to be exact.


The savegame file is a memory dump and has nothing to do with [[dat|instance files]] despite the ".dat" extension (same for saved_film####.dat, ####_corpse.dat, etc). The binary format of a savegame file is detailed below. It applies to PC and PC demo; the Mac build writes all numbers as [[wikipedia:Big Endian|Big Endian]], e.g., the 0x08 field in the header will appear as 00 0C 7F 5C for a Mac savegame. Therefore, savegames are not interchangeable between PC and Mac versions of Oni.
Many aspects of the game world are <u>not</u> saved in persist.dat: essentially, anything not pertaining to Konoko herself, such as the position of AIs and the presence of power-ups on the ground. What <u>is</u> stored is Konoko's position, health and inventory. Everything else is determined by the level scripting and the game data, and will always be in the same place when that save point is loaded.


The header of the savegame file is 0x60=612 bytes long. It is followed by an array of 400 savepoints, 0x204=516 bytes each, grouped implicitly into 40 levels, 10 savepoints per level. The first 10 savepoints belong to level 0 and are never written to. The savepoints of the original 14 levels follow. This leaves 25 unused levels at the end of the savegame file.
==Game preferences==
In addition to save point data, persist.dat stores Oni's preferences as chosen on the Options screen (note that this omits key bindings, which are stored in [[key_config.txt]]). It also records whether the [[cheats]] are enabled, i.e. whether you have beaten the game (however, cheats are unlocked at all times when playing with the [[Anniversary Edition]] or [[Daodan DLL]] installed or when using the [[FERAL|Intel Mac build]]). The final "setting" tracked by persist.dat is whether you killed Griffin in {{C|13}}.


The level names are taken from the [[ONLD]] files of level 0, except for Chapters 0 and 1: "TCTF Training" (level 1, savepoint 0) and "Syndicate Warehouse" (level 1 savepoint 1) are hardcoded in the engine.
==Mac-Windows compatibility==
{{table}}{{OBDtable}}
The Windows version of persist.dat stores its numbers in little-endian format. But Bungie's original Mac game application and The Omni Group's Mac OS X port were built for PowerPC, a big-endian processor, thus numbers were written in the opposite order to the Mac's persist.dat. This meant that the save-game files were not compatible between Windows and Mac versions of Oni. However, when Macs moved to Intel and players began using the Intel-native Mac build of Oni, the file changed to being written in little-endian format and thus became interchangeable between Windows and Mac Oni.
{{OBDth}}
{{OBDtr|0x00|int32|FF0000|0F 00 00 00|15|unknown, maybe 15 levels; if not 15, file is invalid}}
{{OBDtr|0x04|int32|FF0000|0E 0B D0 D0|???|unknown}}
{{OBDtr|0x08|int32|FF0000|5C 7F 0C 00|2<sup>19</sup>+2<sup>18</sup>+2<sup>14</sup>+2<sup>13</sup>+2<sup>12</sup>+2<sup>11</sup><br>+2<sup>10</sup>+2<sup>9</sup>+2<sup>8</sup>+2<sup>6</sup>+2<sup>4</sup>+2<sup>3</sup>+2<sup>2</sup>|visibility lock for levels 2 through 31; 0 and 1 unaffected}}
{{OBDtr|0x0C|int32|FF0000|00 00 00 00|none|visibility lock for levels 32 through 63}}
{{OBDtr|0x10|int32|FF0000|00 00 00 00|none|visibility lock for levels 64 through 95}}
{{OBDtr|0x14|int32|FF0000|00 00 00 00|none|visibility lock for levels 96 through 127}}
{{OBDtr|0x18|int32|FF0000|00 00 00 00|none|visibility lock for levels 128 through 159}}
{{OBDtr|0x1C|int32|FF0000|00 00 00 00|none|visibility lock for levels 160 through 191}}
{{OBDtr|0x20|int32|FF0000|00 00 00 00|none|visibility lock for levels 192 through 223}}
{{OBDtr|0x24|int32|FF0000|00 00 00 00|none|visibility lock for levels 224 through 255}}
{{OBDtr|0x28|int32|FFFF00|01 00 00 00|true|whether Griffin was killed: used in Chapters {{C|13|13}} and {{C|14|14}}; set with [[BSL:Functions|func]] [[killed_griffen]](bool), read with [[BSL:Functions|func]] [[did_kill_griffen]]()}}
{{OBDtr|0x2C|int32|00FF00|FE 1B 00 00|2<sup>12</sup>+2<sup>11</sup>+2<sup>9</sup>+2<sup>8</sup>+2<sup>7</sup><br>+2<sup>6</sup>+2<sup>5</sup>+2<sup>4</sup>+2<sup>3</sup>+2<sup>2</sup>+2<sup>1</sup>|unknown}}
{{OBDtr|0x30|int32|00FFFF|1F 00 00 00|31|unknown}}
{{OBDtr|0x34|int32|FF00FF|13 00 00 00|19|unknown}}
{{OBDtr|0x38|int32|FFC8C8|01 00 00 00|01|unknown}}
{{OBDtr|0x3C|int32|FFFFC8|04 00 00 00|4|quality: from superlow (0) to superhigh (4)}}
{{OBDtr|0x40|float|C8FFC8|00 00 80 3F|1.000000|sound volume: from 0.0 to 1.0}}
{{OBDtr|0x44|bool32|C8FFFF|06 00 00 00|2<sup>2</sup>+2<sup>1</sup>|bitset: 1 - show subtitles; 2 - invert aiming; 4 - enable cheats}}
{{OBDtr|0x48|int32|FFC8FF|02 00 00 00|2|quality: from Easy (0) to Hard (2)}}
{{OBDtr|0x4C|int16|FFC800|20 03|800|horizontal screen resolution}}
{{OBDtr|0x4E|int16|FFC800|02 58|600|vertical screen resolution}}
{{OBDtr|0x50|int32|C800C8|20 00 00 00|32|color depth}}
{{OBDtr|0x54|float|C87C64|00 00 00 3F|0.500000|gamma correction; from 0.0 to 1.0, 0.5 means no correction}}
{{OBDtr|0x58|int32|B0C3D4|03 00 00 00|3|last loaded level; written at level load}}
{{OBDtr|0x5C|int32|E7CEA5|02 00 00 00|2|last saved savepoint}}
|}


 
[[Category:Game directory map]]
Example of a savepoint (chapter 1, savepoint 2)
{{table}}{{OBDtable}}
{{OBDth}}
{{OBDtr2|0x00|char[64]|FF0000|"Save Point 2"|name of the savepoint in the Load Game dialog}}
{{OBDtr|0x40|int32|FFFF00|01 00 00 00|true|whether the savepoint is visible in the Load Game dialog}}
{{OBDtr|0x44|int32|00FF00|BE 00 00 00|190|current health in hitpoints}}
{{OBDtr|0x48|int32|00FFFF|C8 00 00 00|200|max. health in hitpoints}}
{{OBDtr|0x4C|float|FF00FF|AE 20 FB 43|502.255310|x-position}}
{{OBDtr|0x50|float|FF00FF|03 32 4B 42|50.798839|y-position (height)}}
{{OBDtr|0x54|float|FF00FF|55 12 25 C4|-660.286437|z-position}}
{{OBDtr|0x58|float|FFC8C8|80 06 C1 3F|1.508010|y-rotation (facing)}}
{{OBDtr|0x5C|int32|FFFFC8|00 00 00 00|0|amount of ballistic ammo (red clips)}}
{{OBDtr|0x60|int32|C8FFC8|01 00 00 00|1|amount of energy cells (green clips)}}
{{OBDtr|0x64|int32|C8FFFF|00 00 00 00|0|shield in percent}}
{{OBDtr|0x68|int32|FFC8FF|00 00 00 00|0|phase cloak in frames (1/60 s)}}
{{OBDtr|0x6C|int32|FFC800|01 00 00 00|1|amount of hypos}}
{{OBDtr|0x70|int32|C800C8|00 00 00 00|0|unknown; always 0}}
{{OBDtr|0x74|int32|C87C64|01 00 00 00|true|whether the player has an [[LSI]]}}
{{OBDtr|0x78|int32|B0C3D4|00 00 00 00|0|unknown; always 0}}
{{OBDtr|0x7C|int32|E7CEA5|00 00 00 00|0|unknown; always 0}}
{{OBDtr2|0x80|char[256]|FFDDDD|&nbsp;|unknown, always 0}}
{{OBDtr2|0x180|char[128]|64AAAA|w2_sap|name of player's [[ONWC]] (weapon class) if any}}
{{OBDtr|0x200|int32|EBEBEB|1E 00 00 00|30|ammo filling of the weapon (shots or percent?)}}
|}
 
[[Category:Oni binary data docs]]

Latest revision as of 02:33, 4 December 2025

See OBD:Persist.dat for technical documentation of this file's format.

persist.dat, found next to the game application, is the save-game and preference file for Oni. It can be edited most easily with GUI tools such as OSGE for Windows and OniLib for Mac.

Progress saving

As players of Oni are well aware, the game does not allow arbitrary saving ("save anywhere"), but relies on the use of fixed save points activated by reaching certain places in each level, at which point the level scripting uses the BSL function save_game to mark your progress. This means that by deciding on a maximum number of levels and save points, Bungie West could store the total state of the player's progress in a fixed-size file – 206,496 bytes, to be exact.

Many aspects of the game world are not saved in persist.dat: essentially, anything not pertaining to Konoko herself, such as the position of AIs and the presence of power-ups on the ground. What is stored is Konoko's position, health and inventory. Everything else is determined by the level scripting and the game data, and will always be in the same place when that save point is loaded.

Game preferences

In addition to save point data, persist.dat stores Oni's preferences as chosen on the Options screen (note that this omits key bindings, which are stored in key_config.txt). It also records whether the cheats are enabled, i.e. whether you have beaten the game (however, cheats are unlocked at all times when playing with the Anniversary Edition or Daodan DLL installed or when using the Intel Mac build). The final "setting" tracked by persist.dat is whether you killed Griffin in CHAPTER 13 . PHOENIX RISING.

Mac-Windows compatibility

The Windows version of persist.dat stores its numbers in little-endian format. But Bungie's original Mac game application and The Omni Group's Mac OS X port were built for PowerPC, a big-endian processor, thus numbers were written in the opposite order to the Mac's persist.dat. This meant that the save-game files were not compatible between Windows and Mac versions of Oni. However, when Macs moved to Intel and players began using the Intel-native Mac build of Oni, the file changed to being written in little-endian format and thus became interchangeable between Windows and Mac Oni.