summaryrefslogtreecommitdiff
path: root/include/message_data_fmt_nes.h
diff options
context:
space:
mode:
authorDerek Hensley <hensley.derek58@gmail.com>2024-10-12 17:03:44 -0700
committerGitHub <noreply@github.com>2024-10-12 21:03:44 -0300
commit0514d963d9fcf16cc77f39880445db5271766b3d (patch)
treec92960ec175008b3b3be89427cf0b799fd5206c3 /include/message_data_fmt_nes.h
parent7bb0e9287d4b6978273c9b015b3f54aad1631bae (diff)
Port over OoT's new text pipeline (#1685)
* Port OoT's new msgdis and msgenc * format * Remove item_ids try block * Update assets/text/charmap.txt Co-authored-by: Tharo <17233964+Thar0@users.noreply.github.com> --------- Co-authored-by: Tharo <17233964+Thar0@users.noreply.github.com>
Diffstat (limited to 'include/message_data_fmt_nes.h')
-rw-r--r--include/message_data_fmt_nes.h526
1 files changed, 204 insertions, 322 deletions
diff --git a/include/message_data_fmt_nes.h b/include/message_data_fmt_nes.h
index f2f58f96e..949cf9465 100644
--- a/include/message_data_fmt_nes.h
+++ b/include/message_data_fmt_nes.h
@@ -1,339 +1,221 @@
#ifndef MESSAGE_DATA_FMT_NES_H
#define MESSAGE_DATA_FMT_NES_H
-/*
- * Macros to create both a constant and a string literal from a magic value
- * The constants are used in code files when parsing text for various purposes
- * The strings are used in the message_data_static files themselves, as you can only concat strings with other strings
- */
-
-#ifndef GLUE
-#define GLUE(a, b) a##b
-#endif
-
-#define STRINGIFY(s) #s
-#define EXPAND_AND_STRINGIFY(s) STRINGIFY(s)
-
-#define HEX(N) GLUE(0x, N)
-#define STR(N) EXPAND_AND_STRINGIFY(GLUE(\x, N))
-
+#include "sfx.h" // For sfx ids
/*
* Text control characters
*/
-// Control character magic values, in 2-digit hex without prefix
-#define CTRL_COLOR_DEFAULT 00
-#define CTRL_COLOR_RED 01
-#define CTRL_COLOR_GREEN 02
-#define CTRL_COLOR_BLUE 03
-#define CTRL_COLOR_YELLOW 04
-#define CTRL_COLOR_LIGHTBLUE 05
-#define CTRL_COLOR_PINK 06
-#define CTRL_COLOR_SILVER 07
-#define CTRL_COLOR_ORANGE 08
-#define CTRL_TEXT_SPEED 0A // Note this should take an arg 0 to 6, but always just sets next decode char as 0
-#define CTRL_HS_BOAT_ARCHERY 0B
-#define CTRL_STRAY_FAIRIES 0C
-#define CTRL_TOKENS 0D
-#define CTRL_POINTS_TENS 0E
-#define CTRL_POINTS_THOUSANDS 0F
-#define CTRL_BOX_BREAK 10
-#define CTRL_NEWLINE 11
-#define CTRL_BOX_BREAK2 12
-#define CTRL_CARRIAGE_RETURN 13
-#define CTRL_SHIFT 14
-#define CTRL_CONTINUE 15
-#define CTRL_NAME 16
-#define CTRL_QUICKTEXT_ENABLE 17
-#define CTRL_QUICKTEXT_DISABLE 18
-#define CTRL_EVENT 19
-#define CTRL_PERSISTENT 1A
-#define CTRL_BOX_BREAK_DELAYED 1B
-#define CTRL_FADE 1C
-#define CTRL_FADE_SKIPPABLE 1D
-#define CTRL_SFX 1E
-#define CTRL_DELAY 1F
-#define CTRL_BTN_A B0
-#define CTRL_BTN_B B1
-#define CTRL_BTN_C B2
-#define CTRL_BTN_L B3
-#define CTRL_BTN_R B4
-#define CTRL_BTN_Z B5
-#define CTRL_BTN_CUP B6
-#define CTRL_BTN_CDOWN B7
-#define CTRL_BTN_CLEFT B8
-#define CTRL_BTN_CRIGHT B9
-#define CTRL_Z_TARGET BA
-#define CTRL_CONTROL_PAD BB
-#define CTRL_END BF
-#define CTRL_BACKGROUND C1
-#define CTRL_TWO_CHOICE C2
-#define CTRL_THREE_CHOICE C3
-#define CTRL_TIMER_POSTMAN C4
-#define CTRL_TIMER_MINIGAME_1 C5
-#define CTRL_TIMER_2 C6
-#define CTRL_TIMER_MOON_CRASH C7
-#define CTRL_TIMER_MINIGAME_2 C8
-#define CTRL_TIMER_ENV_HAZARD C9
-#define CTRL_TIME CA
-#define CTRL_CHEST_FLAGS CB
-#define CTRL_INPUT_BANK CC
-#define CTRL_RUPEES_SELECTED CD
-#define CTRL_RUPEES_TOTAL CE
-#define CTRL_TIME_UNTIL_MOON_CRASH CF
-#define CTRL_INPUT_DOGGY_RACETRACK_BET D0
-#define CTRL_INPUT_BOMBER_CODE D1
-#define CTRL_PAUSE_MENU D2
-#define CTRL_TIME_SPEED D3
-#define CTRL_OWL_WARP D4
-#define CTRL_INPUT_LOTTERY_CODE D5
-#define CTRL_SPIDER_HOUSE_MASK_CODE D6
-#define CTRL_STRAY_FAIRIES_LEFT_WOODFALL D7
-#define CTRL_STRAY_FAIRIES_LEFT_SNOWHEAD D8
-#define CTRL_STRAY_FAIRIES_LEFT_GREAT_BAY D9
-#define CTRL_STRAY_FAIRIES_LEFT_STONE_TOWER DA
-#define CTRL_POINTS_BOAT_ARCHERY DB // Seems to be the exact same as CTRL_POINTS_THOUSANDS
-#define CTRL_LOTTERY_CODE DC
-#define CTRL_LOTTERY_CODE_GUESS DD
-#define CTRL_HELD_ITEM_PRICE DE
-#define CTRL_BOMBER_CODE DF
-#define CTRL_EVENT2 E0 // Seems to be the exact same as CTRL_EVENT
-#define CTRL_SPIDER_HOUSE_MASK_CODE_1 E1
-#define CTRL_SPIDER_HOUSE_MASK_CODE_2 E2
-#define CTRL_SPIDER_HOUSE_MASK_CODE_3 E3
-#define CTRL_SPIDER_HOUSE_MASK_CODE_4 E4
-#define CTRL_SPIDER_HOUSE_MASK_CODE_5 E5
-#define CTRL_SPIDER_HOUSE_MASK_CODE_6 E6
-#define CTRL_HOURS_UNTIL_MOON_CRASH E7
-#define CTRL_TIME_UNTIL_NEW_DAY E8
-#define CTRL_HS_POINTS_BANK_RUPEES F0
-#define CTRL_HS_POINTS_UNK_1 F1
-#define CTRL_HS_POINTS_FISHING F2
-#define CTRL_HS_TIME_BOAT_ARCHERY F3 // Note this interprets the highscore value as a time (not the actual timer for the minigame)
-#define CTRL_HS_TIME_HORSE_BACK_BALLOON F4 // Note this interprets the highscore value as a time (not the actual timer for the minigame)
-#define CTRL_HS_TIME_LOTTERY_GUESS F5
-#define CTRL_HS_TOWN_SHOOTING_GALLERY F6
-#define CTRL_HS_UNK_1 F7
-#define CTRL_HS_UNK_3_LOWER F8
-#define CTRL_HS_HORSE_BACK_BALLOON F9
-#define CTRL_HS_DEKU_PLAYGROUND_DAY_1 FA
-#define CTRL_HS_DEKU_PLAYGROUND_DAY_2 FB
-#define CTRL_HS_DEKU_PLAYGROUND_DAY_3 FC
-#define CTRL_DEKU_PLAYGROUND_NAME_DAY_1 FD
-#define CTRL_DEKU_PLAYGROUND_NAME_DAY_2 FE
-#define CTRL_DEKU_PLAYGROUND_NAME_DAY_3 FF
+#define MESSAGE_COLOR_DEFAULT 0x00
+#define MESSAGE_COLOR_RED 0x01
+#define MESSAGE_COLOR_GREEN 0x02
+#define MESSAGE_COLOR_BLUE 0x03
+#define MESSAGE_COLOR_YELLOW 0x04
+#define MESSAGE_COLOR_LIGHTBLUE 0x05
+#define MESSAGE_COLOR_PINK 0x06
+#define MESSAGE_COLOR_SILVER 0x07
+#define MESSAGE_COLOR_ORANGE 0x08
+#define MESSAGE_TEXT_SPEED 0x0A // Note this should take an arg 0 to 6, but always just sets next decode char as 0
+#define MESSAGE_HS_BOAT_ARCHERY 0x0B
+#define MESSAGE_STRAY_FAIRIES 0x0C
+#define MESSAGE_TOKENS 0x0D
+#define MESSAGE_POINTS_TENS 0x0E
+#define MESSAGE_POINTS_THOUSANDS 0x0F
+#define MESSAGE_BOX_BREAK 0x10
+#define MESSAGE_NEWLINE 0x11
+#define MESSAGE_BOX_BREAK2 0x12
+#define MESSAGE_CARRIAGE_RETURN 0x13
+#define MESSAGE_SHIFT 0x14
+#define MESSAGE_CONTINUE 0x15
+#define MESSAGE_NAME 0x16
+#define MESSAGE_QUICKTEXT_ENABLE 0x17
+#define MESSAGE_QUICKTEXT_DISABLE 0x18
+#define MESSAGE_EVENT 0x19
+#define MESSAGE_PERSISTENT 0x1A
+#define MESSAGE_BOX_BREAK_DELAYED 0x1B
+#define MESSAGE_FADE 0x1C
+#define MESSAGE_FADE_SKIPPABLE 0x1D
+#define MESSAGE_SFX 0x1E
+#define MESSAGE_DELAY 0x1F
+#define MESSAGE_BTN_A 0xB0
+#define MESSAGE_BTN_B 0xB1
+#define MESSAGE_BTN_C 0xB2
+#define MESSAGE_BTN_L 0xB3
+#define MESSAGE_BTN_R 0xB4
+#define MESSAGE_BTN_Z 0xB5
+#define MESSAGE_BTN_CUP 0xB6
+#define MESSAGE_BTN_CDOWN 0xB7
+#define MESSAGE_BTN_CLEFT 0xB8
+#define MESSAGE_BTN_CRIGHT 0xB9
+#define MESSAGE_Z_TARGET 0xBA
+#define MESSAGE_CONTROL_PAD 0xBB
+#define MESSAGE_END 0xBF
+#define MESSAGE_BACKGROUND 0xC1
+#define MESSAGE_TWO_CHOICE 0xC2
+#define MESSAGE_THREE_CHOICE 0xC3
+#define MESSAGE_TIMER_POSTMAN 0xC4
+#define MESSAGE_TIMER_MINIGAME_1 0xC5
+#define MESSAGE_TIMER_2 0xC6
+#define MESSAGE_TIMER_MOON_CRASH 0xC7
+#define MESSAGE_TIMER_MINIGAME_2 0xC8
+#define MESSAGE_TIMER_ENV_HAZARD 0xC9
+#define MESSAGE_TIME 0xCA
+#define MESSAGE_CHEST_FLAGS 0xCB
+#define MESSAGE_INPUT_BANK 0xCC
+#define MESSAGE_RUPEES_SELECTED 0xCD
+#define MESSAGE_RUPEES_TOTAL 0xCE
+#define MESSAGE_TIME_UNTIL_MOON_CRASH 0xCF
+#define MESSAGE_INPUT_DOGGY_RACETRACK_BET 0xD0
+#define MESSAGE_INPUT_BOMBER_CODE 0xD1
+#define MESSAGE_PAUSE_MENU 0xD2
+#define MESSAGE_TIME_SPEED 0xD3
+#define MESSAGE_OWL_WARP 0xD4
+#define MESSAGE_INPUT_LOTTERY_CODE 0xD5
+#define MESSAGE_SPIDER_HOUSE_MASK_CODE 0xD6
+#define MESSAGE_STRAY_FAIRIES_LEFT_WOODFALL 0xD7
+#define MESSAGE_STRAY_FAIRIES_LEFT_SNOWHEAD 0xD8
+#define MESSAGE_STRAY_FAIRIES_LEFT_GREAT_BAY 0xD9
+#define MESSAGE_STRAY_FAIRIES_LEFT_STONE_TOWER 0xDA
+#define MESSAGE_POINTS_BOAT_ARCHERY 0xDB // Seems to be the exact same as CTRL_POINTS_THOUSANDS
+#define MESSAGE_LOTTERY_CODE 0xDC
+#define MESSAGE_LOTTERY_CODE_GUESS 0xDD
+#define MESSAGE_HELD_ITEM_PRICE 0xDE
+#define MESSAGE_BOMBER_CODE 0xDF
+#define MESSAGE_EVENT2 0xE0 // Seems to be the exact same as CTRL_EVENT
+#define MESSAGE_SPIDER_HOUSE_MASK_CODE_1 0xE1
+#define MESSAGE_SPIDER_HOUSE_MASK_CODE_2 0xE2
+#define MESSAGE_SPIDER_HOUSE_MASK_CODE_3 0xE3
+#define MESSAGE_SPIDER_HOUSE_MASK_CODE_4 0xE4
+#define MESSAGE_SPIDER_HOUSE_MASK_CODE_5 0xE5
+#define MESSAGE_SPIDER_HOUSE_MASK_CODE_6 0xE6
+#define MESSAGE_HOURS_UNTIL_MOON_CRASH 0xE7
+#define MESSAGE_TIME_UNTIL_NEW_DAY 0xE8
+#define MESSAGE_HS_POINTS_BANK_RUPEES 0xF0
+#define MESSAGE_HS_POINTS_UNK_1 0xF1
+#define MESSAGE_HS_POINTS_FISHING 0xF2
+#define MESSAGE_HS_TIME_BOAT_ARCHERY 0xF3 // Note this interprets the highscore value as a time (not the actual timer for the minigame)
+#define MESSAGE_HS_TIME_HORSE_BACK_BALLOON 0xF4 // Note this interprets the highscore value as a time (not the actual timer for the minigame)
+#define MESSAGE_HS_TIME_LOTTERY_GUESS 0xF5
+#define MESSAGE_HS_TOWN_SHOOTING_GALLERY 0xF6
+#define MESSAGE_HS_UNK_1 0xF7
+#define MESSAGE_HS_UNK_3_LOWER 0xF8
+#define MESSAGE_HS_HORSE_BACK_BALLOON 0xF9
+#define MESSAGE_HS_DEKU_PLAYGROUND_DAY_1 0xFA
+#define MESSAGE_HS_DEKU_PLAYGROUND_DAY_2 0xFB
+#define MESSAGE_HS_DEKU_PLAYGROUND_DAY_3 0xFC
+#define MESSAGE_DEKU_PLAYGROUND_NAME_DAY_1 0xFD
+#define MESSAGE_DEKU_PLAYGROUND_NAME_DAY_2 0xFE
+#define MESSAGE_DEKU_PLAYGROUND_NAME_DAY_3 0xFF
#ifdef MESSAGE_DATA_STATIC
// For use in message_data_static files
-#define ARG(x) x
+#define ARG1(x) (x),
+#define ARG2(x) (((x) >> 8) & 0xFF), (((x) >> 0) & 0xFF),
+#define CTRL_BASE(name) ARG1(MESSAGE_##name)
-#define CMD_COLOR_DEFAULT STR(CTRL_COLOR_DEFAULT)
-#define CMD_COLOR_RED STR(CTRL_COLOR_RED)
-#define CMD_COLOR_GREEN STR(CTRL_COLOR_GREEN)
-#define CMD_COLOR_BLUE STR(CTRL_COLOR_BLUE)
-#define CMD_COLOR_YELLOW STR(CTRL_COLOR_YELLOW)
-#define CMD_COLOR_LIGHTBLUE STR(CTRL_COLOR_LIGHTBLUE)
-#define CMD_COLOR_PINK STR(CTRL_COLOR_PINK)
-#define CMD_COLOR_SILVER STR(CTRL_COLOR_SILVER)
-#define CMD_COLOR_ORANGE STR(CTRL_COLOR_ORANGE)
-#define CMD_TEXT_SPEED STR(CTRL_TEXT_SPEED)
-#define CMD_HS_BOAT_ARCHERY STR(CTRL_HS_BOAT_ARCHERY)
-#define CMD_STRAY_FAIRIES STR(CTRL_STRAY_FAIRIES)
-#define CMD_TOKENS STR(CTRL_TOKENS)
-#define CMD_POINTS_TENS STR(CTRL_POINTS_TENS)
-#define CMD_POINTS_THOUSANDS STR(CTRL_POINTS_THOUSANDS)
-#define CMD_BOX_BREAK STR(CTRL_BOX_BREAK)
-// while a control character, newlines are handled in the charmap conversion
-// stage to allow normal newline \n usage in message_data_static files
-#define CMD_NEWLINE STR(CTRL_NEWLINE)
-#define CMD_BOX_BREAK2 STR(CTRL_BOX_BREAK2)
-#define CMD_CARRIAGE_RETURN STR(CTRL_CARRIAGE_RETURN)
-#define CMD_SHIFT(x) STR(CTRL_SHIFT) ARG(x) // 1
-#define CMD_CONTINUE STR(CTRL_CONTINUE)
-#define CMD_NAME STR(CTRL_NAME)
-#define CMD_QUICKTEXT_ENABLE STR(CTRL_QUICKTEXT_ENABLE)
-#define CMD_QUICKTEXT_DISABLE STR(CTRL_QUICKTEXT_DISABLE)
-#define CMD_EVENT STR(CTRL_EVENT)
-#define CMD_PERSISTENT STR(CTRL_PERSISTENT)
-#define CMD_BOX_BREAK_DELAYED(x) STR(CTRL_BOX_BREAK_DELAYED) ARG(x) // 2
-#define CMD_FADE(x) STR(CTRL_FADE) ARG(x) // 2
-#define CMD_FADE_SKIPPABLE(x) STR(CTRL_FADE_SKIPPABLE) ARG(x) // 2
-#define CMD_SFX(x) STR(CTRL_SFX) ARG(x) // 2
-#define CMD_DELAY(x) STR(CTRL_DELAY) ARG(x) // 2
-// while control characters, button images are handled in the charmap conversion
-#define CMD_BTN_A STR(CTRL_BTN_A) // "[A]"
-#define CMD_BTN_B STR(CTRL_BTN_B) // "[B]"
-#define CMD_BTN_C STR(CTRL_BTN_C) // "[C]"
-#define CMD_BTN_L STR(CTRL_BTN_L) // "[L]"
-#define CMD_BTN_R STR(CTRL_BTN_R) // "[R]"
-#define CMD_BTN_Z STR(CTRL_BTN_Z) // "[Z]"
-#define CMD_BTN_CUP STR(CTRL_BTN_CUP) // "[C-Up]"
-#define CMD_BTN_CDOWN STR(CTRL_BTN_CDOWN) // "[C-Down]"
-#define CMD_BTN_CLEFT STR(CTRL_BTN_CLEFT) // "[C-Left]"
-#define CMD_BTN_CRIGHT STR(CTRL_BTN_CRIGHT) // "[C-Right]"
-#define CMD_Z_TARGET STR(CTRL_Z_TARGET) // "▼"
-#define CMD_CONTROL_PAD STR(CTRL_CONTROL_PAD) // "[Control-Pad]"
-#define CMD_END STR(CTRL_END)
-#define CMD_BACKGROUND STR(CTRL_BACKGROUND)
-#define CMD_TWO_CHOICE STR(CTRL_TWO_CHOICE)
-#define CMD_THREE_CHOICE STR(CTRL_THREE_CHOICE)
-#define CMD_TIMER_POSTMAN STR(CTRL_TIMER_POSTMAN)
-#define CMD_TIMER_MINIGAME_1 STR(CTRL_TIMER_MINIGAME_1)
-#define CMD_TIMER_2 STR(CTRL_TIMER_2)
-#define CMD_TIMER_MOON_CRASH STR(CTRL_TIMER_MOON_CRASH)
-#define CMD_TIMER_MINIGAME_2 STR(CTRL_TIMER_MINIGAME_2)
-#define CMD_TIMER_ENV_HAZARD STR(CTRL_TIMER_ENV_HAZARD)
-#define CMD_TIME STR(CTRL_TIME)
-#define CMD_CHEST_FLAGS STR(CTRL_CHEST_FLAGS)
-#define CMD_INPUT_BANK STR(CTRL_INPUT_BANK)
-#define CMD_RUPEES_SELECTED STR(CTRL_RUPEES_SELECTED)
-#define CMD_RUPEES_TOTAL STR(CTRL_RUPEES_TOTAL)
-#define CMD_TIME_UNTIL_MOON_CRASH STR(CTRL_TIME_UNTIL_MOON_CRASH)
-#define CMD_INPUT_DOGGY_RACETRACK_BET STR(CTRL_INPUT_DOGGY_RACETRACK_BET)
-#define CMD_INPUT_BOMBER_CODE STR(CTRL_INPUT_BOMBER_CODE)
-#define CMD_PAUSE_MENU STR(CTRL_PAUSE_MENU)
-#define CMD_TIME_SPEED STR(CTRL_TIME_SPEED)
-#define CMD_OWL_WARP STR(CTRL_OWL_WARP)
-#define CMD_INPUT_LOTTERY_CODE STR(CTRL_INPUT_LOTTERY_CODE)
-#define CMD_SPIDER_HOUSE_MASK_CODE STR(CTRL_SPIDER_HOUSE_MASK_CODE)
-#define CMD_STRAY_FAIRIES_LEFT_WOODFALL STR(CTRL_STRAY_FAIRIES_LEFT_WOODFALL)
-#define CMD_STRAY_FAIRIES_LEFT_SNOWHEAD STR(CTRL_STRAY_FAIRIES_LEFT_SNOWHEAD)
-#define CMD_STRAY_FAIRIES_LEFT_GREAT_BAY STR(CTRL_STRAY_FAIRIES_LEFT_GREAT_BAY)
-#define CMD_STRAY_FAIRIES_LEFT_STONE_TOWER STR(CTRL_STRAY_FAIRIES_LEFT_STONE_TOWER)
-#define CMD_POINTS_BOAT_ARCHERY STR(CTRL_POINTS_BOAT_ARCHERY)
-#define CMD_LOTTERY_CODE STR(CTRL_LOTTERY_CODE)
-#define CMD_LOTTERY_CODE_GUESS STR(CTRL_LOTTERY_CODE_GUESS)
-#define CMD_HELD_ITEM_PRICE STR(CTRL_HELD_ITEM_PRICE)
-#define CMD_BOMBER_CODE STR(CTRL_BOMBER_CODE)
-#define CMD_EVENT2 STR(CTRL_EVENT2)
-#define CMD_SPIDER_HOUSE_MASK_CODE_1 STR(CTRL_SPIDER_HOUSE_MASK_CODE_1)
-#define CMD_SPIDER_HOUSE_MASK_CODE_2 STR(CTRL_SPIDER_HOUSE_MASK_CODE_2)
-#define CMD_SPIDER_HOUSE_MASK_CODE_3 STR(CTRL_SPIDER_HOUSE_MASK_CODE_3)
-#define CMD_SPIDER_HOUSE_MASK_CODE_4 STR(CTRL_SPIDER_HOUSE_MASK_CODE_4)
-#define CMD_SPIDER_HOUSE_MASK_CODE_5 STR(CTRL_SPIDER_HOUSE_MASK_CODE_5)
-#define CMD_SPIDER_HOUSE_MASK_CODE_6 STR(CTRL_SPIDER_HOUSE_MASK_CODE_6)
-#define CMD_HOURS_UNTIL_MOON_CRASH STR(CTRL_HOURS_UNTIL_MOON_CRASH)
-#define CMD_TIME_UNTIL_NEW_DAY STR(CTRL_TIME_UNTIL_NEW_DAY)
-#define CMD_HS_POINTS_BANK_RUPEES STR(CTRL_HS_POINTS_BANK_RUPEES)
-#define CMD_HS_POINTS_UNK_1 STR(CTRL_HS_POINTS_UNK_1)
-#define CMD_HS_POINTS_FISHING STR(CTRL_HS_POINTS_FISHING)
-#define CMD_HS_TIME_BOAT_ARCHERY STR(CTRL_HS_TIME_BOAT_ARCHERY)
-#define CMD_HS_TIME_HORSE_BACK_BALLOON STR(CTRL_HS_TIME_HORSE_BACK_BALLOON)
-#define CMD_HS_TIME_LOTTERY_GUESS STR(CTRL_HS_TIME_LOTTERY_GUESS)
-#define CMD_HS_TOWN_SHOOTING_GALLERY STR(CTRL_HS_TOWN_SHOOTING_GALLERY)
-#define CMD_HS_UNK_1 STR(CTRL_HS_UNK_1)
-#define CMD_HS_UNK_3_LOWER STR(CTRL_HS_UNK_3_LOWER)
-#define CMD_HS_HORSE_BACK_BALLOON STR(CTRL_HS_HORSE_BACK_BALLOON)
-#define CMD_HS_DEKU_PLAYGROUND_DAY_1 STR(CTRL_HS_DEKU_PLAYGROUND_DAY_1)
-#define CMD_HS_DEKU_PLAYGROUND_DAY_2 STR(CTRL_HS_DEKU_PLAYGROUND_DAY_2)
-#define CMD_HS_DEKU_PLAYGROUND_DAY_3 STR(CTRL_HS_DEKU_PLAYGROUND_DAY_3)
-#define CMD_DEKU_PLAYGROUND_NAME_DAY_1 STR(CTRL_DEKU_PLAYGROUND_NAME_DAY_1)
-#define CMD_DEKU_PLAYGROUND_NAME_DAY_2 STR(CTRL_DEKU_PLAYGROUND_NAME_DAY_2)
-#define CMD_DEKU_PLAYGROUND_NAME_DAY_3 STR(CTRL_DEKU_PLAYGROUND_NAME_DAY_3)
+// For use in message_data_static files
-#else
+// Encoded text consists of an array of bytes. Since it's in a macro it must be wrapped in a varargs macro so that each
+// byte is not treated as a separate macro argument to DEFINE_MESSAGE. IDO doesn't support varargs macros, however we
+// preprocess the message_data_static files with modern cpp instead. See the makefile rule for assets/text/
+#define MSG(...) \
+ { __VA_ARGS__ END }
-#define MESSAGE_COLOR_DEFAULT HEX(CTRL_COLOR_DEFAULT)
-#define MESSAGE_COLOR_RED HEX(CTRL_COLOR_RED)
-#define MESSAGE_COLOR_GREEN HEX(CTRL_COLOR_GREEN)
-#define MESSAGE_COLOR_BLUE HEX(CTRL_COLOR_BLUE)
-#define MESSAGE_COLOR_YELLOW HEX(CTRL_COLOR_YELLOW)
-#define MESSAGE_COLOR_LIGHTBLUE HEX(CTRL_COLOR_LIGHTBLUE)
-#define MESSAGE_COLOR_PINK HEX(CTRL_COLOR_PINK)
-#define MESSAGE_COLOR_SILVER HEX(CTRL_COLOR_SILVER)
-#define MESSAGE_COLOR_ORANGE HEX(CTRL_COLOR_ORANGE)
-#define MESSAGE_TEXT_SPEED HEX(CTRL_TEXT_SPEED)
-#define MESSAGE_HS_BOAT_ARCHERY HEX(CTRL_HS_BOAT_ARCHERY)
-#define MESSAGE_STRAY_FAIRIES HEX(CTRL_STRAY_FAIRIES)
-#define MESSAGE_TOKENS HEX(CTRL_TOKENS)
-#define MESSAGE_POINTS_TENS HEX(CTRL_POINTS_TENS)
-#define MESSAGE_POINTS_THOUSANDS HEX(CTRL_POINTS_THOUSANDS)
-#define MESSAGE_BOX_BREAK HEX(CTRL_BOX_BREAK)
-#define MESSAGE_NEWLINE HEX(CTRL_NEWLINE)
-#define MESSAGE_BOX_BREAK2 HEX(CTRL_BOX_BREAK2)
-#define MESSAGE_CARRIAGE_RETURN HEX(CTRL_CARRIAGE_RETURN)
-#define MESSAGE_SHIFT HEX(CTRL_SHIFT)
-#define MESSAGE_CONTINUE HEX(CTRL_CONTINUE)
-#define MESSAGE_NAME HEX(CTRL_NAME)
-#define MESSAGE_QUICKTEXT_ENABLE HEX(CTRL_QUICKTEXT_ENABLE)
-#define MESSAGE_QUICKTEXT_DISABLE HEX(CTRL_QUICKTEXT_DISABLE)
-#define MESSAGE_EVENT HEX(CTRL_EVENT)
-#define MESSAGE_PERSISTENT HEX(CTRL_PERSISTENT)
-#define MESSAGE_BOX_BREAK_DELAYED HEX(CTRL_BOX_BREAK_DELAYED)
-#define MESSAGE_FADE HEX(CTRL_FADE)
-#define MESSAGE_FADE_SKIPPABLE HEX(CTRL_FADE_SKIPPABLE)
-#define MESSAGE_SFX HEX(CTRL_SFX)
-#define MESSAGE_DELAY HEX(CTRL_DELAY)
-#define MESSAGE_BTN_A HEX(CTRL_BTN_A)
-#define MESSAGE_BTN_B HEX(CTRL_BTN_B)
-#define MESSAGE_BTN_C HEX(CTRL_BTN_C)
-#define MESSAGE_BTN_L HEX(CTRL_BTN_L)
-#define MESSAGE_BTN_R HEX(CTRL_BTN_R)
-#define MESSAGE_BTN_Z HEX(CTRL_BTN_Z)
-#define MESSAGE_BTN_CUP HEX(CTRL_BTN_CUP)
-#define MESSAGE_BTN_CDOWN HEX(CTRL_BTN_CDOWN)
-#define MESSAGE_BTN_CLEFT HEX(CTRL_BTN_CLEFT)
-#define MESSAGE_BTN_CRIGHT HEX(CTRL_BTN_CRIGHT)
-#define MESSAGE_Z_TARGET HEX(CTRL_Z_TARGET)
-#define MESSAGE_CONTROL_PAD HEX(CTRL_CONTROL_PAD)
-#define MESSAGE_END HEX(CTRL_END)
-#define MESSAGE_BACKGROUND HEX(CTRL_BACKGROUND)
-#define MESSAGE_TWO_CHOICE HEX(CTRL_TWO_CHOICE)
-#define MESSAGE_THREE_CHOICE HEX(CTRL_THREE_CHOICE)
-#define MESSAGE_TIMER_POSTMAN HEX(CTRL_TIMER_POSTMAN)
-#define MESSAGE_TIMER_MINIGAME_1 HEX(CTRL_TIMER_MINIGAME_1)
-#define MESSAGE_TIMER_2 HEX(CTRL_TIMER_2)
-#define MESSAGE_TIMER_MOON_CRASH HEX(CTRL_TIMER_MOON_CRASH)
-#define MESSAGE_TIMER_MINIGAME_2 HEX(CTRL_TIMER_MINIGAME_2)
-#define MESSAGE_TIMER_ENV_HAZARD HEX(CTRL_TIMER_ENV_HAZARD)
-#define MESSAGE_TIME HEX(CTRL_TIME)
-#define MESSAGE_CHEST_FLAGS HEX(CTRL_CHEST_FLAGS)
-#define MESSAGE_INPUT_BANK HEX(CTRL_INPUT_BANK)
-#define MESSAGE_RUPEES_SELECTED HEX(CTRL_RUPEES_SELECTED)
-#define MESSAGE_RUPEES_TOTAL HEX(CTRL_RUPEES_TOTAL)
-#define MESSAGE_TIME_UNTIL_MOON_CRASH HEX(CTRL_TIME_UNTIL_MOON_CRASH)
-#define MESSAGE_INPUT_DOGGY_RACETRACK_BET HEX(CTRL_INPUT_DOGGY_RACETRACK_BET)
-#define MESSAGE_INPUT_BOMBER_CODE HEX(CTRL_INPUT_BOMBER_CODE)
-#define MESSAGE_PAUSE_MENU HEX(CTRL_PAUSE_MENU)
-#define MESSAGE_TIME_SPEED HEX(CTRL_TIME_SPEED)
-#define MESSAGE_OWL_WARP HEX(CTRL_OWL_WARP)
-#define MESSAGE_INPUT_LOTTERY_CODE HEX(CTRL_INPUT_LOTTERY_CODE)
-#define MESSAGE_SPIDER_HOUSE_MASK_CODE HEX(CTRL_SPIDER_HOUSE_MASK_CODE)
-#define MESSAGE_STRAY_FAIRIES_LEFT_WOODFALL HEX(CTRL_STRAY_FAIRIES_LEFT_WOODFALL)
-#define MESSAGE_STRAY_FAIRIES_LEFT_SNOWHEAD HEX(CTRL_STRAY_FAIRIES_LEFT_SNOWHEAD)
-#define MESSAGE_STRAY_FAIRIES_LEFT_GREAT_BAY HEX(CTRL_STRAY_FAIRIES_LEFT_GREAT_BAY)
-#define MESSAGE_STRAY_FAIRIES_LEFT_STONE_TOWER HEX(CTRL_STRAY_FAIRIES_LEFT_STONE_TOWER)
-#define MESSAGE_POINTS_BOAT_ARCHERY HEX(CTRL_POINTS_BOAT_ARCHERY)
-#define MESSAGE_LOTTERY_CODE HEX(CTRL_LOTTERY_CODE)
-#define MESSAGE_LOTTERY_CODE_GUESS HEX(CTRL_LOTTERY_CODE_GUESS)
-#define MESSAGE_HELD_ITEM_PRICE HEX(CTRL_HELD_ITEM_PRICE)
-#define MESSAGE_BOMBER_CODE HEX(CTRL_BOMBER_CODE)
-#define MESSAGE_EVENT2 HEX(CTRL_EVENT2)
-#define MESSAGE_SPIDER_HOUSE_MASK_CODE_1 HEX(CTRL_SPIDER_HOUSE_MASK_CODE_1)
-#define MESSAGE_SPIDER_HOUSE_MASK_CODE_2 HEX(CTRL_SPIDER_HOUSE_MASK_CODE_2)
-#define MESSAGE_SPIDER_HOUSE_MASK_CODE_3 HEX(CTRL_SPIDER_HOUSE_MASK_CODE_3)
-#define MESSAGE_SPIDER_HOUSE_MASK_CODE_4 HEX(CTRL_SPIDER_HOUSE_MASK_CODE_4)
-#define MESSAGE_SPIDER_HOUSE_MASK_CODE_5 HEX(CTRL_SPIDER_HOUSE_MASK_CODE_5)
-#define MESSAGE_SPIDER_HOUSE_MASK_CODE_6 HEX(CTRL_SPIDER_HOUSE_MASK_CODE_6)
-#define MESSAGE_HOURS_UNTIL_MOON_CRASH HEX(CTRL_HOURS_UNTIL_MOON_CRASH)
-#define MESSAGE_TIME_UNTIL_NEW_DAY HEX(CTRL_TIME_UNTIL_NEW_DAY)
-#define MESSAGE_HS_POINTS_BANK_RUPEES HEX(CTRL_HS_POINTS_BANK_RUPEES)
-#define MESSAGE_HS_POINTS_UNK_1 HEX(CTRL_HS_POINTS_UNK_1)
-#define MESSAGE_HS_POINTS_FISHING HEX(CTRL_HS_POINTS_FISHING)
-#define MESSAGE_HS_TIME_BOAT_ARCHERY HEX(CTRL_HS_TIME_BOAT_ARCHERY)
-#define MESSAGE_HS_TIME_HORSE_BACK_BALLOON HEX(CTRL_HS_TIME_HORSE_BACK_BALLOON)
-#define MESSAGE_HS_TIME_LOTTERY_GUESS HEX(CTRL_HS_TIME_LOTTERY_GUESS)
-#define MESSAGE_HS_TOWN_SHOOTING_GALLERY HEX(CTRL_HS_TOWN_SHOOTING_GALLERY)
-#define MESSAGE_HS_UNK_1 HEX(CTRL_HS_UNK_1)
-#define MESSAGE_HS_UNK_3_LOWER HEX(CTRL_HS_UNK_3_LOWER)
-#define MESSAGE_HS_HORSE_BACK_BALLOON HEX(CTRL_HS_HORSE_BACK_BALLOON)
-#define MESSAGE_HS_DEKU_PLAYGROUND_DAY_1 HEX(CTRL_HS_DEKU_PLAYGROUND_DAY_1)
-#define MESSAGE_HS_DEKU_PLAYGROUND_DAY_2 HEX(CTRL_HS_DEKU_PLAYGROUND_DAY_2)
-#define MESSAGE_HS_DEKU_PLAYGROUND_DAY_3 HEX(CTRL_HS_DEKU_PLAYGROUND_DAY_3)
-#define MESSAGE_DEKU_PLAYGROUND_NAME_DAY_1 HEX(CTRL_DEKU_PLAYGROUND_NAME_DAY_1)
-#define MESSAGE_DEKU_PLAYGROUND_NAME_DAY_2 HEX(CTRL_DEKU_PLAYGROUND_NAME_DAY_2)
-#define MESSAGE_DEKU_PLAYGROUND_NAME_DAY_3 HEX(CTRL_DEKU_PLAYGROUND_NAME_DAY_3)
+// Not a control command, used to define the data that begins every message
+#define HEADER(unk11F08, itemId, nextTextId, unk1206C, unk12070, unk12074) \
+ ARG2(unk11F08) ARG1(itemId) ARG2(nextTextId) ARG2(unk1206C) ARG2(unk12070) ARG2(unk12074)
+
+#define COLOR_DEFAULT CTRL_BASE(COLOR_DEFAULT)
+#define COLOR_RED CTRL_BASE(COLOR_RED)
+#define COLOR_GREEN CTRL_BASE(COLOR_GREEN)
+#define COLOR_BLUE CTRL_BASE(COLOR_BLUE)
+#define COLOR_YELLOW CTRL_BASE(COLOR_YELLOW)
+#define COLOR_LIGHTBLUE CTRL_BASE(COLOR_LIGHTBLUE)
+#define COLOR_PINK CTRL_BASE(COLOR_PINK)
+#define COLOR_SILVER CTRL_BASE(COLOR_SILVER)
+#define COLOR_ORANGE CTRL_BASE(COLOR_ORANGE)
+#define TEXT_SPEED CTRL_BASE(TEXT_SPEED)
+#define HS_BOAT_ARCHERY CTRL_BASE(HS_BOAT_ARCHERY)
+#define STRAY_FAIRIES CTRL_BASE(STRAY_FAIRIES)
+#define TOKENS CTRL_BASE(TOKENS)
+#define POINTS_TENS CTRL_BASE(POINTS_TENS)
+#define POINTS_THOUSANDS CTRL_BASE(POINTS_THOUSANDS)
+#define BOX_BREAK CTRL_BASE(BOX_BREAK)
+// while a control character, newlines are handled in the charmap conversion
+// stage to allow normal newline \n usage in message_data_static files
+#define NEWLINE CTRL_BASE(NEWLINE)
+#define BOX_BREAK2 CTRL_BASE(BOX_BREAK2)
+#define CARRIAGE_RETURN CTRL_BASE(CARRIAGE_RETURN)
+#define SHIFT(amount) CTRL_BASE(SHIFT) ARG1(amount)
+#define CONTINUE CTRL_BASE(CONTINUE)
+#define NAME CTRL_BASE(NAME)
+#define QUICKTEXT_ENABLE CTRL_BASE(QUICKTEXT_ENABLE)
+#define QUICKTEXT_DISABLE CTRL_BASE(QUICKTEXT_DISABLE)
+#define EVENT CTRL_BASE(EVENT)
+#define PERSISTENT CTRL_BASE(PERSISTENT)
+#define BOX_BREAK_DELAYED(delay) CTRL_BASE(BOX_BREAK_DELAYED) ARG2(delay)
+#define FADE(delay) CTRL_BASE(FADE) ARG2(delay)
+#define FADE_SKIPPABLE(delay) CTRL_BASE(FADE_SKIPPABLE) ARG2(delay)
+#define SFX(sfxId) CTRL_BASE(SFX) ARG2(sfxId)
+#define DELAY(delay) CTRL_BASE(DELAY) ARG2(delay)
+#define END CTRL_BASE(END)
+#define BACKGROUND CTRL_BASE(BACKGROUND)
+#define TWO_CHOICE CTRL_BASE(TWO_CHOICE)
+#define THREE_CHOICE CTRL_BASE(THREE_CHOICE)
+#define TIMER_POSTMAN CTRL_BASE(TIMER_POSTMAN)
+#define TIMER_MINIGAME_1 CTRL_BASE(TIMER_MINIGAME_1)
+#define TIMER_2 CTRL_BASE(TIMER_2)
+#define TIMER_MOON_CRASH CTRL_BASE(TIMER_MOON_CRASH)
+#define TIMER_MINIGAME_2 CTRL_BASE(TIMER_MINIGAME_2)
+#define TIMER_ENV_HAZARD CTRL_BASE(TIMER_ENV_HAZARD)
+#define TIME CTRL_BASE(TIME)
+#define CHEST_FLAGS CTRL_BASE(CHEST_FLAGS)
+#define INPUT_BANK CTRL_BASE(INPUT_BANK)
+#define RUPEES_SELECTED CTRL_BASE(RUPEES_SELECTED)
+#define RUPEES_TOTAL CTRL_BASE(RUPEES_TOTAL)
+#define TIME_UNTIL_MOON_CRASH CTRL_BASE(TIME_UNTIL_MOON_CRASH)
+#define INPUT_DOGGY_RACETRACK_BET CTRL_BASE(INPUT_DOGGY_RACETRACK_BET)
+#define INPUT_BOMBER_CODE CTRL_BASE(INPUT_BOMBER_CODE)
+#define PAUSE_MENU CTRL_BASE(PAUSE_MENU)
+#define TIME_SPEED CTRL_BASE(TIME_SPEED)
+#define OWL_WARP CTRL_BASE(OWL_WARP)
+#define INPUT_LOTTERY_CODE CTRL_BASE(INPUT_LOTTERY_CODE)
+#define SPIDER_HOUSE_MASK_CODE CTRL_BASE(SPIDER_HOUSE_MASK_CODE)
+#define STRAY_FAIRIES_LEFT_WOODFALL CTRL_BASE(STRAY_FAIRIES_LEFT_WOODFALL)
+#define STRAY_FAIRIES_LEFT_SNOWHEAD CTRL_BASE(STRAY_FAIRIES_LEFT_SNOWHEAD)
+#define STRAY_FAIRIES_LEFT_GREAT_BAY CTRL_BASE(STRAY_FAIRIES_LEFT_GREAT_BAY)
+#define STRAY_FAIRIES_LEFT_STONE_TOWER CTRL_BASE(STRAY_FAIRIES_LEFT_STONE_TOWER)
+#define POINTS_BOAT_ARCHERY CTRL_BASE(POINTS_BOAT_ARCHERY)
+#define LOTTERY_CODE CTRL_BASE(LOTTERY_CODE)
+#define LOTTERY_CODE_GUESS CTRL_BASE(LOTTERY_CODE_GUESS)
+#define HELD_ITEM_PRICE CTRL_BASE(HELD_ITEM_PRICE)
+#define BOMBER_CODE CTRL_BASE(BOMBER_CODE)
+#define EVENT2 CTRL_BASE(EVENT2)
+#define SPIDER_HOUSE_MASK_CODE_1 CTRL_BASE(SPIDER_HOUSE_MASK_CODE_1)
+#define SPIDER_HOUSE_MASK_CODE_2 CTRL_BASE(SPIDER_HOUSE_MASK_CODE_2)
+#define SPIDER_HOUSE_MASK_CODE_3 CTRL_BASE(SPIDER_HOUSE_MASK_CODE_3)
+#define SPIDER_HOUSE_MASK_CODE_4 CTRL_BASE(SPIDER_HOUSE_MASK_CODE_4)
+#define SPIDER_HOUSE_MASK_CODE_5 CTRL_BASE(SPIDER_HOUSE_MASK_CODE_5)
+#define SPIDER_HOUSE_MASK_CODE_6 CTRL_BASE(SPIDER_HOUSE_MASK_CODE_6)
+#define HOURS_UNTIL_MOON_CRASH CTRL_BASE(HOURS_UNTIL_MOON_CRASH)
+#define TIME_UNTIL_NEW_DAY CTRL_BASE(TIME_UNTIL_NEW_DAY)
+#define HS_POINTS_BANK_RUPEES CTRL_BASE(HS_POINTS_BANK_RUPEES)
+#define HS_POINTS_UNK_1 CTRL_BASE(HS_POINTS_UNK_1)
+#define HS_POINTS_FISHING CTRL_BASE(HS_POINTS_FISHING)
+#define HS_TIME_BOAT_ARCHERY CTRL_BASE(HS_TIME_BOAT_ARCHERY)
+#define HS_TIME_HORSE_BACK_BALLOON CTRL_BASE(HS_TIME_HORSE_BACK_BALLOON)
+#define HS_TIME_LOTTERY_GUESS CTRL_BASE(HS_TIME_LOTTERY_GUESS)
+#define HS_TOWN_SHOOTING_GALLERY CTRL_BASE(HS_TOWN_SHOOTING_GALLERY)
+#define HS_UNK_1 CTRL_BASE(HS_UNK_1)
+#define HS_UNK_3_LOWER CTRL_BASE(HS_UNK_3_LOWER)
+#define HS_HORSE_BACK_BALLOON CTRL_BASE(HS_HORSE_BACK_BALLOON)
+#define HS_DEKU_PLAYGROUND_DAY_1 CTRL_BASE(HS_DEKU_PLAYGROUND_DAY_1)
+#define HS_DEKU_PLAYGROUND_DAY_2 CTRL_BASE(HS_DEKU_PLAYGROUND_DAY_2)
+#define HS_DEKU_PLAYGROUND_DAY_3 CTRL_BASE(HS_DEKU_PLAYGROUND_DAY_3)
+#define DEKU_PLAYGROUND_NAME_DAY_1 CTRL_BASE(DEKU_PLAYGROUND_NAME_DAY_1)
+#define DEKU_PLAYGROUND_NAME_DAY_2 CTRL_BASE(DEKU_PLAYGROUND_NAME_DAY_2)
+#define DEKU_PLAYGROUND_NAME_DAY_3 CTRL_BASE(DEKU_PLAYGROUND_NAME_DAY_3)
#endif