User Tools

Site Tools


mission_impossible:sool_engine

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
mission_impossible:sool_engine [2019/06/18 19:42]
shygoo call_ctx_method: fix input stack order
mission_impossible:sool_engine [2019/07/01 18:25] (current)
shygoo last minute notes on sool file structure
Line 1: Line 1:
 ====== SOOL Engine ====== ====== SOOL Engine ======
-Scenaric Object Oriented Language+SOOL (Scenaric Object Oriented Language) is a proprietary scripting language and engine used by Mission Impossible.
  
-  * [[https://​hackmd.io/​D7_UZ5kGSWCAZb_nM2-xHg?edit|Rough decompilation ​of the SOOL Engine]]+  * [[https://​hackmd.io/​@shygoo/​Byq2TYWkr|SOOL Interpreter partial decomp]] 
 + 
 +---- 
 +===== SOOL File structure ===== 
 + 
 +==== File header ==== 
 +^Offset^Type^Name^Description^ 
 +|0x00|char|signature[4] ​   |"​SOOL"​| 
 +|0x04|u32 |fileSize ​       |Size of the sool file.| 
 +|0x08|u16 |numSections ​    ​|Number of interactor sections.| 
 +|0x0A|u8 ​ |padding[2] ​     |Alignment padding.| 
 +|0x0C|u32 |sectionOffsets[]|Array of interactor section offsets. The length of this array is defined by the ''​numSections''​ field.| 
 +|....|u32 |unknownData[] ​  ​|Unknown data. Always the same size as ''​sectionOffsets''​.| 
 + 
 +==== Interactor sections ==== 
 +^Offset^Type^Name^Description^ 
 +|0x00|u16 |offsVars ​       |Offset of the interactor'​s variables.| 
 +|0x02|u16 |offsVarsEnd ​    |End offset of the interactor'​s variables.| 
 +|0x04|u16 |offsElements ​   |Offset of the interactor'​s elements. 0xFFFF if ''​numElements''​ is zero.| 
 +|0x06|u16 |numElements ​    ​|Number of elements.| 
 +|0x08|u16 |unk08 ​          ​|Unknown - always 0xFFFF?| 
 +|0x0A|u16 |specialMethodIdx|An index of ''​methodOffsets''​. Unknown purpose.| 
 +|0x0C|u16 |offsMethodsEnd ​ |End offset ​of the method code.| 
 +|0x0E|u16 |numMethods ​     |Number of methods.| 
 +|0x10|u16 |methodOffsets[|Array of method offsets. The length of this array is defined by the ''​numMethods''​ field.| 
 +|....|u16 |variables[    |Variable definitions. The position and length of this array are defined by the ''​offsVars''​ and ''​offsVarsEnd''​ fields.| 
 +|....|u8 ​ |methodCode[] ​   |Method bytecode. See commands below.| 
 +|....|u8 ​ |garbage[] ​      |If ''​offsMethodsEnd''​ is uneven, there will be one padding byte of an arbitrary value here for alignment.| 
 +|....|elem|elements[] ​     |Element lookup table. Each entry contains two u16 fields for the key and value.|
  
 ---- ----
Line 96: Line 124:
 Stack: ''​[...] -> [...] [immValue1] [immValue2]''​ Stack: ''​[...] -> [...] [immValue1] [immValue2]''​
 ---- ----
-====0B: ​load_ctx_var_offs ​====+====0B: ​load_ctx_elem ​====
 ''​0B''​ ''​0B''​
  
-Pop variable id and context id from the stack, push offset of variable ​to the stack.+Pop element key and context id from the stack, push context'​s element value to the stack.
  
-Stack: ''​[...] [ctxId] [varId] -> [...] [varOffset]''​+Stack: ''​[...] [ctxId] [elemKey] -> [...] [elemValue]''​
 ---- ----
-====0C: ​load_ctx_var_offs_keep_ctx ​====+====0C: ​load_ctx_elem_keep_ctx ​====
 ''​0C''​ ''​0C''​
  
-Pop variable id from the stack, load context id from top of stack (do not pop context id). Push offset of variable ​to the stack.+Pop element key from the stack, load context id from top of stack (do not pop context id). Push context'​s element value to the stack.
  
-Stack: ''​[...] [ctxId] [varId] -> [...] [ctxId] [varOffset]''​+Stack: ''​[...] [ctxId] [elemKey] -> [...] [ctxId] [elemValue]''​
 ---- ----
-====0D: ​load_ctx_var ​====+====0D: ​load_ctx_elem_var ​====
 ''​0D''​ ''​0D''​
  
-Pop variable id and context id from the stack. ​Push context'​s variable ​value to the stack.+Pop element key and context id from the stack. ​Using the element'​s value as a variable offset, push context'​s variable to the stack.
  
-Stack: ''​[...] [ctxId] [varId] -> [...] [varValue]''​+Stack: ''​[...] [ctxId] [elemKey] -> [...] [varValue]''​
 ---- ----
 ====0E: unk0E ==== ====0E: unk0E ====
mission_impossible/sool_engine.1560886962.txt.gz · Last modified: 2019/06/18 19:42 by shygoo