papermario/tools/splat_ext/pm_charset_palettes.py
AltoXorg bfe9a42b06
some JP decomp (#1149)
* main segment cleanup

* engine1

* engine4

* evt

* entity

* engine2 msg split

* engine2 draft

* identify all gu functions

* font_width + charset

* update msg ids

* os stuff

* msg stuffs

* msg_copy_to_print_buffer

* popup_menu_draw_menu_contents

* appendGfx_message

* cleanup

* building fixed

* Change exceptasm symbols to not be global

---------

Co-authored-by: Ethan <ethteck@gmail.com>
2024-01-16 14:13:54 +09:00

65 lines
1.9 KiB
Python

from splat.segtypes.n64.segment import N64Segment
from splat.segtypes.n64.palette import iter_in_groups
from splat.util.color import unpack_color
from splat.util import options
import png # type: ignore
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 siblings
self.siblings = []
for s in self.parent.subsegments:
if s.type == "pm_charset":
if len(s.yaml) > 6:
charset_pal = s.yaml[6]
else:
charset_pal = s.name
if self.name == charset_pal:
self.siblings.append(s)
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.siblings[0].rasters[0]
w = png.Writer(self.siblings[0].width, self.siblings[0].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 splat.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",
".data",
),
]