from segtypes.n64.segment import N64Segment from segtypes.n64.palette import iter_in_groups from util.color import unpack_color from util import options import png def parse_palette(data): palette = [] for a, b in iter_in_groups(data, 2): palette.append(unpack_color([a, b])) return palette class N64SegPm_charset_palettes(N64Segment): require_unique_name = False def scan(self, rom_bytes): data = rom_bytes[self.rom_start:self.rom_end] # pm_charset sibling self.sibling = next(filter(lambda s: s.type == "pm_charset" and s.name == self.name, self.parent.subsegments)) self.palettes = [] for i in range(0, self.size, 0x10): palette = parse_palette(data[i : i + 0x10]) self.palettes.append(palette) def split(self, rom_bytes): fs_dir = options.opts.asset_path / self.dir / self.name / "palette" fs_dir.mkdir(parents=True, exist_ok=True) for i, palette in enumerate(self.palettes): raster = self.sibling.rasters[0] w = png.Writer(self.sibling.width, self.sibling.height, palette=palette) with open(fs_dir / f"{i:02X}.png", "wb") as f: w.write_array(f, raster) def get_linker_entries(self): from segtypes.linker_entry import LinkerEntry fs_dir = options.opts.asset_path / self.dir / self.name / "palette" return [LinkerEntry( self, [fs_dir / f"{i:02X}.png" for i in range(self.yaml[3])], fs_dir.with_suffix(".dat"), ".data"), ]