Surreal Software Archive (Riot Engine): Difference between revisions

From XentaxWiki
Jump to navigation Jump to search
imported>Ikskoks
m (Ikskoks moved page The Suffering to Surreal Software Archive)
imported>Ikskoks
 
(22 intermediate revisions by the same user not shown)
Line 5: Line 5:




=== Format Specifications ===  
=== Format Specifications (The Suffering, version 1.1) ===  


<tt><b>
<tt><b>
Line 30: Line 30:
:: uint32 {4}&nbsp;&nbsp; - File Size <br>  
:: uint32 {4}&nbsp;&nbsp; - File Size <br>  
</b></tt>
</b></tt>
=== Format Specifications (Drakan, version 0.1) ===
<div class="toccolours mw-collapsible" id="mw-customcollapsible-myDivision" style="width:800px; overflow:auto;">
<pre>
// Drakan
// RRC file format
// little endian
// header
4 bytes (char) - magic // "SRSC"
2 bytes - version  // 0x00 0x01
4 bytes (uint32) - directory offset
2 bytes (uint16) - number of files
// data
number_of_files *
{
  x bytes - file data
}
// directory
number_of_files *
{
  2 bytes (uint16) - file type  // "0x40 0x00" (64) - texture data
                                // "0x00 0x04" (1024) - encrypted text
                                // "0x01 0x04" (1025) - plain text
                                // etc. etc.
  2 bytes (uint16) - file ID
  2 bytes (uint16) - group ID
  4 bytes (uint32) - file offset
  4 bytes (uint32) - file size
}
</pre>
</div>


=== MultiEx BMS ===  
=== MultiEx BMS ===  
Line 38: Line 77:


* [https://aluigi.altervista.org/bms/drakan.bms drakan.bms]
* [https://aluigi.altervista.org/bms/drakan.bms drakan.bms]
=== Notes and Comments ===
* This is archive file format used by the '''Riot Engine''' by '''Surreal Software''' company.
* Some files inside archive may be compressed with '''ZLIB compression'''.
=== Decryption Method ===
Strings are encrypted with custom XOR algorithm. <br>Below is Python implementation of decryption method:<br>
<div class="toccolours mw-collapsible" id="mw-customcollapsible-myDivision" style="width:800px; overflow:auto;">
<pre>
def decrypt_data(in_data_str, in_data_len): 
    key = 0x5FDD390D
    out_data = b''
    for i in range(in_data_len):
        out_data += xore(struct.pack("B", in_data_str[i]) , struct.pack("B", key & 0xFF))
        key = (key<<3) | (key>>(32-3))
       
    return out_data
</pre>
</div>


=== Games ===  
=== Games ===  
Line 43: Line 103:
* Drakan: Order of the Flame
* Drakan: Order of the Flame
* Drakan: The Ancients' Gates
* Drakan: The Ancients' Gates
* The Lord of the Rings: The Fellowship of the Ring
* The Lord of the Rings: The Fellowship of the Ring <font color="red">(needs confirmation!)</font>
* The Suffering
* The Suffering
* The Suffering: Ties That Bind  
* The Suffering: Ties That Bind  
Line 53: Line 113:
* [[Game Extractor|Game Extractor]]<br>
* [[Game Extractor|Game Extractor]]<br>
* [https://github.com/Zalasus/opendrakan opendrakan]
* [https://github.com/Zalasus/opendrakan opendrakan]
* Drakan: Order Of The Flame Level Editor
* [https://github.com/bartlomiejduda/Tools/blob/master/NEW%20Tools/Drakan/Drakan_RRC_Tool.py Drakan_RRC_Tool.py]


<br><br>
<br><br>




[[Category:Complete Almost Done|The Suffering]]
[[Category:Complete Complete|Surreal Software Archive (Riot Engine)]]
[[Category:Platform PC|The Suffering]]
[[Category:Platform PC|Surreal Software Archive (Riot Engine)]]
[[Category:CE Compressed|The Suffering]]
[[Category:CE Compressed|Surreal Software Archive (Riot Engine)]]
[[Category:Format_Archive | Type: Archive]]
[[Category:Format_Archive | Type: Archive]]
[[Category:Extension_rrc | Extension: rrc]]
[[Category:Extension_rrc | Extension: rrc]]
[[Category:XOR encryption]]
[[Category:ZLIB compression]]
[[Category:File Format]]
[[Category:File Format]]

Latest revision as of 18:43, 14 January 2021

ADU CDU FDU LDU MDU ODU QDU SDU TDU VDU WDU XDU RRC


Format Specifications (The Suffering, version 1.1)

// ARCHIVE HEADER

char {4}     - Header (SRSC)
byte {2}     - Version (1,1)
uint32 {4}   - Files Directory Offset
uint32 {4}   - Number Of Files [-1]


// FILE DATA

// for each file
byte {X}     - File Data


// FILES DIRECTORY

uint32 {4}   - Unknown (1026)
uint16 {2}   - null
uint32 {4}   - File Data Length
uint32 {4}   - Unknown (10)


// for each file (14 bytes per entry)
uint32 {4}   - Unknown
uint16 {2}   - File Type ID?
uint32 {4}   - File Offset
uint32 {4}   - File Size


Format Specifications (Drakan, version 0.1)

// Drakan
// RRC file format

// little endian

// header
4 bytes (char) - magic // "SRSC"
2 bytes - version  // 0x00 0x01
4 bytes (uint32) - directory offset
2 bytes (uint16) - number of files


// data
number_of_files *
{
   x bytes - file data
}


// directory
number_of_files *
{
   2 bytes (uint16) - file type  // "0x40 0x00" (64) - texture data
                                 // "0x00 0x04" (1024) - encrypted text
                                 // "0x01 0x04" (1025) - plain text
                                 // etc. etc.
   2 bytes (uint16) - file ID
   2 bytes (uint16) - group ID
   4 bytes (uint32) - file offset
   4 bytes (uint32) - file size
}

MultiEx BMS

Not written yet.

QuickBMS

Notes and Comments

  • This is archive file format used by the Riot Engine by Surreal Software company.
  • Some files inside archive may be compressed with ZLIB compression.

Decryption Method

Strings are encrypted with custom XOR algorithm.
Below is Python implementation of decryption method:

def decrypt_data(in_data_str, in_data_len):   
    key = 0x5FDD390D
    out_data = b''
    for i in range(in_data_len):
        out_data += xore(struct.pack("B", in_data_str[i]) , struct.pack("B", key & 0xFF))
        key = (key<<3) | (key>>(32-3))
        
    return out_data

Games

List of games using this file format:

  • Drakan: Order of the Flame
  • Drakan: The Ancients' Gates
  • The Lord of the Rings: The Fellowship of the Ring (needs confirmation!)
  • The Suffering
  • The Suffering: Ties That Bind
  • Gunslinger (cancelled game) (needs confirmation!)
  • The Lord of the Rings: The Treason of Isengard (cancelled game) (needs confirmation!)

Supported Programs