def from_stream(cls, stream, offset_gfx, offset_collision, palette): stream.seek(offset_gfx) tile_count = stream.read_uint() / 4 stream.seek(offset_gfx) tile_offsets = [] for _ in range(0, tile_count): offset = offset_gfx + stream.read_uint() tile_offsets.append(offset) # Read tile graphics. tiles = [] for offset in tile_offsets: stream.seek(offset) bitplane = Bitplane.from_stream(stream, BitplaneType.PLANAR, 32, 32, 4) surface = bitplane.create_surface(None, palette, 0, 0, MaskMode.NONE) tile = Tile() tile.surface = surface tiles.append(tile) # Read collision data. stream.seek(offset_collision) for tile in tiles: tile.collision = [0] * 16 for index in range(0, 16): tile.collision[index] = stream.read_ubyte() tile.render_collision() return cls(tiles)
def load_graphics(self, json_filename, directory): with open(json_filename, 'r') as fp: data = json.load(fp) # Read palettes. palettes = {} for filename, file_data in data.items(): filename = os.path.join(directory, filename) stream = StreamRead.from_file(filename, Endianness.BIG) for pal_name, pal_data in file_data['palettes'].items(): stream.seek(pal_data['offset']) palettes[pal_name] = Palette.from_stream(stream, pal_data['length'], 4) # Read and generate graphics. for filename, file_data in data.items(): filename = os.path.join(directory, filename) stream = StreamRead.from_file(filename, Endianness.BIG) for gfx in file_data['graphics']: width = gfx['width'] height = gfx['height'] planes = gfx['planes'] count = gfx['count'] palette = palettes[gfx['palette']] # Determine the bitplane mode to use. if gfx['mode'] == 'amiga_sprite': mode = BitplaneType.AMIGA_SPRITE elif gfx['mode'] == 'chunky': mode = BitplaneType.CHUNKY elif gfx['mode'] == 'planar': mode = BitplaneType.PLANAR else: raise Exception('Unknown bitplane mode "{}".'.format(gfx['mode'])) # Read all bitplanes in order. surfaces = [] stream.seek(gfx['offset']) for _ in range(0, count): bitplane = Bitplane.from_stream(stream, mode, width, height, planes) # Create a surface, and use a masking mode if needed. if gfx['mask'] == 'color_zero': surface = bitplane.create_surface(None, palette, 0, 0, MaskMode.INDEX) elif gfx['mask'] == 'none': surface = bitplane.create_surface(None, palette, 0, 0, MaskMode.NONE) elif gfx['mask'] == 'bitplane': if gfx['mode'] == 'planar': mask = bitplane.from_stream(stream, BitplaneType.PLANAR, width, height, planes) else: mask = bitplane.from_stream(stream, BitplaneType.CHUNKY, width, height, 1) surface = bitplane.create_surface(mask, palette, 0, 0, MaskMode.BITPLANE) else: raise Exception('Unknown mask mode "{}".'.format(gfx['mask'])) if gfx['flip_y']: surface = surface.flipped_y() surfaces.append(surface) if gfx['name'] in self.graphics: self.graphics[gfx['name']].extend(surfaces) else: self.graphics[gfx['name']] = surfaces