summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorDerek Hensley <hensley.derek58@gmail.com>2024-06-14 21:35:22 -0700
committerGitHub <noreply@github.com>2024-06-14 21:35:22 -0700
commit0b375cadb0af6f2d95844cc674f84be0b148ae10 (patch)
tree7e8a3262a549c45fe24d5a78ea66ad9407b79d4f /include
parentbd596f9869179f36dad57b1e17360b6532b842ca (diff)
Msgevent OK (#1637)
* Decompiled, some commands still unnamed * Use full weekevent reg names * Fix func_8094E69C * Fix Player_GetMask * Eventinf, mask worn, and item action argument formatting * decimal rupees * Times (day, hours, minutes) as decimal * msgEventScriptPos * Callbacks * Name final commands * Enum * Arrays * functions * Small cleanups * Clean up actors * Remove event from some variable names to make them shorter * Some more function renames * newline * Missed a few unks in commands * Update functions.txt * PlayerMask * MSGMODE_PAUSED * Script time macros * EnSob1_GetWelcome default * Whole bunch of renames * Format * Add CMD to commands * Update code_functions * structs for size * z64scripts.h * MsgEventCallback -> MsgScriptCallback * format * MsgEvent_RunScript stop * Remove cmd handler comment * cmd -> script in MsgEvent_RunScript --------- Co-authored-by: Thar0 <17233964+Thar0@users.noreply.github.com>
Diffstat (limited to 'include')
-rw-r--r--include/functions.h53
-rw-r--r--include/z64.h1
-rw-r--r--include/z64msgevent.h516
-rw-r--r--include/z64player.h2
-rw-r--r--include/z64schedule.h92
-rw-r--r--include/z64scripts.h24
6 files changed, 583 insertions, 105 deletions
diff --git a/include/functions.h b/include/functions.h
index 715a385bc..e67742901 100644
--- a/include/functions.h
+++ b/include/functions.h
@@ -334,59 +334,6 @@ void Map_Destroy(PlayState* play);
void Map_Init(PlayState* play);
void Minimap_Draw(PlayState* play);
void Map_Update(PlayState* play);
-// void func_8010A760(void);
-// void func_8010A7CC(void);
-// void func_8010A814(void);
-// void func_8010A85C(void);
-// void func_8010A8A4(void);
-// void func_8010A8EC(void);
-// void func_8010A990(void);
-// void func_8010AA54(void);
-// void func_8010AB30(void);
-// void func_8010AB94(void);
-// void func_8010AC00(void);
-// void func_8010AD24(void);
-// void func_8010ADD4(void);
-// void func_8010AE48(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5);
-// UNK_TYPE4 func_8010AECC(UNK_TYPE4 param_1, s32 param_2, s32* param_3);
-// void func_8010AF20(void);
-// void func_8010AF6C(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5);
-// void func_8010AF94(void);
-// void func_8010AFE0(void);
-// void func_8010B010(void);
-// void func_8010B06C(void);
-// void func_8010B0B4(void);
-// void func_8010B0DC(void);
-// void func_8010B108(void);
-// void func_8010B140(void);
-// void func_8010B180(void);
-// void func_8010B1BC(void);
-// void func_8010B22C(void);
-// void func_8010B284(void);
-// void func_8010B2C0(void);
-// void func_8010B300(void);
-// void func_8010B434(void);
-// void func_8010B4A4(void);
-// void func_8010B520(void);
-// void func_8010B664(void);
-// void func_8010B7A8(void);
-// void func_8010B828(void);
-// void func_8010B878(void);
-// void func_8010B8E4(void);
-// void func_8010BB0C(void);
-// void func_8010BB6C(void);
-// void func_8010BBCC(void);
-// void func_8010BC28(void);
-// void func_8010BC7C(void);
-// void func_8010BD48(void);
-// void func_8010BD90(void);
-// void func_8010BDDC(void);
-// void func_8010BE78(void);
-// void func_8010BEBC(void);
-// void func_8010BEF0(void);
-// void func_8010BF24(void);
-s32 func_8010BF58(Actor* actor, PlayState* play, void* param_3, UNK_PTR param_4, s32* param_5);
-
f32 OLib_Vec3fDist(Vec3f* a, Vec3f* b);
f32 OLib_Vec3fDistOutDiff(Vec3f* a, Vec3f* b, Vec3f* dest);
f32 OLib_Vec3fDistXZ(Vec3f* a, Vec3f* b);
diff --git a/include/z64.h b/include/z64.h
index dab2bc7b3..0123ae2f9 100644
--- a/include/z64.h
+++ b/include/z64.h
@@ -55,6 +55,7 @@
#include "z64map.h"
#include "z64math.h"
#include "z64message.h"
+#include "z64msgevent.h"
#include "z64object.h"
#include "z64ocarina.h"
#include "z64pause_menu.h"
diff --git a/include/z64msgevent.h b/include/z64msgevent.h
new file mode 100644
index 000000000..69ca66deb
--- /dev/null
+++ b/include/z64msgevent.h
@@ -0,0 +1,516 @@
+#ifndef Z64MSGEVENT_H
+#define Z64MSGEVENT_H
+
+#include "z64scripts.h"
+
+struct PlayState;
+struct Actor;
+
+typedef enum MsgScriptCommandId {
+ /* 0x00 */ MSCRIPT_CMD_ID_CHECK_WEEK_EVENT_REG,
+ /* 0x01 */ MSCRIPT_CMD_ID_CHECK_GORON,
+ /* 0x02 */ MSCRIPT_CMD_ID_CHECK_ZORA,
+ /* 0x03 */ MSCRIPT_CMD_ID_CHECK_DEKU,
+ /* 0x04 */ MSCRIPT_CMD_ID_CHECK_HUMAN,
+ /* 0x05 */ MSCRIPT_CMD_ID_CHECK_TEXT_CHOICE,
+ /* 0x06 */ MSCRIPT_CMD_ID_OFFER_ITEM,
+ /* 0x07 */ MSCRIPT_CMD_ID_AUTOTALK,
+ /* 0x08 */ MSCRIPT_CMD_ID_CHECK_RUPEES,
+ /* 0x09 */ MSCRIPT_CMD_ID_CHECK_CALLBACK,
+ /* 0x0A */ MSCRIPT_CMD_ID_CHECK_DAY,
+ /* 0x0B */ MSCRIPT_CMD_ID_AWAIT_TEXT_JUMP,
+ /* 0x0C */ MSCRIPT_CMD_ID_AWAIT_TEXT,
+ /* 0x0D */ MSCRIPT_CMD_ID_AWAIT_TEXT_END,
+ /* 0x0E */ MSCRIPT_CMD_ID_BEGIN_TEXT,
+ /* 0x0F */ MSCRIPT_CMD_ID_CONTINUE_TEXT,
+ /* 0x10 */ MSCRIPT_CMD_ID_DONE,
+ /* 0x11 */ MSCRIPT_CMD_ID_SET_WEEK_EVENT_REG,
+ /* 0x12 */ MSCRIPT_CMD_ID_CLOSE_TEXT,
+ /* 0x13 */ MSCRIPT_CMD_ID_SET_COLLECTIBLE,
+ /* 0x14 */ MSCRIPT_CMD_ID_CHANGE_RUPEES,
+ /* 0x15 */ MSCRIPT_CMD_ID_PAUSE,
+ /* 0x16 */ MSCRIPT_CMD_ID_UNSET_AUTOTALK,
+ /* 0x17 */ MSCRIPT_CMD_ID_FOCUS_TO_CHILD,
+ /* 0x18 */ MSCRIPT_CMD_ID_FOCUS_TO_SELF,
+ /* 0x19 */ MSCRIPT_CMD_ID_JUMP,
+ /* 0x1A */ MSCRIPT_CMD_ID_CHECK_QUEST_ITEM,
+ /* 0x1B */ MSCRIPT_CMD_ID_CHECK_EVENT_INF,
+ /* 0x1C */ MSCRIPT_CMD_ID_SET_EVENT_INF,
+ /* 0x1D */ MSCRIPT_CMD_ID_UNSET_EVENT_INF,
+ /* 0x1E */ MSCRIPT_CMD_ID_CHECK_ITEM_ACTION,
+ /* 0x1F */ MSCRIPT_CMD_ID_CHECK_HAS_SONG,
+ /* 0x20 */ MSCRIPT_CMD_ID_CHECK_WORN_MASK,
+ /* 0x21 */ MSCRIPT_CMD_ID_CHECK_AFTER_TIME,
+ /* 0x22 */ MSCRIPT_CMD_ID_CHECK_BEFORE_TIME,
+ /* 0x23 */ MSCRIPT_CMD_ID_CHECK_SWITCH_FLAG,
+ /* 0x24 */ MSCRIPT_CMD_ID_SET_SWITCH_FLAG,
+ /* 0x25 */ MSCRIPT_CMD_ID_CHECK_ITEM,
+ /* 0x26 */ MSCRIPT_CMD_ID_CHECK_BETWEEN_TIME,
+ /* 0x27 */ MSCRIPT_CMD_ID_CHECK_ON_DAY,
+ /* 0x28 */ MSCRIPT_CMD_ID_CHECK_CALLBACK_CONTINUE,
+ /* 0x29 */ MSCRIPT_CMD_ID_CHECK_HAS_POWDER_KEG,
+ /* 0x2A */ MSCRIPT_CMD_ID_DELETE_ITEM,
+ /* 0x2B */ MSCRIPT_CMD_ID_CHECK_CALLBACK_MULTI,
+ /* 0x2C */ MSCRIPT_CMD_ID_PLAYER_TALK,
+ /* 0x2D */ MSCRIPT_CMD_ID_NOTEBOOK_EVENT,
+ /* 0x2E */ MSCRIPT_CMD_ID_AWAIT_TEXT_DONE,
+ /* 0x2F */ MSCRIPT_CMD_ID_JUMP_3,
+ /* 0x30 */ MSCRIPT_CMD_ID_PLAY_DECIDE,
+ /* 0x31 */ MSCRIPT_CMD_ID_PLAY_CANCEL,
+ /* 0x32 */ MSCRIPT_CMD_ID_PLAY_ERROR,
+ /* 0x33 */ MSCRIPT_CMD_ID_MAX
+} MsgScriptCommandId;
+
+typedef struct {
+ /* 0x0 */ u8 cmd;
+} MsgScriptCmdBase;
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 flagByte;
+ /* 0x2 */ u8 flagMask;
+ /* 0x3 */ u8 offsetH;
+ /* 0x4 */ u8 offsetL;
+} MsgScriptCmdCheckWeekEventReg; // size = 0x5
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 offsetH;
+ /* 0x2 */ u8 offsetL;
+} MsgScriptCmdCheckGoron; // size = 0x3
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 offsetH;
+ /* 0x2 */ u8 offsetL;
+} MsgScriptCmdCheckZora; // size = 0x3
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 offsetH;
+ /* 0x2 */ u8 offsetL;
+} MsgScriptCmdCheckDeku; // size = 0x3
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 offsetH;
+ /* 0x2 */ u8 offsetL;
+} MsgScriptCmdCheckHuman; // size = 0x3
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 offset0H;
+ /* 0x2 */ u8 offset0L;
+ /* 0x3 */ u8 offset1H;
+ /* 0x4 */ u8 offset1L;
+ /* 0x5 */ u8 offset2H;
+ /* 0x6 */ u8 offset2L;
+} MsgScriptCmdCheckTextChoice; // size = 0x7
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 itemIdH;
+ /* 0x2 */ u8 itemIdL;
+ /* 0x3 */ u8 offsetH;
+ /* 0x4 */ u8 offsetL;
+} MsgScriptCmdOfferItem; // size = 0x5
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 offsetH;
+ /* 0x2 */ u8 offsetL;
+} MsgScriptCmdAutotalk; // size = 0x3
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 rupeesH;
+ /* 0x2 */ u8 rupeesL;
+ /* 0x3 */ u8 offsetH;
+ /* 0x4 */ u8 offsetL;
+} MsgScriptCmdCheckRupees; // size = 0x5
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 offsetH;
+ /* 0x2 */ u8 offsetL;
+} MsgScriptCmdCheckCallback; // size = 0x3
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 offsetDay1H;
+ /* 0x2 */ u8 offsetDay1L;
+ /* 0x3 */ u8 offsetNight1H;
+ /* 0x4 */ u8 offsetNight1L;
+ /* 0x5 */ u8 offsetDay2H;
+ /* 0x6 */ u8 offsetDay2L;
+ /* 0x7 */ u8 offsetNight2H;
+ /* 0x8 */ u8 offsetNight2L;
+ /* 0x9 */ u8 offsetDay3H;
+ /* 0xA */ u8 offsetDay3L;
+ /* 0xB */ u8 offsetNight3H;
+ /* 0xC */ u8 offsetNight3L;
+} MsgScriptCmdCheckDay; // size = 0xD
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 offsetH;
+ /* 0x2 */ u8 offsetL;
+} MsgScriptCmdAwaitTextJump; // size = 0x3
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 textIdH;
+ /* 0x2 */ u8 textIdL;
+} MsgScriptCmdBeginText; // size = 0x3
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 textIdH;
+ /* 0x2 */ u8 textIdL;
+} MsgScriptCmdContinueText; // size = 0x3
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 flagByte;
+ /* 0x2 */ u8 flagMask;
+} MsgScriptCmdSetWeekEventReg; // size = 0x3
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 flagH;
+ /* 0x2 */ u8 flagL;
+} MsgScriptCmdSetCollectible; // size = 0x3
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 rupeesH;
+ /* 0x2 */ u8 rupeesL;
+} MsgScriptCmdChangeRupees; // size = 0x3
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 offsetH;
+ /* 0x2 */ u8 offsetL;
+} MsgScriptCmdJump; // size = 0x3
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 questItemH;
+ /* 0x2 */ u8 questItemL;
+ /* 0x3 */ u8 offsetH;
+ /* 0x4 */ u8 offsetL;
+} MsgScriptCmdCheckQuestItem; // size = 0x5
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 flagByte;
+ /* 0x2 */ u8 flagMask;
+ /* 0x3 */ u8 offsetH;
+ /* 0x4 */ u8 offsetL;
+} MsgScriptCmdCheckEventInf; // size = 0x5
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 flagByte;
+ /* 0x2 */ u8 flagMask;
+} MsgScriptCmdSetEventInf; // size = 0x3
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 flagByte;
+ /* 0x2 */ u8 flagMask;
+} MsgScriptCmdUnsetEventInf; // size = 0x3
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 itemActionH;
+ /* 0x2 */ u8 itemActionL;
+ /* 0x3 */ u8 offsetEqualH;
+ /* 0x4 */ u8 offsetEqualL;
+ /* 0x5 */ u8 offsetDefaultH;
+ /* 0x6 */ u8 offsetDefaultL;
+ /* 0x7 */ u8 offsetContinueH;
+ /* 0x8 */ u8 offsetContinueL;
+} MsgScriptCmdCheckItemAction; // size = 0x9
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 songH;
+ /* 0x2 */ u8 songL;
+ /* 0x3 */ u8 offsetH;
+ /* 0x4 */ u8 offsetL;
+} MsgScriptCmdCheckHasSong; // size = 0x5
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 maskH;
+ /* 0x2 */ u8 maskL;
+ /* 0x3 */ u8 offsetH;
+ /* 0x4 */ u8 offsetL;
+} MsgScriptCmdCheckWornMask; // size = 0x5
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 hr;
+ /* 0x2 */ u8 min;
+ /* 0x3 */ u8 offsetH;
+ /* 0x4 */ u8 offsetL;
+} MsgScriptCmdCheckAfterTime; // size = 0x5
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 hr;
+ /* 0x2 */ u8 min;
+ /* 0x3 */ u8 offsetH;
+ /* 0x4 */ u8 offsetL;
+} MsgScriptCmdCheckBeforeTime; // size = 0x5
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 flagH;
+ /* 0x2 */ u8 flagL;
+ /* 0x3 */ u8 offsetH;
+ /* 0x4 */ u8 offsetL;
+} MsgScriptCmdCheckSwitchFlag; // size = 0x5
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 flagH;
+ /* 0x2 */ u8 flagL;
+} MsgScriptCmdSetSwitchFlag; // size = 0x3
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 itemH;
+ /* 0x2 */ u8 itemL;
+ /* 0x3 */ u8 offsetH;
+ /* 0x4 */ u8 offsetL;
+} MsgScriptCmdCheckItem; // size = 0x5
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 startHr;
+ /* 0x2 */ u8 startMin;
+ /* 0x3 */ u8 endHr;
+ /* 0x4 */ u8 endMin;
+ /* 0x5 */ u8 offsetH;
+ /* 0x6 */ u8 offsetL;
+} MsgScriptCmdCheckBetweenTime; // size = 0x7
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 dayH;
+ /* 0x2 */ u8 dayL;
+ /* 0x3 */ u8 offsetH;
+ /* 0x4 */ u8 offsetL;
+} MsgScriptCmdCheckOnDay; // size = 0x5
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 offsetH;
+ /* 0x2 */ u8 offsetL;
+} MsgScriptCmdCheckCallbackContinue; // size = 0x3
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 offsetH;
+ /* 0x2 */ u8 offsetL;
+} MsgScriptCmdCheckHasPowderKeg; // size = 0x3
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 itemH;
+ /* 0x2 */ u8 itemL;
+} MsgScriptCmdDeleteItem; // size = 0x3
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 offset1H;
+ /* 0x2 */ u8 offset1L;
+ /* 0x3 */ u8 offset2H;
+ /* 0x4 */ u8 offset2L;
+ /* 0x5 */ u8 offset3H;
+ /* 0x6 */ u8 offset3L;
+} MsgScriptCmdCheckCallbackMulti; // size = 0x7
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 textIdH;
+ /* 0x2 */ u8 textIdL;
+} MsgScriptCmdPlayerTalk; // size = 0x3
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 eventH;
+ /* 0x2 */ u8 eventL;
+} MsgScriptCmdBombersNotebook; // size = 0x3
+
+typedef struct {
+ /* 0x0 */ MsgScriptCmdBase base;
+ /* 0x1 */ u8 offsetH;
+ /* 0x2 */ u8 offsetL;
+} MsgScriptCmdJump3; // size = 0x3
+
+#define MSCRIPT_CMD_CHECK_WEEK_EVENT_REG(reg, skip) \
+ MSCRIPT_CMD_ID_CHECK_WEEK_EVENT_REG, SCRIPT_UNPACK_16(reg), SCRIPT_UNPACK_16(skip)
+
+#define MSCRIPT_CMD_CHECK_GORON(skip) \
+ MSCRIPT_CMD_ID_CHECK_GORON, SCRIPT_UNPACK_16(skip)
+
+#define MSCRIPT_CMD_CHECK_ZORA(skip) \
+ MSCRIPT_CMD_ID_CHECK_ZORA, SCRIPT_UNPACK_16(skip)
+
+#define MSCRIPT_CMD_CHECK_DEKU(skip) \
+ MSCRIPT_CMD_ID_CHECK_DEKU, SCRIPT_UNPACK_16(skip)
+
+#define MSCRIPT_CMD_CHECK_HUMAN(skip) \
+ MSCRIPT_CMD_ID_CHECK_HUMAN, SCRIPT_UNPACK_16(skip)
+
+#define MSCRIPT_CMD_CHECK_TEXT_CHOICE(skip0, skip1, skip2) \
+ MSCRIPT_CMD_ID_CHECK_TEXT_CHOICE, SCRIPT_UNPACK_16(skip0), SCRIPT_UNPACK_16(skip1), SCRIPT_UNPACK_16(skip2)
+
+#define MSCRIPT_CMD_OFFER_ITEM(item, skip) \
+ MSCRIPT_CMD_ID_OFFER_ITEM, SCRIPT_UNPACK_16(item), SCRIPT_UNPACK_16(skip)
+
+#define MSCRIPT_CMD_AUTOTALK(skip) \
+ MSCRIPT_CMD_ID_AUTOTALK, SCRIPT_UNPACK_16(skip)
+
+#define MSCRIPT_CMD_CHECK_RUPEES(rupees, skip) \
+ MSCRIPT_CMD_ID_CHECK_RUPEES, SCRIPT_UNPACK_16(rupees), SCRIPT_UNPACK_16(skip)
+
+#define MSCRIPT_CMD_CHECK_CALLBACK(skip) \
+ MSCRIPT_CMD_ID_CHECK_CALLBACK, SCRIPT_UNPACK_16(skip)
+
+#define MSCRIPT_CMD_CHECK_DAY(skipDay1, skipNight1, skipDay2, skipNight2, skipDay3, skipNight3) \
+ MSCRIPT_CMD_ID_CHECK_DAY, \
+ SCRIPT_UNPACK_16(skipDay1), SCRIPT_UNPACK_16(skipNight1), \
+ SCRIPT_UNPACK_16(skipDay2), SCRIPT_UNPACK_16(skipNight2), \
+ SCRIPT_UNPACK_16(skipDay3), SCRIPT_UNPACK_16(skipNight3)
+
+#define MSCRIPT_CMD_AWAIT_TEXT_JUMP(skip) \
+ MSCRIPT_CMD_ID_AWAIT_TEXT_JUMP, SCRIPT_UNPACK_16(skip)
+
+#define MSCRIPT_CMD_AWAIT_TEXT() \
+ MSCRIPT_CMD_ID_AWAIT_TEXT
+
+#define MSCRIPT_CMD_AWAIT_TEXT_END() \
+ MSCRIPT_CMD_ID_AWAIT_TEXT_END
+
+#define MSCRIPT_CMD_BEGIN_TEXT(arg) \
+ MSCRIPT_CMD_ID_BEGIN_TEXT, SCRIPT_UNPACK_16(arg)
+
+#define MSCRIPT_CMD_CONTINUE_TEXT(arg) \
+ MSCRIPT_CMD_ID_CONTINUE_TEXT, SCRIPT_UNPACK_16(arg)
+
+#define MSCRIPT_CMD_DONE() \
+ MSCRIPT_CMD_ID_DONE
+
+#define MSCRIPT_CMD_SET_WEEK_EVENT_REG(reg) \
+ MSCRIPT_CMD_ID_SET_WEEK_EVENT_REG, SCRIPT_UNPACK_16(reg)
+
+#define MSCRIPT_CMD_CLOSE_TEXT() \
+ MSCRIPT_CMD_ID_CLOSE_TEXT
+
+#define MSCRIPT_CMD_SET_COLLECTIBLE(collectFlag) \
+ MSCRIPT_CMD_ID_SET_COLLECTIBLE, SCRIPT_UNPACK_16(collectFlag)
+
+#define MSCRIPT_CMD_CHANGE_RUPEES(num) \
+ MSCRIPT_CMD_ID_CHANGE_RUPEES, SCRIPT_UNPACK_16(num)
+
+#define MSCRIPT_CMD_PAUSE() \
+ MSCRIPT_CMD_ID_PAUSE
+
+#define MSCRIPT_CMD_UNSET_AUTOTALK() \
+ MSCRIPT_CMD_ID_UNSET_AUTOTALK
+
+#define MSCRIPT_CMD_FOCUS_TO_CHILD() \
+ MSCRIPT_CMD_ID_FOCUS_TO_CHILD
+
+#define MSCRIPT_CMD_FOCUS_TO_SELF() \
+ MSCRIPT_CMD_ID_FOCUS_TO_SELF
+
+#define MSCRIPT_CMD_JUMP(skip) \
+ MSCRIPT_CMD_ID_JUMP, SCRIPT_UNPACK_16(skip)
+
+#define MSCRIPT_CMD_CHECK_QUEST_ITEM(questItem, skip) \
+ MSCRIPT_CMD_ID_CHECK_QUEST_ITEM, SCRIPT_UNPACK_16(questItem), SCRIPT_UNPACK_16(skip)
+
+#define MSCRIPT_CMD_CHECK_EVENT_INF(flag, skip) \
+ MSCRIPT_CMD_ID_CHECK_EVENT_INF, SCRIPT_UNPACK_8(((flag) >> 4)), SCRIPT_UNPACK_8((1 << ((flag) & 0xF))), SCRIPT_UNPACK_16(skip)
+
+#define MSCRIPT_CMD_SET_EVENT_INF(flag) \
+ MSCRIPT_CMD_ID_SET_EVENT_INF, SCRIPT_UNPACK_8(((flag) >> 4)), SCRIPT_UNPACK_8((1 << ((flag) & 0xF)))
+
+#define MSCRIPT_CMD_EVENT_INF(flag) \
+ MSCRIPT_CMD_ID_UNSET_EVENT_INF, SCRIPT_UNPACK_8(((flag) >> 4)), SCRIPT_UNPACK_8((1 << ((flag) & 0xF)))
+
+#define MSCRIPT_CMD_CHECK_ITEM_ACTION(itemAction, skipEqual, skipDefault, skipContinue) \
+ MSCRIPT_CMD_ID_CHECK_ITEM_ACTION, SCRIPT_UNPACK_16(itemAction), SCRIPT_UNPACK_16(skipEqual), SCRIPT_UNPACK_16(skipDefault), SCRIPT_UNPACK_16(skipContinue)
+
+#define MSCRIPT_CMD_CHECK_HAS_SONG(questItem, skip) \
+ MSCRIPT_CMD_ID_CHECK_HAS_SONG, SCRIPT_UNPACK_16(questItem), SCRIPT_UNPACK_16(skip)
+
+#define MSCRIPT_CMD_CHECK_WORN_MASK(mask, skip) \
+ MSCRIPT_CMD_ID_CHECK_WORN_MASK, SCRIPT_UNPACK_16(mask), SCRIPT_UNPACK_16(skip)
+
+#define MSCRIPT_CMD_CHECK_AFTER_TIME(hours, minutes, skip) \
+ MSCRIPT_CMD_ID_CHECK_AFTER_TIME, SCRIPT_UNPACK_8(hours), SCRIPT_UNPACK_8(minutes), SCRIPT_UNPACK_16(skip)
+
+#define MSCRIPT_CMD_CHECK_BEFORE_TIME(hours, minutes, skip) \
+ MSCRIPT_CMD_ID_CHECK_BEFORE_TIME, SCRIPT_UNPACK_8(hours), SCRIPT_UNPACK_8(minutes), SCRIPT_UNPACK_16(skip)
+
+#define MSCRIPT_CMD_CHECK_SWITCH_FLAG(switchFlag, skip) \
+ MSCRIPT_CMD_ID_CHECK_SWITCH_FLAG, SCRIPT_UNPACK_16(switchFlag), SCRIPT_UNPACK_16(skip)
+
+#define MSCRIPT_CMD_SET_SWITCH_FLAG(switchFlag) \
+ MSCRIPT_CMD_ID_SET_SWITCH_FLAG, SCRIPT_UNPACK_16(switchFlag)
+
+#define MSCRIPT_CMD_CHECK_ITEM(item, skip) \
+ MSCRIPT_CMD_ID_CHECK_ITEM, SCRIPT_UNPACK_16(item), SCRIPT_UNPACK_16(skip)
+
+#define MSCRIPT_CMD_BETWEEN_TIME(hours1, minutes1, hours2, minutes2, skip) \
+ MSCRIPT_CMD_ID_CHECK_BETWEEN_TIME, SCRIPT_UNPACK_8(hours1), SCRIPT_UNPACK_8(minutes1), SCRIPT_UNPACK_8(hours2), SCRIPT_UNPACK_8(minutes2), SCRIPT_UNPACK_16(skip)
+
+#define MSCRIPT_CMD_CHECK_IN_DAY(day, skip) \
+ MSCRIPT_CMD_ID_CHECK_ON_DAY, SCRIPT_UNPACK_16(day), SCRIPT_UNPACK_16(skip)
+
+#define MSCRIPT_CMD_CHECK_CALLBACK_CONTINUE(skip) \
+ MSCRIPT_CMD_ID_CHECK_CALLBACK_CONTINUE, SCRIPT_UNPACK_16(skip)
+
+#define MSCRIPT_CMD_CHECK_HAS_POWDER_KEG(skip) \
+ MSCRIPT_CMD_ID_CHECK_HAS_POWDER_KEG, SCRIPT_UNPACK_16(skip)
+
+#define MSCRIPT_CMD_DELETE_ITEM(item) \
+ MSCRIPT_CMD_ID_DELETE_ITEM, SCRIPT_UNPACK_16(item)
+
+#define MSCRIPT_CMD_CHECK_CALLBACK_MULTI(skip1, skip2, skip3) \
+ MSCRIPT_CMD_ID_CHECK_CALLBACK_MULTI, SCRIPT_UNPACK_16(skip1), SCRIPT_UNPACK_16(skip2), SCRIPT_UNPACK_16(skip3)
+
+#define MSCRIPT_CMD_PLAYER_TALK(textId) \
+ MSCRIPT_CMD_ID_PLAYER_TALK, SCRIPT_UNPACK_16(textId)
+
+#define MSCRIPT_CMD_NOTEBOOK_EVENT(event) \
+ MSCRIPT_CMD_ID_NOTEBOOK_EVENT, SCRIPT_UNPACK_16(event)
+
+#define MSCRIPT_CMD_AWAIT_TEXT_DONE() \
+ MSCRIPT_CMD_ID_AWAIT_TEXT_DONE
+
+#define MSCRIPT_CMD_JUMP_3(skip) \
+ MSCRIPT_CMD_ID_JUMP_3, SCRIPT_UNPACK_16(skip)
+
+#define MSCRIPT_CMD_PLAY_DECIDE() \
+ MSCRIPT_CMD_ID_PLAY_DECIDE
+
+#define MSCRIPT_CMD_PLAY_CANCEL() \
+ MSCRIPT_CMD_ID_PLAY_CANCEL
+
+#define MSCRIPT_CMD_PLAY_ERROR() \
+ MSCRIPT_CMD_ID_PLAY_ERROR
+
+typedef u8 MsgScript;
+
+typedef s32 (*MsgScriptCallback)(struct Actor* thisx, struct PlayState* play);
+
+s32 MsgEvent_RunScript(Actor* actor, struct PlayState* play, MsgScript* script, MsgScriptCallback callback, s32* pos);
+
+#endif
diff --git a/include/z64player.h b/include/z64player.h
index a5c531ca8..2f2650705 100644
--- a/include/z64player.h
+++ b/include/z64player.h
@@ -1388,7 +1388,7 @@ void func_80123E90(struct PlayState* play, Actor* actor);
s32 func_80123F2C(struct PlayState* play, s32 ammo);
bool Player_IsBurningStickInRange(struct PlayState* play, Vec3f* pos, f32 xzRange, f32 yRange);
u8 Player_GetStrength(void);
-u8 Player_GetMask(struct PlayState* play);
+PlayerMask Player_GetMask(struct PlayState* play);
void Player_RemoveMask(struct PlayState* play);
bool Player_HasMirrorShieldEquipped(struct PlayState* play);
bool Player_IsHoldingMirrorShield(struct PlayState* play);
diff --git a/include/z64schedule.h b/include/z64schedule.h
index 1fabc7c5d..9db9379cd 100644
--- a/include/z64schedule.h
+++ b/include/z64schedule.h
@@ -1,7 +1,7 @@
#ifndef Z64SCHEDULE_H
#define Z64SCHEDULE_H
-#include "ultra64.h"
+#include "z64scripts.h"
/**
* Schedule is a subsystem that acts as a way to make decisions based on the
@@ -29,33 +29,26 @@
struct PlayState;
-// Macro to convert the time format used in the save struct into the format used in Schedule
-#define SCHEDULE_CONVERT_TIME(time) ((s32)((time) - 0x10000 / 360 * 90))
-
-#define SCHEDULE_TIME(hour, minute) SCHEDULE_CONVERT_TIME((((hour)*60.0f) + (minute)) * (0x10000 / 60 / 24.0f))
-
-#define SCHEDULE_TIME_NOW SCHEDULE_CONVERT_TIME(CURRENT_TIME)
-
typedef enum ScheduleCommandId {
- /* 0x00 */ SCHEDULE_CMD_ID_CHECK_FLAG_S, // Checks if a weekEventReg flag is set and branches if so, short range branch
- /* 0x01 */ SCHEDULE_CMD_ID_CHECK_FLAG_L, // Checks if a weekEventReg flag is set and branches if so, long range branch
- /* 0x02 */ SCHEDULE_CMD_ID_CHECK_TIME_RANGE_S, // Checks if the current time is within the range of the two provided times and branches if so, short range branch
- /* 0x03 */ SCHEDULE_CMD_ID_CHECK_TIME_RANGE_L, // Checks if the current time is within the range of the two provided times and branches if so, long range branch
- /* 0x04 */ SCHEDULE_CMD_ID_RET_VAL_L, // Ends script and returns 2-byte value (Note: bugged as the return value size is only 1 byte in the struct)
- /* 0x05 */ SCHEDULE_CMD_ID_RET_NONE, // Ends script without returning anything
- /* 0x06 */ SCHEDULE_CMD_ID_RET_EMPTY, // Ends script and indicates return without changing existing value
- /* 0x07 */ SCHEDULE_CMD_ID_NOP, // No-Op
- /* 0x08 */ SCHEDULE_CMD_ID_CHECK_MISC_S, // Special check based on items or masks and branches if check passes, short range branch
- /* 0x09 */ SCHEDULE_CMD_ID_RET_VAL_S, // Ends script and returns byte value
- /* 0x0A */ SCHEDULE_CMD_ID_CHECK_NOT_IN_SCENE_S, // Checks if the current scene is not SceneId and branches if so, short range branch
- /* 0x0B */ SCHEDULE_CMD_ID_CHECK_NOT_IN_SCENE_L, // Checks if the current scene is not SceneId and branches if so, long range branch
- /* 0x0C */ SCHEDULE_CMD_ID_CHECK_NOT_IN_DAY_S, // Checks if the current day is not Day and branches if so, short range branch
- /* 0x0D */ SCHEDULE_CMD_ID_CHECK_NOT_IN_DAY_L, // Checks if the current day is not Day and branches if so, long range branch
- /* 0x0E */ SCHEDULE_CMD_ID_RET_TIME, // Returns 2 time values
- /* 0x0F */ SCHEDULE_CMD_ID_CHECK_BEFORE_TIME_S, // Branches if the current time is less than the command time, short range branch
- /* 0x10 */ SCHEDULE_CMD_ID_CHECK_BEFORE_TIME_L, // Branches if the current time is less than the command time, long range branch
- /* 0x11 */ SCHEDULE_CMD_ID_BRANCH_S, // Always branch, short range branch
- /* 0x12 */ SCHEDULE_CMD_ID_BRANCH_L // Always branch, long range branch
+ /* 0x00 */ SCHEDULE_CMD_ID_CHECK_WEEK_EVENT_REG_S, // Checks if a weekEventReg flag is set and branches if so, short range branch
+ /* 0x01 */ SCHEDULE_CMD_ID_CHECK_WEEK_EVENT_REG_L, // Checks if a weekEventReg flag is set and branches if so, long range branch
+ /* 0x02 */ SCHEDULE_CMD_ID_CHECK_TIME_RANGE_S, // Checks if the current time is within the range of the two provided times and branches if so, short range branch
+ /* 0x03 */ SCHEDULE_CMD_ID_CHECK_TIME_RANGE_L, // Checks if the current time is within the range of the two provided times and branches if so, long range branch
+ /* 0x04 */ SCHEDULE_CMD_ID_RET_VAL_L, // Ends script and returns 2-byte value (Note: bugged as the return value size is only 1 byte in the struct)
+ /* 0x05 */ SCHEDULE_CMD_ID_RET_NONE, // Ends script without returning anything
+ /* 0x06 */ SCHEDULE_CMD_ID_RET_EMPTY, // Ends script and indicates return without changing existing value
+ /* 0x07 */ SCHEDULE_CMD_ID_NOP, // No-Op
+ /* 0x08 */ SCHEDULE_CMD_ID_CHECK_MISC_S, // Special check based on items or masks and branches if check passes, short range branch
+ /* 0x09 */ SCHEDULE_CMD_ID_RET_VAL_S, // Ends script and returns byte value
+ /* 0x0A */ SCHEDULE_CMD_ID_CHECK_NOT_IN_SCENE_S, // Checks if the current scene is not SceneId and branches if so, short range branch
+ /* 0x0B */ SCHEDULE_CMD_ID_CHECK_NOT_IN_SCENE_L, // Checks if the current scene is not SceneId and branches if so, long range branch
+ /* 0x0C */ SCHEDULE_CMD_ID_CHECK_NOT_IN_DAY_S, // Checks if the current day is not Day and branches if so, short range branch
+ /* 0x0D */ SCHEDULE_CMD_ID_CHECK_NOT_IN_DAY_L, // Checks if the current day is not Day and branches if so, long range branch
+ /* 0x0E */ SCHEDULE_CMD_ID_RET_TIME, // Returns 2 time values
+ /* 0x0F */ SCHEDULE_CMD_ID_CHECK_BEFORE_TIME_S, // Branches if the current time is less than the command time, short range branch
+ /* 0x10 */ SCHEDULE_CMD_ID_CHECK_BEFORE_TIME_L, // Branches if the current time is less than the command time, long range branch
+ /* 0x11 */ SCHEDULE_CMD_ID_BRANCH_S, // Always branch, short range branch
+ /* 0x12 */ SCHEDULE_CMD_ID_BRANCH_L // Always branch, long range branch
} ScheduleCommandId;
typedef enum {
@@ -80,7 +73,7 @@ typedef struct {
/* 0x1 */ u8 flagByte;
/* 0x2 */ u8 flagMask;
/* 0x3 */ s8 offset;
-} ScheduleCmdCheckFlagS; // size = 0x4
+} ScheduleCmdCheckWeekEventRegS; // size = 0x4
typedef struct {
/* 0x0 */ ScheduleCmdBase base;
@@ -88,7 +81,7 @@ typedef struct {
/* 0x2 */ u8 flagMask;
/* 0x3 */ u8 offsetH;
/* 0x4 */ u8 offsetL;
-} ScheduleCmdCheckFlagL; // size = 0x5
+} ScheduleCmdCheckWeekEventRegL; // size = 0x5
typedef struct {
/* 0x0 */ ScheduleCmdBase base;
@@ -198,23 +191,20 @@ typedef struct {
/* 0x2 */ u8 offsetL;
} ScheduleCmdBranchL; // size = 0x3
-#define SCHEDULE_PACK_S16(val) \
- ((val) >> 8) & 0xFF, (val) & 0xFF
-
-#define SCHEDULE_CMD_CHECK_FLAG_S(flag, offset) \
- SCHEDULE_CMD_ID_CHECK_FLAG_S, SCHEDULE_PACK_S16(flag), (offset)
+#define SCHEDULE_CMD_CHECK_WEEK_EVENT_REG_S(flag, offset) \
+ SCHEDULE_CMD_ID_CHECK_WEEK_EVENT_REG_S, SCRIPT_UNPACK_16(flag), SCRIPT_UNPACK_8(offset)
-#define SCHEDULE_CMD_CHECK_FLAG_L(flag, offset) \
- SCHEDULE_CMD_ID_CHECK_FLAG_L, SCHEDULE_PACK_S16(flag), SCHEDULE_PACK_S16(offset)
+#define SCHEDULE_CMD_CHECK_WEEK_EVENT_REG_L(flag, offset) \
+ SCHEDULE_CMD_ID_CHECK_WEEK_EVENT_REG_L, SCRIPT_UNPACK_16(flag), SCRIPT_UNPACK_16(offset)
#define SCHEDULE_CMD_CHECK_TIME_RANGE_S(startHr, startMin, endHr, endMin, offset) \
- SCHEDULE_CMD_ID_CHECK_TIME_RANGE_S, (startHr), (startMin), (endHr), (endMin), (offset)
+ SCHEDULE_CMD_ID_CHECK_TIME_RANGE_S, SCRIPT_UNPACK_8(startHr), SCRIPT_UNPACK_8(startMin), SCRIPT_UNPACK_8(endHr), SCRIPT_UNPACK_8(endMin), SCRIPT_UNPACK_8(offset)
#define SCHEDULE_CMD_CHECK_TIME_RANGE_L(startHr, startMin, endHr, endMin, offset) \
- SCHEDULE_CMD_ID_CHECK_TIME_RANGE_L, (startHr), (startMin), (endHr), (endMin), SCHEDULE_PACK_S16(offset)
+ SCHEDULE_CMD_ID_CHECK_TIME_RANGE_L, SCRIPT_UNPACK_8(startHr), SCRIPT_UNPACK_8(startMin), SCRIPT_UNPACK_8(endHr), SCRIPT_UNPACK_8(endMin), SCRIPT_UNPACK_16(offset)
#define SCHEDULE_CMD_RET_VAL_L(result) \
- SCHEDULE_CMD_ID_RET_VAL_L, SCHEDULE_PACK_S16(result)
+ SCHEDULE_CMD_ID_RET_VAL_L, SCRIPT_UNPACK_16(result)
#define SCHEDULE_CMD_RET_NONE() \
SCHEDULE_CMD_ID_RET_NONE
@@ -223,40 +213,40 @@ typedef struct {
SCHEDULE_CMD_ID_RET_EMPTY,
#define SCHEDULE_CMD_NOP(unk0, unk1, unk2) \
- SCHEDULE_CMD_ID_NOP, (unk0), (unk1), (unk2)
+ SCHEDULE_CMD_ID_NOP, SCRIPT_UNPACK_8(unk0), SCRIPT_UNPACK_8(unk1), SCRIPT_UNPACK_8(unk2)
#define SCHEDULE_CMD_CHECK_MISC_S(which, offset) \
- SCHEDULE_CMD_ID_CHECK_MISC_S, (which), (offset)
+ SCHEDULE_CMD_ID_CHECK_MISC_S, SCRIPT_UNPACK_8(which), SCRIPT_UNPACK_8(offset)
#define SCHEDULE_CMD_RET_VAL_S(result) \
- SCHEDULE_CMD_ID_RET_VAL_S, (result)
+ SCHEDULE_CMD_ID_RET_VAL_S, SCRIPT_UNPACK_8(result)
#define SCHEDULE_CMD_CHECK_NOT_IN_SCENE_S(scene, offset) \
- SCHEDULE_CMD_ID_CHECK_NOT_IN_SCENE_S, SCHEDULE_PACK_S16(scene), (offset)
+ SCHEDULE_CMD_ID_CHECK_NOT_IN_SCENE_S, SCRIPT_UNPACK_16(scene), SCRIPT_UNPACK_8(offset)
#define SCHEDULE_CMD_CHECK_NOT_IN_SCENE_L(scene, offset) \
- SCHEDULE_CMD_ID_CHECK_NOT_IN_SCENE_L, SCHEDULE_PACK_S16(scene), SCHEDULE_PACK_S16(offset)
+ SCHEDULE_CMD_ID_CHECK_NOT_IN_SCENE_L, SCRIPT_UNPACK_16(scene), SCRIPT_UNPACK_16(offset)
#define SCHEDULE_CMD_CHECK_NOT_IN_DAY_S(day, offset) \
- SCHEDULE_CMD_ID_CHECK_NOT_IN_DAY_S, SCHEDULE_PACK_S16(day), (offset)
+ SCHEDULE_CMD_ID_CHECK_NOT_IN_DAY_S, SCRIPT_UNPACK_16(day), SCRIPT_UNPACK_8(offset)
#define SCHEDULE_CMD_CHECK_NOT_IN_DAY_L(day, offset) \
- SCHEDULE_CMD_ID_CHECK_NOT_IN_DAY_L, SCHEDULE_PACK_S16(day), SCHEDULE_PACK_S16(offset)
+ SCHEDULE_CMD_ID_CHECK_NOT_IN_DAY_L, SCRIPT_UNPACK_16(day), SCRIPT_UNPACK_16(offset)
#define SCHEDULE_CMD_RET_TIME(time0Hr, time0Min, time1Hr, time1Min, result) \
- SCHEDULE_CMD_ID_RET_TIME, (time0Hr), (time0Min), (time1Hr), (time1Min), (result)
+ SCHEDULE_CMD_ID_RET_TIME, SCRIPT_UNPACK_8(time0Hr), SCRIPT_UNPACK_8(time0Min), SCRIPT_UNPACK_8(time1Hr), SCRIPT_UNPACK_8(time1Min), SCRIPT_UNPACK_8(result)
#define SCHEDULE_CMD_CHECK_BEFORE_TIME_S(timeHr, timeMin, offset) \
- SCHEDULE_CMD_ID_CHECK_BEFORE_TIME_S, (timeHr), (timeMin), (offset)
+ SCHEDULE_CMD_ID_CHECK_BEFORE_TIME_S, SCRIPT_UNPACK_8(timeHr), SCRIPT_UNPACK_8(timeMin), SCRIPT_UNPACK_8(offset)
#define SCHEDULE_CMD_CHECK_BEFORE_TIME_L(timeHr, timeMin, offset) \
- SCHEDULE_CMD_ID_CHECK_BEFORE_TIME_L, (timeHr), (timeMin), SCHEDULE_PACK_S16(offset)
+ SCHEDULE_CMD_ID_CHECK_BEFORE_TIME_L, SCRIPT_UNPACK_8(timeHr), SCRIPT_UNPACK_8(timeMin), SCRIPT_UNPACK_16(offset)
#define SCHEDULE_CMD_BRANCH_S(offset) \
- SCHEDULE_CMD_ID_BRANCH_S, (offset)
+ SCHEDULE_CMD_ID_BRANCH_S, SCRIPT_UNPACK_8(offset)
#define SCHEDULE_CMD_BRANCH_L(offset) \
- SCHEDULE_CMD_ID_BRANCH_L, SCHEDULE_PACK_S16(offset)
+ SCHEDULE_CMD_ID_BRANCH_L, SCRIPT_UNPACK_16(offset)
typedef u8 ScheduleScript;
diff --git a/include/z64scripts.h b/include/z64scripts.h
new file mode 100644
index 000000000..2b5c8a6a5
--- /dev/null
+++ b/include/z64scripts.h
@@ -0,0 +1,24 @@
+#ifndef Z64SCRIPTS_H
+#define Z64SCRIPTS_H
+
+#include "PR/ultratypes.h"
+
+// Macros to convert the time format used in the save struct into the format used in scripts (Schedule or Message)
+#define SCRIPT_CONVERT_TIME(time) ((s32)((time) - 0x10000 / 360 * 90))
+
+#define SCRIPT_CALC_TIME(hour, minute, dest, temp) \
+ (temp) = (hour)*60.0f; \
+ (temp) += (minute); \
+ (dest) = (temp) * (0x10000 / 60 / 24.0f); \
+ (dest) = SCRIPT_CONVERT_TIME(dest)
+
+#define SCRIPT_TIME(hour, minute) SCRIPT_CONVERT_TIME((((hour)*60.0f) + (minute)) * (0x10000 / 60 / 24.0f))
+
+#define SCRIPT_TIME_NOW SCRIPT_CONVERT_TIME(CURRENT_TIME)
+
+#define SCRIPT_PACK_16(h, l) (((h) << 8) | (l))
+
+#define SCRIPT_UNPACK_8(v) (u8)(v)
+#define SCRIPT_UNPACK_16(v) (u8)_SHIFTR(v, 8, 8), (u8)_SHIFTR(v, 0, 8)
+
+#endif