From f558d0faa66ed34c0f71e6b5c0b0faaaceeb5306 Mon Sep 17 00:00:00 2001 From: Alex Bates Date: Wed, 18 Nov 2020 10:25:55 +0000 Subject: [PATCH 1/5] sonic --- tools/splat_ext/PaperMarioMessages.py | 55 ++++++++++++++++----------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/tools/splat_ext/PaperMarioMessages.py b/tools/splat_ext/PaperMarioMessages.py index 6a52397584..32141804f8 100644 --- a/tools/splat_ext/PaperMarioMessages.py +++ b/tools/splat_ext/PaperMarioMessages.py @@ -1,6 +1,8 @@ from segtypes.segment import N64Segment from pathlib import Path +import vmprof + CHARSET = { 0x00: "𝅘𝅥𝅮", 0x01: "!", @@ -349,6 +351,9 @@ class N64SegPaperMarioMessages(N64Segment): section_offsets.append(offset) pos += 4 + log = open("lol.bin", "w+b") + #vmprof.enable(log.fileno(), lines=True) + for i, section_offset in enumerate(section_offsets): name = f"{i:02X}" if len(self.files) >= i: @@ -376,6 +381,8 @@ class N64SegPaperMarioMessages(N64Segment): f.write(f"[message section=0x{i:02X} index={j}]\n") self.write_message_markup(data[msg_offset:], f) f.write("\n[/message]\n") + #vmprof.disable() + log.close() def get_ld_files(self): return [("", self.name, ".data")] @@ -400,31 +407,35 @@ class N64SegPaperMarioMessages(N64Segment): font = CHARSET def char_to_markup(self, data, charset=CHARSET): - value = None - char = int(data[0]) + pos = 0 + markup = [] - if char in charset: - value = charset[char] - elif None in charset: - value = charset[None] + while True: + char = data[pos] - if type(value) is str: - return value, 1 - if callable(value): - return value(data) - if type(value) is dict: - markup, delta = self.char_to_markup(data[1:], charset=value) + if char in charset: + value = charset[char] + elif None in charset: + value = charset[None] - if markup is None: + if value is None: + value = fallback + + if isinstance(value, str): + markup.append(value) + pos += 1 + break + elif callable(value): + more_markup, delta = value(data[1:]) + markup.append(more_markup) + pos += delta + break + elif isinstance(value, dict): if None in charset: - value = charset[None] - - if callable(value): - return value(data) - - return value, 1 + fallback = charset[None] + charset = value + pos += 1 else: - return markup, delta + 1 + raise ValueError(value) - - return None, 0 + return "".join(markup), pos # this is quicker than string appends From ec9684507448314c19b60ea8503126c8a9680005 Mon Sep 17 00:00:00 2001 From: Alex Bates Date: Wed, 18 Nov 2020 10:37:02 +0000 Subject: [PATCH 2/5] SPEED --- tools/splat_ext/PaperMarioMessages.py | 81 ++++++++++++--------------- 1 file changed, 37 insertions(+), 44 deletions(-) diff --git a/tools/splat_ext/PaperMarioMessages.py b/tools/splat_ext/PaperMarioMessages.py index 32141804f8..fc8ee7380a 100644 --- a/tools/splat_ext/PaperMarioMessages.py +++ b/tools/splat_ext/PaperMarioMessages.py @@ -374,13 +374,13 @@ class N64SegPaperMarioMessages(N64Segment): path = Path(base_path, self.name, name + ".msg") path.parent.mkdir(parents=True, exist_ok=True) - with open(path, "w") as f: + with open(path, "w") as self.f: for j, msg_offset in enumerate(msg_offsets): if j != 0: - f.write("\n") - f.write(f"[message section=0x{i:02X} index={j}]\n") - self.write_message_markup(data[msg_offset:], f) - f.write("\n[/message]\n") + self.f.write("\n") + self.f.write(f"[message section=0x{i:02X} index={j}]\n") + self.write_message_markup(data[msg_offset:]) + self.f.write("\n[/message]\n") #vmprof.disable() log.close() @@ -391,51 +391,44 @@ class N64SegPaperMarioMessages(N64Segment): def get_default_name(addr): return "msg" - def write_message_markup(self, data, f): + def write_message_markup(self, data): pos = 0 - font = CHARSET while data[pos] != 0xFD: - markup, delta = self.char_to_markup(data[pos:], charset=font) + self.charset = CHARSET - f.write(markup) - pos += delta + while True: + char = data[pos] - if markup == "[font=title]\n" or markup == "[font=subtitle]\n": - font = CHARSET_CREDITS - elif markup == "[font=normal]": - font = CHARSET + if char in self.charset: + value = self.charset[char] + elif None in self.charset: + value = self.charset[None] - def char_to_markup(self, data, charset=CHARSET): - pos = 0 - markup = [] + if value is None: + value = fallback - while True: - char = data[pos] + if isinstance(value, str): + self.write_markup(value) + pos += 1 + break + elif callable(value): + markup, delta = value(data[1:]) + self.write_markup(markup) + pos += delta + break + elif isinstance(value, dict): + if None in self.charset: + fallback = self.charset[None] + self.charset = value + pos += 1 + else: + raise ValueError(value) - if char in charset: - value = charset[char] - elif None in charset: - value = charset[None] + def write_markup(self, markup): + self.f.write(markup) - if value is None: - value = fallback - - if isinstance(value, str): - markup.append(value) - pos += 1 - break - elif callable(value): - more_markup, delta = value(data[1:]) - markup.append(more_markup) - pos += delta - break - elif isinstance(value, dict): - if None in charset: - fallback = charset[None] - charset = value - pos += 1 - else: - raise ValueError(value) - - return "".join(markup), pos # this is quicker than string appends + if markup == "[font=title]\n" or markup == "[font=subtitle]\n": + self.charset = CHARSET_CREDITS + elif markup == "[font=normal]": + self.charset = CHARSET From a7f5ed8a369da50592931c2ba901258a29cd2e76 Mon Sep 17 00:00:00 2001 From: Alex Bates Date: Wed, 18 Nov 2020 10:45:01 +0000 Subject: [PATCH 3/5] remove vmprof stuff --- tools/splat_ext/PaperMarioMessages.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tools/splat_ext/PaperMarioMessages.py b/tools/splat_ext/PaperMarioMessages.py index fc8ee7380a..60840a6bf7 100644 --- a/tools/splat_ext/PaperMarioMessages.py +++ b/tools/splat_ext/PaperMarioMessages.py @@ -1,8 +1,6 @@ from segtypes.segment import N64Segment from pathlib import Path -import vmprof - CHARSET = { 0x00: "𝅘𝅥𝅮", 0x01: "!", @@ -351,9 +349,6 @@ class N64SegPaperMarioMessages(N64Segment): section_offsets.append(offset) pos += 4 - log = open("lol.bin", "w+b") - #vmprof.enable(log.fileno(), lines=True) - for i, section_offset in enumerate(section_offsets): name = f"{i:02X}" if len(self.files) >= i: @@ -381,8 +376,6 @@ class N64SegPaperMarioMessages(N64Segment): self.f.write(f"[message section=0x{i:02X} index={j}]\n") self.write_message_markup(data[msg_offset:]) self.f.write("\n[/message]\n") - #vmprof.disable() - log.close() def get_ld_files(self): return [("", self.name, ".data")] From a35b085c174b5e3d08f48ccfaf4a64ec5f00aedd Mon Sep 17 00:00:00 2001 From: Alex Bates Date: Wed, 18 Nov 2020 10:56:56 +0000 Subject: [PATCH 4/5] fix credits font --- tools/splat_ext/PaperMarioMessages.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tools/splat_ext/PaperMarioMessages.py b/tools/splat_ext/PaperMarioMessages.py index 60840a6bf7..1b13cdd153 100644 --- a/tools/splat_ext/PaperMarioMessages.py +++ b/tools/splat_ext/PaperMarioMessages.py @@ -386,9 +386,10 @@ class N64SegPaperMarioMessages(N64Segment): def write_message_markup(self, data): pos = 0 + self.root_charset = CHARSET while data[pos] != 0xFD: - self.charset = CHARSET + self.charset = self.root_charset while True: char = data[pos] @@ -422,6 +423,6 @@ class N64SegPaperMarioMessages(N64Segment): self.f.write(markup) if markup == "[font=title]\n" or markup == "[font=subtitle]\n": - self.charset = CHARSET_CREDITS + self.root_charset = CHARSET_CREDITS elif markup == "[font=normal]": - self.charset = CHARSET + self.root_charset = CHARSET From 3c7ebe536d230d6fbdf3875f8e4e45297da183f1 Mon Sep 17 00:00:00 2001 From: Alex Bates Date: Wed, 18 Nov 2020 11:16:23 +0000 Subject: [PATCH 5/5] fix fallback lambdas --- tools/splat_ext/PaperMarioMessages.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/splat_ext/PaperMarioMessages.py b/tools/splat_ext/PaperMarioMessages.py index 1b13cdd153..07aac08679 100644 --- a/tools/splat_ext/PaperMarioMessages.py +++ b/tools/splat_ext/PaperMarioMessages.py @@ -407,7 +407,7 @@ class N64SegPaperMarioMessages(N64Segment): pos += 1 break elif callable(value): - markup, delta = value(data[1:]) + markup, delta = value(data[pos:]) self.write_markup(markup) pos += delta break