Add preliminary support for ZSPR Format
This commit is contained in:
parent
1528489201
commit
1d223dc0b8
57
Rom.py
57
Rom.py
|
@ -7,6 +7,7 @@ import random
|
|||
import json
|
||||
import hashlib
|
||||
import logging
|
||||
import struct
|
||||
|
||||
JAP10HASH = '03a63945398191337e896e5771f77173'
|
||||
RANDOMIZERBASEHASH = '1deebb05eccefd2ab68297c6e9c0d25f'
|
||||
|
@ -97,8 +98,9 @@ class Sprite(object):
|
|||
default_glove_palette = [246, 82, 118, 3]
|
||||
|
||||
def __init__(self, filename):
|
||||
filedata = bytearray(open(filename, 'rb').read())
|
||||
self.valid=True
|
||||
with open(filename, 'rb') as file:
|
||||
filedata = bytearray(file.read())
|
||||
self.valid = True
|
||||
if len(filedata) == 0x7000:
|
||||
# sprite file with graphics and without palette data
|
||||
self.sprite = filedata[:0x7000]
|
||||
|
@ -109,13 +111,40 @@ class Sprite(object):
|
|||
self.sprite = filedata[:0x7000]
|
||||
self.palette = filedata[0x7000:]
|
||||
self.glove_palette = filedata[0x7036:0x7038] + filedata[0x7054:0x7056]
|
||||
elif len(filedata) == 0x707C:
|
||||
# sprite file with graphics and palette data including gloves
|
||||
self.sprite = filedata[:0x7000]
|
||||
self.palette = filedata[0x7000:0x7078]
|
||||
self.glove_palette = filedata[0x7078:]
|
||||
elif len(filedata) in [0x100000, 0x200000]:
|
||||
# full rom with patched sprite, extract it
|
||||
self.sprite = filedata[0x80000:0x87000]
|
||||
self.palette = filedata[0xDD308:0xDD380]
|
||||
self.glove_palette = filedata[0xDEDF5:0xDEDF9]
|
||||
elif filedata.startswith(b'ZSPR'):
|
||||
result = self.parse_zspr(filedata,1)
|
||||
print(result)
|
||||
if result is None:
|
||||
self.valid = False
|
||||
return
|
||||
(sprite, palette) = result
|
||||
if len(sprite) != 0x7000:
|
||||
self.valid = False
|
||||
return
|
||||
self.sprite = sprite
|
||||
if len(palette) == 0:
|
||||
self.palette = None
|
||||
self.glove_palette = None
|
||||
elif len(palette) == 0x78:
|
||||
self.palette = palette
|
||||
self.glove_palette = None
|
||||
elif len(palette) == 0x7C:
|
||||
self.palette = palette[:0x78]
|
||||
self.glove_palette = palette[0x78:]
|
||||
else:
|
||||
self.valid=False
|
||||
self.valid = False
|
||||
else:
|
||||
self.valid = False
|
||||
|
||||
def decode8(self, pos):
|
||||
arr=[[0 for _ in range(8)] for _ in range(8)]
|
||||
|
@ -144,6 +173,28 @@ class Sprite(object):
|
|||
arr[y+8][x+8] = bottom_right[y][x]
|
||||
return arr
|
||||
|
||||
def parse_zspr(self, filedata, expected_kind):
|
||||
headerstr = "<4xBHHIHIHH6x"
|
||||
headersize = struct.calcsize(headerstr)
|
||||
if len(filedata) < headersize:
|
||||
return None
|
||||
(version, csum, icsum, sprite_offset, sprite_size, palette_offset, palette_size, kind) = struct.unpack_from(headerstr,filedata)
|
||||
if version not in [1]:
|
||||
#ZSPR Version not supported
|
||||
return None
|
||||
if kind != expected_kind:
|
||||
return None
|
||||
|
||||
real_csum = sum(filedata) % 0x10000
|
||||
if real_csum != csum or real_csum ^ 0xFFFF != icsum:
|
||||
#invalid checksum
|
||||
pass
|
||||
sprite = filedata[sprite_offset:sprite_offset + sprite_size]
|
||||
palette = filedata[palette_offset:palette_offset + palette_size]
|
||||
#FIXME: Check lengths of those byte arrays against the _size values
|
||||
|
||||
return (sprite, palette)
|
||||
|
||||
def decode_palette(self):
|
||||
"Returns the palettes as an array of arrays of 15 colors"
|
||||
def array_chunk(arr,size):
|
||||
|
|
Loading…
Reference in New Issue