<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://fileformats.archiveteam.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://fileformats.archiveteam.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=RavuAlHemio</id>
		<title>Just Solve the File Format Problem - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://fileformats.archiveteam.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=RavuAlHemio"/>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Special:Contributions/RavuAlHemio"/>
		<updated>2026-05-28T09:26:09Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.19.2</generator>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/Remedy_Archive_System</id>
		<title>Remedy Archive System</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Remedy_Archive_System"/>
				<updated>2025-11-23T23:08:05Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: /* RAS1+2 (Max Payne 1+2) */ clarify reduction-to-s8&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|formattype=electronic&lt;br /&gt;
|subcat=Game data files&lt;br /&gt;
|extensions={{ext|ras}}&lt;br /&gt;
|released=2001&lt;br /&gt;
}}&lt;br /&gt;
'''Remedy Archive System''' is used to store game data for Remedy Entertainment games such as Max Payne and Max Payne 2. The metadata (central directory) following the header is encrypted.&lt;br /&gt;
&lt;br /&gt;
== Identification ==&lt;br /&gt;
Files begin with signature bytes {{magic|52 41 53 00}}.&lt;br /&gt;
&lt;br /&gt;
== Format details ==&lt;br /&gt;
&lt;br /&gt;
Numbers are in little-endian byte order.&lt;br /&gt;
&lt;br /&gt;
=== Metadata ===&lt;br /&gt;
&lt;br /&gt;
The file's header has the following structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASHeader {&lt;br /&gt;
  uint8_t magic[4]; // &amp;quot;RAS\0&amp;quot;&lt;br /&gt;
  int32_t encryptionKey;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next section of the header must be decrypted first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASMetadata {&lt;br /&gt;
  uint32_t fileCount;&lt;br /&gt;
  uint32_t dirCount;&lt;br /&gt;
  uint32_t fileListLength;&lt;br /&gt;
  uint32_t dirListLength;&lt;br /&gt;
  float32_t version; // binary32 according to IEEE 754&lt;br /&gt;
  uint32_t unknown5;&lt;br /&gt;
  uint32_t unknown6;&lt;br /&gt;
  uint32_t unknown7;&lt;br /&gt;
  uint32_t compatibility;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following version and compatibility values are known:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
! Compatibility&lt;br /&gt;
! Game&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 3 || Max Payne&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 4 || Max Payne 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
What follows are &amp;lt;code&amp;gt;fileListLength&amp;lt;/code&amp;gt; encrypted bytes of file metadata that can be decrypted using &amp;lt;code&amp;gt;encryptionKey&amp;lt;/code&amp;gt;. (It is not necessary to remember the last value of &amp;lt;code&amp;gt;key&amp;lt;/code&amp;gt; from decrypting &amp;lt;code&amp;gt;RASMetadata&amp;lt;/code&amp;gt;.) Each entry has the following structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASFileListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  uint32_t uncompressedSize;&lt;br /&gt;
  uint32_t compressedSize;&lt;br /&gt;
  uint32_t unknown2;&lt;br /&gt;
  uint32_t dirIndex;&lt;br /&gt;
  uint32_t unknown4;&lt;br /&gt;
  uint32_t compressionMode; // 1 = some form of Lempel-Ziv, 3 = uncompressed&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next is a directory list of &amp;lt;code&amp;gt;dirCount&amp;lt;/code&amp;gt; elements which must be decrypted similarly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASDirListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each directory is listed with its full name which starts and ends with a backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;). The top-most directory is named &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;. A file's &amp;lt;code&amp;gt;dirIndex&amp;lt;/code&amp;gt; is a 0-based index into the directory list.&lt;br /&gt;
&lt;br /&gt;
Timestamps are encoded using the same structure as SYSTEMTIME on Windows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASTimestamp {&lt;br /&gt;
  uint16_t year;&lt;br /&gt;
  uint16_t month;&lt;br /&gt;
  uint16_t dayOfWeek; // 0 = Sunday, 1 = Monday, ..., 6 = Saturday&lt;br /&gt;
  uint16_t day;&lt;br /&gt;
  uint16_t hour;&lt;br /&gt;
  uint16_t minute;&lt;br /&gt;
  uint16_t second;&lt;br /&gt;
  uint16_t millisecond;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data ===&lt;br /&gt;
&lt;br /&gt;
The file data follows directly after the file and directory lists. Each file is stored in turn with no padding; skipping to a specific file requires adding up the &amp;lt;code&amp;gt;compressedSize&amp;lt;/code&amp;gt; members of all files preceding it.&lt;br /&gt;
&lt;br /&gt;
== Encryption ==&lt;br /&gt;
&lt;br /&gt;
Depending on the generation of the RAS file format, different encryption schemes are used.&lt;br /&gt;
&lt;br /&gt;
=== RAS1+2 (Max Payne 1+2) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void decrypt(uint8_t *buf, size_t count, int32_t key) {&lt;br /&gt;
  size_t i;&lt;br /&gt;
&lt;br /&gt;
  if (key == 0) {&lt;br /&gt;
    key = 1;&lt;br /&gt;
  }&lt;br /&gt;
  for (i = 0; i &amp;amp;lt; count; i++) {&lt;br /&gt;
    uint8_t a = buf[i];&lt;br /&gt;
    uint8_t b = ((uint8_t)(i % 5)) &amp;amp; 7;&lt;br /&gt;
    buf[i] = rotateLeftByte(a, b);&lt;br /&gt;
    key = key * 171 + (key / 177) * -30269;&lt;br /&gt;
    buf[i] = (uint8_t)((((((int8_t)i) + 3) * 6) ^ buf[i]) + ((int8_t)key));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your programming language doesn't support the &amp;lt;code&amp;gt;rotateLeftByte&amp;lt;/code&amp;gt; operation, it can be emulated using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint8_t rotateLeftByte(uint8_t a, uint8_t b) {&lt;br /&gt;
  return (uint8_t)((a &amp;amp;lt;&amp;amp;lt; b) | (a &amp;amp;gt;&amp;amp;gt; (8 - b)));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the algorithm relies heavily on signed-integer wraparound and C's integer promotion rules; an operation like &amp;lt;code&amp;gt;((int8_t)i) + 3&amp;lt;/code&amp;gt; will sign-extend the 8-bit value of &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; to 32 bits before adding 3.&lt;br /&gt;
&lt;br /&gt;
A more complete description of the algorithm is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function BitCastU8ToS8(u: u8): s8&lt;br /&gt;
  // reinterpret the bits of `u`, an 8-bit unsigned integer,&lt;br /&gt;
  // as an 8-bit signed two's-complement integer&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function BitCastS8ToU8(i: s8): i8&lt;br /&gt;
  // reinterpret the bits of `i`, an 8-bit signed two's-complement integer,&lt;br /&gt;
  // as an 8-bit unsigned integer&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function SignExtendS8ToS32(i: s8): s32&lt;br /&gt;
  // expand `i` from 8 bits to 32 bits&lt;br /&gt;
  // by copying its topmost bit into the top 24 bits&lt;br /&gt;
  // and the bottom 8 bits being the same as the bits of `i`&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function RotateLeftS8(i: s8, by: u8): s8&lt;br /&gt;
  // rotate the 8-bit value `i` left by the number of bits in `by`&lt;br /&gt;
  // (shift the value `i` left by `by` bits,&lt;br /&gt;
  // shifting in the bits on the right that &amp;quot;fall out&amp;quot; on the left)&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function MultiplyS32(factor1: s32, factor2: s32): s32&lt;br /&gt;
  // sign-extend `factor1` and `factor2` each to s64,&lt;br /&gt;
  // multiply them, then take the bottom 32 bits of the product&lt;br /&gt;
  // and return it as s32&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function ModuloU32U8(dividend: u32, divisor: u8): u8&lt;br /&gt;
  // divide `dividend` by `divisor` and return the remainder;&lt;br /&gt;
  // this must be a value 0 ≤ value &amp;amp;lt; divisor&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function DivideS32U8(dividend: s32, divisor: u8): s32&lt;br /&gt;
  // divide `dividend` by `divisor` and return the quotient;&lt;br /&gt;
  // always round toward 0&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function AddS32(summand1: s32, summand2: s32): s32&lt;br /&gt;
  // add `summand1` and `summand2`;&lt;br /&gt;
  // wrap around (drop any carry bits) if addition overflows&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function BitwiseXorS32(operand1: s32, operand2: s32): s32&lt;br /&gt;
  // perform a bitwise exclusive-or operation&lt;br /&gt;
  // on the bits of operand1 with the corresponding bits of operand2&lt;br /&gt;
  // with the sign bits treated equally to all the other bits&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function ReduceS32ToS8(i: s32): s8&lt;br /&gt;
  // remove the topmost 24 bits of `i`,&lt;br /&gt;
  // returning the remaining bits as an 8-bit signed two's-complement integer;&lt;br /&gt;
  // no modification is made to the topmost remaining bit&lt;br /&gt;
  // (which becomes the result's sign bit)&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function ReduceU32ToS8(u: u32): s8&lt;br /&gt;
  // remove the topmost 24 bits of `u`,&lt;br /&gt;
  // returning the remaining bits as an 8-bit signed two's-complement integer;&lt;br /&gt;
  // no modification is made to the topmost remaining bit&lt;br /&gt;
  // (which becomes the result's sign bit)&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function Decrypt(buf: u8[], key: s32): void&lt;br /&gt;
  if key == 0&lt;br /&gt;
    key := 1&lt;br /&gt;
&lt;br /&gt;
  for i from 0 to buf.length-1&lt;br /&gt;
    a := BitCastU8ToS8(buf[i])&lt;br /&gt;
    b := ModuloU32U8(i, 5)&lt;br /&gt;
    c := RotateLeftS8(a, b)&lt;br /&gt;
    buf[i] := BitCastS8ToU8(c)&lt;br /&gt;
&lt;br /&gt;
    d := MultiplyS32(key, 171)&lt;br /&gt;
    e := DivideS32U8(key, 177)&lt;br /&gt;
    f := MultiplyS32(e, -30269)&lt;br /&gt;
    key := AddS32(d, f)&lt;br /&gt;
&lt;br /&gt;
    g := ReduceU32ToS8(i)&lt;br /&gt;
    h := SignExtendS8ToS32(g)&lt;br /&gt;
    j := AddS32(h, 3)&lt;br /&gt;
    k := MultiplyS32(j, 6)&lt;br /&gt;
    l := BitCastU8ToS8(buf[i])&lt;br /&gt;
    m := SignExtendS8ToS32(l)&lt;br /&gt;
    n := BitwiseXorS32(k, m)&lt;br /&gt;
    o := ReduceS32ToS8(key)&lt;br /&gt;
    p := SignExtendS8ToS32(o)&lt;br /&gt;
    q := AddS32(n, p)&lt;br /&gt;
    r := ReduceS32ToS8(q)&lt;br /&gt;
    buf[i] := BitCastS8ToU8(r)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Remedy Entertainment]]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/Remedy_Archive_System</id>
		<title>Remedy Archive System</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Remedy_Archive_System"/>
				<updated>2025-11-23T23:03:39Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: reformulate sign bit treatment in xor&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|formattype=electronic&lt;br /&gt;
|subcat=Game data files&lt;br /&gt;
|extensions={{ext|ras}}&lt;br /&gt;
|released=2001&lt;br /&gt;
}}&lt;br /&gt;
'''Remedy Archive System''' is used to store game data for Remedy Entertainment games such as Max Payne and Max Payne 2. The metadata (central directory) following the header is encrypted.&lt;br /&gt;
&lt;br /&gt;
== Identification ==&lt;br /&gt;
Files begin with signature bytes {{magic|52 41 53 00}}.&lt;br /&gt;
&lt;br /&gt;
== Format details ==&lt;br /&gt;
&lt;br /&gt;
Numbers are in little-endian byte order.&lt;br /&gt;
&lt;br /&gt;
=== Metadata ===&lt;br /&gt;
&lt;br /&gt;
The file's header has the following structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASHeader {&lt;br /&gt;
  uint8_t magic[4]; // &amp;quot;RAS\0&amp;quot;&lt;br /&gt;
  int32_t encryptionKey;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next section of the header must be decrypted first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASMetadata {&lt;br /&gt;
  uint32_t fileCount;&lt;br /&gt;
  uint32_t dirCount;&lt;br /&gt;
  uint32_t fileListLength;&lt;br /&gt;
  uint32_t dirListLength;&lt;br /&gt;
  float32_t version; // binary32 according to IEEE 754&lt;br /&gt;
  uint32_t unknown5;&lt;br /&gt;
  uint32_t unknown6;&lt;br /&gt;
  uint32_t unknown7;&lt;br /&gt;
  uint32_t compatibility;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following version and compatibility values are known:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
! Compatibility&lt;br /&gt;
! Game&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 3 || Max Payne&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 4 || Max Payne 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
What follows are &amp;lt;code&amp;gt;fileListLength&amp;lt;/code&amp;gt; encrypted bytes of file metadata that can be decrypted using &amp;lt;code&amp;gt;encryptionKey&amp;lt;/code&amp;gt;. (It is not necessary to remember the last value of &amp;lt;code&amp;gt;key&amp;lt;/code&amp;gt; from decrypting &amp;lt;code&amp;gt;RASMetadata&amp;lt;/code&amp;gt;.) Each entry has the following structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASFileListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  uint32_t uncompressedSize;&lt;br /&gt;
  uint32_t compressedSize;&lt;br /&gt;
  uint32_t unknown2;&lt;br /&gt;
  uint32_t dirIndex;&lt;br /&gt;
  uint32_t unknown4;&lt;br /&gt;
  uint32_t compressionMode; // 1 = some form of Lempel-Ziv, 3 = uncompressed&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next is a directory list of &amp;lt;code&amp;gt;dirCount&amp;lt;/code&amp;gt; elements which must be decrypted similarly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASDirListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each directory is listed with its full name which starts and ends with a backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;). The top-most directory is named &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;. A file's &amp;lt;code&amp;gt;dirIndex&amp;lt;/code&amp;gt; is a 0-based index into the directory list.&lt;br /&gt;
&lt;br /&gt;
Timestamps are encoded using the same structure as SYSTEMTIME on Windows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASTimestamp {&lt;br /&gt;
  uint16_t year;&lt;br /&gt;
  uint16_t month;&lt;br /&gt;
  uint16_t dayOfWeek; // 0 = Sunday, 1 = Monday, ..., 6 = Saturday&lt;br /&gt;
  uint16_t day;&lt;br /&gt;
  uint16_t hour;&lt;br /&gt;
  uint16_t minute;&lt;br /&gt;
  uint16_t second;&lt;br /&gt;
  uint16_t millisecond;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data ===&lt;br /&gt;
&lt;br /&gt;
The file data follows directly after the file and directory lists. Each file is stored in turn with no padding; skipping to a specific file requires adding up the &amp;lt;code&amp;gt;compressedSize&amp;lt;/code&amp;gt; members of all files preceding it.&lt;br /&gt;
&lt;br /&gt;
== Encryption ==&lt;br /&gt;
&lt;br /&gt;
Depending on the generation of the RAS file format, different encryption schemes are used.&lt;br /&gt;
&lt;br /&gt;
=== RAS1+2 (Max Payne 1+2) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void decrypt(uint8_t *buf, size_t count, int32_t key) {&lt;br /&gt;
  size_t i;&lt;br /&gt;
&lt;br /&gt;
  if (key == 0) {&lt;br /&gt;
    key = 1;&lt;br /&gt;
  }&lt;br /&gt;
  for (i = 0; i &amp;amp;lt; count; i++) {&lt;br /&gt;
    uint8_t a = buf[i];&lt;br /&gt;
    uint8_t b = ((uint8_t)(i % 5)) &amp;amp; 7;&lt;br /&gt;
    buf[i] = rotateLeftByte(a, b);&lt;br /&gt;
    key = key * 171 + (key / 177) * -30269;&lt;br /&gt;
    buf[i] = (uint8_t)((((((int8_t)i) + 3) * 6) ^ buf[i]) + ((int8_t)key));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your programming language doesn't support the &amp;lt;code&amp;gt;rotateLeftByte&amp;lt;/code&amp;gt; operation, it can be emulated using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint8_t rotateLeftByte(uint8_t a, uint8_t b) {&lt;br /&gt;
  return (uint8_t)((a &amp;amp;lt;&amp;amp;lt; b) | (a &amp;amp;gt;&amp;amp;gt; (8 - b)));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the algorithm relies heavily on signed-integer wraparound and C's integer promotion rules; an operation like &amp;lt;code&amp;gt;((int8_t)i) + 3&amp;lt;/code&amp;gt; will sign-extend the 8-bit value of &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; to 32 bits before adding 3.&lt;br /&gt;
&lt;br /&gt;
A more complete description of the algorithm is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function BitCastU8ToS8(u: u8): s8&lt;br /&gt;
  // reinterpret the bits of `u`, an 8-bit unsigned integer,&lt;br /&gt;
  // as an 8-bit signed two's-complement integer&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function BitCastS8ToU8(i: s8): i8&lt;br /&gt;
  // reinterpret the bits of `i`, an 8-bit signed two's-complement integer,&lt;br /&gt;
  // as an 8-bit unsigned integer&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function SignExtendS8ToS32(i: s8): s32&lt;br /&gt;
  // expand `i` from 8 bits to 32 bits&lt;br /&gt;
  // by copying its topmost bit into the top 24 bits&lt;br /&gt;
  // and the bottom 8 bits being the same as the bits of `i`&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function RotateLeftS8(i: s8, by: u8): s8&lt;br /&gt;
  // rotate the 8-bit value `i` left by the number of bits in `by`&lt;br /&gt;
  // (shift the value `i` left by `by` bits,&lt;br /&gt;
  // shifting in the bits on the right that &amp;quot;fall out&amp;quot; on the left)&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function MultiplyS32(factor1: s32, factor2: s32): s32&lt;br /&gt;
  // sign-extend `factor1` and `factor2` each to s64,&lt;br /&gt;
  // multiply them, then take the bottom 32 bits of the product&lt;br /&gt;
  // and return it as s32&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function ModuloU32U8(dividend: u32, divisor: u8): u8&lt;br /&gt;
  // divide `dividend` by `divisor` and return the remainder;&lt;br /&gt;
  // this must be a value 0 ≤ value &amp;amp;lt; divisor&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function DivideS32U8(dividend: s32, divisor: u8): s32&lt;br /&gt;
  // divide `dividend` by `divisor` and return the quotient;&lt;br /&gt;
  // always round toward 0&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function AddS32(summand1: s32, summand2: s32): s32&lt;br /&gt;
  // add `summand1` and `summand2`;&lt;br /&gt;
  // wrap around (drop any carry bits) if addition overflows&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function BitwiseXorS32(operand1: s32, operand2: s32): s32&lt;br /&gt;
  // perform a bitwise exclusive-or operation&lt;br /&gt;
  // on the bits of operand1 with the corresponding bits of operand2&lt;br /&gt;
  // with the sign bits treated equally as all the other bits&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function ReduceS32ToS8(i: s32): s8&lt;br /&gt;
  // remove the topmost 24 bits of `i`,&lt;br /&gt;
  // returning the remaining bits as a signed 8-bit integer;&lt;br /&gt;
  // if the topmost bit of the resulting integer happens to be 1,&lt;br /&gt;
  // the result is negative&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function ReduceU32ToS8(u: u32): s8&lt;br /&gt;
  // remove the topmost 24 bits of `u`,&lt;br /&gt;
  // returning the remaining bits as a signed 8-bit integer;&lt;br /&gt;
  // if the topmost bit of the resulting integer happens to be 1,&lt;br /&gt;
  // the result is negative&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function Decrypt(buf: u8[], key: s32): void&lt;br /&gt;
  if key == 0&lt;br /&gt;
    key := 1&lt;br /&gt;
&lt;br /&gt;
  for i from 0 to buf.length-1&lt;br /&gt;
    a := BitCastU8ToS8(buf[i])&lt;br /&gt;
    b := ModuloU32U8(i, 5)&lt;br /&gt;
    c := RotateLeftS8(a, b)&lt;br /&gt;
    buf[i] := BitCastS8ToU8(c)&lt;br /&gt;
&lt;br /&gt;
    d := MultiplyS32(key, 171)&lt;br /&gt;
    e := DivideS32U8(key, 177)&lt;br /&gt;
    f := MultiplyS32(e, -30269)&lt;br /&gt;
    key := AddS32(d, f)&lt;br /&gt;
&lt;br /&gt;
    g := ReduceU32ToS8(i)&lt;br /&gt;
    h := SignExtendS8ToS32(g)&lt;br /&gt;
    j := AddS32(h, 3)&lt;br /&gt;
    k := MultiplyS32(j, 6)&lt;br /&gt;
    l := BitCastU8ToS8(buf[i])&lt;br /&gt;
    m := SignExtendS8ToS32(l)&lt;br /&gt;
    n := BitwiseXorS32(k, m)&lt;br /&gt;
    o := ReduceS32ToS8(key)&lt;br /&gt;
    p := SignExtendS8ToS32(o)&lt;br /&gt;
    q := AddS32(n, p)&lt;br /&gt;
    r := ReduceS32ToS8(q)&lt;br /&gt;
    buf[i] := BitCastS8ToU8(r)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Remedy Entertainment]]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/Remedy_Archive_System</id>
		<title>Remedy Archive System</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Remedy_Archive_System"/>
				<updated>2025-11-23T23:02:51Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: /* RAS1+2 (Max Payne 1+2) */ improve bitwise xor explanation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|formattype=electronic&lt;br /&gt;
|subcat=Game data files&lt;br /&gt;
|extensions={{ext|ras}}&lt;br /&gt;
|released=2001&lt;br /&gt;
}}&lt;br /&gt;
'''Remedy Archive System''' is used to store game data for Remedy Entertainment games such as Max Payne and Max Payne 2. The metadata (central directory) following the header is encrypted.&lt;br /&gt;
&lt;br /&gt;
== Identification ==&lt;br /&gt;
Files begin with signature bytes {{magic|52 41 53 00}}.&lt;br /&gt;
&lt;br /&gt;
== Format details ==&lt;br /&gt;
&lt;br /&gt;
Numbers are in little-endian byte order.&lt;br /&gt;
&lt;br /&gt;
=== Metadata ===&lt;br /&gt;
&lt;br /&gt;
The file's header has the following structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASHeader {&lt;br /&gt;
  uint8_t magic[4]; // &amp;quot;RAS\0&amp;quot;&lt;br /&gt;
  int32_t encryptionKey;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next section of the header must be decrypted first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASMetadata {&lt;br /&gt;
  uint32_t fileCount;&lt;br /&gt;
  uint32_t dirCount;&lt;br /&gt;
  uint32_t fileListLength;&lt;br /&gt;
  uint32_t dirListLength;&lt;br /&gt;
  float32_t version; // binary32 according to IEEE 754&lt;br /&gt;
  uint32_t unknown5;&lt;br /&gt;
  uint32_t unknown6;&lt;br /&gt;
  uint32_t unknown7;&lt;br /&gt;
  uint32_t compatibility;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following version and compatibility values are known:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
! Compatibility&lt;br /&gt;
! Game&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 3 || Max Payne&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 4 || Max Payne 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
What follows are &amp;lt;code&amp;gt;fileListLength&amp;lt;/code&amp;gt; encrypted bytes of file metadata that can be decrypted using &amp;lt;code&amp;gt;encryptionKey&amp;lt;/code&amp;gt;. (It is not necessary to remember the last value of &amp;lt;code&amp;gt;key&amp;lt;/code&amp;gt; from decrypting &amp;lt;code&amp;gt;RASMetadata&amp;lt;/code&amp;gt;.) Each entry has the following structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASFileListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  uint32_t uncompressedSize;&lt;br /&gt;
  uint32_t compressedSize;&lt;br /&gt;
  uint32_t unknown2;&lt;br /&gt;
  uint32_t dirIndex;&lt;br /&gt;
  uint32_t unknown4;&lt;br /&gt;
  uint32_t compressionMode; // 1 = some form of Lempel-Ziv, 3 = uncompressed&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next is a directory list of &amp;lt;code&amp;gt;dirCount&amp;lt;/code&amp;gt; elements which must be decrypted similarly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASDirListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each directory is listed with its full name which starts and ends with a backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;). The top-most directory is named &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;. A file's &amp;lt;code&amp;gt;dirIndex&amp;lt;/code&amp;gt; is a 0-based index into the directory list.&lt;br /&gt;
&lt;br /&gt;
Timestamps are encoded using the same structure as SYSTEMTIME on Windows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASTimestamp {&lt;br /&gt;
  uint16_t year;&lt;br /&gt;
  uint16_t month;&lt;br /&gt;
  uint16_t dayOfWeek; // 0 = Sunday, 1 = Monday, ..., 6 = Saturday&lt;br /&gt;
  uint16_t day;&lt;br /&gt;
  uint16_t hour;&lt;br /&gt;
  uint16_t minute;&lt;br /&gt;
  uint16_t second;&lt;br /&gt;
  uint16_t millisecond;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data ===&lt;br /&gt;
&lt;br /&gt;
The file data follows directly after the file and directory lists. Each file is stored in turn with no padding; skipping to a specific file requires adding up the &amp;lt;code&amp;gt;compressedSize&amp;lt;/code&amp;gt; members of all files preceding it.&lt;br /&gt;
&lt;br /&gt;
== Encryption ==&lt;br /&gt;
&lt;br /&gt;
Depending on the generation of the RAS file format, different encryption schemes are used.&lt;br /&gt;
&lt;br /&gt;
=== RAS1+2 (Max Payne 1+2) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void decrypt(uint8_t *buf, size_t count, int32_t key) {&lt;br /&gt;
  size_t i;&lt;br /&gt;
&lt;br /&gt;
  if (key == 0) {&lt;br /&gt;
    key = 1;&lt;br /&gt;
  }&lt;br /&gt;
  for (i = 0; i &amp;amp;lt; count; i++) {&lt;br /&gt;
    uint8_t a = buf[i];&lt;br /&gt;
    uint8_t b = ((uint8_t)(i % 5)) &amp;amp; 7;&lt;br /&gt;
    buf[i] = rotateLeftByte(a, b);&lt;br /&gt;
    key = key * 171 + (key / 177) * -30269;&lt;br /&gt;
    buf[i] = (uint8_t)((((((int8_t)i) + 3) * 6) ^ buf[i]) + ((int8_t)key));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your programming language doesn't support the &amp;lt;code&amp;gt;rotateLeftByte&amp;lt;/code&amp;gt; operation, it can be emulated using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint8_t rotateLeftByte(uint8_t a, uint8_t b) {&lt;br /&gt;
  return (uint8_t)((a &amp;amp;lt;&amp;amp;lt; b) | (a &amp;amp;gt;&amp;amp;gt; (8 - b)));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the algorithm relies heavily on signed-integer wraparound and C's integer promotion rules; an operation like &amp;lt;code&amp;gt;((int8_t)i) + 3&amp;lt;/code&amp;gt; will sign-extend the 8-bit value of &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; to 32 bits before adding 3.&lt;br /&gt;
&lt;br /&gt;
A more complete description of the algorithm is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function BitCastU8ToS8(u: u8): s8&lt;br /&gt;
  // reinterpret the bits of `u`, an 8-bit unsigned integer,&lt;br /&gt;
  // as an 8-bit signed two's-complement integer&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function BitCastS8ToU8(i: s8): i8&lt;br /&gt;
  // reinterpret the bits of `i`, an 8-bit signed two's-complement integer,&lt;br /&gt;
  // as an 8-bit unsigned integer&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function SignExtendS8ToS32(i: s8): s32&lt;br /&gt;
  // expand `i` from 8 bits to 32 bits&lt;br /&gt;
  // by copying its topmost bit into the top 24 bits&lt;br /&gt;
  // and the bottom 8 bits being the same as the bits of `i`&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function RotateLeftS8(i: s8, by: u8): s8&lt;br /&gt;
  // rotate the 8-bit value `i` left by the number of bits in `by`&lt;br /&gt;
  // (shift the value `i` left by `by` bits,&lt;br /&gt;
  // shifting in the bits on the right that &amp;quot;fall out&amp;quot; on the left)&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function MultiplyS32(factor1: s32, factor2: s32): s32&lt;br /&gt;
  // sign-extend `factor1` and `factor2` each to s64,&lt;br /&gt;
  // multiply them, then take the bottom 32 bits of the product&lt;br /&gt;
  // and return it as s32&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function ModuloU32U8(dividend: u32, divisor: u8): u8&lt;br /&gt;
  // divide `dividend` by `divisor` and return the remainder;&lt;br /&gt;
  // this must be a value 0 ≤ value &amp;amp;lt; divisor&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function DivideS32U8(dividend: s32, divisor: u8): s32&lt;br /&gt;
  // divide `dividend` by `divisor` and return the quotient;&lt;br /&gt;
  // always round toward 0&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function AddS32(summand1: s32, summand2: s32): s32&lt;br /&gt;
  // add `summand1` and `summand2`;&lt;br /&gt;
  // wrap around (drop any carry bits) if addition overflows&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function BitwiseXorS32(operand1: s32, operand2: s32): s32&lt;br /&gt;
  // perform a bitwise exclusive-or operation&lt;br /&gt;
  // on the bits of operand1 with the corresponding bits of operand2&lt;br /&gt;
  // with no special provisions for the sign bit&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function ReduceS32ToS8(i: s32): s8&lt;br /&gt;
  // remove the topmost 24 bits of `i`,&lt;br /&gt;
  // returning the remaining bits as a signed 8-bit integer;&lt;br /&gt;
  // if the topmost bit of the resulting integer happens to be 1,&lt;br /&gt;
  // the result is negative&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function ReduceU32ToS8(u: u32): s8&lt;br /&gt;
  // remove the topmost 24 bits of `u`,&lt;br /&gt;
  // returning the remaining bits as a signed 8-bit integer;&lt;br /&gt;
  // if the topmost bit of the resulting integer happens to be 1,&lt;br /&gt;
  // the result is negative&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function Decrypt(buf: u8[], key: s32): void&lt;br /&gt;
  if key == 0&lt;br /&gt;
    key := 1&lt;br /&gt;
&lt;br /&gt;
  for i from 0 to buf.length-1&lt;br /&gt;
    a := BitCastU8ToS8(buf[i])&lt;br /&gt;
    b := ModuloU32U8(i, 5)&lt;br /&gt;
    c := RotateLeftS8(a, b)&lt;br /&gt;
    buf[i] := BitCastS8ToU8(c)&lt;br /&gt;
&lt;br /&gt;
    d := MultiplyS32(key, 171)&lt;br /&gt;
    e := DivideS32U8(key, 177)&lt;br /&gt;
    f := MultiplyS32(e, -30269)&lt;br /&gt;
    key := AddS32(d, f)&lt;br /&gt;
&lt;br /&gt;
    g := ReduceU32ToS8(i)&lt;br /&gt;
    h := SignExtendS8ToS32(g)&lt;br /&gt;
    j := AddS32(h, 3)&lt;br /&gt;
    k := MultiplyS32(j, 6)&lt;br /&gt;
    l := BitCastU8ToS8(buf[i])&lt;br /&gt;
    m := SignExtendS8ToS32(l)&lt;br /&gt;
    n := BitwiseXorS32(k, m)&lt;br /&gt;
    o := ReduceS32ToS8(key)&lt;br /&gt;
    p := SignExtendS8ToS32(o)&lt;br /&gt;
    q := AddS32(n, p)&lt;br /&gt;
    r := ReduceS32ToS8(q)&lt;br /&gt;
    buf[i] := BitCastS8ToU8(r)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Remedy Entertainment]]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/Remedy_Archive_System</id>
		<title>Remedy Archive System</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Remedy_Archive_System"/>
				<updated>2025-11-23T18:59:45Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: /* RAS1+2 (Max Payne 1+2) */ define and use ReduceU32ToS8 on i&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|formattype=electronic&lt;br /&gt;
|subcat=Game data files&lt;br /&gt;
|extensions={{ext|ras}}&lt;br /&gt;
|released=2001&lt;br /&gt;
}}&lt;br /&gt;
'''Remedy Archive System''' is used to store game data for Remedy Entertainment games such as Max Payne and Max Payne 2. The metadata (central directory) following the header is encrypted.&lt;br /&gt;
&lt;br /&gt;
== Identification ==&lt;br /&gt;
Files begin with signature bytes {{magic|52 41 53 00}}.&lt;br /&gt;
&lt;br /&gt;
== Format details ==&lt;br /&gt;
&lt;br /&gt;
Numbers are in little-endian byte order.&lt;br /&gt;
&lt;br /&gt;
=== Metadata ===&lt;br /&gt;
&lt;br /&gt;
The file's header has the following structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASHeader {&lt;br /&gt;
  uint8_t magic[4]; // &amp;quot;RAS\0&amp;quot;&lt;br /&gt;
  int32_t encryptionKey;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next section of the header must be decrypted first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASMetadata {&lt;br /&gt;
  uint32_t fileCount;&lt;br /&gt;
  uint32_t dirCount;&lt;br /&gt;
  uint32_t fileListLength;&lt;br /&gt;
  uint32_t dirListLength;&lt;br /&gt;
  float32_t version; // binary32 according to IEEE 754&lt;br /&gt;
  uint32_t unknown5;&lt;br /&gt;
  uint32_t unknown6;&lt;br /&gt;
  uint32_t unknown7;&lt;br /&gt;
  uint32_t compatibility;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following version and compatibility values are known:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
! Compatibility&lt;br /&gt;
! Game&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 3 || Max Payne&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 4 || Max Payne 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
What follows are &amp;lt;code&amp;gt;fileListLength&amp;lt;/code&amp;gt; encrypted bytes of file metadata that can be decrypted using &amp;lt;code&amp;gt;encryptionKey&amp;lt;/code&amp;gt;. (It is not necessary to remember the last value of &amp;lt;code&amp;gt;key&amp;lt;/code&amp;gt; from decrypting &amp;lt;code&amp;gt;RASMetadata&amp;lt;/code&amp;gt;.) Each entry has the following structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASFileListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  uint32_t uncompressedSize;&lt;br /&gt;
  uint32_t compressedSize;&lt;br /&gt;
  uint32_t unknown2;&lt;br /&gt;
  uint32_t dirIndex;&lt;br /&gt;
  uint32_t unknown4;&lt;br /&gt;
  uint32_t compressionMode; // 1 = some form of Lempel-Ziv, 3 = uncompressed&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next is a directory list of &amp;lt;code&amp;gt;dirCount&amp;lt;/code&amp;gt; elements which must be decrypted similarly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASDirListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each directory is listed with its full name which starts and ends with a backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;). The top-most directory is named &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;. A file's &amp;lt;code&amp;gt;dirIndex&amp;lt;/code&amp;gt; is a 0-based index into the directory list.&lt;br /&gt;
&lt;br /&gt;
Timestamps are encoded using the same structure as SYSTEMTIME on Windows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASTimestamp {&lt;br /&gt;
  uint16_t year;&lt;br /&gt;
  uint16_t month;&lt;br /&gt;
  uint16_t dayOfWeek; // 0 = Sunday, 1 = Monday, ..., 6 = Saturday&lt;br /&gt;
  uint16_t day;&lt;br /&gt;
  uint16_t hour;&lt;br /&gt;
  uint16_t minute;&lt;br /&gt;
  uint16_t second;&lt;br /&gt;
  uint16_t millisecond;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data ===&lt;br /&gt;
&lt;br /&gt;
The file data follows directly after the file and directory lists. Each file is stored in turn with no padding; skipping to a specific file requires adding up the &amp;lt;code&amp;gt;compressedSize&amp;lt;/code&amp;gt; members of all files preceding it.&lt;br /&gt;
&lt;br /&gt;
== Encryption ==&lt;br /&gt;
&lt;br /&gt;
Depending on the generation of the RAS file format, different encryption schemes are used.&lt;br /&gt;
&lt;br /&gt;
=== RAS1+2 (Max Payne 1+2) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void decrypt(uint8_t *buf, size_t count, int32_t key) {&lt;br /&gt;
  size_t i;&lt;br /&gt;
&lt;br /&gt;
  if (key == 0) {&lt;br /&gt;
    key = 1;&lt;br /&gt;
  }&lt;br /&gt;
  for (i = 0; i &amp;amp;lt; count; i++) {&lt;br /&gt;
    uint8_t a = buf[i];&lt;br /&gt;
    uint8_t b = ((uint8_t)(i % 5)) &amp;amp; 7;&lt;br /&gt;
    buf[i] = rotateLeftByte(a, b);&lt;br /&gt;
    key = key * 171 + (key / 177) * -30269;&lt;br /&gt;
    buf[i] = (uint8_t)((((((int8_t)i) + 3) * 6) ^ buf[i]) + ((int8_t)key));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your programming language doesn't support the &amp;lt;code&amp;gt;rotateLeftByte&amp;lt;/code&amp;gt; operation, it can be emulated using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint8_t rotateLeftByte(uint8_t a, uint8_t b) {&lt;br /&gt;
  return (uint8_t)((a &amp;amp;lt;&amp;amp;lt; b) | (a &amp;amp;gt;&amp;amp;gt; (8 - b)));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the algorithm relies heavily on signed-integer wraparound and C's integer promotion rules; an operation like &amp;lt;code&amp;gt;((int8_t)i) + 3&amp;lt;/code&amp;gt; will sign-extend the 8-bit value of &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; to 32 bits before adding 3.&lt;br /&gt;
&lt;br /&gt;
A more complete description of the algorithm is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function BitCastU8ToS8(u: u8): s8&lt;br /&gt;
  // reinterpret the bits of `u`, an 8-bit unsigned integer,&lt;br /&gt;
  // as an 8-bit signed two's-complement integer&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function BitCastS8ToU8(i: s8): i8&lt;br /&gt;
  // reinterpret the bits of `i`, an 8-bit signed two's-complement integer,&lt;br /&gt;
  // as an 8-bit unsigned integer&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function SignExtendS8ToS32(i: s8): s32&lt;br /&gt;
  // expand `i` from 8 bits to 32 bits&lt;br /&gt;
  // by copying its topmost bit into the top 24 bits&lt;br /&gt;
  // and the bottom 8 bits being the same as the bits of `i`&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function RotateLeftS8(i: s8, by: u8): s8&lt;br /&gt;
  // rotate the 8-bit value `i` left by the number of bits in `by`&lt;br /&gt;
  // (shift the value `i` left by `by` bits,&lt;br /&gt;
  // shifting in the bits on the right that &amp;quot;fall out&amp;quot; on the left)&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function MultiplyS32(factor1: s32, factor2: s32): s32&lt;br /&gt;
  // sign-extend `factor1` and `factor2` each to s64,&lt;br /&gt;
  // multiply them, then take the bottom 32 bits of the product&lt;br /&gt;
  // and return it as s32&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function ModuloU32U8(dividend: u32, divisor: u8): u8&lt;br /&gt;
  // divide `dividend` by `divisor` and return the remainder;&lt;br /&gt;
  // this must be a value 0 ≤ value &amp;amp;lt; divisor&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function DivideS32U8(dividend: s32, divisor: u8): s32&lt;br /&gt;
  // divide `dividend` by `divisor` and return the quotient;&lt;br /&gt;
  // always round toward 0&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function AddS32(summand1: s32, summand2: s32): s32&lt;br /&gt;
  // add `summand1` and `summand2`;&lt;br /&gt;
  // wrap around (drop any carry bits) if addition overflows&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function BitwiseXorS32(operand1: s32, operand2: s32): s32&lt;br /&gt;
  // perform a bitwise exclusive-or operation&lt;br /&gt;
  // on the bits of operand1 and operand2&lt;br /&gt;
  // with no special provisions for the sign bit&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function ReduceS32ToS8(i: s32): s8&lt;br /&gt;
  // remove the topmost 24 bits of `i`,&lt;br /&gt;
  // returning the remaining bits as a signed 8-bit integer;&lt;br /&gt;
  // if the topmost bit of the resulting integer happens to be 1,&lt;br /&gt;
  // the result is negative&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function ReduceU32ToS8(u: u32): s8&lt;br /&gt;
  // remove the topmost 24 bits of `u`,&lt;br /&gt;
  // returning the remaining bits as a signed 8-bit integer;&lt;br /&gt;
  // if the topmost bit of the resulting integer happens to be 1,&lt;br /&gt;
  // the result is negative&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function Decrypt(buf: u8[], key: s32): void&lt;br /&gt;
  if key == 0&lt;br /&gt;
    key := 1&lt;br /&gt;
&lt;br /&gt;
  for i from 0 to buf.length-1&lt;br /&gt;
    a := BitCastU8ToS8(buf[i])&lt;br /&gt;
    b := ModuloU32U8(i, 5)&lt;br /&gt;
    c := RotateLeftS8(a, b)&lt;br /&gt;
    buf[i] := BitCastS8ToU8(c)&lt;br /&gt;
&lt;br /&gt;
    d := MultiplyS32(key, 171)&lt;br /&gt;
    e := DivideS32U8(key, 177)&lt;br /&gt;
    f := MultiplyS32(e, -30269)&lt;br /&gt;
    key := AddS32(d, f)&lt;br /&gt;
&lt;br /&gt;
    g := ReduceU32ToS8(i)&lt;br /&gt;
    h := SignExtendS8ToS32(g)&lt;br /&gt;
    j := AddS32(h, 3)&lt;br /&gt;
    k := MultiplyS32(j, 6)&lt;br /&gt;
    l := BitCastU8ToS8(buf[i])&lt;br /&gt;
    m := SignExtendS8ToS32(l)&lt;br /&gt;
    n := BitwiseXorS32(k, m)&lt;br /&gt;
    o := ReduceS32ToS8(key)&lt;br /&gt;
    p := SignExtendS8ToS32(o)&lt;br /&gt;
    q := AddS32(n, p)&lt;br /&gt;
    r := ReduceS32ToS8(q)&lt;br /&gt;
    buf[i] := BitCastS8ToU8(r)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Remedy Entertainment]]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/Remedy_Archive_System</id>
		<title>Remedy Archive System</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Remedy_Archive_System"/>
				<updated>2025-11-23T18:51:04Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: /* RAS1+2 (Max Payne 1+2) */ fix DivideS32U8 return type&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|formattype=electronic&lt;br /&gt;
|subcat=Game data files&lt;br /&gt;
|extensions={{ext|ras}}&lt;br /&gt;
|released=2001&lt;br /&gt;
}}&lt;br /&gt;
'''Remedy Archive System''' is used to store game data for Remedy Entertainment games such as Max Payne and Max Payne 2. The metadata (central directory) following the header is encrypted.&lt;br /&gt;
&lt;br /&gt;
== Identification ==&lt;br /&gt;
Files begin with signature bytes {{magic|52 41 53 00}}.&lt;br /&gt;
&lt;br /&gt;
== Format details ==&lt;br /&gt;
&lt;br /&gt;
Numbers are in little-endian byte order.&lt;br /&gt;
&lt;br /&gt;
=== Metadata ===&lt;br /&gt;
&lt;br /&gt;
The file's header has the following structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASHeader {&lt;br /&gt;
  uint8_t magic[4]; // &amp;quot;RAS\0&amp;quot;&lt;br /&gt;
  int32_t encryptionKey;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next section of the header must be decrypted first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASMetadata {&lt;br /&gt;
  uint32_t fileCount;&lt;br /&gt;
  uint32_t dirCount;&lt;br /&gt;
  uint32_t fileListLength;&lt;br /&gt;
  uint32_t dirListLength;&lt;br /&gt;
  float32_t version; // binary32 according to IEEE 754&lt;br /&gt;
  uint32_t unknown5;&lt;br /&gt;
  uint32_t unknown6;&lt;br /&gt;
  uint32_t unknown7;&lt;br /&gt;
  uint32_t compatibility;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following version and compatibility values are known:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
! Compatibility&lt;br /&gt;
! Game&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 3 || Max Payne&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 4 || Max Payne 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
What follows are &amp;lt;code&amp;gt;fileListLength&amp;lt;/code&amp;gt; encrypted bytes of file metadata that can be decrypted using &amp;lt;code&amp;gt;encryptionKey&amp;lt;/code&amp;gt;. (It is not necessary to remember the last value of &amp;lt;code&amp;gt;key&amp;lt;/code&amp;gt; from decrypting &amp;lt;code&amp;gt;RASMetadata&amp;lt;/code&amp;gt;.) Each entry has the following structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASFileListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  uint32_t uncompressedSize;&lt;br /&gt;
  uint32_t compressedSize;&lt;br /&gt;
  uint32_t unknown2;&lt;br /&gt;
  uint32_t dirIndex;&lt;br /&gt;
  uint32_t unknown4;&lt;br /&gt;
  uint32_t compressionMode; // 1 = some form of Lempel-Ziv, 3 = uncompressed&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next is a directory list of &amp;lt;code&amp;gt;dirCount&amp;lt;/code&amp;gt; elements which must be decrypted similarly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASDirListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each directory is listed with its full name which starts and ends with a backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;). The top-most directory is named &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;. A file's &amp;lt;code&amp;gt;dirIndex&amp;lt;/code&amp;gt; is a 0-based index into the directory list.&lt;br /&gt;
&lt;br /&gt;
Timestamps are encoded using the same structure as SYSTEMTIME on Windows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASTimestamp {&lt;br /&gt;
  uint16_t year;&lt;br /&gt;
  uint16_t month;&lt;br /&gt;
  uint16_t dayOfWeek; // 0 = Sunday, 1 = Monday, ..., 6 = Saturday&lt;br /&gt;
  uint16_t day;&lt;br /&gt;
  uint16_t hour;&lt;br /&gt;
  uint16_t minute;&lt;br /&gt;
  uint16_t second;&lt;br /&gt;
  uint16_t millisecond;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data ===&lt;br /&gt;
&lt;br /&gt;
The file data follows directly after the file and directory lists. Each file is stored in turn with no padding; skipping to a specific file requires adding up the &amp;lt;code&amp;gt;compressedSize&amp;lt;/code&amp;gt; members of all files preceding it.&lt;br /&gt;
&lt;br /&gt;
== Encryption ==&lt;br /&gt;
&lt;br /&gt;
Depending on the generation of the RAS file format, different encryption schemes are used.&lt;br /&gt;
&lt;br /&gt;
=== RAS1+2 (Max Payne 1+2) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void decrypt(uint8_t *buf, size_t count, int32_t key) {&lt;br /&gt;
  size_t i;&lt;br /&gt;
&lt;br /&gt;
  if (key == 0) {&lt;br /&gt;
    key = 1;&lt;br /&gt;
  }&lt;br /&gt;
  for (i = 0; i &amp;amp;lt; count; i++) {&lt;br /&gt;
    uint8_t a = buf[i];&lt;br /&gt;
    uint8_t b = ((uint8_t)(i % 5)) &amp;amp; 7;&lt;br /&gt;
    buf[i] = rotateLeftByte(a, b);&lt;br /&gt;
    key = key * 171 + (key / 177) * -30269;&lt;br /&gt;
    buf[i] = (uint8_t)((((((int8_t)i) + 3) * 6) ^ buf[i]) + ((int8_t)key));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your programming language doesn't support the &amp;lt;code&amp;gt;rotateLeftByte&amp;lt;/code&amp;gt; operation, it can be emulated using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint8_t rotateLeftByte(uint8_t a, uint8_t b) {&lt;br /&gt;
  return (uint8_t)((a &amp;amp;lt;&amp;amp;lt; b) | (a &amp;amp;gt;&amp;amp;gt; (8 - b)));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the algorithm relies heavily on signed-integer wraparound and C's integer promotion rules; an operation like &amp;lt;code&amp;gt;((int8_t)i) + 3&amp;lt;/code&amp;gt; will sign-extend the 8-bit value of &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; to 32 bits before adding 3.&lt;br /&gt;
&lt;br /&gt;
A more complete description of the algorithm is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function BitCastU8ToS8(u: u8): s8&lt;br /&gt;
  // reinterpret the bits of `u`, an 8-bit unsigned integer,&lt;br /&gt;
  // as an 8-bit signed two's-complement integer&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function BitCastS8ToU8(i: s8): i8&lt;br /&gt;
  // reinterpret the bits of `i`, an 8-bit signed two's-complement integer,&lt;br /&gt;
  // as an 8-bit unsigned integer&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function SignExtendS8ToS32(i: s8): s32&lt;br /&gt;
  // expand `i` from 8 bits to 32 bits&lt;br /&gt;
  // by copying its topmost bit into the top 24 bits&lt;br /&gt;
  // and the bottom 8 bits being the same as the bits of `i`&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function RotateLeftS8(i: s8, by: u8): s8&lt;br /&gt;
  // rotate the 8-bit value `i` left by the number of bits in `by`&lt;br /&gt;
  // (shift the value `i` left by `by` bits,&lt;br /&gt;
  // shifting in the bits on the right that &amp;quot;fall out&amp;quot; on the left)&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function MultiplyS32(factor1: s32, factor2: s32): s32&lt;br /&gt;
  // sign-extend `factor1` and `factor2` each to s64,&lt;br /&gt;
  // multiply them, then take the bottom 32 bits of the product&lt;br /&gt;
  // and return it as s32&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function ModuloU32U8(dividend: u32, divisor: u8): u8&lt;br /&gt;
  // divide `dividend` by `divisor` and return the remainder;&lt;br /&gt;
  // this must be a value 0 ≤ value &amp;amp;lt; divisor&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function DivideS32U8(dividend: s32, divisor: u8): s32&lt;br /&gt;
  // divide `dividend` by `divisor` and return the quotient;&lt;br /&gt;
  // always round toward 0&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function AddS32(summand1: s32, summand2: s32): s32&lt;br /&gt;
  // add `summand1` and `summand2`;&lt;br /&gt;
  // wrap around (drop any carry bits) if addition overflows&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function BitwiseXorS32(operand1: s32, operand2: s32): s32&lt;br /&gt;
  // perform a bitwise exclusive-or operation&lt;br /&gt;
  // on the bits of operand1 and operand2&lt;br /&gt;
  // with no special provisions for the sign bit&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function ReduceS32ToS8(i: s32): s8&lt;br /&gt;
  // remove the topmost 24 bits of `i`,&lt;br /&gt;
  // returning the remaining bits as a signed 8-bit integer;&lt;br /&gt;
  // if the topmost bit of the resulting integer happens to be 1,&lt;br /&gt;
  // the result is negative&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function Decrypt(buf: u8[], key: s32): void&lt;br /&gt;
  if key == 0&lt;br /&gt;
    key := 1&lt;br /&gt;
&lt;br /&gt;
  for i from 0 to buf.length-1&lt;br /&gt;
    a := BitCastU8ToS8(buf[i])&lt;br /&gt;
    b := ModuloU32U8(i, 5)&lt;br /&gt;
    c := RotateLeftS8(a, b)&lt;br /&gt;
    buf[i] := BitCastS8ToU8(c)&lt;br /&gt;
&lt;br /&gt;
    d := MultiplyS32(key, 171)&lt;br /&gt;
    e := DivideS32U8(key, 177)&lt;br /&gt;
    f := MultiplyS32(e, -30269)&lt;br /&gt;
    key := AddS32(d, f)&lt;br /&gt;
&lt;br /&gt;
    g := ReduceS32ToS8(i)&lt;br /&gt;
    h := SignExtendS8ToS32(g)&lt;br /&gt;
    j := AddS32(h, 3)&lt;br /&gt;
    k := MultiplyS32(j, 6)&lt;br /&gt;
    l := BitCastU8ToS8(buf[i])&lt;br /&gt;
    m := SignExtendS8ToS32(l)&lt;br /&gt;
    n := BitwiseXorS32(k, m)&lt;br /&gt;
    o := ReduceS32ToS8(key)&lt;br /&gt;
    p := SignExtendS8ToS32(o)&lt;br /&gt;
    q := AddS32(n, p)&lt;br /&gt;
    r := ReduceS32ToS8(q)&lt;br /&gt;
    buf[i] := BitCastS8ToU8(r)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Remedy Entertainment]]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/Remedy_Archive_System</id>
		<title>Remedy Archive System</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Remedy_Archive_System"/>
				<updated>2025-11-23T18:46:56Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: S/I inconsistency&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|formattype=electronic&lt;br /&gt;
|subcat=Game data files&lt;br /&gt;
|extensions={{ext|ras}}&lt;br /&gt;
|released=2001&lt;br /&gt;
}}&lt;br /&gt;
'''Remedy Archive System''' is used to store game data for Remedy Entertainment games such as Max Payne and Max Payne 2. The metadata (central directory) following the header is encrypted.&lt;br /&gt;
&lt;br /&gt;
== Identification ==&lt;br /&gt;
Files begin with signature bytes {{magic|52 41 53 00}}.&lt;br /&gt;
&lt;br /&gt;
== Format details ==&lt;br /&gt;
&lt;br /&gt;
Numbers are in little-endian byte order.&lt;br /&gt;
&lt;br /&gt;
=== Metadata ===&lt;br /&gt;
&lt;br /&gt;
The file's header has the following structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASHeader {&lt;br /&gt;
  uint8_t magic[4]; // &amp;quot;RAS\0&amp;quot;&lt;br /&gt;
  int32_t encryptionKey;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next section of the header must be decrypted first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASMetadata {&lt;br /&gt;
  uint32_t fileCount;&lt;br /&gt;
  uint32_t dirCount;&lt;br /&gt;
  uint32_t fileListLength;&lt;br /&gt;
  uint32_t dirListLength;&lt;br /&gt;
  float32_t version; // binary32 according to IEEE 754&lt;br /&gt;
  uint32_t unknown5;&lt;br /&gt;
  uint32_t unknown6;&lt;br /&gt;
  uint32_t unknown7;&lt;br /&gt;
  uint32_t compatibility;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following version and compatibility values are known:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
! Compatibility&lt;br /&gt;
! Game&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 3 || Max Payne&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 4 || Max Payne 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
What follows are &amp;lt;code&amp;gt;fileListLength&amp;lt;/code&amp;gt; encrypted bytes of file metadata that can be decrypted using &amp;lt;code&amp;gt;encryptionKey&amp;lt;/code&amp;gt;. (It is not necessary to remember the last value of &amp;lt;code&amp;gt;key&amp;lt;/code&amp;gt; from decrypting &amp;lt;code&amp;gt;RASMetadata&amp;lt;/code&amp;gt;.) Each entry has the following structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASFileListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  uint32_t uncompressedSize;&lt;br /&gt;
  uint32_t compressedSize;&lt;br /&gt;
  uint32_t unknown2;&lt;br /&gt;
  uint32_t dirIndex;&lt;br /&gt;
  uint32_t unknown4;&lt;br /&gt;
  uint32_t compressionMode; // 1 = some form of Lempel-Ziv, 3 = uncompressed&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next is a directory list of &amp;lt;code&amp;gt;dirCount&amp;lt;/code&amp;gt; elements which must be decrypted similarly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASDirListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each directory is listed with its full name which starts and ends with a backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;). The top-most directory is named &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;. A file's &amp;lt;code&amp;gt;dirIndex&amp;lt;/code&amp;gt; is a 0-based index into the directory list.&lt;br /&gt;
&lt;br /&gt;
Timestamps are encoded using the same structure as SYSTEMTIME on Windows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASTimestamp {&lt;br /&gt;
  uint16_t year;&lt;br /&gt;
  uint16_t month;&lt;br /&gt;
  uint16_t dayOfWeek; // 0 = Sunday, 1 = Monday, ..., 6 = Saturday&lt;br /&gt;
  uint16_t day;&lt;br /&gt;
  uint16_t hour;&lt;br /&gt;
  uint16_t minute;&lt;br /&gt;
  uint16_t second;&lt;br /&gt;
  uint16_t millisecond;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data ===&lt;br /&gt;
&lt;br /&gt;
The file data follows directly after the file and directory lists. Each file is stored in turn with no padding; skipping to a specific file requires adding up the &amp;lt;code&amp;gt;compressedSize&amp;lt;/code&amp;gt; members of all files preceding it.&lt;br /&gt;
&lt;br /&gt;
== Encryption ==&lt;br /&gt;
&lt;br /&gt;
Depending on the generation of the RAS file format, different encryption schemes are used.&lt;br /&gt;
&lt;br /&gt;
=== RAS1+2 (Max Payne 1+2) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void decrypt(uint8_t *buf, size_t count, int32_t key) {&lt;br /&gt;
  size_t i;&lt;br /&gt;
&lt;br /&gt;
  if (key == 0) {&lt;br /&gt;
    key = 1;&lt;br /&gt;
  }&lt;br /&gt;
  for (i = 0; i &amp;amp;lt; count; i++) {&lt;br /&gt;
    uint8_t a = buf[i];&lt;br /&gt;
    uint8_t b = ((uint8_t)(i % 5)) &amp;amp; 7;&lt;br /&gt;
    buf[i] = rotateLeftByte(a, b);&lt;br /&gt;
    key = key * 171 + (key / 177) * -30269;&lt;br /&gt;
    buf[i] = (uint8_t)((((((int8_t)i) + 3) * 6) ^ buf[i]) + ((int8_t)key));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your programming language doesn't support the &amp;lt;code&amp;gt;rotateLeftByte&amp;lt;/code&amp;gt; operation, it can be emulated using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint8_t rotateLeftByte(uint8_t a, uint8_t b) {&lt;br /&gt;
  return (uint8_t)((a &amp;amp;lt;&amp;amp;lt; b) | (a &amp;amp;gt;&amp;amp;gt; (8 - b)));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the algorithm relies heavily on signed-integer wraparound and C's integer promotion rules; an operation like &amp;lt;code&amp;gt;((int8_t)i) + 3&amp;lt;/code&amp;gt; will sign-extend the 8-bit value of &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; to 32 bits before adding 3.&lt;br /&gt;
&lt;br /&gt;
A more complete description of the algorithm is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function BitCastU8ToS8(u: u8): s8&lt;br /&gt;
  // reinterpret the bits of `u`, an 8-bit unsigned integer,&lt;br /&gt;
  // as an 8-bit signed two's-complement integer&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function BitCastS8ToU8(i: s8): i8&lt;br /&gt;
  // reinterpret the bits of `i`, an 8-bit signed two's-complement integer,&lt;br /&gt;
  // as an 8-bit unsigned integer&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function SignExtendS8ToS32(i: s8): s32&lt;br /&gt;
  // expand `i` from 8 bits to 32 bits&lt;br /&gt;
  // by copying its topmost bit into the top 24 bits&lt;br /&gt;
  // and the bottom 8 bits being the same as the bits of `i`&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function RotateLeftS8(i: s8, by: u8): s8&lt;br /&gt;
  // rotate the 8-bit value `i` left by the number of bits in `by`&lt;br /&gt;
  // (shift the value `i` left by `by` bits,&lt;br /&gt;
  // shifting in the bits on the right that &amp;quot;fall out&amp;quot; on the left)&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function MultiplyS32(factor1: s32, factor2: s32): s32&lt;br /&gt;
  // sign-extend `factor1` and `factor2` each to s64,&lt;br /&gt;
  // multiply them, then take the bottom 32 bits of the product&lt;br /&gt;
  // and return it as s32&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function ModuloU32U8(dividend: u32, divisor: u8): u8&lt;br /&gt;
  // divide `dividend` by `divisor` and return the remainder;&lt;br /&gt;
  // this must be a value 0 ≤ value &amp;amp;lt; divisor&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function DivideS32U8(dividend: s32, divisor: u8): u8&lt;br /&gt;
  // divide `dividend` by `divisor` and return the quotient;&lt;br /&gt;
  // always round toward 0&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function AddS32(summand1: s32, summand2: s32): s32&lt;br /&gt;
  // add `summand1` and `summand2`;&lt;br /&gt;
  // wrap around (drop any carry bits) if addition overflows&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function BitwiseXorS32(operand1: s32, operand2: s32): s32&lt;br /&gt;
  // perform a bitwise exclusive-or operation&lt;br /&gt;
  // on the bits of operand1 and operand2&lt;br /&gt;
  // with no special provisions for the sign bit&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function ReduceS32ToS8(i: s32): s8&lt;br /&gt;
  // remove the topmost 24 bits of `i`,&lt;br /&gt;
  // returning the remaining bits as a signed 8-bit integer;&lt;br /&gt;
  // if the topmost bit of the resulting integer happens to be 1,&lt;br /&gt;
  // the result is negative&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function Decrypt(buf: u8[], key: s32): void&lt;br /&gt;
  if key == 0&lt;br /&gt;
    key := 1&lt;br /&gt;
&lt;br /&gt;
  for i from 0 to buf.length-1&lt;br /&gt;
    a := BitCastU8ToS8(buf[i])&lt;br /&gt;
    b := ModuloU32U8(i, 5)&lt;br /&gt;
    c := RotateLeftS8(a, b)&lt;br /&gt;
    buf[i] := BitCastS8ToU8(c)&lt;br /&gt;
&lt;br /&gt;
    d := MultiplyS32(key, 171)&lt;br /&gt;
    e := DivideS32U8(key, 177)&lt;br /&gt;
    f := MultiplyS32(e, -30269)&lt;br /&gt;
    key := AddS32(d, f)&lt;br /&gt;
&lt;br /&gt;
    g := ReduceS32ToS8(i)&lt;br /&gt;
    h := SignExtendS8ToS32(g)&lt;br /&gt;
    j := AddS32(h, 3)&lt;br /&gt;
    k := MultiplyS32(j, 6)&lt;br /&gt;
    l := BitCastU8ToS8(buf[i])&lt;br /&gt;
    m := SignExtendS8ToS32(l)&lt;br /&gt;
    n := BitwiseXorS32(k, m)&lt;br /&gt;
    o := ReduceS32ToS8(key)&lt;br /&gt;
    p := SignExtendS8ToS32(o)&lt;br /&gt;
    q := AddS32(n, p)&lt;br /&gt;
    r := ReduceS32ToS8(q)&lt;br /&gt;
    buf[i] := BitCastS8ToU8(r)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Remedy Entertainment]]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/Remedy_Archive_System</id>
		<title>Remedy Archive System</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Remedy_Archive_System"/>
				<updated>2025-11-23T18:41:14Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: /* RAS1+2 (Max Payne 1+2) */ precise description of the algorithm&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|formattype=electronic&lt;br /&gt;
|subcat=Game data files&lt;br /&gt;
|extensions={{ext|ras}}&lt;br /&gt;
|released=2001&lt;br /&gt;
}}&lt;br /&gt;
'''Remedy Archive System''' is used to store game data for Remedy Entertainment games such as Max Payne and Max Payne 2. The metadata (central directory) following the header is encrypted.&lt;br /&gt;
&lt;br /&gt;
== Identification ==&lt;br /&gt;
Files begin with signature bytes {{magic|52 41 53 00}}.&lt;br /&gt;
&lt;br /&gt;
== Format details ==&lt;br /&gt;
&lt;br /&gt;
Numbers are in little-endian byte order.&lt;br /&gt;
&lt;br /&gt;
=== Metadata ===&lt;br /&gt;
&lt;br /&gt;
The file's header has the following structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASHeader {&lt;br /&gt;
  uint8_t magic[4]; // &amp;quot;RAS\0&amp;quot;&lt;br /&gt;
  int32_t encryptionKey;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next section of the header must be decrypted first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASMetadata {&lt;br /&gt;
  uint32_t fileCount;&lt;br /&gt;
  uint32_t dirCount;&lt;br /&gt;
  uint32_t fileListLength;&lt;br /&gt;
  uint32_t dirListLength;&lt;br /&gt;
  float32_t version; // binary32 according to IEEE 754&lt;br /&gt;
  uint32_t unknown5;&lt;br /&gt;
  uint32_t unknown6;&lt;br /&gt;
  uint32_t unknown7;&lt;br /&gt;
  uint32_t compatibility;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following version and compatibility values are known:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
! Compatibility&lt;br /&gt;
! Game&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 3 || Max Payne&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 4 || Max Payne 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
What follows are &amp;lt;code&amp;gt;fileListLength&amp;lt;/code&amp;gt; encrypted bytes of file metadata that can be decrypted using &amp;lt;code&amp;gt;encryptionKey&amp;lt;/code&amp;gt;. (It is not necessary to remember the last value of &amp;lt;code&amp;gt;key&amp;lt;/code&amp;gt; from decrypting &amp;lt;code&amp;gt;RASMetadata&amp;lt;/code&amp;gt;.) Each entry has the following structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASFileListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  uint32_t uncompressedSize;&lt;br /&gt;
  uint32_t compressedSize;&lt;br /&gt;
  uint32_t unknown2;&lt;br /&gt;
  uint32_t dirIndex;&lt;br /&gt;
  uint32_t unknown4;&lt;br /&gt;
  uint32_t compressionMode; // 1 = some form of Lempel-Ziv, 3 = uncompressed&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next is a directory list of &amp;lt;code&amp;gt;dirCount&amp;lt;/code&amp;gt; elements which must be decrypted similarly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASDirListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each directory is listed with its full name which starts and ends with a backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;). The top-most directory is named &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;. A file's &amp;lt;code&amp;gt;dirIndex&amp;lt;/code&amp;gt; is a 0-based index into the directory list.&lt;br /&gt;
&lt;br /&gt;
Timestamps are encoded using the same structure as SYSTEMTIME on Windows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASTimestamp {&lt;br /&gt;
  uint16_t year;&lt;br /&gt;
  uint16_t month;&lt;br /&gt;
  uint16_t dayOfWeek; // 0 = Sunday, 1 = Monday, ..., 6 = Saturday&lt;br /&gt;
  uint16_t day;&lt;br /&gt;
  uint16_t hour;&lt;br /&gt;
  uint16_t minute;&lt;br /&gt;
  uint16_t second;&lt;br /&gt;
  uint16_t millisecond;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data ===&lt;br /&gt;
&lt;br /&gt;
The file data follows directly after the file and directory lists. Each file is stored in turn with no padding; skipping to a specific file requires adding up the &amp;lt;code&amp;gt;compressedSize&amp;lt;/code&amp;gt; members of all files preceding it.&lt;br /&gt;
&lt;br /&gt;
== Encryption ==&lt;br /&gt;
&lt;br /&gt;
Depending on the generation of the RAS file format, different encryption schemes are used.&lt;br /&gt;
&lt;br /&gt;
=== RAS1+2 (Max Payne 1+2) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void decrypt(uint8_t *buf, size_t count, int32_t key) {&lt;br /&gt;
  size_t i;&lt;br /&gt;
&lt;br /&gt;
  if (key == 0) {&lt;br /&gt;
    key = 1;&lt;br /&gt;
  }&lt;br /&gt;
  for (i = 0; i &amp;amp;lt; count; i++) {&lt;br /&gt;
    uint8_t a = buf[i];&lt;br /&gt;
    uint8_t b = ((uint8_t)(i % 5)) &amp;amp; 7;&lt;br /&gt;
    buf[i] = rotateLeftByte(a, b);&lt;br /&gt;
    key = key * 171 + (key / 177) * -30269;&lt;br /&gt;
    buf[i] = (uint8_t)((((((int8_t)i) + 3) * 6) ^ buf[i]) + ((int8_t)key));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your programming language doesn't support the &amp;lt;code&amp;gt;rotateLeftByte&amp;lt;/code&amp;gt; operation, it can be emulated using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint8_t rotateLeftByte(uint8_t a, uint8_t b) {&lt;br /&gt;
  return (uint8_t)((a &amp;amp;lt;&amp;amp;lt; b) | (a &amp;amp;gt;&amp;amp;gt; (8 - b)));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the algorithm relies heavily on signed-integer wraparound and C's integer promotion rules; an operation like &amp;lt;code&amp;gt;((int8_t)i) + 3&amp;lt;/code&amp;gt; will sign-extend the 8-bit value of &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; to 32 bits before adding 3.&lt;br /&gt;
&lt;br /&gt;
A more complete description of the algorithm is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function BitCastU8ToS8(u: u8): s8&lt;br /&gt;
  // reinterpret the bits of `u`, an 8-bit unsigned integer,&lt;br /&gt;
  // as an 8-bit signed two's-complement integer&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function BitCastS8ToU8(i: s8): i8&lt;br /&gt;
  // reinterpret the bits of `i`, an 8-bit signed two's-complement integer,&lt;br /&gt;
  // as an 8-bit unsigned integer&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function SignExtendS8ToS32(i: s8): s32&lt;br /&gt;
  // expand `i` from 8 bits to 32 bits&lt;br /&gt;
  // by copying its topmost bit into the top 24 bits&lt;br /&gt;
  // and the bottom 8 bits being the same as the bits of `i`&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function RotateLeftI8(i: s8, by: u8): s8&lt;br /&gt;
  // rotate the 8-bit value `i` left by the number of bits in `by`&lt;br /&gt;
  // (shift the value `i` left by `by` bits,&lt;br /&gt;
  // shifting in the bits on the right that &amp;quot;fall out&amp;quot; on the left)&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function MultiplyS32(factor1: s32, factor2: s32): s32&lt;br /&gt;
  // sign-extend `factor1` and `factor2` each to s64,&lt;br /&gt;
  // multiply them, then take the bottom 32 bits of the product&lt;br /&gt;
  // and return it as s32&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function ModuloU32U8(dividend: u32, divisor: u8): u8&lt;br /&gt;
  // divide `dividend` by `divisor` and return the remainder;&lt;br /&gt;
  // this must be a value 0 ≤ value &amp;amp;lt; divisor&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function DivideS32U8(dividend: s32, divisor: u8): u8&lt;br /&gt;
  // divide `dividend` by `divisor` and return the quotient;&lt;br /&gt;
  // always round toward 0&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function AddS32(summand1: s32, summand2: s32): s32&lt;br /&gt;
  // add `summand1` and `summand2`;&lt;br /&gt;
  // wrap around (drop any carry bits) if addition overflows&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function BitwiseXorS32(operand1: s32, operand2: s32): s32&lt;br /&gt;
  // perform a bitwise exclusive-or operation&lt;br /&gt;
  // on the bits of operand1 and operand2&lt;br /&gt;
  // with no special provisions for the sign bit&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function ReduceS32ToS8(i: s32): s8&lt;br /&gt;
  // remove the topmost 24 bits of `i`,&lt;br /&gt;
  // returning the remaining bits as a signed 8-bit integer;&lt;br /&gt;
  // if the topmost bit of the resulting integer happens to be 1,&lt;br /&gt;
  // the result is negative&lt;br /&gt;
  return ...&lt;br /&gt;
&lt;br /&gt;
function Decrypt(buf: u8[], key: s32): void&lt;br /&gt;
  if key == 0&lt;br /&gt;
    key := 1&lt;br /&gt;
&lt;br /&gt;
  for i from 0 to buf.length-1&lt;br /&gt;
    a := BitCastU8ToS8(buf[i])&lt;br /&gt;
    b := ModuloU32U8(i, 5)&lt;br /&gt;
    c := RotateLeftI8(a, b)&lt;br /&gt;
    buf[i] := BitCastS8ToU8(c)&lt;br /&gt;
&lt;br /&gt;
    d := MultiplyS32(key, 171)&lt;br /&gt;
    e := DivideS32U8(key, 177)&lt;br /&gt;
    f := MultiplyS32(e, -30269)&lt;br /&gt;
    key := AddS32(d, f)&lt;br /&gt;
&lt;br /&gt;
    g := ReduceS32ToS8(i)&lt;br /&gt;
    h := SignExtendS8ToS32(g)&lt;br /&gt;
    j := AddS32(h, 3)&lt;br /&gt;
    k := MultiplyS32(j, 6)&lt;br /&gt;
    l := BitCastU8ToS8(buf[i])&lt;br /&gt;
    m := SignExtendS8ToS32(l)&lt;br /&gt;
    n := BitwiseXorS32(k, m)&lt;br /&gt;
    o := ReduceS32ToS8(key)&lt;br /&gt;
    p := SignExtendS8ToS32(o)&lt;br /&gt;
    q := AddS32(n, p)&lt;br /&gt;
    r := ReduceS32ToS8(q)&lt;br /&gt;
    buf[i] := BitCastS8ToU8(r)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Remedy Entertainment]]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/MIDI</id>
		<title>MIDI</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/MIDI"/>
				<updated>2025-11-23T17:58:39Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: /* Alternative formats */ add RIFF MIDS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|subcat=Audio and Music&lt;br /&gt;
|extensions={{ext|mid}}, {{ext|midi}}&lt;br /&gt;
|mimetypes={{mimetype|audio/midi}}&amp;lt;br&amp;gt;{{mimetype|audio/mid}}&amp;lt;br&amp;gt;{{mimetype|audio/x-midi}}&amp;lt;br&amp;gt;{{mimetype|audio/m}}&amp;lt;br&amp;gt;{{mimetype|application/x-midi}}&lt;br /&gt;
|locfdd={{LoCFDD|fdd000102}}&amp;lt;br&amp;gt;{{LoCFDD|fdd000119}}&lt;br /&gt;
|pronom={{PRONOM|x-fmt/230}}&lt;br /&gt;
|wikidata={{wikidata|Q80535}}&lt;br /&gt;
|kaitai struct=standard_midi_file&lt;br /&gt;
}}&lt;br /&gt;
'''Musical Instrument Digital Interface''' ('''MIDI''') is an industry specification that permits digital musical instruments, computers and other related devices to connect and communicate with one another. The MIDI Specification was published in August 1983, and is widely used in electronic music.&lt;br /&gt;
&lt;br /&gt;
For many, the name &amp;quot;MIDI&amp;quot; is associated with music synthesized with cheesy, lifeless software instruments from the 90's. There is considerable confusion resulting in the conflation of several things:&lt;br /&gt;
&lt;br /&gt;
* The core MIDI protocol, which is a real-time messaging format that encodes musical events such as note on/note off, velocity, tempo, controls, etc.&lt;br /&gt;
* The '''General MIDI''' sub-specification of MIDI, which associates MIDI program numbers with a specific bank of 175 instruments such as oboes, pianos, drums, and so forth.&lt;br /&gt;
* The MIDI file format, officially '''SMF''' (Standard MIDI Format), which is simply a score of timed MIDI messages. MIDI files may or may not be intended for interpretation as General MIDI.&lt;br /&gt;
* The synthesis methods used to realize MIDI and/or General MIDI as audio, which run the whole spectrum from cheesy to non-cheesy.&lt;br /&gt;
&lt;br /&gt;
Back in the day, high-quality audio files were a bit large to send over the Internet, so nerds would listen to MIDI file renditions instead. Since MIDI itself does not specify how program numbers map to instruments, General MIDI ensures that the Third Eye Blind song you send to your buddy over AOL will not inexplicably have bagpipes in it. Nowadays, MIDI files are used primarily as a storage and interchange format for music producers rather than an consumers. In music production, the synthesizer associated with a given MIDI channel is generally known ''a priori'', so the interopability of General MIDI is less useful. The ghost of bad General MIDI synthesizers nevertheless persists in the public view of MIDI.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Black MIDI&amp;quot; is a style of MIDI music that has notes so densely placed that a graphical rendition has large patches of solid black.&lt;br /&gt;
&lt;br /&gt;
== Sound Fonts ==&lt;br /&gt;
Originally created and used by Emu and Creative Labs software and equipment, [[SoundFont_1.0|sound fonts]] are instrument description extensions, or voice files, used, usually, for a cleaner high quality sound. Sound fonts are available from and for: Roland, Yamaha, Allen Organ, and Wurlitzer, among others.&lt;br /&gt;
&lt;br /&gt;
== Alternative formats ==&lt;br /&gt;
As well as the standard MIDI specification, a number of (often proprietary) MIDI clones and variants have been created over the years. These include:&lt;br /&gt;
&lt;br /&gt;
* [[Compact MIDI]]&lt;br /&gt;
* [[GMD]]&lt;br /&gt;
* [[HMI]]&lt;br /&gt;
* [[HMP]]&lt;br /&gt;
* [[HMZ]]&lt;br /&gt;
* [[KAR]]&lt;br /&gt;
* [[MIDS]]&lt;br /&gt;
* [[MIZ]]&lt;br /&gt;
* [[MSS (MIDI)|MSS]]&lt;br /&gt;
* [[RIFF MIDI]]&lt;br /&gt;
* [[RIFF MIDS]]&lt;br /&gt;
* [[Scalable Polyphony MIDI]]&lt;br /&gt;
* [[Synthetic Music Application Format]]&lt;br /&gt;
* [[Doom MUS]]&lt;br /&gt;
&lt;br /&gt;
== Sample files ==&lt;br /&gt;
* {{DexvertSamples|music/mid}}&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [[Wikipedia:MIDI]]&lt;br /&gt;
* [http://localhostr.com/file/LJUEw0K/midiformat.pdf Standard MIDI-File Format Spec. 1.1]&lt;br /&gt;
* [http://www.midi.org/techspecs/midispec.php The Complete MIDI 1.0 Detailed Specification] Available for purchase from MMA (MIDI Manufacturers Association)&lt;br /&gt;
* [http://www.blitter.com/~russtopia/MIDI/~jglatt/tech/midispec.htm The MIDI Specification] Not the official specification, but an adaptation.&lt;br /&gt;
* [http://www.digitalpreservation.gov/formats/fdd/fdd000102.shtml MIDI Sequence Data, from Library of Congress resource on Sustainability of Digital Formats]&lt;br /&gt;
* [http://www.digitalpreservation.gov/formats/fdd/fdd000119.shtml Standard MIDI File Format, from Library of Congress resource on Sustainability of Digital Formats]&lt;br /&gt;
* [ftp://ftp.modland.com/pub/documents/format_documentation/MIDI%20(General%20MIDI%20Level%201%20Spec)%20(.mid).txt Brief Overview of Proposed General MIDI Level 1 Spec]&lt;br /&gt;
* [ftp://ftp.modland.com/pub/documents/format_documentation/MIDI%20(Sample%20Dump%20Standard)%20(.mid).txt MIDI Sample Dump Standard]&lt;br /&gt;
* [ftp://ftp.modland.com/pub/documents/format_documentation/MIDI%20(The%20Usenet%20MIDI%20Primer)%20(.mid).txt The USENET MIDI Primer]&lt;br /&gt;
* [https://www.techdirt.com/blog/innovation/articles/20130412/09091522689/heres-another-inventor-who-willingly-gave-his-greatest-idea-away-order-to-establish-it-as-global-standard.shtml Inventor of MIDI willingly gave idea away to establish it as a standard]&lt;br /&gt;
* [http://rhizome.org/editorial/2013/sep/23/impossible-music-black-midi/ The impossible music of black MIDI]&lt;br /&gt;
* [https://www.youtube.com/watch?v=FqjSYtKWyX8 Black MIDI songs will kill your brain and your computer]&lt;br /&gt;
* [https://midimusic.github.io/tech/midispec.html Standard MIDI-File Format Spec. 1.1]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/MIDI</id>
		<title>MIDI</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/MIDI"/>
				<updated>2025-11-23T17:57:32Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: reunite alternative format list with its section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|subcat=Audio and Music&lt;br /&gt;
|extensions={{ext|mid}}, {{ext|midi}}&lt;br /&gt;
|mimetypes={{mimetype|audio/midi}}&amp;lt;br&amp;gt;{{mimetype|audio/mid}}&amp;lt;br&amp;gt;{{mimetype|audio/x-midi}}&amp;lt;br&amp;gt;{{mimetype|audio/m}}&amp;lt;br&amp;gt;{{mimetype|application/x-midi}}&lt;br /&gt;
|locfdd={{LoCFDD|fdd000102}}&amp;lt;br&amp;gt;{{LoCFDD|fdd000119}}&lt;br /&gt;
|pronom={{PRONOM|x-fmt/230}}&lt;br /&gt;
|wikidata={{wikidata|Q80535}}&lt;br /&gt;
|kaitai struct=standard_midi_file&lt;br /&gt;
}}&lt;br /&gt;
'''Musical Instrument Digital Interface''' ('''MIDI''') is an industry specification that permits digital musical instruments, computers and other related devices to connect and communicate with one another. The MIDI Specification was published in August 1983, and is widely used in electronic music.&lt;br /&gt;
&lt;br /&gt;
For many, the name &amp;quot;MIDI&amp;quot; is associated with music synthesized with cheesy, lifeless software instruments from the 90's. There is considerable confusion resulting in the conflation of several things:&lt;br /&gt;
&lt;br /&gt;
* The core MIDI protocol, which is a real-time messaging format that encodes musical events such as note on/note off, velocity, tempo, controls, etc.&lt;br /&gt;
* The '''General MIDI''' sub-specification of MIDI, which associates MIDI program numbers with a specific bank of 175 instruments such as oboes, pianos, drums, and so forth.&lt;br /&gt;
* The MIDI file format, officially '''SMF''' (Standard MIDI Format), which is simply a score of timed MIDI messages. MIDI files may or may not be intended for interpretation as General MIDI.&lt;br /&gt;
* The synthesis methods used to realize MIDI and/or General MIDI as audio, which run the whole spectrum from cheesy to non-cheesy.&lt;br /&gt;
&lt;br /&gt;
Back in the day, high-quality audio files were a bit large to send over the Internet, so nerds would listen to MIDI file renditions instead. Since MIDI itself does not specify how program numbers map to instruments, General MIDI ensures that the Third Eye Blind song you send to your buddy over AOL will not inexplicably have bagpipes in it. Nowadays, MIDI files are used primarily as a storage and interchange format for music producers rather than an consumers. In music production, the synthesizer associated with a given MIDI channel is generally known ''a priori'', so the interopability of General MIDI is less useful. The ghost of bad General MIDI synthesizers nevertheless persists in the public view of MIDI.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Black MIDI&amp;quot; is a style of MIDI music that has notes so densely placed that a graphical rendition has large patches of solid black.&lt;br /&gt;
&lt;br /&gt;
== Sound Fonts ==&lt;br /&gt;
Originally created and used by Emu and Creative Labs software and equipment, [[SoundFont_1.0|sound fonts]] are instrument description extensions, or voice files, used, usually, for a cleaner high quality sound. Sound fonts are available from and for: Roland, Yamaha, Allen Organ, and Wurlitzer, among others.&lt;br /&gt;
&lt;br /&gt;
== Alternative formats ==&lt;br /&gt;
As well as the standard MIDI specification, a number of (often proprietary) MIDI clones and variants have been created over the years. These include:&lt;br /&gt;
&lt;br /&gt;
* [[Compact MIDI]]&lt;br /&gt;
* [[GMD]]&lt;br /&gt;
* [[HMI]]&lt;br /&gt;
* [[HMP]]&lt;br /&gt;
* [[HMZ]]&lt;br /&gt;
* [[KAR]]&lt;br /&gt;
* [[MIDS]]&lt;br /&gt;
* [[MIZ]]&lt;br /&gt;
* [[MSS (MIDI)|MSS]]&lt;br /&gt;
* [[RIFF MIDI]]&lt;br /&gt;
* [[Scalable Polyphony MIDI]]&lt;br /&gt;
* [[Synthetic Music Application Format]]&lt;br /&gt;
* [[Doom MUS]]&lt;br /&gt;
&lt;br /&gt;
== Sample files ==&lt;br /&gt;
* {{DexvertSamples|music/mid}}&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [[Wikipedia:MIDI]]&lt;br /&gt;
* [http://localhostr.com/file/LJUEw0K/midiformat.pdf Standard MIDI-File Format Spec. 1.1]&lt;br /&gt;
* [http://www.midi.org/techspecs/midispec.php The Complete MIDI 1.0 Detailed Specification] Available for purchase from MMA (MIDI Manufacturers Association)&lt;br /&gt;
* [http://www.blitter.com/~russtopia/MIDI/~jglatt/tech/midispec.htm The MIDI Specification] Not the official specification, but an adaptation.&lt;br /&gt;
* [http://www.digitalpreservation.gov/formats/fdd/fdd000102.shtml MIDI Sequence Data, from Library of Congress resource on Sustainability of Digital Formats]&lt;br /&gt;
* [http://www.digitalpreservation.gov/formats/fdd/fdd000119.shtml Standard MIDI File Format, from Library of Congress resource on Sustainability of Digital Formats]&lt;br /&gt;
* [ftp://ftp.modland.com/pub/documents/format_documentation/MIDI%20(General%20MIDI%20Level%201%20Spec)%20(.mid).txt Brief Overview of Proposed General MIDI Level 1 Spec]&lt;br /&gt;
* [ftp://ftp.modland.com/pub/documents/format_documentation/MIDI%20(Sample%20Dump%20Standard)%20(.mid).txt MIDI Sample Dump Standard]&lt;br /&gt;
* [ftp://ftp.modland.com/pub/documents/format_documentation/MIDI%20(The%20Usenet%20MIDI%20Primer)%20(.mid).txt The USENET MIDI Primer]&lt;br /&gt;
* [https://www.techdirt.com/blog/innovation/articles/20130412/09091522689/heres-another-inventor-who-willingly-gave-his-greatest-idea-away-order-to-establish-it-as-global-standard.shtml Inventor of MIDI willingly gave idea away to establish it as a standard]&lt;br /&gt;
* [http://rhizome.org/editorial/2013/sep/23/impossible-music-black-midi/ The impossible music of black MIDI]&lt;br /&gt;
* [https://www.youtube.com/watch?v=FqjSYtKWyX8 Black MIDI songs will kill your brain and your computer]&lt;br /&gt;
* [https://midimusic.github.io/tech/midispec.html Standard MIDI-File Format Spec. 1.1]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/Remedy_Archive_System</id>
		<title>Remedy Archive System</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Remedy_Archive_System"/>
				<updated>2025-11-22T15:47:03Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|formattype=electronic&lt;br /&gt;
|subcat=Game data files&lt;br /&gt;
|extensions={{ext|ras}}&lt;br /&gt;
|released=2001&lt;br /&gt;
}}&lt;br /&gt;
'''Remedy Archive System''' is used to store game data for Remedy Entertainment games such as Max Payne and Max Payne 2. The metadata (central directory) following the header is encrypted.&lt;br /&gt;
&lt;br /&gt;
== Identification ==&lt;br /&gt;
Files begin with signature bytes {{magic|52 41 53 00}}.&lt;br /&gt;
&lt;br /&gt;
== Format details ==&lt;br /&gt;
&lt;br /&gt;
Numbers are in little-endian byte order.&lt;br /&gt;
&lt;br /&gt;
=== Metadata ===&lt;br /&gt;
&lt;br /&gt;
The file's header has the following structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASHeader {&lt;br /&gt;
  uint8_t magic[4]; // &amp;quot;RAS\0&amp;quot;&lt;br /&gt;
  int32_t encryptionKey;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next section of the header must be decrypted first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASMetadata {&lt;br /&gt;
  uint32_t fileCount;&lt;br /&gt;
  uint32_t dirCount;&lt;br /&gt;
  uint32_t fileListLength;&lt;br /&gt;
  uint32_t dirListLength;&lt;br /&gt;
  float32_t version; // binary32 according to IEEE 754&lt;br /&gt;
  uint32_t unknown5;&lt;br /&gt;
  uint32_t unknown6;&lt;br /&gt;
  uint32_t unknown7;&lt;br /&gt;
  uint32_t compatibility;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following version and compatibility values are known:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
! Compatibility&lt;br /&gt;
! Game&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 3 || Max Payne&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 4 || Max Payne 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
What follows are &amp;lt;code&amp;gt;fileListLength&amp;lt;/code&amp;gt; encrypted bytes of file metadata that can be decrypted using &amp;lt;code&amp;gt;encryptionKey&amp;lt;/code&amp;gt;. (It is not necessary to remember the last value of &amp;lt;code&amp;gt;key&amp;lt;/code&amp;gt; from decrypting &amp;lt;code&amp;gt;RASMetadata&amp;lt;/code&amp;gt;.) Each entry has the following structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASFileListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  uint32_t uncompressedSize;&lt;br /&gt;
  uint32_t compressedSize;&lt;br /&gt;
  uint32_t unknown2;&lt;br /&gt;
  uint32_t dirIndex;&lt;br /&gt;
  uint32_t unknown4;&lt;br /&gt;
  uint32_t compressionMode; // 1 = some form of Lempel-Ziv, 3 = uncompressed&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next is a directory list of &amp;lt;code&amp;gt;dirCount&amp;lt;/code&amp;gt; elements which must be decrypted similarly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASDirListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each directory is listed with its full name which starts and ends with a backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;). The top-most directory is named &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;. A file's &amp;lt;code&amp;gt;dirIndex&amp;lt;/code&amp;gt; is a 0-based index into the directory list.&lt;br /&gt;
&lt;br /&gt;
Timestamps are encoded using the same structure as SYSTEMTIME on Windows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASTimestamp {&lt;br /&gt;
  uint16_t year;&lt;br /&gt;
  uint16_t month;&lt;br /&gt;
  uint16_t dayOfWeek; // 0 = Sunday, 1 = Monday, ..., 6 = Saturday&lt;br /&gt;
  uint16_t day;&lt;br /&gt;
  uint16_t hour;&lt;br /&gt;
  uint16_t minute;&lt;br /&gt;
  uint16_t second;&lt;br /&gt;
  uint16_t millisecond;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data ===&lt;br /&gt;
&lt;br /&gt;
The file data follows directly after the file and directory lists. Each file is stored in turn with no padding; skipping to a specific file requires adding up the &amp;lt;code&amp;gt;compressedSize&amp;lt;/code&amp;gt; members of all files preceding it.&lt;br /&gt;
&lt;br /&gt;
== Encryption ==&lt;br /&gt;
&lt;br /&gt;
Depending on the generation of the RAS file format, different encryption schemes are used.&lt;br /&gt;
&lt;br /&gt;
=== RAS1+2 (Max Payne 1+2) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void decrypt(uint8_t *buf, size_t count, int32_t key) {&lt;br /&gt;
  size_t i;&lt;br /&gt;
&lt;br /&gt;
  if (key == 0) {&lt;br /&gt;
    key = 1;&lt;br /&gt;
  }&lt;br /&gt;
  for (i = 0; i &amp;amp;lt; count; i++) {&lt;br /&gt;
    uint8_t a = buf[i];&lt;br /&gt;
    uint8_t b = ((uint8_t)(i % 5)) &amp;amp; 7;&lt;br /&gt;
    buf[i] = rotateLeftByte(a, b);&lt;br /&gt;
    key = key * 171 + (key / 177) * -30269;&lt;br /&gt;
    buf[i] = (uint8_t)((((((int8_t)i) + 3) * 6) ^ buf[i]) + ((int8_t)key));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your programming language doesn't support the &amp;lt;code&amp;gt;rotateLeftByte&amp;lt;/code&amp;gt; operation, it can be emulated using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint8_t rotateLeftByte(uint8_t a, uint8_t b) {&lt;br /&gt;
  return (uint8_t)((a &amp;amp;lt;&amp;amp;lt; b) | (a &amp;amp;gt;&amp;amp;gt; (8 - b)));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the algorithm relies heavily on signed-integer wraparound and C's integer promotion rules; an operation like &amp;lt;code&amp;gt;((int8_t)i) + 3&amp;lt;/code&amp;gt; will sign-extend the 8-bit value of &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; to 32 bits before adding 3.&lt;br /&gt;
&lt;br /&gt;
[[Category:Remedy Entertainment]]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/Remedy_Archive_System</id>
		<title>Remedy Archive System</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Remedy_Archive_System"/>
				<updated>2025-11-22T15:36:08Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: table row&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|formattype=electronic&lt;br /&gt;
|subcat=Game data files&lt;br /&gt;
|extensions={{ext|ras}}&lt;br /&gt;
|released=2001&lt;br /&gt;
}}&lt;br /&gt;
'''Remedy Archive System''' is used to store game data for Remedy Entertainment games such as Max Payne and Max Payne 2. The metadata (central directory) following the header is encrypted.&lt;br /&gt;
&lt;br /&gt;
== Identification ==&lt;br /&gt;
Files begin with signature bytes {{magic|52 41 53 00}}.&lt;br /&gt;
&lt;br /&gt;
== Format details ==&lt;br /&gt;
&lt;br /&gt;
Numbers are in little-endian byte order.&lt;br /&gt;
&lt;br /&gt;
=== Metadata ===&lt;br /&gt;
&lt;br /&gt;
The file's header has the following structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASHeader {&lt;br /&gt;
  uint8_t magic[4]; // &amp;quot;RAS\0&amp;quot;&lt;br /&gt;
  uint32_t encryptionKey;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next section of the header must be decrypted first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASMetadata {&lt;br /&gt;
  uint32_t fileCount;&lt;br /&gt;
  uint32_t dirCount;&lt;br /&gt;
  uint32_t fileListLength;&lt;br /&gt;
  uint32_t dirListLength;&lt;br /&gt;
  float32_t version; // binary32 according to IEEE 754&lt;br /&gt;
  uint32_t unknown5;&lt;br /&gt;
  uint32_t unknown6;&lt;br /&gt;
  uint32_t unknown7;&lt;br /&gt;
  uint32_t compatibility;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following version and compatibility values are known:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
! Compatibility&lt;br /&gt;
! Game&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 3 || Max Payne&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 4 || Max Payne 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
What follows are &amp;lt;code&amp;gt;fileListLength&amp;lt;/code&amp;gt; encrypted bytes of file metadata that can be decrypted using &amp;lt;code&amp;gt;encryptionKey&amp;lt;/code&amp;gt;. (It is not necessary to remember the last value of &amp;lt;code&amp;gt;key&amp;lt;/code&amp;gt; from decrypting &amp;lt;code&amp;gt;RASMetadata&amp;lt;/code&amp;gt;.) Each entry has the following structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASFileListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  uint32_t uncompressedSize;&lt;br /&gt;
  uint32_t compressedSize;&lt;br /&gt;
  uint32_t unknown2;&lt;br /&gt;
  uint32_t dirIndex;&lt;br /&gt;
  uint32_t unknown4;&lt;br /&gt;
  uint32_t compressionMode; // 1 = some form of Lempel-Ziv, 3 = uncompressed&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next is a directory list of &amp;lt;code&amp;gt;dirCount&amp;lt;/code&amp;gt; elements which must be decrypted similarly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASDirListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each directory is listed with its full name which starts and ends with a backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;). The top-most directory is named &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;. A file's &amp;lt;code&amp;gt;dirIndex&amp;lt;/code&amp;gt; is a 0-based index into the directory list.&lt;br /&gt;
&lt;br /&gt;
Timestamps are encoded using the same structure as SYSTEMTIME on Windows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASTimestamp {&lt;br /&gt;
  uint16_t year;&lt;br /&gt;
  uint16_t month;&lt;br /&gt;
  uint16_t dayOfWeek; // 0 = Sunday, 1 = Monday, ..., 6 = Saturday&lt;br /&gt;
  uint16_t day;&lt;br /&gt;
  uint16_t hour;&lt;br /&gt;
  uint16_t minute;&lt;br /&gt;
  uint16_t second;&lt;br /&gt;
  uint16_t millisecond;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data ===&lt;br /&gt;
&lt;br /&gt;
The file data follows directly after the file and directory lists. Each file is stored in turn with no padding; skipping to a specific file requires adding up the &amp;lt;code&amp;gt;compressedSize&amp;lt;/code&amp;gt; members of all files preceding it.&lt;br /&gt;
&lt;br /&gt;
== Encryption ==&lt;br /&gt;
&lt;br /&gt;
Depending on the generation of the RAS file format, different encryption schemes are used.&lt;br /&gt;
&lt;br /&gt;
=== RAS1+2 (Max Payne 1+2) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void decrypt(uint8_t *buf, size_t count, int32_t key) {&lt;br /&gt;
  size_t i;&lt;br /&gt;
&lt;br /&gt;
  if (key == 0) {&lt;br /&gt;
    key = 1;&lt;br /&gt;
  }&lt;br /&gt;
  for (i = 0; i &amp;amp;lt; count; i++) {&lt;br /&gt;
    uint8_t a = buf[i];&lt;br /&gt;
    uint8_t b = ((uint8_t)(i % 5)) &amp;amp; 7;&lt;br /&gt;
    buf[i] = rotateLeftByte(a, b);&lt;br /&gt;
    key = key * 171 + (key / 177) * -30269;&lt;br /&gt;
    buf[i] = (uint8_t)((((((int8_t)i) + 3) * 6) ^ buf[i]) + ((int8_t)key));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your programming language doesn't support the &amp;lt;code&amp;gt;rotateLeftByte&amp;lt;/code&amp;gt; operation, it can be emulated using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint8_t rotateLeftByte(uint8_t a, uint8_t b) {&lt;br /&gt;
  return (uint8_t)((a &amp;amp;lt;&amp;amp;lt; b) | (a &amp;amp;gt;&amp;amp;gt; (8 - b)));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Remedy Entertainment]]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/Remedy_Archive_System</id>
		<title>Remedy Archive System</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Remedy_Archive_System"/>
				<updated>2025-11-22T15:32:43Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: MP2 uses the same decryption method&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|formattype=electronic&lt;br /&gt;
|subcat=Game data files&lt;br /&gt;
|extensions={{ext|ras}}&lt;br /&gt;
|released=2001&lt;br /&gt;
}}&lt;br /&gt;
'''Remedy Archive System''' is used to store game data for Remedy Entertainment games such as Max Payne and Max Payne 2. The metadata (central directory) following the header is encrypted.&lt;br /&gt;
&lt;br /&gt;
== Identification ==&lt;br /&gt;
Files begin with signature bytes {{magic|52 41 53 00}}.&lt;br /&gt;
&lt;br /&gt;
== Format details ==&lt;br /&gt;
&lt;br /&gt;
Numbers are in little-endian byte order.&lt;br /&gt;
&lt;br /&gt;
=== Metadata ===&lt;br /&gt;
&lt;br /&gt;
The file's header has the following structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASHeader {&lt;br /&gt;
  uint8_t magic[4]; // &amp;quot;RAS\0&amp;quot;&lt;br /&gt;
  uint32_t encryptionKey;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next section of the header must be decrypted first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASMetadata {&lt;br /&gt;
  uint32_t fileCount;&lt;br /&gt;
  uint32_t dirCount;&lt;br /&gt;
  uint32_t fileListLength;&lt;br /&gt;
  uint32_t dirListLength;&lt;br /&gt;
  float32_t version; // binary32 according to IEEE 754&lt;br /&gt;
  uint32_t unknown5;&lt;br /&gt;
  uint32_t unknown6;&lt;br /&gt;
  uint32_t unknown7;&lt;br /&gt;
  uint32_t compatibility;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following version and compatibility values are known:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
! Compatibility&lt;br /&gt;
! Game&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 3 || Max Payne&lt;br /&gt;
|| 1.2 || 4 || Max Payne 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
What follows are &amp;lt;code&amp;gt;fileListLength&amp;lt;/code&amp;gt; encrypted bytes of file metadata that can be decrypted using &amp;lt;code&amp;gt;encryptionKey&amp;lt;/code&amp;gt;. (It is not necessary to remember the last value of &amp;lt;code&amp;gt;key&amp;lt;/code&amp;gt; from decrypting &amp;lt;code&amp;gt;RASMetadata&amp;lt;/code&amp;gt;.) Each entry has the following structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASFileListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  uint32_t uncompressedSize;&lt;br /&gt;
  uint32_t compressedSize;&lt;br /&gt;
  uint32_t unknown2;&lt;br /&gt;
  uint32_t dirIndex;&lt;br /&gt;
  uint32_t unknown4;&lt;br /&gt;
  uint32_t compressionMode; // 1 = some form of Lempel-Ziv, 3 = uncompressed&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next is a directory list of &amp;lt;code&amp;gt;dirCount&amp;lt;/code&amp;gt; elements which must be decrypted similarly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASDirListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each directory is listed with its full name which starts and ends with a backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;). The top-most directory is named &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;. A file's &amp;lt;code&amp;gt;dirIndex&amp;lt;/code&amp;gt; is a 0-based index into the directory list.&lt;br /&gt;
&lt;br /&gt;
Timestamps are encoded using the same structure as SYSTEMTIME on Windows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASTimestamp {&lt;br /&gt;
  uint16_t year;&lt;br /&gt;
  uint16_t month;&lt;br /&gt;
  uint16_t dayOfWeek; // 0 = Sunday, 1 = Monday, ..., 6 = Saturday&lt;br /&gt;
  uint16_t day;&lt;br /&gt;
  uint16_t hour;&lt;br /&gt;
  uint16_t minute;&lt;br /&gt;
  uint16_t second;&lt;br /&gt;
  uint16_t millisecond;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data ===&lt;br /&gt;
&lt;br /&gt;
The file data follows directly after the file and directory lists. Each file is stored in turn with no padding; skipping to a specific file requires adding up the &amp;lt;code&amp;gt;compressedSize&amp;lt;/code&amp;gt; members of all files preceding it.&lt;br /&gt;
&lt;br /&gt;
== Encryption ==&lt;br /&gt;
&lt;br /&gt;
Depending on the generation of the RAS file format, different encryption schemes are used.&lt;br /&gt;
&lt;br /&gt;
=== RAS1+2 (Max Payne 1+2) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void decrypt(uint8_t *buf, size_t count, int32_t key) {&lt;br /&gt;
  size_t i;&lt;br /&gt;
&lt;br /&gt;
  if (key == 0) {&lt;br /&gt;
    key = 1;&lt;br /&gt;
  }&lt;br /&gt;
  for (i = 0; i &amp;amp;lt; count; i++) {&lt;br /&gt;
    uint8_t a = buf[i];&lt;br /&gt;
    uint8_t b = ((uint8_t)(i % 5)) &amp;amp; 7;&lt;br /&gt;
    buf[i] = rotateLeftByte(a, b);&lt;br /&gt;
    key = key * 171 + (key / 177) * -30269;&lt;br /&gt;
    buf[i] = (uint8_t)((((((int8_t)i) + 3) * 6) ^ buf[i]) + ((int8_t)key));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your programming language doesn't support the &amp;lt;code&amp;gt;rotateLeftByte&amp;lt;/code&amp;gt; operation, it can be emulated using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint8_t rotateLeftByte(uint8_t a, uint8_t b) {&lt;br /&gt;
  return (uint8_t)((a &amp;amp;lt;&amp;amp;lt; b) | (a &amp;amp;gt;&amp;amp;gt; (8 - b)));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Remedy Entertainment]]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/Remedy_Archive_System</id>
		<title>Remedy Archive System</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Remedy_Archive_System"/>
				<updated>2025-11-22T15:23:55Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|formattype=electronic&lt;br /&gt;
|subcat=Game data files&lt;br /&gt;
|extensions={{ext|ras}}&lt;br /&gt;
|released=2001&lt;br /&gt;
}}&lt;br /&gt;
'''Remedy Archive System''' is used to store game data for Remedy Entertainment games such as Max Payne and Max Payne 2. The metadata (central directory) following the header is encrypted.&lt;br /&gt;
&lt;br /&gt;
== Identification ==&lt;br /&gt;
Files begin with signature bytes {{magic|52 41 53 00}}.&lt;br /&gt;
&lt;br /&gt;
== Format details ==&lt;br /&gt;
&lt;br /&gt;
Numbers are in little-endian byte order.&lt;br /&gt;
&lt;br /&gt;
=== Metadata ===&lt;br /&gt;
&lt;br /&gt;
The file's header has the following structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASHeader {&lt;br /&gt;
  uint8_t magic[4]; // &amp;quot;RAS\0&amp;quot;&lt;br /&gt;
  uint32_t encryptionKey;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next section of the header must be decrypted first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASMetadata {&lt;br /&gt;
  uint32_t fileCount;&lt;br /&gt;
  uint32_t dirCount;&lt;br /&gt;
  uint32_t fileListLength;&lt;br /&gt;
  uint32_t dirListLength;&lt;br /&gt;
  float32_t version; // binary32 according to IEEE 754&lt;br /&gt;
  uint32_t unknown5;&lt;br /&gt;
  uint32_t unknown6;&lt;br /&gt;
  uint32_t unknown7;&lt;br /&gt;
  uint32_t compatibility;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following version and compatibility values are known:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
! Compatibility&lt;br /&gt;
! Game&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 3 || Max Payne&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
What follows are &amp;lt;code&amp;gt;fileListLength&amp;lt;/code&amp;gt; encrypted bytes of file metadata that can be decrypted using &amp;lt;code&amp;gt;encryptionKey&amp;lt;/code&amp;gt;. (It is not necessary to remember the last value of &amp;lt;code&amp;gt;key&amp;lt;/code&amp;gt; from decrypting &amp;lt;code&amp;gt;RASMetadata&amp;lt;/code&amp;gt;.) Each entry has the following structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASFileListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  uint32_t uncompressedSize;&lt;br /&gt;
  uint32_t compressedSize;&lt;br /&gt;
  uint32_t unknown2;&lt;br /&gt;
  uint32_t dirIndex;&lt;br /&gt;
  uint32_t unknown4;&lt;br /&gt;
  uint32_t compressionMode; // 1 = some form of Lempel-Ziv, 3 = uncompressed&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next is a directory list of &amp;lt;code&amp;gt;dirCount&amp;lt;/code&amp;gt; elements which must be decrypted similarly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASDirListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each directory is listed with its full name which starts and ends with a backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;). The top-most directory is named &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;. A file's &amp;lt;code&amp;gt;dirIndex&amp;lt;/code&amp;gt; is a 0-based index into the directory list.&lt;br /&gt;
&lt;br /&gt;
Timestamps are encoded using the same structure as SYSTEMTIME on Windows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASTimestamp {&lt;br /&gt;
  uint16_t year;&lt;br /&gt;
  uint16_t month;&lt;br /&gt;
  uint16_t dayOfWeek; // 0 = Sunday, 1 = Monday, ..., 6 = Saturday&lt;br /&gt;
  uint16_t day;&lt;br /&gt;
  uint16_t hour;&lt;br /&gt;
  uint16_t minute;&lt;br /&gt;
  uint16_t second;&lt;br /&gt;
  uint16_t millisecond;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data ===&lt;br /&gt;
&lt;br /&gt;
The file data follows directly after the file and directory lists. Each file is stored in turn with no padding; skipping to a specific file requires adding up the &amp;lt;code&amp;gt;compressedSize&amp;lt;/code&amp;gt; members of all files preceding it.&lt;br /&gt;
&lt;br /&gt;
== Encryption ==&lt;br /&gt;
&lt;br /&gt;
Depending on the generation of the RAS file format, different encryption schemes are used.&lt;br /&gt;
&lt;br /&gt;
=== RAS1 (Max Payne) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void decrypt(uint8_t *buf, size_t count, int32_t key) {&lt;br /&gt;
  size_t i;&lt;br /&gt;
&lt;br /&gt;
  if (key == 0) {&lt;br /&gt;
    key = 1;&lt;br /&gt;
  }&lt;br /&gt;
  for (i = 0; i &amp;amp;lt; count; i++) {&lt;br /&gt;
    uint8_t a = buf[i];&lt;br /&gt;
    uint8_t b = ((uint8_t)(i % 5)) &amp;amp; 7;&lt;br /&gt;
    buf[i] = rotateLeftByte(a, b);&lt;br /&gt;
    key = key * 171 + (key / 177) * -30269;&lt;br /&gt;
    buf[i] = (uint8_t)((((((int8_t)i) + 3) * 6) ^ buf[i]) + ((int8_t)key));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your programming language doesn't support the &amp;lt;code&amp;gt;rotateLeftByte&amp;lt;/code&amp;gt; operation, it can be emulated using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint8_t rotateLeftByte(uint8_t a, uint8_t b) {&lt;br /&gt;
  return (uint8_t)((a &amp;amp;lt;&amp;amp;lt; b) | (a &amp;amp;gt;&amp;amp;gt; (8 - b)));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Remedy Entertainment]]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/Remedy_Archive_System</id>
		<title>Remedy Archive System</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Remedy_Archive_System"/>
				<updated>2025-11-22T13:32:07Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|formattype=electronic&lt;br /&gt;
|subcat=Game data files&lt;br /&gt;
|extensions={{ext|ras}}&lt;br /&gt;
|released=2001&lt;br /&gt;
}}&lt;br /&gt;
'''Remedy Archive System''' is used to store game data for Remedy Entertainment games such as Max Payne and Max Payne 2. The metadata (central directory) following the header is encrypted.&lt;br /&gt;
&lt;br /&gt;
== Identification ==&lt;br /&gt;
Files begin with signature bytes {{magic|52 41 53 00}}.&lt;br /&gt;
&lt;br /&gt;
== Format details ==&lt;br /&gt;
&lt;br /&gt;
Numbers are in little-endian byte order.&lt;br /&gt;
&lt;br /&gt;
=== Metadata ===&lt;br /&gt;
&lt;br /&gt;
The file's header has the following structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASHeader {&lt;br /&gt;
  uint8_t magic[4]; // &amp;quot;RAS\0&amp;quot;&lt;br /&gt;
  uint32_t encryptionKey;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next section of the header must be decrypted first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASMetadata {&lt;br /&gt;
  uint32_t fileCount;&lt;br /&gt;
  uint32_t dirCount;&lt;br /&gt;
  uint32_t fileListLength;&lt;br /&gt;
  uint32_t dirListLength;&lt;br /&gt;
  float32_t version; // binary32 according to IEEE 754&lt;br /&gt;
  uint32_t unknown5;&lt;br /&gt;
  uint32_t unknown6;&lt;br /&gt;
  uint32_t unknown7;&lt;br /&gt;
  uint32_t compatibility;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following version and compatibility values are known:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
! Compatibility&lt;br /&gt;
! Game&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 3 || Max Payne&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
What follows are &amp;lt;code&amp;gt;fileListLength&amp;lt;/code&amp;gt; encrypted bytes of file metadata that can be decrypted using &amp;lt;code&amp;gt;encryptionKey&amp;lt;/code&amp;gt;. (It is not necessary to remember the last value of &amp;lt;code&amp;gt;key&amp;lt;/code&amp;gt; from decrypting &amp;lt;code&amp;gt;RASMetadata&amp;lt;/code&amp;gt;.) Each entry has the following structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASFileListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  uint32_t uncompressedSize;&lt;br /&gt;
  uint32_t compressedSize;&lt;br /&gt;
  uint32_t unknown2;&lt;br /&gt;
  uint32_t dirIndex;&lt;br /&gt;
  uint32_t unknown4;&lt;br /&gt;
  uint32_t compressionMode; // 1 = ???, 3 = uncompressed&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next is a directory list of &amp;lt;code&amp;gt;dirCount&amp;lt;/code&amp;gt; elements which must be decrypted similarly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASDirListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each directory is listed with its full name which starts and ends with a backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;). The top-most directory is named &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;. A file's &amp;lt;code&amp;gt;dirIndex&amp;lt;/code&amp;gt; is a 0-based index into the directory list.&lt;br /&gt;
&lt;br /&gt;
Timestamps are encoded using the same structure as SYSTEMTIME on Windows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASTimestamp {&lt;br /&gt;
  uint16_t year;&lt;br /&gt;
  uint16_t month;&lt;br /&gt;
  uint16_t dayOfWeek; // 0 = Sunday, 1 = Monday, ..., 6 = Saturday&lt;br /&gt;
  uint16_t day;&lt;br /&gt;
  uint16_t hour;&lt;br /&gt;
  uint16_t minute;&lt;br /&gt;
  uint16_t second;&lt;br /&gt;
  uint16_t millisecond;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data ===&lt;br /&gt;
&lt;br /&gt;
The file data follows directly after the file and directory lists. Each file is stored in turn with no padding; skipping to a specific file requires adding up the &amp;lt;code&amp;gt;compressedSize&amp;lt;/code&amp;gt; members of all files preceding it.&lt;br /&gt;
&lt;br /&gt;
== Encryption ==&lt;br /&gt;
&lt;br /&gt;
Depending on the generation of the RAS file format, different encryption schemes are used.&lt;br /&gt;
&lt;br /&gt;
=== RAS1 (Max Payne) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void decrypt(uint8_t *buf, size_t count, int32_t key) {&lt;br /&gt;
  size_t i;&lt;br /&gt;
&lt;br /&gt;
  if (key == 0) {&lt;br /&gt;
    key = 1;&lt;br /&gt;
  }&lt;br /&gt;
  for (i = 0; i &amp;amp;lt; count; i++) {&lt;br /&gt;
    uint8_t a = buf[i];&lt;br /&gt;
    uint8_t b = ((uint8_t)(i % 5)) &amp;amp; 7;&lt;br /&gt;
    buf[i] = rotateLeftByte(a, b);&lt;br /&gt;
    key = key * 171 + (key / 177) * -30269;&lt;br /&gt;
    buf[i] = (uint8_t)((((((int8_t)i) + 3) * 6) ^ buf[i]) + ((int8_t)key));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your programming language doesn't support the &amp;lt;code&amp;gt;rotateLeftByte&amp;lt;/code&amp;gt; operation, it can be emulated using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint8_t rotateLeftByte(uint8_t a, uint8_t b) {&lt;br /&gt;
  return (uint8_t)((a &amp;amp;lt;&amp;amp;lt; b) | (a &amp;amp;gt;&amp;amp;gt; (8 - b)));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Remedy Entertainment]]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/Remedy_Archive_System</id>
		<title>Remedy Archive System</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Remedy_Archive_System"/>
				<updated>2025-11-22T13:24:24Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|formattype=electronic&lt;br /&gt;
|subcat=Game data files&lt;br /&gt;
|extensions={{ext|ras}}&lt;br /&gt;
|released=2001&lt;br /&gt;
}}&lt;br /&gt;
'''Remedy Archive System''' is used to store game data for Remedy Entertainment games such as Max Payne and Max Payne 2. The metadata (central directory) following the header is encrypted.&lt;br /&gt;
&lt;br /&gt;
== Identification ==&lt;br /&gt;
Files begin with signature bytes {{magic|52 41 53 00}}.&lt;br /&gt;
&lt;br /&gt;
== Format details ==&lt;br /&gt;
&lt;br /&gt;
Numbers are in little-endian byte order.&lt;br /&gt;
&lt;br /&gt;
The file's header has the following structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASHeader {&lt;br /&gt;
  uint8_t magic[4]; // &amp;quot;RAS\0&amp;quot;&lt;br /&gt;
  uint32_t encryptionKey;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next section of the header must be decrypted first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASMetadata {&lt;br /&gt;
  uint32_t fileCount;&lt;br /&gt;
  uint32_t dirCount;&lt;br /&gt;
  uint32_t fileListLength;&lt;br /&gt;
  uint32_t dirListLength;&lt;br /&gt;
  float32_t version; // binary32 according to IEEE 754&lt;br /&gt;
  uint32_t unknown5;&lt;br /&gt;
  uint32_t unknown6;&lt;br /&gt;
  uint32_t unknown7;&lt;br /&gt;
  uint32_t compatibility;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following version and compatibility values are known:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
! Compatibility&lt;br /&gt;
! Game&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 3 || Max Payne&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
What follows are &amp;lt;code&amp;gt;fileListLength&amp;lt;/code&amp;gt; encrypted bytes of file metadata that can be decrypted using &amp;lt;code&amp;gt;encryptionKey&amp;lt;/code&amp;gt;. (It is not necessary to remember the last value of &amp;lt;code&amp;gt;key&amp;lt;/code&amp;gt; from decrypting &amp;lt;code&amp;gt;RASMetadata&amp;lt;/code&amp;gt;.) Each entry has the following structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASFileListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  uint32_t uncompressedSize;&lt;br /&gt;
  uint32_t compressedSize;&lt;br /&gt;
  uint32_t unknown2;&lt;br /&gt;
  uint32_t dirIndex;&lt;br /&gt;
  uint32_t unknown4;&lt;br /&gt;
  uint32_t compressionMode; // 1 = ???, 3 = uncompressed&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next is a directory list of &amp;lt;code&amp;gt;dirCount&amp;lt;/code&amp;gt; elements which must be decrypted similarly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASDirListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  RASTimestamp timestamp;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each directory is listed with its full name which starts and ends with a backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;). The top-most directory is named &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Timestamps are encoded using the same structure as SYSTEMTIME on Windows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASTimestamp {&lt;br /&gt;
  uint16_t year;&lt;br /&gt;
  uint16_t month;&lt;br /&gt;
  uint16_t dayOfWeek; // 0 = Sunday, 1 = Monday, ..., 6 = Saturday&lt;br /&gt;
  uint16_t day;&lt;br /&gt;
  uint16_t hour;&lt;br /&gt;
  uint16_t minute;&lt;br /&gt;
  uint16_t second;&lt;br /&gt;
  uint16_t millisecond;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Encryption ==&lt;br /&gt;
&lt;br /&gt;
Depending on the generation of the RAS file format, different encryption schemes are used.&lt;br /&gt;
&lt;br /&gt;
=== RAS1 (Max Payne) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void decrypt(uint8_t *buf, size_t count, int32_t key) {&lt;br /&gt;
  size_t i;&lt;br /&gt;
&lt;br /&gt;
  if (key == 0) {&lt;br /&gt;
    key = 1;&lt;br /&gt;
  }&lt;br /&gt;
  for (i = 0; i &amp;amp;lt; count; i++) {&lt;br /&gt;
    uint8_t a = buf[i];&lt;br /&gt;
    uint8_t b = ((uint8_t)(i % 5)) &amp;amp; 7;&lt;br /&gt;
    buf[i] = rotateLeftByte(a, b);&lt;br /&gt;
    key = key * 171 + (key / 177) * -30269;&lt;br /&gt;
    buf[i] = (uint8_t)((((((int8_t)i) + 3) * 6) ^ buf[i]) + ((int8_t)key));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your programming language doesn't support the &amp;lt;code&amp;gt;rotateLeftByte&amp;lt;/code&amp;gt; operation, it can be emulated using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint8_t rotateLeftByte(uint8_t a, uint8_t b) {&lt;br /&gt;
  return (uint8_t)((a &amp;amp;lt;&amp;amp;lt; b) | (a &amp;amp;gt;&amp;amp;gt; (8 - b)));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Remedy Entertainment]]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/Remedy_Archive_System</id>
		<title>Remedy Archive System</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Remedy_Archive_System"/>
				<updated>2025-11-22T12:01:55Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: clean up decryption code slightly&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|formattype=electronic&lt;br /&gt;
|subcat=Game data files&lt;br /&gt;
|extensions={{ext|ras}}&lt;br /&gt;
|released=2001&lt;br /&gt;
}}&lt;br /&gt;
'''Remedy Archive System''' is used to store game data for Remedy Entertainment games such as Max Payne and Max Payne 2. The metadata (central directory) following the header is encrypted.&lt;br /&gt;
&lt;br /&gt;
== Identification ==&lt;br /&gt;
Files begin with signature bytes {{magic|52 41 53 00}}.&lt;br /&gt;
&lt;br /&gt;
== Format details ==&lt;br /&gt;
&lt;br /&gt;
Numbers are in little-endian byte order.&lt;br /&gt;
&lt;br /&gt;
The file's header has the following structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASHeader {&lt;br /&gt;
  uint8_t magic[4]; // &amp;quot;RAS\0&amp;quot;&lt;br /&gt;
  uint32_t encryptionKey;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next section of the header must be decrypted first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASMetadata {&lt;br /&gt;
  uint32_t fileCount;&lt;br /&gt;
  uint32_t dirCount;&lt;br /&gt;
  uint32_t fileListLength;&lt;br /&gt;
  uint32_t dirListLength;&lt;br /&gt;
  float32_t version; // binary32 according to IEEE 754&lt;br /&gt;
  uint32_t unknown5;&lt;br /&gt;
  uint32_t unknown6;&lt;br /&gt;
  uint32_t unknown7;&lt;br /&gt;
  uint32_t compatibility;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following version and compatibility values are known:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
! Compatibility&lt;br /&gt;
! Game&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 3 || Max Payne&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
What follows are &amp;lt;code&amp;gt;fileListLength&amp;lt;/code&amp;gt; encrypted bytes of file metadata that can be decrypted using &amp;lt;code&amp;gt;encryptionKey&amp;lt;/code&amp;gt;. (It is not necessary to remember the last value of &amp;lt;code&amp;gt;key&amp;lt;/code&amp;gt; from decrypting &amp;lt;code&amp;gt;RASMetadata&amp;lt;/code&amp;gt;.) Each entry has the following structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASFileListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  uint32_t unknown0;&lt;br /&gt;
  uint32_t unknown1;&lt;br /&gt;
  uint32_t unknown2;&lt;br /&gt;
  uint32_t unknown3;&lt;br /&gt;
  uint32_t unknown4;&lt;br /&gt;
  uint32_t unknown5;&lt;br /&gt;
  uint32_t unknown6;&lt;br /&gt;
  uint32_t unknown7;&lt;br /&gt;
  uint32_t unknown8;&lt;br /&gt;
  uint32_t unknown9;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next is a directory list of &amp;lt;code&amp;gt;dirCount&amp;lt;/code&amp;gt; elements which must be decrypted similarly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASDirListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  uint16_t unknown0;&lt;br /&gt;
  uint16_t unknown1;&lt;br /&gt;
  uint16_t unknown2;&lt;br /&gt;
  uint16_t unknown3;&lt;br /&gt;
  uint16_t unknown4;&lt;br /&gt;
  uint16_t unknown5;&lt;br /&gt;
  uint16_t unknown6;&lt;br /&gt;
  uint16_t unknown7;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each directory is listed with its full name which starts and ends with a backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;). The top-most directory is named &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
== Encryption ==&lt;br /&gt;
&lt;br /&gt;
Depending on the generation of the RAS file format, different encryption schemes are used.&lt;br /&gt;
&lt;br /&gt;
=== RAS1 (Max Payne) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void decrypt(uint8_t *buf, size_t count, int32_t key) {&lt;br /&gt;
  size_t i;&lt;br /&gt;
&lt;br /&gt;
  if (key == 0) {&lt;br /&gt;
    key = 1;&lt;br /&gt;
  }&lt;br /&gt;
  for (i = 0; i &amp;amp;lt; count; i++) {&lt;br /&gt;
    uint8_t a = buf[i];&lt;br /&gt;
    uint8_t b = ((uint8_t)(i % 5)) &amp;amp; 7;&lt;br /&gt;
    buf[i] = rotateLeftByte(a, b);&lt;br /&gt;
    key = key * 171 + (key / 177) * -30269;&lt;br /&gt;
    buf[i] = (uint8_t)((((((int8_t)i) + 3) * 6) ^ buf[i]) + ((int8_t)key));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your programming language doesn't support the &amp;lt;code&amp;gt;rotateLeftByte&amp;lt;/code&amp;gt; operation, it can be emulated using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint8_t rotateLeftByte(uint8_t a, uint8_t b) {&lt;br /&gt;
  return (uint8_t)((a &amp;amp;lt;&amp;amp;lt; b) | (a &amp;amp;gt;&amp;amp;gt; (8 - b)));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Remedy Entertainment]]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/Remedy_Archive_System</id>
		<title>Remedy Archive System</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Remedy_Archive_System"/>
				<updated>2025-11-22T09:05:47Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: decrypt: i and key are cast to signed char, not unsigned char&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|formattype=electronic&lt;br /&gt;
|subcat=Game data files&lt;br /&gt;
|extensions={{ext|ras}}&lt;br /&gt;
|released=2001&lt;br /&gt;
}}&lt;br /&gt;
'''Remedy Archive System''' is used to store game data for Remedy Entertainment games such as Max Payne and Max Payne 2. The metadata (central directory) following the header is encrypted.&lt;br /&gt;
&lt;br /&gt;
== Identification ==&lt;br /&gt;
Files begin with signature bytes {{magic|52 41 53 00}}.&lt;br /&gt;
&lt;br /&gt;
== Format details ==&lt;br /&gt;
&lt;br /&gt;
Numbers are in little-endian byte order.&lt;br /&gt;
&lt;br /&gt;
The file's header has the following structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASHeader {&lt;br /&gt;
  uint8_t magic[4]; // &amp;quot;RAS\0&amp;quot;&lt;br /&gt;
  uint32_t encryptionKey;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next section of the header must be decrypted first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASMetadata {&lt;br /&gt;
  uint32_t fileCount;&lt;br /&gt;
  uint32_t dirCount;&lt;br /&gt;
  uint32_t fileListLength;&lt;br /&gt;
  uint32_t dirListLength;&lt;br /&gt;
  float32_t version; // binary32 according to IEEE 754&lt;br /&gt;
  uint32_t unknown5;&lt;br /&gt;
  uint32_t unknown6;&lt;br /&gt;
  uint32_t unknown7;&lt;br /&gt;
  uint32_t compatibility;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following version and compatibility values are known:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
! Compatibility&lt;br /&gt;
! Game&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 3 || Max Payne&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
What follows are &amp;lt;code&amp;gt;fileListLength&amp;lt;/code&amp;gt; encrypted bytes of file metadata that can be decrypted using &amp;lt;code&amp;gt;encryptionKey&amp;lt;/code&amp;gt;. (It is not necessary to remember the last value of &amp;lt;code&amp;gt;key&amp;lt;/code&amp;gt; from decrypting &amp;lt;code&amp;gt;RASMetadata&amp;lt;/code&amp;gt;.) Each entry has the following structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASFileListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  uint32_t unknown0;&lt;br /&gt;
  uint32_t unknown1;&lt;br /&gt;
  uint32_t unknown2;&lt;br /&gt;
  uint32_t unknown3;&lt;br /&gt;
  uint32_t unknown4;&lt;br /&gt;
  uint32_t unknown5;&lt;br /&gt;
  uint32_t unknown6;&lt;br /&gt;
  uint32_t unknown7;&lt;br /&gt;
  uint32_t unknown8;&lt;br /&gt;
  uint32_t unknown9;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next is a directory list of &amp;lt;code&amp;gt;dirCount&amp;lt;/code&amp;gt; elements which must be decrypted similarly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASDirListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  uint16_t unknown0;&lt;br /&gt;
  uint16_t unknown1;&lt;br /&gt;
  uint16_t unknown2;&lt;br /&gt;
  uint16_t unknown3;&lt;br /&gt;
  uint16_t unknown4;&lt;br /&gt;
  uint16_t unknown5;&lt;br /&gt;
  uint16_t unknown6;&lt;br /&gt;
  uint16_t unknown7;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each directory is listed with its full name which starts and ends with a backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;). The top-most directory is named &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
== Encryption ==&lt;br /&gt;
&lt;br /&gt;
Depending on the generation of the RAS file format, different encryption schemes are used.&lt;br /&gt;
&lt;br /&gt;
=== RAS1 (Max Payne) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void decrypt(uint8_t *buf, size_t count, int32_t key) {&lt;br /&gt;
  size_t i;&lt;br /&gt;
  uint8_t a;&lt;br /&gt;
  uint8_t b;&lt;br /&gt;
&lt;br /&gt;
  if (key == 0) {&lt;br /&gt;
    key = 1;&lt;br /&gt;
  }&lt;br /&gt;
  for (i = 0; i &amp;amp;lt; count; i++) {&lt;br /&gt;
    uint8_t a = buf[i];&lt;br /&gt;
    uint8_t b = ((uint8_t)(i % 5)) &amp;amp; 7;&lt;br /&gt;
    buf[i] = rotateLeftByte(a, b);&lt;br /&gt;
    key = key * 171 + (key / 177) * -30269;&lt;br /&gt;
    buf[i] = (uint8_t)((((((int8_t)i) + 3) * 6) ^ buf[i]) + ((int8_t)key));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your programming language doesn't support the &amp;lt;code&amp;gt;rotateLeftByte&amp;lt;/code&amp;gt; operation, it can be emulated using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint8_t rotateLeftByte(uint8_t a, uint8_t b) {&lt;br /&gt;
  return (a &amp;amp;lt;&amp;amp;lt; b) | (a &amp;amp;gt;&amp;amp;gt; (8 - b));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Remedy Entertainment]]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/Remedy_Archive_System</id>
		<title>Remedy Archive System</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Remedy_Archive_System"/>
				<updated>2025-11-22T07:18:31Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: RASDirListEntry&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|formattype=electronic&lt;br /&gt;
|subcat=Game data files&lt;br /&gt;
|extensions={{ext|ras}}&lt;br /&gt;
|released=2001&lt;br /&gt;
}}&lt;br /&gt;
'''Remedy Archive System''' is used to store game data for Remedy Entertainment games such as Max Payne and Max Payne 2. The metadata (central directory) following the header is encrypted.&lt;br /&gt;
&lt;br /&gt;
== Identification ==&lt;br /&gt;
Files begin with signature bytes {{magic|52 41 53 00}}.&lt;br /&gt;
&lt;br /&gt;
== Format details ==&lt;br /&gt;
&lt;br /&gt;
Numbers are in little-endian byte order.&lt;br /&gt;
&lt;br /&gt;
The file's header has the following structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASHeader {&lt;br /&gt;
  uint8_t magic[4]; // &amp;quot;RAS\0&amp;quot;&lt;br /&gt;
  uint32_t encryptionKey;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next section of the header must be decrypted first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASMetadata {&lt;br /&gt;
  uint32_t fileCount;&lt;br /&gt;
  uint32_t dirCount;&lt;br /&gt;
  uint32_t fileListLength;&lt;br /&gt;
  uint32_t dirListLength;&lt;br /&gt;
  float32_t version; // binary32 according to IEEE 754&lt;br /&gt;
  uint32_t unknown5;&lt;br /&gt;
  uint32_t unknown6;&lt;br /&gt;
  uint32_t unknown7;&lt;br /&gt;
  uint32_t compatibility;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following version and compatibility values are known:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
! Compatibility&lt;br /&gt;
! Game&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 3 || Max Payne&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
What follows are &amp;lt;code&amp;gt;fileListLength&amp;lt;/code&amp;gt; encrypted bytes of file metadata that can be decrypted using &amp;lt;code&amp;gt;encryptionKey&amp;lt;/code&amp;gt;. (It is not necessary to remember the last value of &amp;lt;code&amp;gt;key&amp;lt;/code&amp;gt; from decrypting &amp;lt;code&amp;gt;RASMetadata&amp;lt;/code&amp;gt;.) Each entry has the following structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASFileListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  uint32_t unknown0;&lt;br /&gt;
  uint32_t unknown1;&lt;br /&gt;
  uint32_t unknown2;&lt;br /&gt;
  uint32_t unknown3;&lt;br /&gt;
  uint32_t unknown4;&lt;br /&gt;
  uint32_t unknown5;&lt;br /&gt;
  uint32_t unknown6;&lt;br /&gt;
  uint32_t unknown7;&lt;br /&gt;
  uint32_t unknown8;&lt;br /&gt;
  uint32_t unknown9;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next is a directory list of &amp;lt;code&amp;gt;dirCount&amp;lt;/code&amp;gt; elements which must be decrypted similarly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASDirListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  uint16_t unknown0;&lt;br /&gt;
  uint16_t unknown1;&lt;br /&gt;
  uint16_t unknown2;&lt;br /&gt;
  uint16_t unknown3;&lt;br /&gt;
  uint16_t unknown4;&lt;br /&gt;
  uint16_t unknown5;&lt;br /&gt;
  uint16_t unknown6;&lt;br /&gt;
  uint16_t unknown7;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each directory is listed with its full name which starts and ends with a backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;). The top-most directory is named &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
== Encryption ==&lt;br /&gt;
&lt;br /&gt;
Depending on the generation of the RAS file format, different encryption schemes are used.&lt;br /&gt;
&lt;br /&gt;
=== RAS1 (Max Payne) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void decrypt(uint8_t *buf, size_t count, int32_t key) {&lt;br /&gt;
  size_t i;&lt;br /&gt;
  uint8_t a;&lt;br /&gt;
  uint8_t b;&lt;br /&gt;
&lt;br /&gt;
  if (key == 0) {&lt;br /&gt;
    key = 1;&lt;br /&gt;
  }&lt;br /&gt;
  for (i = 0; i &amp;amp;lt; count; i++) {&lt;br /&gt;
    uint8_t a = buf[i];&lt;br /&gt;
    uint8_t b = ((uint8_t)(i % 5)) &amp;amp; 7;&lt;br /&gt;
    buf[i] = rotateLeftByte(a, b);&lt;br /&gt;
    key = key * 171 + (key / 177) * -30269;&lt;br /&gt;
    buf[i] = (((((uint8_t)i) + 3) * 6) ^ buf[i]) + ((uint8_t)key);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your programming language doesn't support the &amp;lt;code&amp;gt;rotateLeftByte&amp;lt;/code&amp;gt; operation, it can be emulated using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint8_t rotateLeftByte(uint8_t a, uint8_t b) {&lt;br /&gt;
  return (a &amp;amp;lt;&amp;amp;lt; b) | (a &amp;amp;gt;&amp;amp;gt; (8 - b));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Remedy Entertainment]]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/Remedy_Archive_System</id>
		<title>Remedy Archive System</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Remedy_Archive_System"/>
				<updated>2025-11-22T07:05:58Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: document file list entry structure&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|formattype=electronic&lt;br /&gt;
|subcat=Game data files&lt;br /&gt;
|extensions={{ext|ras}}&lt;br /&gt;
|released=2001&lt;br /&gt;
}}&lt;br /&gt;
'''Remedy Archive System''' is used to store game data for Remedy Entertainment games such as Max Payne and Max Payne 2. The metadata (central directory) following the header is encrypted.&lt;br /&gt;
&lt;br /&gt;
== Identification ==&lt;br /&gt;
Files begin with signature bytes {{magic|52 41 53 00}}.&lt;br /&gt;
&lt;br /&gt;
== Format details ==&lt;br /&gt;
&lt;br /&gt;
Numbers are in little-endian byte order.&lt;br /&gt;
&lt;br /&gt;
The file's header has the following structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASHeader {&lt;br /&gt;
  uint8_t magic[4]; // &amp;quot;RAS\0&amp;quot;&lt;br /&gt;
  uint32_t encryptionKey;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next section of the header must be decrypted first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASMetadata {&lt;br /&gt;
  uint32_t fileCount;&lt;br /&gt;
  uint32_t unknown1;&lt;br /&gt;
  uint32_t fileListLength;&lt;br /&gt;
  uint32_t unknown3;&lt;br /&gt;
  float32_t version; // binary32 according to IEEE 754&lt;br /&gt;
  uint32_t unknown5;&lt;br /&gt;
  uint32_t unknown6;&lt;br /&gt;
  uint32_t unknown7;&lt;br /&gt;
  uint32_t compatibility;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following version and compatibility values are known:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
! Compatibility&lt;br /&gt;
! Game&lt;br /&gt;
|-&lt;br /&gt;
|| 1.2 || 3 || Max Payne&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
What follows are &amp;lt;code&amp;gt;fileListLength&amp;lt;/code&amp;gt; encrypted bytes of file metadata that can be decrypted using &amp;lt;code&amp;gt;encryptionKey&amp;lt;/code&amp;gt;. (It is not necessary to remember the last value of &amp;lt;code&amp;gt;key&amp;lt;/code&amp;gt; from decrypting &amp;lt;code&amp;gt;RASMetadata&amp;lt;/code&amp;gt;.) Each entry has the following structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASFileListEntry {&lt;br /&gt;
  char name[]; // NUL-terminated&lt;br /&gt;
  uint32_t unknown0;&lt;br /&gt;
  uint32_t unknown1;&lt;br /&gt;
  uint32_t unknown2;&lt;br /&gt;
  uint32_t unknown3;&lt;br /&gt;
  uint32_t unknown4;&lt;br /&gt;
  uint32_t unknown5;&lt;br /&gt;
  uint32_t unknown6;&lt;br /&gt;
  uint32_t unknown7;&lt;br /&gt;
  uint32_t unknown8;&lt;br /&gt;
  uint32_t unknown9;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Encryption ==&lt;br /&gt;
&lt;br /&gt;
Depending on the generation of the RAS file format, different encryption schemes are used.&lt;br /&gt;
&lt;br /&gt;
=== RAS1 (Max Payne) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void decrypt(uint8_t *buf, size_t count, int32_t key) {&lt;br /&gt;
  size_t i;&lt;br /&gt;
  uint8_t a;&lt;br /&gt;
  uint8_t b;&lt;br /&gt;
&lt;br /&gt;
  if (key == 0) {&lt;br /&gt;
    key = 1;&lt;br /&gt;
  }&lt;br /&gt;
  for (i = 0; i &amp;amp;lt; count; i++) {&lt;br /&gt;
    uint8_t a = buf[i];&lt;br /&gt;
    uint8_t b = ((uint8_t)(i % 5)) &amp;amp; 7;&lt;br /&gt;
    buf[i] = rotateLeftByte(a, b);&lt;br /&gt;
    key = key * 171 + (key / 177) * -30269;&lt;br /&gt;
    buf[i] = (((((uint8_t)i) + 3) * 6) ^ buf[i]) + ((uint8_t)key);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your programming language doesn't support the &amp;lt;code&amp;gt;rotateLeftByte&amp;lt;/code&amp;gt; operation, it can be emulated using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint8_t rotateLeftByte(uint8_t a, uint8_t b) {&lt;br /&gt;
  return (a &amp;amp;lt;&amp;amp;lt; b) | (a &amp;amp;gt;&amp;amp;gt; (8 - b));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Remedy Entertainment]]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/Remedy_Archive_System</id>
		<title>Remedy Archive System</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Remedy_Archive_System"/>
				<updated>2025-11-21T16:47:58Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: add general structure of metadata&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|formattype=electronic&lt;br /&gt;
|subcat=Game data files&lt;br /&gt;
|extensions={{ext|ras}}&lt;br /&gt;
|released=2001&lt;br /&gt;
}}&lt;br /&gt;
'''Remedy Archive System''' is used to store game data for Remedy Entertainment games such as Max Payne and Max Payne 2. The metadata (central directory) following the header is encrypted.&lt;br /&gt;
&lt;br /&gt;
== Identification ==&lt;br /&gt;
Files begin with signature bytes {{magic|52 41 53 00}}.&lt;br /&gt;
&lt;br /&gt;
== Format details ==&lt;br /&gt;
&lt;br /&gt;
Numbers are in little-endian byte order.&lt;br /&gt;
&lt;br /&gt;
The file's header has the following structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASHeader {&lt;br /&gt;
  uint8_t magic[4]; // &amp;quot;RAS\0&amp;quot;&lt;br /&gt;
  uint32_t encryptionKey;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next section of the header must be decrypted first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASMetadata {&lt;br /&gt;
  uint32_t unknown0;&lt;br /&gt;
  uint32_t unknown1;&lt;br /&gt;
  uint32_t centralDirectoryLength;&lt;br /&gt;
  uint32_t unknown3;&lt;br /&gt;
  float32_t version; /* binary32 according to IEEE 754 */&lt;br /&gt;
  uint32_t unknown5;&lt;br /&gt;
  uint32_t unknown6;&lt;br /&gt;
  uint32_t unknown7;&lt;br /&gt;
  uint32_t compatibility;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Encryption ==&lt;br /&gt;
&lt;br /&gt;
Depending on the generation of the RAS file format, different encryption schemes are used.&lt;br /&gt;
&lt;br /&gt;
=== RAS1 (Max Payne) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void decrypt(uint8_t *buf, size_t count, int32_t key) {&lt;br /&gt;
  size_t i;&lt;br /&gt;
  uint8_t a;&lt;br /&gt;
  uint8_t b;&lt;br /&gt;
&lt;br /&gt;
  if (key == 0) {&lt;br /&gt;
    key = 1;&lt;br /&gt;
  }&lt;br /&gt;
  for (i = 0; i &amp;amp;lt; count; i++) {&lt;br /&gt;
    uint8_t a = buf[i];&lt;br /&gt;
    uint8_t b = ((uint8_t)(i % 5)) &amp;amp; 7;&lt;br /&gt;
    buf[i] = rotateLeftByte(a, b);&lt;br /&gt;
    key = key * 171 + (key / 177) * -30269;&lt;br /&gt;
    buf[i] = (((((uint8_t)i) + 3) * 6) ^ buf[i]) + ((uint8_t)key);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your programming language doesn't support the &amp;lt;code&amp;gt;rotateLeftByte&amp;lt;/code&amp;gt; operation, it can be emulated using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint8_t rotateLeftByte(uint8_t a, uint8_t b) {&lt;br /&gt;
  return (a &amp;amp;lt;&amp;amp;lt; b) | (a &amp;amp;gt;&amp;amp;gt; (8 - b));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Remedy Entertainment]]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/Remedy_Archive_System</id>
		<title>Remedy Archive System</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Remedy_Archive_System"/>
				<updated>2025-11-21T16:12:28Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: translate description to C due to range of int32_t&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|formattype=electronic&lt;br /&gt;
|subcat=Game data files&lt;br /&gt;
|extensions={{ext|ras}}&lt;br /&gt;
|released=2001&lt;br /&gt;
}}&lt;br /&gt;
'''Remedy Archive System''' is used to store game data for Remedy Entertainment games such as Max Payne and Max Payne 2. The metadata (central directory) following the header is encrypted.&lt;br /&gt;
&lt;br /&gt;
== Identification ==&lt;br /&gt;
Files begin with signature bytes {{magic|52 41 53 00}}.&lt;br /&gt;
&lt;br /&gt;
== Format details ==&lt;br /&gt;
&lt;br /&gt;
Numbers are in little-endian byte order.&lt;br /&gt;
&lt;br /&gt;
The file's header has the following structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASHeader {&lt;br /&gt;
  uint8_t magic[4]; // &amp;quot;RAS\0&amp;quot;&lt;br /&gt;
  uint32_t encryptionKey;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next section of the header must be decrypted first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASMetadata {&lt;br /&gt;
  &lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Encryption ==&lt;br /&gt;
&lt;br /&gt;
Depending on the generation of the RAS file format, different encryption schemes are used.&lt;br /&gt;
&lt;br /&gt;
=== RAS1 (Max Payne) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void decrypt(uint8_t *buf, size_t count, int32_t key) {&lt;br /&gt;
  size_t i;&lt;br /&gt;
  uint8_t a;&lt;br /&gt;
  uint8_t b;&lt;br /&gt;
&lt;br /&gt;
  if (key == 0) {&lt;br /&gt;
    key = 1;&lt;br /&gt;
  }&lt;br /&gt;
  for (i = 0; i &amp;amp;lt; count; i++) {&lt;br /&gt;
    uint8_t a = buf[i];&lt;br /&gt;
    uint8_t b = ((uint8_t)(i % 5)) &amp;amp; 7;&lt;br /&gt;
    buf[i] = rotateLeftByte(a, b);&lt;br /&gt;
    key = key * 171 + (key / 177) * -30269;&lt;br /&gt;
    buf[i] = (((((uint8_t)i) + 3) * 6) ^ buf[i]) + ((uint8_t)key);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your programming language doesn't support the &amp;lt;code&amp;gt;rotateLeftByte&amp;lt;/code&amp;gt; operation, it can be emulated using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint8_t rotateLeftByte(uint8_t a, uint8_t b) {&lt;br /&gt;
  return (a &amp;amp;lt;&amp;amp;lt; b) | (a &amp;amp;gt;&amp;amp;gt; (8 - b));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Remedy Entertainment]]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/Remedy_Archive_System</id>
		<title>Remedy Archive System</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Remedy_Archive_System"/>
				<updated>2025-11-21T15:31:29Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: /* Format details */ LE&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|formattype=electronic&lt;br /&gt;
|subcat=Game data files&lt;br /&gt;
|extensions={{ext|ras}}&lt;br /&gt;
|released=2001&lt;br /&gt;
}}&lt;br /&gt;
'''Remedy Archive System''' is used to store game data for Remedy Entertainment games such as Max Payne and Max Payne 2. The metadata (central directory) following the header is encrypted.&lt;br /&gt;
&lt;br /&gt;
== Identification ==&lt;br /&gt;
Files begin with signature bytes {{magic|52 41 53 00}}.&lt;br /&gt;
&lt;br /&gt;
== Format details ==&lt;br /&gt;
&lt;br /&gt;
Numbers are in little-endian byte order.&lt;br /&gt;
&lt;br /&gt;
The file's header has the following structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASHeader {&lt;br /&gt;
  uint8_t magic[4]; // &amp;quot;RAS\0&amp;quot;&lt;br /&gt;
  uint32_t encryptionKey;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next section of the header must be decrypted first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASMetadata {&lt;br /&gt;
  &lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Encryption ==&lt;br /&gt;
&lt;br /&gt;
Depending on the generation of the RAS file format, different encryption schemes are used.&lt;br /&gt;
&lt;br /&gt;
=== RAS1 (Max Payne) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function decrypt(data: byte[], key: uint32):&lt;br /&gt;
  if key == 0:&lt;br /&gt;
    key := 1&lt;br /&gt;
 &lt;br /&gt;
  for i from 0 to data.length-1:&lt;br /&gt;
    a := data[i]&lt;br /&gt;
    b := i mod 5         -- such that 0 ≤ b &amp;amp;lt; 5&lt;br /&gt;
    c := rotateByteLeft(a by b)&lt;br /&gt;
    d := key / 177&lt;br /&gt;
    e := d * 30269&lt;br /&gt;
    f := key * 171&lt;br /&gt;
    key := f - e&lt;br /&gt;
    g := i mod 256&lt;br /&gt;
    h := g + 3&lt;br /&gt;
    k := h * 6&lt;br /&gt;
    m := k bitwiseXor data[i]&lt;br /&gt;
    p := key mod 256     -- such that 0 ≤ p &amp;amp;lt; 256&lt;br /&gt;
    q := m + p&lt;br /&gt;
    data[i] := q mod 256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your programming language doesn't support the &amp;lt;code&amp;gt;rotateLeft&amp;lt;/code&amp;gt; operation, it can be emulated using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function rotateByteLeft(i by n):&lt;br /&gt;
  return (i bitShiftLeft n) bitwiseOr (i bitShiftRight (8 - n))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Remedy Entertainment]]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/Remedy_Archive_System</id>
		<title>Remedy Archive System</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Remedy_Archive_System"/>
				<updated>2025-11-21T15:30:18Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: MP1 crypt: ensure last value fits in a byte&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|formattype=electronic&lt;br /&gt;
|subcat=Game data files&lt;br /&gt;
|extensions={{ext|ras}}&lt;br /&gt;
|released=2001&lt;br /&gt;
}}&lt;br /&gt;
'''Remedy Archive System''' is used to store game data for Remedy Entertainment games such as Max Payne and Max Payne 2. The metadata (central directory) following the header is encrypted.&lt;br /&gt;
&lt;br /&gt;
== Identification ==&lt;br /&gt;
Files begin with signature bytes {{magic|52 41 53 00}}.&lt;br /&gt;
&lt;br /&gt;
== Format details ==&lt;br /&gt;
&lt;br /&gt;
The file's header has the following structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASHeader {&lt;br /&gt;
  uint8_t magic[4]; // &amp;quot;RAS\0&amp;quot;&lt;br /&gt;
  uint32_t encryptionKey;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next section of the header must be decrypted first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASMetadata {&lt;br /&gt;
  &lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Encryption ==&lt;br /&gt;
&lt;br /&gt;
Depending on the generation of the RAS file format, different encryption schemes are used.&lt;br /&gt;
&lt;br /&gt;
=== RAS1 (Max Payne) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function decrypt(data: byte[], key: uint32):&lt;br /&gt;
  if key == 0:&lt;br /&gt;
    key := 1&lt;br /&gt;
 &lt;br /&gt;
  for i from 0 to data.length-1:&lt;br /&gt;
    a := data[i]&lt;br /&gt;
    b := i mod 5         -- such that 0 ≤ b &amp;amp;lt; 5&lt;br /&gt;
    c := rotateByteLeft(a by b)&lt;br /&gt;
    d := key / 177&lt;br /&gt;
    e := d * 30269&lt;br /&gt;
    f := key * 171&lt;br /&gt;
    key := f - e&lt;br /&gt;
    g := i mod 256&lt;br /&gt;
    h := g + 3&lt;br /&gt;
    k := h * 6&lt;br /&gt;
    m := k bitwiseXor data[i]&lt;br /&gt;
    p := key mod 256     -- such that 0 ≤ p &amp;amp;lt; 256&lt;br /&gt;
    q := m + p&lt;br /&gt;
    data[i] := q mod 256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your programming language doesn't support the &amp;lt;code&amp;gt;rotateLeft&amp;lt;/code&amp;gt; operation, it can be emulated using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function rotateByteLeft(i by n):&lt;br /&gt;
  return (i bitShiftLeft n) bitwiseOr (i bitShiftRight (8 - n))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Remedy Entertainment]]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/Remedy_Archive_System</id>
		<title>Remedy Archive System</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Remedy_Archive_System"/>
				<updated>2025-11-21T15:23:31Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: no semicolons in pseudocode&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|formattype=electronic&lt;br /&gt;
|subcat=Game data files&lt;br /&gt;
|extensions={{ext|ras}}&lt;br /&gt;
|released=2001&lt;br /&gt;
}}&lt;br /&gt;
'''Remedy Archive System''' is used to store game data for Remedy Entertainment games such as Max Payne and Max Payne 2. The metadata (central directory) following the header is encrypted.&lt;br /&gt;
&lt;br /&gt;
== Identification ==&lt;br /&gt;
Files begin with signature bytes {{magic|52 41 53 00}}.&lt;br /&gt;
&lt;br /&gt;
== Format details ==&lt;br /&gt;
&lt;br /&gt;
The file's header has the following structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASHeader {&lt;br /&gt;
  uint8_t magic[4]; // &amp;quot;RAS\0&amp;quot;&lt;br /&gt;
  uint32_t encryptionKey;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next section of the header must be decrypted first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASMetadata {&lt;br /&gt;
  &lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Encryption ==&lt;br /&gt;
&lt;br /&gt;
Depending on the generation of the RAS file format, different encryption schemes are used.&lt;br /&gt;
&lt;br /&gt;
=== RAS1 (Max Payne) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function decrypt(data: byte[], key: uint32):&lt;br /&gt;
  if key == 0:&lt;br /&gt;
    key := 1&lt;br /&gt;
 &lt;br /&gt;
  for i from 0 to data.length-1:&lt;br /&gt;
    a := data[i]&lt;br /&gt;
    b := i mod 5         -- such that 0 ≤ b &amp;amp;lt; 5&lt;br /&gt;
    c := rotateByteLeft(a by b)&lt;br /&gt;
    d := key / 177&lt;br /&gt;
    e := d * 30269&lt;br /&gt;
    f := key * 171&lt;br /&gt;
    key := f - e&lt;br /&gt;
    g := i mod 256&lt;br /&gt;
    h := g + 3&lt;br /&gt;
    k := h * 6&lt;br /&gt;
    m := k bitwiseXor data[i]&lt;br /&gt;
    p := key mod 256     -- such that 0 ≤ p &amp;amp;lt; 256&lt;br /&gt;
    data[i] := m + p&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your programming language doesn't support the &amp;lt;code&amp;gt;rotateLeft&amp;lt;/code&amp;gt; operation, it can be emulated using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function rotateByteLeft(i by n):&lt;br /&gt;
  return (i bitShiftLeft n) bitwiseOr (i bitShiftRight (8 - n))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Remedy Entertainment]]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/Remedy_Archive_System</id>
		<title>Remedy Archive System</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Remedy_Archive_System"/>
				<updated>2025-11-21T15:22:35Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: initial info on header and decryption, WIP&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|formattype=electronic&lt;br /&gt;
|subcat=Game data files&lt;br /&gt;
|extensions={{ext|ras}}&lt;br /&gt;
|released=2001&lt;br /&gt;
}}&lt;br /&gt;
'''Remedy Archive System''' is used to store game data for Remedy Entertainment games such as Max Payne and Max Payne 2. The metadata (central directory) following the header is encrypted.&lt;br /&gt;
&lt;br /&gt;
== Identification ==&lt;br /&gt;
Files begin with signature bytes {{magic|52 41 53 00}}.&lt;br /&gt;
&lt;br /&gt;
== Format details ==&lt;br /&gt;
&lt;br /&gt;
The file's header has the following structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct RASHeader {&lt;br /&gt;
  uint8_t magic[4]; // &amp;quot;RAS\0&amp;quot;&lt;br /&gt;
  uint32_t encryptionKey;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next section of the header must be decrypted first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// decrypted structure&lt;br /&gt;
struct RASMetadata {&lt;br /&gt;
  &lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Encryption ==&lt;br /&gt;
&lt;br /&gt;
Depending on the generation of the RAS file format, different encryption schemes are used.&lt;br /&gt;
&lt;br /&gt;
=== RAS1 (Max Payne) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function decrypt(data: byte[], key: uint32):&lt;br /&gt;
  if key == 0:&lt;br /&gt;
    key := 1&lt;br /&gt;
 &lt;br /&gt;
  for i from 0 to data.length-1:&lt;br /&gt;
    a := data[i]&lt;br /&gt;
    b := i mod 5         -- such that 0 ≤ b &amp;amp;lt; 5&lt;br /&gt;
    c := rotateByteLeft(a by b)&lt;br /&gt;
    d := key / 177&lt;br /&gt;
    e := d * 30269&lt;br /&gt;
    f := key * 171&lt;br /&gt;
    key := f - e&lt;br /&gt;
    g := i mod 256&lt;br /&gt;
    h := g + 3&lt;br /&gt;
    k := h * 6&lt;br /&gt;
    m := k bitwiseXor data[i]&lt;br /&gt;
    p := key mod 256     -- such that 0 ≤ p &amp;amp;lt; 256&lt;br /&gt;
    data[i] := m + p&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your programming language doesn't support the &amp;lt;code&amp;gt;rotateLeft&amp;lt;/code&amp;gt; operation, it can be emulated using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function rotateByteLeft(i by n):&lt;br /&gt;
  return (i bitShiftLeft n) bitwiseOr (i bitShiftRight (8 - n));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Remedy Entertainment]]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	<entry>
		<id>http://fileformats.archiveteam.org/wiki/Game_data_files</id>
		<title>Game data files</title>
		<link rel="alternate" type="text/html" href="http://fileformats.archiveteam.org/wiki/Game_data_files"/>
				<updated>2025-11-21T14:55:50Z</updated>
		
		<summary type="html">&lt;p&gt;RavuAlHemio: /* Archiving / Compression */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FormatInfo&lt;br /&gt;
|formattype=electronic&lt;br /&gt;
|thiscat=Game data files&lt;br /&gt;
|image=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
Many popular games use proprietary file formats to store their assets. These include custom image, sound and video formats and custom archive formats. There is no way that all of these can be enumerated here in some way or another. And as long as the games can still be run by an [[Emulation_Software|Emulator]] it's not that much of a deal. However, a lot of work has been put into deciphering, decrypting and hacking these files, and that work should be preserved.&lt;br /&gt;
&lt;br /&gt;
See also: [[Interactive Fiction]] for data formats related to text adventure games, [[Puzzles]] for puzzle-game files, and [[Saved Games]] for data saved by games to store a player's game status.&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
* [http://wiki.xentax.com Xentax Wiki]&lt;br /&gt;
* [http://rewiki.awiki.org ReWiki]&lt;br /&gt;
* [http://aluigi.altervista.org/quickbms.htm QuickBMS], a tool suite to describe archives in an abstract BASIC-like language, and lots of scripts for even more games&lt;br /&gt;
&lt;br /&gt;
==General Game Formats==&lt;br /&gt;
&lt;br /&gt;
This section details formats such as [[Interplay ACM]] and [[Unreal Music Format]] which are used in a number of games.&lt;br /&gt;
&lt;br /&gt;
=== Archiving / Compression ===&lt;br /&gt;
* [[CFL]]&lt;br /&gt;
* [[Electronic Arts LIB Game Archive]]&lt;br /&gt;
* [[FAR (The Sims)]]&lt;br /&gt;
* [[HMM Packfile]] (.PAK)&lt;br /&gt;
* [[Remedy Archive System]]&lt;br /&gt;
* [[Unity package file]]&lt;br /&gt;
&lt;br /&gt;
===Audio / Music===&lt;br /&gt;
(see also [[Audio and Music]])&lt;br /&gt;
&lt;br /&gt;
* [[BAKA]] (PCM 16 bit)&lt;br /&gt;
* beatmania / IIDX simulation&lt;br /&gt;
** [[BMS]]&lt;br /&gt;
* [[BH2PCM]] (extracted from [[Doom WAD]] by eXtendable WAD Editor)&lt;br /&gt;
* [[BNSF]] (IS14)&lt;br /&gt;
* Commodore Amiga&lt;br /&gt;
** [[AC1D-DC1A Packer]]&lt;br /&gt;
** [[AMOS Music Bank]]&lt;br /&gt;
** [[Channel Players]]&lt;br /&gt;
** [[Digital Illusions]]&lt;br /&gt;
** [[Game Music Creator]]&lt;br /&gt;
** [[Jason Page]]&lt;br /&gt;
* Electronic Arts&lt;br /&gt;
** [[Electronic Arts MUS]]&lt;br /&gt;
* [[Epic Megagames MASI]]&lt;br /&gt;
* id Software&lt;br /&gt;
** [[Doom MUS]]&lt;br /&gt;
** [[id Software Music Format]]&lt;br /&gt;
* [[Interplay ACM]]&lt;br /&gt;
* [[Inverse Frequency Sound format]]&lt;br /&gt;
* [[Ken's Adlib Music]]&lt;br /&gt;
* [[Sierra AGI]]&lt;br /&gt;
* [[Sierra SCI]]&lt;br /&gt;
* [[Westwood Studios ADL]]&lt;br /&gt;
* [[Westwood Studios AUD]]&lt;br /&gt;
* [[Xbox IMA ADPCM]]&lt;br /&gt;
* Nintendo GameCube / Wii&lt;br /&gt;
** [[Nintendo GameCube / Wii AST]]&lt;br /&gt;
** [[Nintendo GameCube / Wii BRSTM]]&lt;br /&gt;
&lt;br /&gt;
=== Game programming languages ===&lt;br /&gt;
&lt;br /&gt;
* [[Blitz3D]]&lt;br /&gt;
** [[Blitz3D Model]]&lt;br /&gt;
&lt;br /&gt;
(see also [[Programming Languages]])&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
&lt;br /&gt;
* Allegro (game programming library)&lt;br /&gt;
** [[Allegro packfile]]&lt;br /&gt;
&lt;br /&gt;
* Atari&lt;br /&gt;
** [[STOS memory bank]] (.mbk)&lt;br /&gt;
&lt;br /&gt;
* Bitsboard&lt;br /&gt;
** [[Bitsboard board]]&lt;br /&gt;
&lt;br /&gt;
* Blizzard Entertainment&lt;br /&gt;
** [[BLP]]&lt;br /&gt;
** [[MDX (Blizzard)|MDX]]&lt;br /&gt;
** [[MoPaQ]]&lt;br /&gt;
&lt;br /&gt;
* Build Engine&lt;br /&gt;
** [[ART (Build Engine ART)]]&lt;br /&gt;
** [[DAT (Build Engine Palette)]]&lt;br /&gt;
** [[GRP (Build Engine Group Archive)]]&lt;br /&gt;
&lt;br /&gt;
* [[D3TV]]&lt;br /&gt;
* [[DIV Games Studio]]&lt;br /&gt;
&lt;br /&gt;
* Electronic Arts&lt;br /&gt;
** [[Electronic Arts CMV]]&lt;br /&gt;
** [[Electronic Arts INF]]&lt;br /&gt;
** [[Electronic Arts MAD]]‎&lt;br /&gt;
** [[Electronic Arts MOV]]&lt;br /&gt;
** [[Electronic Arts MPC‎]]&lt;br /&gt;
** [[Electronic Arts TGV]]&lt;br /&gt;
** [[Electronic Arts WVE]]&lt;br /&gt;
&lt;br /&gt;
* Free Hero Mesh&lt;br /&gt;
** [[Free Hero Mesh class definition file]] (.class)&lt;br /&gt;
** [[Free Hero Mesh class resource file]] (.xclass)&lt;br /&gt;
** [[Free Hero Mesh level file]] (.level)&lt;br /&gt;
** [[Free Hero Mesh solution file]] (.solution)&lt;br /&gt;
** [[Free Hero Mesh code page file]]&lt;br /&gt;
** [[Free Hero Mesh composite puzzle set]]&lt;br /&gt;
&lt;br /&gt;
* Hero Mesh&lt;br /&gt;
** [[Hero Mesh puzzle set]] (.mb)&lt;br /&gt;
&lt;br /&gt;
* id Software&lt;br /&gt;
** [[BSP]] (map format used in Quake)&lt;br /&gt;
** [[Doom WAD]]&lt;br /&gt;
** [[Quake PAK]]&lt;br /&gt;
** [[Quake PK3]] (actually [[ZIP]])&lt;br /&gt;
** [[Quake WAD]]&lt;br /&gt;
&lt;br /&gt;
* Infinity Engine&lt;br /&gt;
** [[BAM]]&lt;br /&gt;
&lt;br /&gt;
* [[MegaZeux]]&lt;br /&gt;
&lt;br /&gt;
* NetImmerse / Gamebryo Engine&lt;br /&gt;
** [[KF]]&lt;br /&gt;
** [[NIF]]&lt;br /&gt;
&lt;br /&gt;
* Nintendo GameCube&lt;br /&gt;
** [[Nintendo GameCube Opening.bnr]]&lt;br /&gt;
&lt;br /&gt;
* Nintendo GameCube / Wii&lt;br /&gt;
** [[DOL (Nintendo)]]&lt;br /&gt;
** [[RARC]]&lt;br /&gt;
** [[Yaz0]]&lt;br /&gt;
&lt;br /&gt;
* Nintendo Wii&lt;br /&gt;
** [[BootMii NAND Dump]]&lt;br /&gt;
** [[BRFNT]]&lt;br /&gt;
** [[Mii Data]]&lt;br /&gt;
** [[Nintendo Wii BRLAN]]&lt;br /&gt;
** [[Nintendo Wii BRLYT]]&lt;br /&gt;
** [[Nintendo Wii BRRES]]&lt;br /&gt;
** [[Nintendo Wii Content.bin]]&lt;br /&gt;
** [[Nintendo Wii Data.bin]]&lt;br /&gt;
** [[Nintendo Wii Opening.bnr]]&lt;br /&gt;
** [[Nintendo Wii PAC]]&lt;br /&gt;
** [[Nintendo Wii PCS]]&lt;br /&gt;
** [[Nintendo Wii REL]]&lt;br /&gt;
** [[Nintendo Wii Savegame]]&lt;br /&gt;
** [[Nintendo Wii SEL]]&lt;br /&gt;
** [[Nintendo Wii Ticket]]&lt;br /&gt;
** [[Nintendo Wii TPL]]&lt;br /&gt;
** [[Nintendo Wii U8]]&lt;br /&gt;
** [[Nintendo Wii Update.inf]]&lt;br /&gt;
** [[Nintendo Wii VFF]]&lt;br /&gt;
** [[Title metadata]]&lt;br /&gt;
** [[Virtual Console CCF]]&lt;br /&gt;
** [[WAD (Wii)]]&lt;br /&gt;
** [[WiiConnect24 file]]&lt;br /&gt;
&lt;br /&gt;
* [[OHRRPGCE]]&lt;br /&gt;
&lt;br /&gt;
* [[Outerra engine]] (.otx) (used in Anteworld game)&lt;br /&gt;
&lt;br /&gt;
* Raven Software game engine&lt;br /&gt;
** [[GLA]] - Ghoul animation (.gla)&lt;br /&gt;
** [[GLM]] - Ghoul mesh (.glm)&lt;br /&gt;
&lt;br /&gt;
* Sokoban&lt;br /&gt;
** [[Softdisk Publishing UDF files]] (used for Softdisk's version of Sokoban)&lt;br /&gt;
** [[SOK (Sokoban)]]&lt;br /&gt;
** [[Sokoban XML]]&lt;br /&gt;
&lt;br /&gt;
* Terminal Reality [https://github.com/jopadan/termpod/wiki/Terminal-Reality]&lt;br /&gt;
** [[POD1]] (.pod) [https://github.com/jopadan/termpod/wiki/Pod-1-Format-Reference] (no CRC)&lt;br /&gt;
** [[POD2]] (.pod) [https://github.com/jopadan/termpod/wiki/Pod-2-Format-Reference] (CRC=[[CRC-32#CRC-32/MPEG-2|CRC-32/MPEG-2]])&lt;br /&gt;
** [[POD3]] (.pod) [https://github.com/jopadan/termpod/wiki/Pod-3-Format-Reference] (CRC=CRC-32/MPEG-2)&lt;br /&gt;
** [[POD4]] (.pod) [https://github.com/jopadan/termpod/wiki/Pod-4-Format-Reference] (CRC=CRC-32/MPEG-2)&lt;br /&gt;
** [[POD5]] (.pod) [https://github.com/jopadan/termpod/wiki/Pod-5-Format-Reference] (CRC=CRC-32/MPEG-2)&lt;br /&gt;
** [[POD6]] (.pod) [https://github.com/jopadan/termpod/wiki/Pod-6-Format-Reference] (no CRC)&lt;br /&gt;
** [[EPD]]  (.epd) [https://github.com/jopadan/termpod/wiki/Epd-Format-Reference] (CRC=CRC-32/MPEG-2)&lt;br /&gt;
&lt;br /&gt;
* Tiled&lt;br /&gt;
** [[Tiled JSON]]&lt;br /&gt;
** [[Tiled TMX]]&lt;br /&gt;
** [[Tiled TSX]]&lt;br /&gt;
&lt;br /&gt;
* Torque 3D game engine&lt;br /&gt;
** [[DTS]] (.dts)&lt;br /&gt;
&lt;br /&gt;
* Valve Source Engine&lt;br /&gt;
** [[Valve Model Format]] (.mdl) [https://developer.valvesoftware.com/wiki/MDL Source Code]&lt;br /&gt;
** [[Valve Collision Model]] (.phy)&lt;br /&gt;
** [[Valve Map Format]] (.vmf)&lt;br /&gt;
** [[Valve Material Type]] (.vmt)&lt;br /&gt;
** [[Valve Vertex Data]] (.vvd)&lt;br /&gt;
** [[Valve Texture Format]] (.vtf)&lt;br /&gt;
&lt;br /&gt;
* Xtremeworlds&lt;br /&gt;
** [[Xtremeworlds PWX]]&lt;br /&gt;
** [[Xtremeworlds map]]&lt;br /&gt;
&lt;br /&gt;
* [[ZZT]]&lt;br /&gt;
** [[ZXT/ZAX]]&lt;br /&gt;
&lt;br /&gt;
* [[ZZ Zero]]&lt;br /&gt;
&lt;br /&gt;
==Individual Game Formats==&lt;br /&gt;
&lt;br /&gt;
This section details formats which are specific to a single game (or perhaps a game series), such as [[God of Thunder Music Format]].&lt;br /&gt;
* 7 Days to Die&lt;br /&gt;
** [[TTS Prefab]] (.tts)&lt;br /&gt;
** [[7DTD Map File]] (.map)&lt;br /&gt;
* Age of Empires&lt;br /&gt;
** [[Data Resource File]] (.drs)&lt;br /&gt;
** [[Age of Empires Graphics File]] (.slp)&lt;br /&gt;
* Age of Mythology&lt;br /&gt;
** [[BAR (Age of Mythology)]] (.bar archive)&lt;br /&gt;
* Alter Ego (1986)&lt;br /&gt;
** [[Alter Ego Vignette Script format]]&lt;br /&gt;
* Arma&lt;br /&gt;
** [[Arma PBO]] (.pbo)&lt;br /&gt;
* Barony&lt;br /&gt;
** [[Barony Voxel]] (.vox)&lt;br /&gt;
* Blur&lt;br /&gt;
** [[BAF]] (Blur ADPCM)&lt;br /&gt;
* BVE, OpenBVE, Boso View Express (railroad simulator)&lt;br /&gt;
** [[BVE object formats]]&lt;br /&gt;
** [[BVE route formats]]&lt;br /&gt;
** [[BVE train.dat file]]&lt;br /&gt;
* Carnivores&lt;br /&gt;
** [[CAR (Carnivores)]] (.car)&lt;br /&gt;
* Cartooners&lt;br /&gt;
** [[Cartooners actor file]] (.act)&lt;br /&gt;
** [[Electronic Arts INF‎]] (.inf)&lt;br /&gt;
** [[Electronic Arts MOV]] (.mov)&lt;br /&gt;
** [[Electronic Arts MUS]] (.mus)&lt;br /&gt;
* Chasm: The Rift&lt;br /&gt;
** [[CAR (Chasm: The Rift)]]&lt;br /&gt;
* Cities Skylines&lt;br /&gt;
** [[Cities Skylines CRP]] (.crp)&lt;br /&gt;
* Commander Keen 1&lt;br /&gt;
** [[Commander Keen 1 Level format]] (.ck1)&lt;br /&gt;
* Core Wars&lt;br /&gt;
** [[RBJ (Redcode oBJect)]] (.rbj)&lt;br /&gt;
* Crystal Caves&lt;br /&gt;
** [[Crystal Caves Sound format]] (.snd)&lt;br /&gt;
* Dance With Intensity&lt;br /&gt;
** [[Dance With Intensity simfile]] (.dwi)&lt;br /&gt;
* Dangerous Dave&lt;br /&gt;
** [[Dangerous Dave level format]]&lt;br /&gt;
** [[Dangerous Dave tileset format]]&lt;br /&gt;
** (also uses [[Inverse Frequency Sound format]])&lt;br /&gt;
* Dark Reign&lt;br /&gt;
** [[FTG (Dark Reign)]]&lt;br /&gt;
** [[PAL (Dark Reign)]]&lt;br /&gt;
* Dofus&lt;br /&gt;
** [[Dofus localization]]&lt;br /&gt;
* Donkey Konga 2&lt;br /&gt;
** [[Donkey Konga 2 DSP]]&lt;br /&gt;
* Doom&lt;br /&gt;
** [[Doom cheat code encryption]]&lt;br /&gt;
** [[Doom MUS]] (.mus)&lt;br /&gt;
** [[Doom WAD]] (.wad)&lt;br /&gt;
** [[Doom DWD]] (.dwd)&lt;br /&gt;
** [[DeHackEd patch]] (used by the Doom modding community)&lt;br /&gt;
* DTX Mania&lt;br /&gt;
** [[DTX Mania simfile]]&lt;br /&gt;
* Duke Nukem&lt;br /&gt;
** [[ART (Duke Nukem 3D)]]&lt;br /&gt;
** [[DAT (Duke Nukem 3D)]]&lt;br /&gt;
** [[Duke Nukem level format]]&lt;br /&gt;
** [[Duke Nukem graphics format]]&lt;br /&gt;
** [[GRP (Duke Nukem 3D)]]&lt;br /&gt;
* Fallout&lt;br /&gt;
** [[Fallout character description]] (.gcd)&lt;br /&gt;
* Friday Night Funkin&lt;br /&gt;
** [[Friday Night Funkin mod]]&lt;br /&gt;
* Garry's Mod&lt;br /&gt;
** [[Garry's Mod Addon]] (.gma)&lt;br /&gt;
* God of Thunder&lt;br /&gt;
** [[DAT (God of Thunder)]]&lt;br /&gt;
** [[God of Thunder Music Format]]&lt;br /&gt;
* Grand Theft Auto&lt;br /&gt;
** [[RAGE Package Format]] (.rpf)&lt;br /&gt;
** [[RenderWare binary stream file]] (.dff)&lt;br /&gt;
* In the Groove&lt;br /&gt;
** [[In the Groove PCK]] (.pck)&lt;br /&gt;
* Jack Nicklaus Golf &amp;amp; Course Design: Signature Edition&lt;br /&gt;
** [[JNSE golf course]]&lt;br /&gt;
* Kick It Up&lt;br /&gt;
** [[Kick It Up simfile]] (.ksf)&lt;br /&gt;
* Lego Island&lt;br /&gt;
** [[Lego Island World Database]] (.wdb)&lt;br /&gt;
* Magic &amp;amp; Mayhem&lt;br /&gt;
** [[Magic &amp;amp; Mayhem sprites file]]&lt;br /&gt;
* Mario Kart Wii&lt;br /&gt;
** [[Wii BTI]]&lt;br /&gt;
* Mario Paint&lt;br /&gt;
** [[Mario Paint Composer]]&lt;br /&gt;
** [[SHI]]&lt;br /&gt;
** [[SHO]]&lt;br /&gt;
* Mass Effect&lt;br /&gt;
** [[AFC]] (AFX audio file; Mass Effect 2)&lt;br /&gt;
* MegaZeux&lt;br /&gt;
** [[MegaZeux Property List]]&lt;br /&gt;
* Minecraft&lt;br /&gt;
** [[Minecraft Alpha level format]]&lt;br /&gt;
** [[Minecraft Anvil format]]&lt;br /&gt;
** [[Minecraft Bedrock Edition level format]]&lt;br /&gt;
** [[Minecraft chunk format]]&lt;br /&gt;
** [[Minecraft classic level format]]&lt;br /&gt;
** [[Minecraft classic server protocol]]&lt;br /&gt;
** [[Minecraft generated structures format]]&lt;br /&gt;
** [[Minecraft Indev level format]]&lt;br /&gt;
** [[Minecraft Java Edition level format]]&lt;br /&gt;
** [[Minecraft loot table]]&lt;br /&gt;
** [[Minecraft map item format]]&lt;br /&gt;
** [[Minecraft model]]&lt;br /&gt;
** [[Minecraft NBT format]]&lt;br /&gt;
** [[Minecraft player format]]&lt;br /&gt;
** [[Minecraft raids.dat format]]&lt;br /&gt;
** [[Minecraft Region format]]&lt;br /&gt;
** [[Minecraft server_level.dat]]&lt;br /&gt;
** [[Minecraft server list format]]&lt;br /&gt;
** [[Minecraft structure block file format]]&lt;br /&gt;
** [[Minecraft scoreboard format]]&lt;br /&gt;
** [[Minecraft sounds.json]]&lt;br /&gt;
** [[Minecraft villages.dat format]]&lt;br /&gt;
** [[Schematic file format]]&lt;br /&gt;
* Mortal Kombat 4&lt;br /&gt;
** [[Mortal Kombat 4 filesys.dat]]&lt;br /&gt;
* Pokémon&lt;br /&gt;
** [[Pokémon Mystery Dungeon]]&lt;br /&gt;
** [[Pokémon ROM]]&lt;br /&gt;
** [[RMC]]&lt;br /&gt;
* Quake&lt;br /&gt;
** [[MD2]] - Quake 2 model format (.md2)&lt;br /&gt;
** [[MD3]] - Quake 3 model format (.md3)&lt;br /&gt;
** [[MD4 (Quake)|MD4]] - Quake MD4 model format (used in later Quake 3 versions) (.md4)&lt;br /&gt;
* Rise of the Triad&lt;br /&gt;
** [[Rise of the Triad level format]]&lt;br /&gt;
** (also uses [[Doom WAD]])&lt;br /&gt;
* RobotWar&lt;br /&gt;
** [[RobotWar|RobotWar programming language]]&lt;br /&gt;
* Sims, The&lt;br /&gt;
** [[CFP]] (Compressed Floating Point)&lt;br /&gt;
** [[CMX/BCF]]&lt;br /&gt;
** [[FAR (The Sims)]]&lt;br /&gt;
** [[IFF (The Sims)]] (.iff, .flr, .wll, .spf, .stx)&lt;br /&gt;
** [[SKN/BMF]]&lt;br /&gt;
* StarCraft&lt;br /&gt;
** [[StarCraft group file]] (.grp)&lt;br /&gt;
* StepMania&lt;br /&gt;
** [[StepMania simfile]] (.sm)&lt;br /&gt;
** [[StepMania 5 simfile]] (.ssc)&lt;br /&gt;
** [[StepMania AMX simfile]] (.sma)&lt;br /&gt;
* Stronghold&lt;br /&gt;
**[[Stronghold GM1]] (.gm1)&lt;br /&gt;
**[[TGX Graphics]] (.tgx)&lt;br /&gt;
* Supaplex&lt;br /&gt;
** [[Supaplex Level format]] (.dat)&lt;br /&gt;
* Super Mario Galaxy&lt;br /&gt;
** [[Super Mario Galaxy savefile]]&lt;br /&gt;
* Super Paper Mario&lt;br /&gt;
** [[BRSTMPSM]] (music data)&lt;br /&gt;
* Total War&lt;br /&gt;
** [[Total War ESF]] (.esf)&lt;br /&gt;
* Vinyl Goddess From Mars&lt;br /&gt;
** [[Vinyl Goddess From Mars Instrument Format]]&lt;br /&gt;
** [[Vinyl Goddess From Mars Music Format]]&lt;br /&gt;
* Warcraft&lt;br /&gt;
** [[Warcraft II PUD]] (.pud) (custom maps)&lt;br /&gt;
* Wiggle Planet&lt;br /&gt;
** [[Wiglet]]&lt;br /&gt;
* Wii Fit / Wii Fit Plus&lt;br /&gt;
** [[Wii Fit BMG]]&lt;br /&gt;
&lt;br /&gt;
== Game hints ==&lt;br /&gt;
* [[UHS]]&lt;br /&gt;
&lt;br /&gt;
== Board/card games ==&lt;br /&gt;
* [[Magic Set Editor]]&lt;br /&gt;
** [[Magic Set Editor card set]] (.mse-set)&lt;br /&gt;
** [[Magic Set Editor export template]] (.mse-export-template)&lt;br /&gt;
** [[Magic Set Editor game definition]] (.mse-game)&lt;br /&gt;
** [[Magic Set Editor include package]] (.mse-include)&lt;br /&gt;
** [[Magic Set Editor installer]] (???)&lt;br /&gt;
** [[Magic Set Editor style sheet]] (.mse-style)&lt;br /&gt;
** [[Magic Set Editor symbol font]] (.mse-symbol-font)&lt;br /&gt;
* [[REKO Cardset]]&lt;br /&gt;
* [[TeXnicard]]&lt;br /&gt;
** [[TeXnicard card database]]&lt;br /&gt;
** [[TeXnicard template]]&lt;br /&gt;
* [[Wiz Solitaire]]&lt;br /&gt;
&lt;br /&gt;
== Uncategorized ==&lt;br /&gt;
&lt;br /&gt;
* [[RBPACK]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.osti.gov/accomplishments/videogame.html Possibly the first video game, in 1958]&lt;br /&gt;
* [https://archive.org/details/Nintendo_Ultra64_Programming_Manual Nintendo Ultra64 Programming Manual]&lt;br /&gt;
* [http://ukvac.com/forum/topic335921.html Sega Pengo: bug found in maze generating algorithm]&lt;br /&gt;
* [http://www.stavros.io/posts/winning-candy-crush/ How to 'hack' Candy Crush]&lt;br /&gt;
* [http://www.glitchthegame.com/public-domain-game-art/ Glitch game files, released into the public domain]&lt;br /&gt;
* [https://github.com/jmechner/Prince-of-Persia-Apple-II Prince of Persia source code (Apple II)]&lt;br /&gt;
* [http://sourceforge.net/projects/dice/ DICE: emulator of early discrete-circuit video games]&lt;br /&gt;
* [http://www.polygon.com/2014/4/22/5640114/maze-invaders-atari-arcade-source-code-strong-museum-icheg Museum acquires 'virtually complete' source code from Atari's arcade heyday]&lt;br /&gt;
* [https://archive.org/details/pdp1_spacewar Spacewar! for the PDP-1 (1962)] (with in-browser emulation)&lt;br /&gt;
* [http://tcrf.net/Category:Games_with_hidden_developer_messages Games with hidden developer messages]&lt;br /&gt;
* [http://www.loc.gov/preservation/resources/rfs/softgame.html Library of Congress Recommended Format Specifications: Software/Gaming]&lt;br /&gt;
* [https://github.com/keendreams/keen Keen Dreams Source Code (open-source release)]&lt;/div&gt;</summary>
		<author><name>RavuAlHemio</name></author>	</entry>

	</feed>