* implement jp msg

* replace

* .
This commit is contained in:
AltoXorg 2023-12-25 21:15:30 +08:00 committed by GitHub
parent c55c2c0017
commit 9b96f91dc6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 2740 additions and 1458 deletions

View File

@ -259,7 +259,7 @@ def write_ninja_rules(
ninja.rule( ninja.rule(
"msg", "msg",
description="msg $in", description="msg $in",
command=f"$python {BUILD_TOOLS}/msg/parse_compile.py $in $out", command=f"$python {BUILD_TOOLS}/msg/parse_compile.py $version $in $out",
) )
ninja.rule( ninja.rule(

View File

@ -116,7 +116,7 @@ def color_to_code(color, style):
).get(color) ).get(color)
CHARSET = { CHARSET_STANDARD = {
# "𝅘𝅥𝅮": 0x00, # "𝅘𝅥𝅮": 0x00,
"!": 0x01, "!": 0x01,
'"': 0x02, '"': 0x02,
@ -274,6 +274,7 @@ CHARSET = {
"": 0xA4, "": 0xA4,
"": 0xA5, "": 0xA5,
" ": 0xF7, " ": 0xF7,
" ": 0xF7,
# "Ⓐ": [0xFF, 0x24, 0xFF, 0x05, 0x10, 0x98, 0xFF, 0x25], # "Ⓐ": [0xFF, 0x24, 0xFF, 0x05, 0x10, 0x98, 0xFF, 0x25],
# "Ⓑ": [0xFF, 0x24, 0xFF, 0x05, 0x11, 0x99, 0xFF, 0x25], # "Ⓑ": [0xFF, 0x24, 0xFF, 0x05, 0x11, 0x99, 0xFF, 0x25],
# "Ⓢ": [0xFF, 0x24, 0xFF, 0x05, 0x12, 0xA1, 0xFF, 0x25], # "Ⓢ": [0xFF, 0x24, 0xFF, 0x05, 0x12, 0xA1, 0xFF, 0x25],
@ -329,8 +330,454 @@ CHARSET_CREDITS = {
"©": 0x27, "©": 0x27,
"&": 0x28, "&": 0x28,
" ": 0xF7, " ": 0xF7,
" ": 0xF8,
} }
CHARSET_KANA = {
"": 0x00,
"": 0x01,
"": 0x02,
"": 0x03,
"": 0x04,
"": 0x05,
"": 0x06,
"": 0x07,
"": 0x08,
"": 0x09,
"": 0x0A,
"": 0x0B,
"": 0x0C,
"": 0x0D,
"": 0x0E,
"": 0x0F,
"": 0x10,
"": 0x11,
"": 0x12,
"": 0x13,
"": 0x14,
"": 0x15,
"": 0x16,
"": 0x17,
"": 0x18,
"": 0x19,
"": 0x1A,
"": 0x1B,
"": 0x1C,
"": 0x1D,
"": 0x1E,
"": 0x1F,
"": 0x20,
"": 0x21,
"": 0x22,
"": 0x23,
"": 0x24,
"": 0x25,
"": 0x26,
"": 0x27,
"": 0x28,
"": 0x29,
"": 0x2A,
"": 0x2B,
"": 0x2C,
"": 0x2D,
"": 0x2E,
"": 0x2F,
"": 0x30,
"": 0x31,
"": 0x32,
"": 0x33,
"": 0x34,
"": 0x35,
"": 0x36,
"": 0x37,
"": 0x38,
"": 0x39,
"": 0x3A,
"": 0x3B,
"": 0x3C,
"": 0x3D,
"": 0x3E,
"": 0x3F,
"": 0x40,
"": 0x41,
"": 0x42,
"": 0x43,
"": 0x44,
"": 0x45,
"": 0x46,
"": 0x47,
"": 0x48,
"": 0x49,
"": 0x4A,
"": 0x4B,
"": 0x4C,
"": 0x4D,
"": 0x4E,
"": 0x4F,
"": 0x50,
"": 0x51,
"": 0x52,
"": 0x53,
"": 0x54,
"": 0x55,
"": 0x56,
"": 0x57,
"": 0x58,
"": 0x59,
"": 0x5A,
"": 0x5B,
"": 0x5C,
"": 0x5D,
"": 0x5E,
"": 0x5F,
"": 0x60,
"": 0x61,
"": 0x62,
"": 0x63,
"": 0x64,
"": 0x65,
"": 0x66,
"": 0x67,
"": 0x68,
"": 0x69,
"": 0x6A,
"": 0x6B,
"": 0x6C,
"": 0x6D,
"": 0x6E,
"": 0x6F,
"": 0x70,
"": 0x71,
"": 0x72,
"": 0x73,
"": 0x74,
"": 0x75,
"": 0x76,
"": 0x77,
"": 0x78,
"": 0x79,
"": 0x7A,
"": 0x7B,
"": 0x7C,
"": 0x7D,
"": 0x7E,
"": 0x7F,
"": 0x80,
"": 0x81,
"": 0x82,
"": 0x83,
"": 0x84,
"": 0x85,
"": 0x86,
"": 0x87,
"": 0x88,
"": 0x89,
"": 0x8A,
"": 0x8B,
"": 0x8C,
"": 0x8D,
"": 0x8E,
"": 0x8F,
"": 0x90,
"": 0x91,
"": 0x92,
"": 0x93,
"": 0x94,
"": 0x95,
"": 0x96,
"": 0x97,
"": 0x98,
"": 0x99,
"": 0x9A,
"": 0x9B,
"": 0x9C,
"": 0x9D,
"": 0x9E,
"": 0x9F,
"": 0xA0,
"": 0xA1,
"": 0xA2,
"": 0xA3,
"~": 0xA3,
# "―": 0xA4,
# "―": 0xA5,
# "―": 0xA6,
"": 0xA7,
"0": 0xA7,
"": 0xA8,
"1": 0xA8,
"": 0xA9,
"2": 0xA9,
"": 0xAA,
"3": 0xAA,
"": 0xAB,
"4": 0xAB,
"": 0xAC,
"5": 0xAC,
"": 0xAD,
"6": 0xAD,
"": 0xAE,
"7": 0xAE,
"": 0xAF,
"8": 0xAF,
"": 0xB0,
"9": 0xB0,
"[up]": 0xB1,
"[down]": 0xB2,
"[left]": 0xB3,
"[right]": 0xB4,
"": 0xB5,
"!": 0xB5,
"": 0xB6,
"?": 0xB6,
"": 0xB7,
"+": 0xB7,
"": 0xB8,
"": 0xB9,
"/": 0xB9,
"": 0xBA,
".": 0xBA,
"": 0xBB,
"&": 0xBB,
"": 0xBC,
"#": 0xBC,
"[heart]": 0xBD,
"[star]": 0xBE,
"": 0xBF,
"(": 0xBF,
"": 0xC0,
")": 0xC0,
"": 0xC1,
"": 0xC2,
"": 0xC3,
"[hiragana smalln]": 0xC4,
"[katakana smalln]": 0xC5,
"": 0xC6,
# 0xC7 is unused
" ": 0xF7,
" ": 0xF8,
}
CHARSET_LATIN = {
"A": 0x00,
"": 0x00,
"B": 0x01,
"": 0x01,
"C": 0x02,
"": 0x02,
"D": 0x03,
"": 0x03,
"E": 0x04,
"": 0x04,
"F": 0x05,
"": 0x05,
"G": 0x06,
"": 0x06,
"H": 0x07,
"": 0x07,
"I": 0x08,
"": 0x08,
"J": 0x09,
"": 0x09,
"K": 0x0A,
"": 0x0A,
"L": 0x0B,
"": 0x0B,
"M": 0x0C,
"": 0x0C,
"N": 0x0D,
"": 0x0D,
"O": 0x0E,
"": 0x0E,
"P": 0x0F,
"": 0x0F,
"Q": 0x10,
"": 0x10,
"R": 0x11,
"": 0x11,
"S": 0x12,
"": 0x12,
"T": 0x13,
"": 0x13,
"U": 0x14,
"": 0x14,
"V": 0x15,
"": 0x15,
"W": 0x16,
"": 0x16,
"X": 0x17,
"": 0x17,
"Y": 0x18,
"": 0x18,
"Z": 0x19,
"": 0x19,
"z": 0x1A,
"": 0x1A,
" ": 0xF7,
" ": 0xF8,
}
CHARSET_KANJI = {
"": 0x00,
"": 0x01,
"": 0x02,
"": 0x03,
"": 0x04,
"": 0x05,
"西": 0x06,
"": 0x07,
"": 0x08,
"": 0x09,
"": 0x0A,
"": 0x0B,
"": 0x0C,
"": 0x0D,
"": 0x0E,
"": 0x0F,
"": 0x10,
"": 0x11,
"": 0x12,
"": 0x13,
"": 0x14,
"": 0x15,
"": 0x16,
"": 0x17,
"": 0x18,
"": 0x19,
"": 0x1A,
"": 0x1B,
"": 0x1C,
"": 0x1D,
"": 0x1E,
"": 0x1F,
"": 0x20,
"": 0x21,
"": 0x22,
"": 0x23,
"": 0x24,
"": 0x25,
"": 0x26,
"": 0x27,
"": 0x28,
"": 0x29,
"": 0x2A,
"": 0x2B,
"": 0x2C,
"": 0x2D,
"": 0x2E,
"": 0x2F,
"": 0x30,
"": 0x31,
"": 0x32,
"": 0x33,
"": 0x34,
"": 0x35,
"": 0x36,
"": 0x37,
"": 0x38,
"": 0x39,
"": 0x3A,
"": 0x3B,
"": 0x3C,
"": 0x3D,
"": 0x3E,
"": 0x3F,
"使": 0x40,
"": 0x41,
"": 0x42,
"": 0x43,
"": 0x44,
"": 0x45,
"": 0x46,
"": 0x47,
"": 0x48,
"": 0x49,
"": 0x4A,
"": 0x4B,
"": 0x4C,
"": 0x4D,
"": 0x4E,
"": 0x4F,
"": 0x50,
"": 0x51,
"": 0x52,
"": 0x53,
"": 0x54,
"": 0x55,
"": 0x56,
"": 0x57,
"": 0x58,
"": 0x59,
"": 0x5A,
"": 0x5B,
"": 0x5C,
"": 0x5D,
"": 0x5E,
"": 0x5F,
"": 0x60,
"[circle]": 0x61,
"[cross]": 0x62,
"": 0x63,
"": 0x64,
"": 0x65,
"": 0x66,
"": 0x67,
"": 0x68,
"": 0x69,
"[note]": 0x6A,
"": 0x6B,
"": 0x6C,
"": 0x6D,
"": 0x6E,
"": 0x6F,
"": 0x70,
"": 0x71,
"": 0x72,
"": 0x73,
"": 0x74,
"": 0x75,
"": 0x76,
"": 0x77,
"": 0x78,
"x": 0x78,
" ": 0xF7,
" ": 0xF8,
}
CHARSET_BUTTONS = {
"[~a]": 0x00,
"[~b]": 0x01,
"[~start]": 0x02,
"[~c-up]": 0x03,
"[~c-down]": 0x04,
"[~c-left]": 0x05,
"[~c-right]": 0x06,
"[~z]": 0x07,
"[~l]": 0x08,
"[~r]": 0x09,
}
def check_if_correct_charset(char, cur_charset, filename, lineno):
warn_msg = f"{filename}:{lineno}: Warning: character '{char}' is present but is completely in a wrong charset currently set. Add {{}} before the character to silence this warning."
if char == " " or char == " ":
return -1, cur_charset
elif char in CHARSET_KANA and cur_charset is not CHARSET_KANA:
print(warn_msg.format("[Charset Kana]"))
return 0, CHARSET_KANA
elif char in CHARSET_LATIN and cur_charset is not CHARSET_LATIN:
print(warn_msg.format("[Charset Latin]"))
return 1, CHARSET_LATIN
elif char in CHARSET_KANJI and cur_charset is not CHARSET_KANJI:
print(warn_msg.format("[Charset Kanji]"))
return 2, CHARSET_KANJI
elif char in CHARSET_BUTTONS and cur_charset is not CHARSET_BUTTONS:
print(warn_msg.format("[Charset Buttons]"))
return 3, CHARSET_BUTTONS
return -1, cur_charset
def strip_c_comments(text): def strip_c_comments(text):
def replacer(match): def replacer(match):
@ -349,11 +796,12 @@ def strip_c_comments(text):
if __name__ == "__main__": if __name__ == "__main__":
if len(argv) < 3: if len(argv) < 3:
print("usage: parse_compile.py [in.msg] [out.msgpack] [--c]") print("usage: parse_compile.py [version] [in.msg] [out.msgpack] [--c]")
exit(1) exit(1)
filename = argv[1] version = argv[1]
outfile = argv[2] filename = argv[2]
outfile = argv[3]
is_output_format_c = "--c" in argv is_output_format_c = "--c" in argv
messages = [] messages = []
@ -366,7 +814,10 @@ if __name__ == "__main__":
directive = "" directive = ""
indent_level = 0 indent_level = 0
charset = CHARSET if version == "jp":
charset = CHARSET_KANA
else:
charset = CHARSET_STANDARD
font_stack = [0] font_stack = [0]
sound_stack = [0] sound_stack = [0]
color_stack = [0x0A] color_stack = [0x0A]
@ -433,6 +884,11 @@ if __name__ == "__main__":
message = Message(name, section, index) message = Message(name, section, index)
messages.append(message) messages.append(message)
if version == "jp":
charset = CHARSET_KANA
else:
charset = CHARSET_STANDARD
while source[0] != "{": while source[0] != "{":
source = source[1:] source = source[1:]
@ -557,6 +1013,8 @@ if __name__ == "__main__":
message.bytes += [0x09, index] message.bytes += [0x09, index]
elif style == "popup": elif style == "popup":
message.bytes += [0x0A] message.bytes += [0x0A]
elif style == "popup2":
message.bytes += [0x0B]
elif style == "upgrade": elif style == "upgrade":
pos = named_args.get("pos") pos = named_args.get("pos")
@ -592,6 +1050,8 @@ if __name__ == "__main__":
font = 0 font = 0
elif font == "menu": elif font == "menu":
font = 1 font = 1
elif font == "menu2":
font = 2
elif font == "title": elif font == "title":
font = 3 font = 3
elif font == "subtitle": elif font == "subtitle":
@ -607,7 +1067,10 @@ if __name__ == "__main__":
if font == 3 or font == 4: if font == 3 or font == 4:
charset = CHARSET_CREDITS charset = CHARSET_CREDITS
else: else:
charset = CHARSET if version == "jp":
charset = CHARSET_KANA
else:
charset = CHARSET_STANDARD
# elif command == "/font": # elif command == "/font":
# font_stack.pop() # font_stack.pop()
# message.bytes += [0xFF, 0x00, font_stack[0]] # message.bytes += [0xFF, 0x00, font_stack[0]]
@ -616,6 +1079,41 @@ if __name__ == "__main__":
# charset = CHARSET_CREDITS # charset = CHARSET_CREDITS
# else: # else:
# charset = CHARSET # charset = CHARSET
elif command == "charset":
if version != "jp":
print(f"{filename}:{lineno}: charset command is only supported in the JP version")
exit(1)
if len(args) != 1:
print(f"{filename}:{lineno}: charset command requires 1 parameter")
exit(1)
arg_charset = args[0]
if arg_charset == "kana":
arg_charset = 0
elif arg_charset == "latin":
arg_charset = 1
elif arg_charset == "kanji":
arg_charset = 2
elif arg_charset == "buttons":
arg_charset = 3
if type(arg_charset) is not int:
print(f"{filename}:{lineno}: unknown charset '{arg_charset}'")
exit(1)
message.bytes += [0xF3 + arg_charset]
if arg_charset == 0:
charset = CHARSET_KANA
elif arg_charset == 1:
charset = CHARSET_LATIN
elif arg_charset == 2:
charset = CHARSET_KANJI
elif arg_charset == 3:
charset = CHARSET_BUTTONS
elif command == "inputoff": elif command == "inputoff":
message.bytes += [0xFF, 0x07] message.bytes += [0xFF, 0x07]
elif command == "inputon": elif command == "inputon":
@ -686,6 +1184,12 @@ if __name__ == "__main__":
message.bytes += [0xFF, 0x11, *args] message.bytes += [0xFF, 0x11, *args]
elif command == "right": elif command == "right":
if len(args) == 0: if len(args) == 0:
if version == "jp":
charset_byte, charset = check_if_correct_charset("[right]", charset, filename, lineno)
if charset_byte != -1:
message.bytes += [0xF3 + charset_byte]
message.bytes += [0xB4]
else:
message.bytes += [0x95] message.bytes += [0x95]
else: else:
if len(args) != 1: if len(args) != 1:
@ -695,6 +1199,12 @@ if __name__ == "__main__":
message.bytes += [0xFF, 0x12, args[0]] message.bytes += [0xFF, 0x12, args[0]]
elif command == "down": elif command == "down":
if len(args) == 0: if len(args) == 0:
if version == "jp":
charset_byte, charset = check_if_correct_charset("[down]", charset, filename, lineno)
if charset_byte != -1:
message.bytes += [0xF3 + charset_byte]
message.bytes += [0xB2]
else:
message.bytes += [0x93] message.bytes += [0x93]
else: else:
if len(args) != 1: if len(args) != 1:
@ -704,6 +1214,12 @@ if __name__ == "__main__":
message.bytes += [0xFF, 0x13, args[0]] message.bytes += [0xFF, 0x13, args[0]]
elif command == "up": elif command == "up":
if len(args) == 0: if len(args) == 0:
if version == "jp":
charset_byte, charset = check_if_correct_charset("[up]", charset, filename, lineno)
if charset_byte != -1:
message.bytes += [0xF3 + charset_byte]
message.bytes += [0xB1]
else:
message.bytes += [0x92] message.bytes += [0x92]
else: else:
if len(args) != 1: if len(args) != 1:
@ -1015,6 +1531,19 @@ if __name__ == "__main__":
elif command == "a": elif command == "a":
color_code = color_to_code("blue", "button") color_code = color_to_code("blue", "button")
assert color_code is not None assert color_code is not None
if version == "jp":
message.bytes += [
0xFF,
0x24,
0xFF,
0x05,
color_code,
0xF6,
0x00,
0xFF,
0x25,
]
else:
message.bytes += [ message.bytes += [
0xFF, 0xFF,
0x24, 0x24,
@ -1031,6 +1560,19 @@ if __name__ == "__main__":
named_args.get("ctx", "button"), named_args.get("ctx", "button"),
) )
assert color_code is not None assert color_code is not None
if version == "jp":
message.bytes += [
0xFF,
0x24,
0xFF,
0x05,
color_code,
0xF6,
0x01,
0xFF,
0x25,
]
else:
message.bytes += [ message.bytes += [
0xFF, 0xFF,
0x24, 0x24,
@ -1047,6 +1589,19 @@ if __name__ == "__main__":
named_args.get("ctx", "button"), named_args.get("ctx", "button"),
) )
assert color_code is not None assert color_code is not None
if version == "jp":
message.bytes += [
0xFF,
0x24,
0xFF,
0x05,
color_code,
0xF6,
0x08,
0xFF,
0x25,
]
else:
message.bytes += [ message.bytes += [
0xFF, 0xFF,
0x24, 0x24,
@ -1063,6 +1618,19 @@ if __name__ == "__main__":
named_args.get("ctx", "button"), named_args.get("ctx", "button"),
) )
assert color_code is not None assert color_code is not None
if version == "jp":
message.bytes += [
0xFF,
0x24,
0xFF,
0x05,
color_code,
0xF6,
0x09,
0xFF,
0x25,
]
else:
message.bytes += [ message.bytes += [
0xFF, 0xFF,
0x24, 0x24,
@ -1076,6 +1644,19 @@ if __name__ == "__main__":
elif command == "z": elif command == "z":
color_code = color_to_code("grey", "button") color_code = color_to_code("grey", "button")
assert color_code is not None assert color_code is not None
if version == "jp":
message.bytes += [
0xFF,
0x24,
0xFF,
0x05,
color_code,
0xF6,
0x07,
0xFF,
0x25,
]
else:
message.bytes += [ message.bytes += [
0xFF, 0xFF,
0x24, 0x24,
@ -1092,6 +1673,19 @@ if __name__ == "__main__":
named_args.get("ctx", "button"), named_args.get("ctx", "button"),
) )
assert color_code is not None assert color_code is not None
if version == "jp":
message.bytes += [
0xFF,
0x24,
0xFF,
0x05,
color_code,
0xF6,
0x03,
0xFF,
0x25,
]
else:
message.bytes += [ message.bytes += [
0xFF, 0xFF,
0x24, 0x24,
@ -1108,6 +1702,19 @@ if __name__ == "__main__":
named_args.get("ctx", "button"), named_args.get("ctx", "button"),
) )
assert color_code is not None assert color_code is not None
if version == "jp":
message.bytes += [
0xFF,
0x24,
0xFF,
0x05,
color_code,
0xF6,
0x04,
0xFF,
0x25,
]
else:
message.bytes += [ message.bytes += [
0xFF, 0xFF,
0x24, 0x24,
@ -1124,6 +1731,19 @@ if __name__ == "__main__":
named_args.get("ctx", "button"), named_args.get("ctx", "button"),
) )
assert color_code is not None assert color_code is not None
if version == "jp":
message.bytes += [
0xFF,
0x24,
0xFF,
0x05,
color_code,
0xF6,
0x05,
0xFF,
0x25,
]
else:
message.bytes += [ message.bytes += [
0xFF, 0xFF,
0x24, 0x24,
@ -1140,6 +1760,19 @@ if __name__ == "__main__":
named_args.get("ctx", "button"), named_args.get("ctx", "button"),
) )
assert color_code is not None assert color_code is not None
if version == "jp":
message.bytes += [
0xFF,
0x24,
0xFF,
0x05,
color_code,
0xF6,
0x06,
0xFF,
0x25,
]
else:
message.bytes += [ message.bytes += [
0xFF, 0xFF,
0x24, 0x24,
@ -1156,6 +1789,19 @@ if __name__ == "__main__":
named_args.get("ctx", "button"), named_args.get("ctx", "button"),
) # ) #
assert color_code is not None assert color_code is not None
if version == "jp":
message.bytes += [
0xFF,
0x24,
0xFF,
0x05,
color_code,
0xF6,
0x02,
0xFF,
0x25,
]
else:
message.bytes += [ message.bytes += [
0xFF, 0xFF,
0x24, 0x24,
@ -1167,37 +1813,171 @@ if __name__ == "__main__":
0x25, 0x25,
] ]
elif command == "~a": elif command == "~a":
if version == "jp":
charset_byte, charset = check_if_correct_charset("[~a]", charset, filename, lineno)
if charset_byte != -1:
message.bytes += [0xF3 + charset_byte]
message.bytes += [0x00]
else:
message.bytes += [0x98] message.bytes += [0x98]
elif command == "~b": elif command == "~b":
if version == "jp":
charset_byte, charset = check_if_correct_charset("[~b]", charset, filename, lineno)
if charset_byte != -1:
message.bytes += [0xF3 + charset_byte]
message.bytes += [0x01]
else:
message.bytes += [0x99] message.bytes += [0x99]
elif command == "~l": elif command == "~l":
if version == "jp":
charset_byte, charset = check_if_correct_charset("[~l]", charset, filename, lineno)
if charset_byte != -1:
message.bytes += [0xF3 + charset_byte]
message.bytes += [0x08]
else:
message.bytes += [0x9A] message.bytes += [0x9A]
elif command == "~r": elif command == "~r":
if version == "jp":
charset_byte, charset = check_if_correct_charset("[~r]", charset, filename, lineno)
if charset_byte != -1:
message.bytes += [0xF3 + charset_byte]
message.bytes += [0x09]
else:
message.bytes += [0x9B] message.bytes += [0x9B]
elif command == "~z": elif command == "~z":
if version == "jp":
charset_byte, charset = check_if_correct_charset("[~z]", charset, filename, lineno)
if charset_byte != -1:
message.bytes += [0xF3 + charset_byte]
message.bytes += [0x07]
else:
message.bytes += [0x9C] message.bytes += [0x9C]
elif command == "~c-up": elif command == "~c-up":
if version == "jp":
charset_byte, charset = check_if_correct_charset("[~c-up]", charset, filename, lineno)
if charset_byte != -1:
message.bytes += [0xF3 + charset_byte]
message.bytes += [0x03]
else:
message.bytes += [0x9D] message.bytes += [0x9D]
elif command == "~c-down": elif command == "~c-down":
if version == "jp":
charset_byte, charset = check_if_correct_charset("[~c-down]", charset, filename, lineno)
if charset_byte != -1:
message.bytes += [0xF3 + charset_byte]
message.bytes += [0x04]
else:
message.bytes += [0x9E] message.bytes += [0x9E]
elif command == "~c-left": elif command == "~c-left":
if version == "jp":
charset_byte, charset = check_if_correct_charset("[~c-left]", charset, filename, lineno)
if charset_byte != -1:
message.bytes += [0xF3 + charset_byte]
message.bytes += [0x05]
else:
message.bytes += [0x9F] message.bytes += [0x9F]
elif command == "~c-right": elif command == "~c-right":
if version == "jp":
charset_byte, charset = check_if_correct_charset("[~c-right]", charset, filename, lineno)
if charset_byte != -1:
message.bytes += [0xF3 + charset_byte]
message.bytes += [0x06]
else:
message.bytes += [0xA0] message.bytes += [0xA0]
elif command == "~start": elif command == "~start":
if version == "jp":
charset_byte, charset = check_if_correct_charset("[~start]", charset, filename, lineno)
if charset_byte != -1:
message.bytes += [0xF3 + charset_byte]
message.bytes += [0x02]
else:
message.bytes += [0xA1] message.bytes += [0xA1]
elif command == "note": elif command == "note":
if version == "jp":
charset_byte, charset = check_if_correct_charset("[note]", charset, filename, lineno)
if charset_byte != -1:
message.bytes += [0xF3 + charset_byte]
message.bytes += [0x6A]
else:
message.bytes += [0x00] message.bytes += [0x00]
elif command == "heart": elif command == "heart":
if version == "jp":
charset_byte, charset = check_if_correct_charset("[heart]", charset, filename, lineno)
if charset_byte != -1:
message.bytes += [0xF3 + charset_byte]
message.bytes += [0xBD]
else:
message.bytes += [0x90] message.bytes += [0x90]
elif command == "star": elif command == "star":
if version == "jp":
charset_byte, charset = check_if_correct_charset("[star]", charset, filename, lineno)
if charset_byte != -1:
message.bytes += [0xF3 + charset_byte]
message.bytes += [0xBE]
else:
message.bytes += [0x91] message.bytes += [0x91]
elif command == "left": elif command == "left":
if version == "jp":
charset_byte, charset = check_if_correct_charset("[left]", charset, filename, lineno)
if charset_byte != -1:
message.bytes += [0xF3 + charset_byte]
message.bytes += [0xB3]
else:
message.bytes += [0x94] message.bytes += [0x94]
elif command == "circle": elif command == "circle":
if version == "jp":
charset_byte, charset = check_if_correct_charset("[circle]", charset, filename, lineno)
if charset_byte != -1:
message.bytes += [0xF3 + charset_byte]
message.bytes += [0x61]
else:
message.bytes += [0x96] message.bytes += [0x96]
elif command == "cross": elif command == "cross":
if version == "jp":
charset_byte, charset = check_if_correct_charset("[cross]", charset, filename, lineno)
if charset_byte != -1:
message.bytes += [0xF3 + charset_byte]
message.bytes += [0x62]
else:
message.bytes += [0x97] message.bytes += [0x97]
elif command == "katakana":
if version != "jp":
print(f"{filename}:{lineno}: Command katakana is only supported in the JP version")
exit(1)
kana_char = args[0]
if kana_char == "smalln":
charset_byte, charset = check_if_correct_charset(
"[katakana smalln]", charset, filename, lineno
)
if charset_byte != -1:
message.bytes += [0xF3 + charset_byte]
message.bytes += [0xC5]
else:
print(f"{filename}:{lineno}: Invalid or unimplemented katakana character name {kana_char}")
exit(1)
elif command == "hiragana":
if version != "jp":
print(f"{filename}:{lineno}: Command hiragana is only supported in the JP version")
exit(1)
kana_char = args[0]
if kana_char == "smalln":
charset_byte, charset = check_if_correct_charset(
"[hiragana smalln]", charset, filename, lineno
)
if charset_byte != -1:
message.bytes += [0xF3 + charset_byte]
message.bytes += [0xC4]
else:
print(f"{filename}:{lineno}: Invalid or unimplemented hiragana character name {kana_char}")
exit(1)
elif command == "fullspace":
message.bytes += [0xF8]
elif command == "halfspace":
message.bytes += [0xF9]
elif command == "savepos": elif command == "savepos":
message.bytes += [0xFF, 0x22] message.bytes += [0xFF, 0x22]
elif command == "restorepos": elif command == "restorepos":
@ -1255,6 +2035,28 @@ if __name__ == "__main__":
if source[0] == "\\": if source[0] == "\\":
source = source[1:] source = source[1:]
if version == "jp" and charset is not CHARSET_CREDITS:
charset_byte, charset = check_if_correct_charset(source[0], charset, filename, lineno)
if charset_byte != -1:
message.bytes += [0xF3 + charset_byte]
elif (
source[0] not in CHARSET_KANA
and source[0] not in CHARSET_LATIN
and source[0] not in CHARSET_KANJI
and source[0] not in CHARSET_BUTTONS
):
print(f"{filename}:{lineno}: unsupported character '{source[0]}' for current font")
exit(1)
data = charset[source[0]]
if type(data) is int:
message.bytes.append(data)
else:
message.bytes += data
source = source[1:]
else:
if source[0] in charset: if source[0] in charset:
data = charset[source[0]] data = charset[source[0]]

1152
tools/splat_ext/msg_jp.yaml Normal file

File diff suppressed because it is too large Load Diff

View File

@ -7,7 +7,182 @@ import re
import pylibyaml import pylibyaml
import yaml as yaml_loader import yaml as yaml_loader
CHARSET = {
CHARSET_COMMON = {
0xF7: " ",
0xF0: "[BR]\n",
0xF1: "[Wait]",
0xF2: {None: lambda d: (f"[Pause {d[0]}]", 1)},
0xF3: "[Variant0]",
0xF4: "[Variant1]",
0xF5: "[Variant2]",
0xF6: "[Variant3]",
0xFB: "[Next]\n",
0xFC: {
0x01: "[Style right]\n",
0x02: "[Style left]\n",
0x03: "[Style center]\n",
0x04: "[Style tattle]\n",
0x05: {
None: lambda d: (
f"[Style choice pos={d[0]},{d[1]} size={d[2]},{d[3]}]\n",
4,
)
},
0x06: "[Style inspect]\n",
0x07: "[Style sign]\n",
0x08: {None: lambda d: (f"[Style lamppost height={d[0]}]\n", 1)},
0x09: {None: lambda d: (f"[Style postcard index={d[0]}]\n", 1)},
0x0A: "[Style popup]\n",
0x0B: "[Style popup2]\n",
0x0C: {
None: lambda d: (
f"[Style upgrade pos={d[0]},{d[1]} size={d[2]},{d[3]}]\n",
4,
)
},
0x0D: "[Style narrate]\n",
0x0E: "[Style epilogue]\n",
},
0xFF: {
0x00: {
0: "[Font standard]\n",
1: "[Font menu]\n",
2: "[Font menu2]\n",
3: "[Font title]\n",
4: "[Font subtitle]\n",
},
0x04: "[Yield]",
0x05: {
# 0x0A: "[color:normal]",
# 0x20: "[color:red]",
# 0x21: "[color:pink]",
# 0x22: "[color:purple]",
# 0x23: "[color:blue]",
# 0x24: "[color:cyan]",
# 0x25: "[color:green]",
# 0x26: "[color:yellow]",
# 0x00: "[color=normal ctx=diary]",
# 0x07: "[color=red ctx=diary]",
# 0x17: "[color=dark ctx=inspect]",
# 0x18: "[color=normal ctx=sign]",
# 0x19: "[color=red ctx=sign]",
# 0x1A: "[color=blue ctx=sign]",
# 0x1B: "[color=green ctx=sign]",
# 0x28: "[color=red ctx=popup]",
# 0x29: "[color=pink ctx=popup]",
# 0x2A: "[color=purple ctx=popup]",
# 0x2B: "[color=blue ctx=popup]",
# 0x2C: "[color=teal ctx=popup]",
# 0x2D: "[color=green ctx=popup]",
# 0x2E: "[color=yellow ctx=popup]",
# 0x2F: "[color=normal ctx=popup]",
None: lambda d: (f"[Color 0x{d[0]:X}]", 1),
},
0x07: "[InputOff]\n",
0x08: "[InputOn]\n",
0x09: "[DelayOff]\n",
0x0A: "[DelayOn]\n",
0x0B: {None: lambda d: (f"[CharWidth {d[0]}]", 1)},
0x0C: {None: lambda d: (f"[Scroll {d[0]}]", 1)},
0x0D: {None: lambda d: (f"[Size {d[0]},{d[1]}]\n", 2)},
0x0E: "[SizeReset]\n",
0x0F: {None: lambda d: (f"[Speed delay={d[0]} chars={d[1]}]", 2)},
0x10: {None: lambda d: (f"[SetPosX {(d[0] << 8) + d[1]}]", 2)},
0x11: {None: lambda d: (f"[SetPosY {d[0]}]", 1)},
0x12: {None: lambda d: (f"[Right {d[0]}]", 1)},
0x13: {None: lambda d: (f"[Down {d[0]}]", 1)},
0x14: {None: lambda d: (f"[Up {d[0]}]", 1)},
0x15: {None: lambda d: (f"[InlineImage index={d[0]}]\n", 1)},
0x16: {
None: lambda d: (
f"[AnimSprite spriteID=0x{d[0]:02X}{d[1]:02X} raster={d[2]}]\n",
3,
)
},
0x17: {None: lambda d: (f"[ItemIcon itemID=0x{d[0]:02X}{d[1]:02X}]\n", 2)},
0x18: {
None: lambda d: (
f"[Image index={d[0]} pos={(d[1] << 8) + d[2]},{d[3]} hasBorder={d[4]} alpha={d[5]} fadeAmount={d[6]}]\n",
7,
)
},
0x19: {None: lambda d: (f"[HideImage fadeAmount={d[0]}]\n", 1)},
0x1A: {None: lambda d: (f"[AnimDelay index={d[1]} delay={d[2]}]", 3)},
0x1B: {None: lambda d: (f"[AnimLoop {d[0]} {d[1]}]", 2)},
0x1C: {None: lambda d: (f"[AnimDone {d[0]}]", 1)},
0x1E: {None: lambda d: (f"[Cursor {d[0]}]", 1)},
0x1F: {None: lambda d: (f"[EndChoice {d[0]}]", 1)},
0x20: {None: lambda d: (f"[SetCancel {d[0]}]", 1)},
0x21: {None: lambda d: (f"[Option {d[0]}]", 1)},
0x22: "[SavePos]",
0x23: "[RestorePos]",
0x24: {
0xFF: {
0x05: {
0x10: {0x98: {0xFF: {0x25: "[A]"}}},
0x11: {0x99: {0xFF: {0x25: "[B]"}}},
0x12: {0xA1: {0xFF: {0x25: "[START]"}}},
0x13: {
0x9D: {0xFF: {0x25: "[C-UP]"}},
0x9E: {0xFF: {0x25: "[C-DOWN]"}},
0x9F: {0xFF: {0x25: "[C-LEFT]"}},
0xA0: {0xFF: {0x25: "[C-RIGHT]"}},
},
0x14: {0x9C: {0xFF: {0x25: "[Z]"}}},
}
}
},
# 0x24: "[SaveColor]",
# 0x25: "[RestoreColor]",
0x26: {
0x00: "[Shake]",
0x01: "[Wave]",
0x02: "[NoiseOutline]",
0x03: {None: lambda d: (f"[Static {d[0]}]", 1)},
0x05: {None: lambda d: (f"[Blur dir={['x', 'y', 'xy'][d[0]]}]", 1)},
0x07: {None: lambda d: (f"[DitherFade {d[0]}]", 1)},
0x0A: "[PrintRising]",
0x0B: "[PrintGrowing]",
0x0C: "[SizeJitter]",
0x0D: "[SizeWave]",
0x0E: "[DropShadow]",
},
0x27: {
0x00: "[/Shake]",
0x01: "[/Wave]",
0x03: "[/Static]",
0x05: "[/Blur]",
0x07: "[/DitherFade]",
0x0A: "[/PrintRising]",
0x0B: "[/PrintGrowing]",
0x0C: "[/SizeJitter]",
0x0D: "[/SizeWave]",
0x0E: "[/DropShadow]",
},
0x28: {None: lambda d: (f"[Var {d[0]}]", 1)},
0x29: {None: lambda d: (f"[CenterX {d[0]}]", 1)},
0x2B: "[EnableCDownNext]",
0x2C: {
None: lambda d: (
f"[CustomVoice soundIDs=0x{d[0]:02X}{d[1]:02X}{d[2]:02X}{d[3]:02X},0x{d[4]:02X}{d[5]:02X}{d[6]:02X}{d[7]:02X}]",
8,
)
},
0x2E: {None: lambda d: (f"[Volume {d[0]}]", 1)},
0x2F: {
0: "[Voice normal]\n",
1: "[Voice bowser]\n",
2: "[Voice star]\n",
None: lambda d: (f"[Voice {d[0]}]\n", 1),
},
# None: lambda d: (f"[func_{d[0]:02X}]", 1),
},
None: lambda d: (f"[Raw 0x{d[0]:02X}]", 1),
}
CHARSET_STANDARD = {
**CHARSET_COMMON,
0x00: "[NOTE]", 0x00: "[NOTE]",
0x01: "!", 0x01: "!",
0x02: '"', 0x02: '"',
@ -174,178 +349,10 @@ CHARSET = {
0xA3: "", 0xA3: "",
0xA4: "", 0xA4: "",
0xA5: "", 0xA5: "",
0xF7: " ",
0xF0: "[BR]\n",
0xF1: "[Wait]",
0xF2: {None: lambda d: (f"[Pause {d[0]}]", 1)},
0xF3: "[Variant0]",
0xF4: "[Variant1]",
0xF5: "[Variant2]",
0xF6: "[Variant3]",
0xFB: "[Next]\n",
0xFC: {
0x01: "[Style right]\n",
0x02: "[Style left]\n",
0x03: "[Style center]\n",
0x04: "[Style tattle]\n",
0x05: {
None: lambda d: (
f"[Style choice pos={d[0]},{d[1]} size={d[2]},{d[3]}]\n",
4,
)
},
0x06: "[Style inspect]\n",
0x07: "[Style sign]\n",
0x08: {None: lambda d: (f"[Style lamppost height={d[0]}]\n", 1)},
0x09: {None: lambda d: (f"[Style postcard index={d[0]}]\n", 1)},
0x0A: "[Style popup]\n",
0x0C: {
None: lambda d: (
f"[Style upgrade pos={d[0]},{d[1]} size={d[2]},{d[3]}]\n",
4,
)
},
0x0D: "[Style narrate]\n",
0x0E: "[Style epilogue]\n",
},
0xFF: {
0x00: {
0: "[Font standard]\n",
1: "[Font menu]\n",
3: "[Font title]\n",
4: "[Font subtitle]\n",
},
0x04: "[Yield]",
0x05: {
# 0x0A: "[color:normal]",
# 0x20: "[color:red]",
# 0x21: "[color:pink]",
# 0x22: "[color:purple]",
# 0x23: "[color:blue]",
# 0x24: "[color:cyan]",
# 0x25: "[color:green]",
# 0x26: "[color:yellow]",
# 0x00: "[color=normal ctx=diary]",
# 0x07: "[color=red ctx=diary]",
# 0x17: "[color=dark ctx=inspect]",
# 0x18: "[color=normal ctx=sign]",
# 0x19: "[color=red ctx=sign]",
# 0x1A: "[color=blue ctx=sign]",
# 0x1B: "[color=green ctx=sign]",
# 0x28: "[color=red ctx=popup]",
# 0x29: "[color=pink ctx=popup]",
# 0x2A: "[color=purple ctx=popup]",
# 0x2B: "[color=blue ctx=popup]",
# 0x2C: "[color=teal ctx=popup]",
# 0x2D: "[color=green ctx=popup]",
# 0x2E: "[color=yellow ctx=popup]",
# 0x2F: "[color=normal ctx=popup]",
None: lambda d: (f"[Color 0x{d[0]:X}]", 1),
},
0x07: "[InputOff]\n",
0x08: "[InputOn]\n",
0x09: "[DelayOff]\n",
0x0A: "[DelayOn]\n",
0x0B: {None: lambda d: (f"[CharWidth {d[0]}]", 1)},
0x0C: {None: lambda d: (f"[Scroll {d[0]}]", 1)},
0x0D: {None: lambda d: (f"[Size {d[0]},{d[1]}]\n", 2)},
0x0E: "[SizeReset]\n",
0x0F: {None: lambda d: (f"[Speed delay={d[0]} chars={d[1]}]", 2)},
0x10: {None: lambda d: (f"[SetPosX {(d[0] << 8) + d[1]}]", 2)},
0x11: {None: lambda d: (f"[SetPosY {d[0]}]", 1)},
0x12: {None: lambda d: (f"[Right {d[0]}]", 1)},
0x13: {None: lambda d: (f"[Down {d[0]}]", 1)},
0x14: {None: lambda d: (f"[Up {d[0]}]", 1)},
0x15: {None: lambda d: (f"[InlineImage index={d[0]}]\n", 1)},
0x16: {
None: lambda d: (
f"[AnimSprite spriteID=0x{d[0]:02X}{d[1]:02X} raster={d[2]}]\n",
3,
)
},
0x17: {None: lambda d: (f"[ItemIcon itemID=0x{d[0]:02X}{d[1]:02X}]\n", 2)},
0x18: {
None: lambda d: (
f"[Image index={d[0]} pos={(d[1] << 8) + d[2]},{d[3]} hasBorder={d[4]} alpha={d[5]} fadeAmount={d[6]}]\n",
7,
)
},
0x19: {None: lambda d: (f"[HideImage fadeAmount={d[0]}]\n", 1)},
0x1A: {None: lambda d: (f"[AnimDelay index={d[1]} delay={d[2]}]", 3)},
0x1B: {None: lambda d: (f"[AnimLoop {d[0]} {d[1]}]", 2)},
0x1C: {None: lambda d: (f"[AnimDone {d[0]}]", 1)},
0x1E: {None: lambda d: (f"[Cursor {d[0]}]", 1)},
0x1F: {None: lambda d: (f"[EndChoice {d[0]}]", 1)},
0x20: {None: lambda d: (f"[SetCancel {d[0]}]", 1)},
0x21: {None: lambda d: (f"[Option {d[0]}]", 1)},
0x22: "[SavePos]",
0x23: "[RestorePos]",
0x24: {
0xFF: {
0x05: {
0x10: {0x98: {0xFF: {0x25: "[A]"}}},
0x11: {0x99: {0xFF: {0x25: "[B]"}}},
0x12: {0xA1: {0xFF: {0x25: "[START]"}}},
0x13: {
0x9D: {0xFF: {0x25: "[C-UP]"}},
0x9E: {0xFF: {0x25: "[C-DOWN]"}},
0x9F: {0xFF: {0x25: "[C-LEFT]"}},
0xA0: {0xFF: {0x25: "[C-RIGHT]"}},
},
0x14: {0x9C: {0xFF: {0x25: "[Z]"}}},
}
}
},
# 0x24: "[SaveColor]",
# 0x25: "[RestoreColor]",
0x26: {
0x00: "[Shake]",
0x01: "[Wave]",
0x02: "[NoiseOutline]",
0x03: {None: lambda d: (f"[Static {d[0]}]", 1)},
0x05: {None: lambda d: (f"[Blur dir={['x', 'y', 'xy'][d[0]]}]", 1)},
0x07: {None: lambda d: (f"[DitherFade {d[0]}]", 1)},
0x0A: "[PrintRising]",
0x0B: "[PrintGrowing]",
0x0C: "[SizeJitter]",
0x0D: "[SizeWave]",
0x0E: "[DropShadow]",
},
0x27: {
0x00: "[/Shake]",
0x01: "[/Wave]",
0x03: "[/Static]",
0x05: "[/Blur]",
0x07: "[/DitherFade]",
0x0A: "[/PrintRising]",
0x0B: "[/PrintGrowing]",
0x0C: "[/SizeJitter]",
0x0D: "[/SizeWave]",
0x0E: "[/DropShadow]",
},
0x28: {None: lambda d: (f"[Var {d[0]}]", 1)},
0x29: {None: lambda d: (f"[CenterX {d[0]}]", 1)},
0x2B: "[EnableCDownNext]",
0x2C: {
None: lambda d: (
f"[CustomVoice soundIDs=0x{d[0]:02X}{d[1]:02X}{d[2]:02X}{d[3]:02X},{d[4]:02X}{d[5]:02X}{d[6]:02X}{d[7]:02X}]",
8,
)
},
0x2E: {None: lambda d: (f"[Volume {d[0]}]", 1)},
0x2F: {
0: "[Voice normal]\n",
1: "[Voice bowser]\n",
2: "[Voice star]\n",
None: lambda d: (f"[Voice {d[0]}]\n", 1),
},
# None: lambda d: (f"[func_{d[0]:02X}]", 1),
},
None: lambda d: (f"[Raw 0x{d[0]:02X}]", 1),
} }
CHARSET_CREDITS = { CHARSET_CREDITS = {
**CHARSET, **CHARSET_COMMON,
0x00: "A", 0x00: "A",
0x01: "B", 0x01: "B",
0x02: "C", 0x02: "C",
@ -387,7 +394,419 @@ CHARSET_CREDITS = {
0x26: "9", 0x26: "9",
0x27: "©", 0x27: "©",
0x28: "&", 0x28: "&",
}
CHARSET_JP_COMMON = {
**CHARSET_COMMON,
0xF3: "[Charset Kana]",
0xF4: "[Charset Latin]",
0xF5: "[Charset Kanji]",
0xF6: "[Charset Buttons]",
0xF7: " ", 0xF7: " ",
0xF8: " ",
0xF9: "[HALFSPACE]",
0xFF: {
**CHARSET_COMMON[0xFF],
0x24: {
0xFF: {
0x05: {
0x10: {0xF6: {0x00: {0xFF: {0x25: "[A]"}}}},
0x11: {0xF6: {0x01: {0xFF: {0x25: "[B]"}}}},
0x12: {0xF6: {0x02: {0xFF: {0x25: "[START]"}}}},
0x13: {
0xF6: {
0x03: {0xFF: {0x25: "[C-UP]"}},
0x04: {0xFF: {0x25: "[C-DOWN]"}},
0x05: {0xFF: {0x25: "[C-LEFT]"}},
0x06: {0xFF: {0x25: "[C-RIGHT]"}},
}
},
0x14: {
0xF6: {
0x07: {0xFF: {0x25: "[Z]"}},
0x08: {0xFF: {0x25: "[L]"}},
0x09: {0xFF: {0x25: "[R]"}},
}
},
}
}
},
},
}
CHARSET_KANA = {
**CHARSET_JP_COMMON,
0x00: "",
0x01: "",
0x02: "",
0x03: "",
0x04: "",
0x05: "",
0x06: "",
0x07: "",
0x08: "",
0x09: "",
0x0A: "",
0x0B: "",
0x0C: "",
0x0D: "",
0x0E: "",
0x0F: "",
0x10: "",
0x11: "",
0x12: "",
0x13: "",
0x14: "",
0x15: "",
0x16: "",
0x17: "",
0x18: "",
0x19: "",
0x1A: "",
0x1B: "",
0x1C: "",
0x1D: "",
0x1E: "",
0x1F: "",
0x20: "",
0x21: "",
0x22: "",
0x23: "",
0x24: "",
0x25: "",
0x26: "",
0x27: "",
0x28: "",
0x29: "",
0x2A: "",
0x2B: "",
0x2C: "",
0x2D: "",
0x2E: "",
0x2F: "",
0x30: "",
0x31: "",
0x32: "",
0x33: "",
0x34: "",
0x35: "",
0x36: "",
0x37: "",
0x38: "",
0x39: "",
0x3A: "",
0x3B: "",
0x3C: "",
0x3D: "",
0x3E: "",
0x3F: "",
0x40: "",
0x41: "",
0x42: "",
0x43: "",
0x44: "",
0x45: "",
0x46: "",
0x47: "",
0x48: "",
0x49: "",
0x4A: "",
0x4B: "",
0x4C: "",
0x4D: "",
0x4E: "",
0x4F: "",
0x50: "",
0x51: "",
0x52: "",
0x53: "",
0x54: "",
0x55: "",
0x56: "",
0x57: "",
0x58: "",
0x59: "",
0x5A: "",
0x5B: "",
0x5C: "",
0x5D: "",
0x5E: "",
0x5F: "",
0x60: "",
0x61: "",
0x62: "",
0x63: "",
0x64: "",
0x65: "",
0x66: "",
0x67: "",
0x68: "",
0x69: "",
0x6A: "",
0x6B: "",
0x6C: "",
0x6D: "",
0x6E: "",
0x6F: "",
0x70: "",
0x71: "",
0x72: "",
0x73: "",
0x74: "",
0x75: "",
0x76: "",
0x77: "",
0x78: "",
0x79: "",
0x7A: "",
0x7B: "",
0x7C: "",
0x7D: "",
0x7E: "",
0x7F: "",
0x80: "",
0x81: "",
0x82: "",
0x83: "",
0x84: "",
0x85: "",
0x86: "",
0x87: "",
0x88: "",
0x89: "",
0x8A: "",
0x8B: "",
0x8C: "",
0x8D: "",
0x8E: "",
0x8F: "",
0x90: "",
0x91: "",
0x92: "",
0x93: "",
0x94: "",
0x95: "",
0x96: "",
0x97: "",
0x98: "",
0x99: "",
0x9A: "",
0x9B: "",
0x9C: "",
0x9D: "",
0x9E: "",
0x9F: "",
0xA0: "",
0xA1: "",
0xA2: "",
0xA3: "",
0xA4: {0xA5: {0xA6: "[LONGDASH]"}},
0xA7: "",
0xA8: "",
0xA9: "",
0xAA: "",
0xAB: "",
0xAC: "",
0xAD: "",
0xAE: "",
0xAF: "",
0xB0: "",
0xB1: "[UP]",
0xB2: "[DOWN]",
0xB3: "[LEFT]",
0xB4: "[RIGHT]",
0xB5: "",
0xB6: "",
0xB7: "",
0xB8: "",
0xB9: "",
0xBA: "",
0xBB: "",
0xBC: "",
0xBD: "[HEART]",
0xBE: "[STAR]",
0xBF: "",
0xC0: "",
0xC1: "",
0xC2: "",
0xC3: "",
0xC4: "[HIRAGANA SmallN]",
0xC5: "[KATAKANA SmallN]",
# existing characters without small counterparts
# 0xC4: "ん",
# 0xC5: "ン",
0xC6: "",
# 0xC7 is unused
}
CHARSET_LATIN = {
**CHARSET_JP_COMMON,
0x00: "",
0x01: "",
0x02: "",
0x03: "",
0x04: "",
0x05: "",
0x06: "",
0x07: "",
0x08: "",
0x09: "",
0x0A: "",
0x0B: "",
0x0C: "",
0x0D: "",
0x0E: "",
0x0F: "",
0x10: "",
0x11: "",
0x12: "",
0x13: "",
0x14: "",
0x15: "",
0x16: "",
0x17: "",
0x18: "",
0x19: "",
0x1A: "",
}
CHARSET_KANJI = {
**CHARSET_JP_COMMON,
0x00: "",
0x01: "",
0x02: "",
0x03: "",
0x04: "",
0x05: "",
0x06: "西",
0x07: "",
0x08: "",
0x09: "",
0x0A: "",
0x0B: "",
0x0C: "",
0x0D: "",
0x0E: "",
0x0F: "",
0x10: "",
0x11: "",
0x12: "",
0x13: "",
0x14: "",
0x15: "",
0x16: "",
0x17: "",
0x18: "",
0x19: "",
0x1A: "",
0x1B: "",
0x1C: "",
0x1D: "",
0x1E: "",
0x1F: "",
0x20: "",
0x21: "",
0x22: "",
0x23: "",
0x24: "",
0x25: "",
0x26: "",
0x27: "",
0x28: "",
0x29: "",
0x2A: "",
0x2B: "",
0x2C: "",
0x2D: "",
0x2E: "",
0x2F: "",
0x30: "",
0x31: "",
0x32: "",
0x33: "",
0x34: "",
0x35: "",
0x36: "",
0x37: "",
0x38: "",
0x39: "",
0x3A: "",
0x3B: "",
0x3C: "",
0x3D: "",
0x3E: "",
0x3F: "",
0x40: "使",
0x41: "",
0x42: "",
0x43: "",
0x44: "",
0x45: "",
0x46: "",
0x47: "",
0x48: "",
0x49: "",
0x4A: "",
0x4B: "",
0x4C: "",
0x4D: "",
0x4E: "",
0x4F: "",
0x50: "",
0x51: "",
0x52: "",
0x53: "",
0x54: "",
0x55: "",
0x56: "",
0x57: "",
0x58: "",
0x59: "",
0x5A: "",
0x5B: "",
0x5C: "",
0x5D: "",
0x5E: "",
0x5F: "",
0x60: "",
0x61: "[CIRCLE]",
0x62: "[CROSS]",
0x63: "",
0x64: "",
0x65: "",
0x66: "",
0x67: "",
0x68: "",
0x69: "",
0x6A: "[NOTE]",
0x6B: "",
0x6C: "",
0x6D: "",
0x6E: "",
0x6F: "",
0x70: "",
0x71: "",
0x72: "",
0x73: "",
0x74: "",
0x75: "",
0x76: "",
0x77: "",
0x78: "",
}
CHARSET_BUTTONS = {
**CHARSET_JP_COMMON,
0x00: "[~A]",
0x01: "[~B]",
0x02: "[~START]",
0x03: "[~C-UP]",
0x04: "[~C-DOWN]",
0x05: "[~C-LEFT]",
0x06: "[~C-RIGHT]",
0x07: "[~Z]",
0x08: "[~L]",
0x09: "[~R]",
} }
@ -488,7 +907,10 @@ class N64SegPm_msg(N64Segment):
def write_message_markup(self, data): def write_message_markup(self, data):
pos = 0 pos = 0
self.root_charset = CHARSET if "ver/jp" in str(options.opts.target_path):
self.root_charset = CHARSET_KANA
else:
self.root_charset = CHARSET_STANDARD
while data[pos] != 0xFD: while data[pos] != 0xFD:
self.charset = self.root_charset self.charset = self.root_charset
@ -531,7 +953,16 @@ class N64SegPm_msg(N64Segment):
if markup_lower == "[font title]\n" or markup_lower == "[font subtitle]\n": if markup_lower == "[font title]\n" or markup_lower == "[font subtitle]\n":
self.root_charset = CHARSET_CREDITS self.root_charset = CHARSET_CREDITS
elif markup_lower == "[font standard]": elif markup_lower == "[font standard]":
self.root_charset = CHARSET self.root_charset = CHARSET_STANDARD
elif "ver/jp" in str(options.opts.target_path):
if markup_lower == "[charset kana]":
self.root_charset = CHARSET_KANA
elif markup_lower == "[charset latin]":
self.root_charset = CHARSET_LATIN
elif markup_lower == "[charset kanji]":
self.root_charset = CHARSET_KANJI
elif markup_lower == "[charset buttons]":
self.root_charset = CHARSET_BUTTONS
def cache(self): def cache(self):
return (self.yaml, self.rom_end, self.msg_names) return (self.yaml, self.rom_end, self.msg_names)

File diff suppressed because it is too large Load Diff

View File

@ -3282,8 +3282,60 @@ segments:
- [0x1C7F208, bin ] - [0x1C7F208, bin ]
- start: 0x1D40000 - start: 0x1D40000
type: bin type: pm_msg
name: pm_msg # TODO: fix message dumping for JP name: msg_jp
files:
- 00_Intro
- 01_Outro
- 02_ToadTownGate
- 03_ToadTownPlaza
- 04_ToadTownBridge
- 05_ToadTownStation
- 06_ToadTownHousing
- 07_ToadTownPort
- 08_Minigame
- 09_CastleGrounds
- 0A_ShootingStarSummit
- 0B_Prologue
- 0C_Chapter1
- 0D_Chapter2
- 0E_Chapter3
- 0F_Chapter4
- 10_Chapter5
- 11_Chapter6
- 12_Chapter7
- 13_Chapter8
- 14_Peach
- 15_KootFavors
- 16_RussTHints
- 17_Unused
- 18_Unused
- 19_NewsBoard
- 1A_GossipBoard
- 1B_MapTattles
- 1C_NpcTattles
- 1D_EntityTattles
- 1E_EnemyTattles
- 1F_Unused
- 20_Menus
- 21_Choices
- 22_MenuTips
- 23_Documents
- 24_QuizQuestions
- 25_QuizChoices
- 26_MerlonHints
- 27_MerluvleeHints
- 28_ShortItemDesc
- 29_ShopItemDesc
- 2A_FullItemDesc
- 2B_ItemNames
- 2C_PlayerMoves
- 2D_Shops
- 2E_PartnerDesc
- 2F_PartnerMoves
- 30_TestStrings
- 31_EnemyNames
- 32_Credits
- [0x1DDBE60, bin] - [0x1DDBE60, bin]
- [0x1E00000, pm_map_data, mapfs] - [0x1E00000, pm_map_data, mapfs]