37 lines
866 B
GDScript3
37 lines
866 B
GDScript3
|
extends Node
|
||
|
|
||
|
func ByteArray(size: int) -> PoolByteArray:
|
||
|
var arr := PoolByteArray()
|
||
|
arr.resize(size)
|
||
|
return arr
|
||
|
|
||
|
func LZ77_decompress(rom: File, address: int) -> PoolByteArray:
|
||
|
rom.seek(address)
|
||
|
var header := rom.get_32()
|
||
|
assert (header & 0x10 == 0x10)
|
||
|
var length := header >> 8
|
||
|
var output := ByteArray(length)
|
||
|
var ptr := 0
|
||
|
while ptr < length:
|
||
|
var bitmap := rom.get_8()
|
||
|
for i in range(8):
|
||
|
if (bitmap >> (7-i)) & 1:
|
||
|
# Buffer substitution
|
||
|
var h1 := rom.get_8()
|
||
|
var h2 := rom.get_8()
|
||
|
var copy_len := 3 + (h1 >> 4)
|
||
|
var copy_ptr := ptr - 1 - (((h1 & 0x0F)<<8) + h2)
|
||
|
for j in range(copy_len):
|
||
|
output[ptr] = output[copy_ptr]
|
||
|
copy_ptr += 1
|
||
|
ptr += 1
|
||
|
if ptr >= length:
|
||
|
return output
|
||
|
else:
|
||
|
# Literal byte
|
||
|
output[ptr] = rom.get_8()
|
||
|
ptr += 1
|
||
|
if ptr >= length:
|
||
|
return output
|
||
|
return output
|