Advertisement
Dyrati

Decompression

Oct 19th, 2019
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.13 KB | None | 0 0
  1. function getNextBit(number,bitAddr)
  2.     b = bit.band(number,1)
  3.     number = bit.rshift(number,1)
  4.     bitAddr = bitAddr + 1
  5.     if bit.band(bitAddr,31) == 0 then
  6.         number = memory.readdword(bit.rshift(bitAddr,3))
  7.     end
  8.     return b,number,bitAddr
  9. end
  10.  
  11. function decompressText(textIndex)
  12.  
  13.     local charTablePointer = memory.readdword(0x08038578) -- 08060C30 pointer to charDataAddr and treeOffsetTableAddr
  14.     local dataPointer = memory.readdword(0x080385DC) -- 080A9F54 table of addresses related to compressed data
  15.     local txtDataPntrs = dataPointer + bit.lshift(bit.rshift(textIndex,8),3) -- base compressed data address, address of table of text lengths
  16.     local baseAddr = memory.readdword(txtDataPntrs)
  17.     local txtLenAddr = memory.readdword(txtDataPntrs + 4)
  18.     textIndex = bit.band(textIndex,0xFF)
  19.  
  20.     -- Gets address of compressed text data
  21.     local i = 0
  22.     while i < textIndex do
  23.         local txtLen = memory.readbyte(txtLenAddr + i)
  24.         baseAddr = baseAddr + txtLen
  25.         if txtLen ~= 0xFF then i = i + 1 end
  26.     end
  27.  
  28.     local previousChar = 0
  29.     local charString = ""
  30.     local dataBitAddr = bit.lshift(baseAddr,3)
  31.     local data = bit.rshift(memory.readdword(bit.band(baseAddr,-4)), bit.lshift(bit.band(baseAddr,3),3))
  32.  
  33.     repeat
  34.  
  35.         local charDataPointer = 0x08060C30 + bit.lshift(bit.rshift(previousChar,8),3) -- addresses of charData and table of offsets
  36.         previousChar = bit.band(previousChar,0xFF)
  37.         local charDataAddr = memory.readdword(charDataPointer)
  38.         local charOffsetTableAddr = memory.readdword(charDataPointer + 4)
  39.         local charOffset = memory.readword(charOffsetTableAddr + 2*previousChar)
  40.         local charTreeAddr = charDataAddr + charOffset
  41.         local treeBitAddr = bit.lshift(charTreeAddr,3)
  42.         local byteOffset = bit.band(charTreeAddr,3)
  43.         charTreeAddr = charTreeAddr - byteOffset
  44.         local charTree = bit.rshift(memory.readdword(charTreeAddr),8*byteOffset)
  45.         local charAddr = treeBitAddr - 12
  46.  
  47.         -- Gets the next character by navigating the chartree using the compressed data
  48.         while true do
  49.  
  50.             treeBit,charTree,treeBitAddr = getNextBit(charTree,treeBitAddr)
  51.             if treeBit == 1 then break end
  52.  
  53.             dataBit,data,dataBitAddr = getNextBit(data,dataBitAddr)
  54.             if dataBit == 1 then
  55.                 local depth = 0
  56.                 while depth >=0 do
  57.                     treeBit,charTree,treeBitAddr = getNextBit(charTree,treeBitAddr)
  58.                     while treeBit == 0 do
  59.                         treeBit,charTree,treeBitAddr = getNextBit(charTree,treeBitAddr)
  60.                         depth = depth + 1
  61.                     end
  62.                     depth = depth - 1
  63.                     charAddr = charAddr - 12
  64.                 end
  65.             end
  66.         end
  67.  
  68.         charValue = memory.readword(bit.rshift(charAddr - bit.band(charAddr,7),3))
  69.         charValue = bit.band(bit.rshift(charValue,bit.band(charAddr,7)),0xFFF)
  70.         charString = charString..string.char(bit.band(charValue,0xFF))
  71.         previousChar = charValue
  72.  
  73.     until charValue == 0
  74.     return charString
  75. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement