Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Some CGX files are LZ19, and some are LZ3. you have to try both
- bit_flipped = [
- sum(((byte >> i) & 1) << (7 - i) for i in range(8))
- for byte in range(0x100)
- ]
- def lc_lz19_Decompress(lz):
- addr = 0
- output = []
- while lz[addr] != 0xFF:
- cmd = lz[addr] >> 5
- if cmd == 7:
- cmd = (lz[addr] >> 2) & 0x7
- length = (lz[addr] & 0x3)*0x100 + lz[addr+1] + 1
- addr += 2
- else:
- length = (lz[addr] & 0x1F) + 1
- addr += 1
- if cmd==0:
- output += lz[addr:addr+length]
- addr += length
- elif cmd==1:
- val = lz[addr]
- addr += 1
- output += [val] * length
- elif cmd==2:
- val1 = lz[addr]
- addr += 1
- val2 = lz[addr]
- addr += 1
- output += [val1, val2] * length
- elif cmd==3:
- val = lz[addr]
- addr += 1
- for i in range(length):
- output += [(val+i)%256]
- elif cmd==4:
- outbuf_addr = lz[addr]*0x100 + lz[addr+1]
- addr += 2
- for i in range(length):
- output.append(output[outbuf_addr+i])
- elif cmd==5:
- outbuf_addr = lz[addr]*0x100 + lz[addr+1]
- addr += 2
- for i in range(length):
- output.append(bit_flipped[output[outbuf_addr+i]])
- elif cmd==6:
- outbuf_addr = lz[addr]*0x100 + lz[addr+1]
- addr += 2
- for i in range(length):
- output.append(output[outbuf_addr-i])
- else:
- print('unimplemented cmd '+str(cmd))
- 1/0
- return output
- def lc_lz3_Decompress(lz):
- addr = 0
- output = []
- while lz[addr] != 0xFF:
- cmd = lz[addr] >> 5
- if cmd == 7:
- cmd = (lz[addr] >> 2) & 0x7
- length = (lz[addr] & 0x3)*0x100 + lz[addr+1] + 1
- addr += 2
- else:
- length = (lz[addr] & 0x1F) + 1
- addr += 1
- if cmd==0:
- output += lz[addr:addr+length]
- addr += length
- elif cmd==1:
- val = lz[addr]
- addr += 1
- output += [val] * length
- elif cmd==2:
- vals = (lz[addr], lz[addr+1])
- addr += 2
- for i in range(length):
- output.append(vals[i%2])
- elif cmd==3:
- output += [0] * length
- elif cmd==4:
- if lz[addr] & 0x80:
- outbuf_addr = len(output) - 1 - (lz[addr]&0x7F)
- addr += 1
- else:
- outbuf_addr = lz[addr]*0x100 + lz[addr+1]
- addr += 2
- for i in range(length):
- output.append(output[outbuf_addr+i])
- elif cmd==5:
- if lz[addr] & 0x80:
- outbuf_addr = len(output) - 1 - (lz[addr]&0x7F)
- addr += 1
- else:
- outbuf_addr = lz[addr]*0x100 + lz[addr+1]
- addr += 2
- for i in range(length):
- output.append(bit_flipped[output[outbuf_addr+i]])
- elif cmd==6:
- if lz[addr] & 0x80:
- outbuf_addr = len(output) - 1 - (lz[addr]&0x7F)
- addr += 1
- else:
- outbuf_addr = lz[addr]*0x100 + lz[addr+1]
- addr += 2
- for i in range(length):
- output.append(output[outbuf_addr-i])
- else:
- print('unimplemented cmd '+str(cmd))
- 1/0
- return output
- def convertTxt(filename):
- print(filename)
- ret = []
- f=open(filename,'r')
- ignore_mode = False
- width=0
- height=0
- first_len = 0
- len_sum = 0
- prev_len = 0
- width_solved = False
- needsCommon = False
- for line in f:
- if 'ifn' in line:
- ignore_mode = True
- elif 'else' in line or 'endif' in line:
- ignore_mode = False
- elif not ignore_mode:
- if '\tdb' in line:
- words=re.sub(r';.*','',line).replace('\tdb','').strip().strip(',').split(',')
- if len(words) > 0 and not width_solved:
- if first_len == 0:
- first_len = len(words)
- width = len(words)
- if ';20' in line:
- needsCommon = True
- elif first_len == len(words) and prev_len != len(words):
- width = len_sum
- width_solved = True
- len_sum += len(words)
- prev_len = len(words)
- for word in words:
- word=word.strip()
- if word[0]!='0':
- print(word, word[0])
- assert word[0]=='0'
- assert word[-1]=='h'
- if len(word) == 4:
- ret.append(int(word[1:3], 16))
- elif len(word) == 6:
- 1/0
- ret.append(int(word[1:3], 16))
- ret.append(int(word[3:5], 16))
- else:
- 1/0
- elif '\tdw' in line:
- words=re.sub(r';.*','',line).replace('\tdw','').strip().strip(',').split(',')
- for word in words:
- word=word.strip()
- if len(word) == 5:
- word = '0'+word
- assert word[0]=='0'
- assert word[-1]=='h'
- if len(word) == 6:
- ret.append(int(word[3:5], 16))
- ret.append(int(word[1:3], 16))
- else:
- 1/0
- elif '\tdh' in line:
- 1/0 #todo
- f.close()
- if width != 0:
- height = len(ret)//width
- if '.CGX' in filename:
- ret_lz19 = lc_lz19_Decompress(ret)
- if len(ret_lz19)%0x100 == 0:
- ret = ret_lz19
- else:
- ret_lz3 = lc_lz3_Decompress(ret)
- if len(ret_lz3)%0x100 == 0:
- ret = ret_lz3
- else:
- 1/0
- f2=open('temp_'+filename.split('/')[-1]+'.2bpp','wb')
- f2.write(bytearray(ret))
- f2.close()
- return ret, width, height, needsCommon
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement