summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTharo <17233964+Thar0@users.noreply.github.com>2021-11-16 23:04:31 +0000
committerGitHub <noreply@github.com>2021-11-16 18:04:31 -0500
commit9ca6bfdac375b2008fcd2d19173c4017279eccde (patch)
tree232a8cacb955d723fc7d0848686f4a867ee49298 /src
parenta3b4dcf388f7b424aedce4e9e8b130fa5c82a5d9 (diff)
Create macros for and decompile elf_message scripts (#999)
* elf_message * Review suggestions
Diffstat (limited to 'src')
-rw-r--r--src/code/z_elf_message.c59
-rw-r--r--src/elf_message/elf_message_field.c33
-rw-r--r--src/elf_message/elf_message_ydan.c6
3 files changed, 75 insertions, 23 deletions
diff --git a/src/code/z_elf_message.c b/src/code/z_elf_message.c
index 7d33b496d..370fe8d41 100644
--- a/src/code/z_elf_message.c
+++ b/src/code/z_elf_message.c
@@ -1,16 +1,29 @@
#include "global.h"
+#include "z64elf_message.h"
-// TODO: use macros to define elf messages once the format is fully documented
ElfMessage sChildSariaMsgs[] = {
- { 0x66, 0x00, 0x03, 0x00 }, { 0x00, 0x37, 0x61, 0x00 }, { 0xE0, 0x00, 0x64, 0x00 }, { 0x00, 0x25, 0x62, 0x00 },
- { 0x00, 0x37, 0x63, 0x00 }, { 0x00, 0x43, 0x65, 0x00 }, { 0x06, 0x30, 0x66, 0x66 }, { 0x06, 0x30, 0x66, 0x67 },
- { 0x06, 0x30, 0x66, 0x68 }, { 0x06, 0x20, 0x67, 0x65 }, { 0x06, 0x30, 0x68, 0x69 }, { 0x06, 0x30, 0x68, 0x6A },
- { 0xE0, 0x00, 0x69, 0x00 },
+ ELF_MSG_STRENGTH_UPG(SKIP, 3, false, 0),
+ ELF_MSG_FLAG(CHECK, 0x61, false, 0x37), /* eventChkInf[3] & 0x80 */
+ ELF_MSG_END(0x64),
+ ELF_MSG_FLAG(CHECK, 0x62, false, 0x25), /* eventChkInf[2] & 0x20 */
+ ELF_MSG_FLAG(CHECK, 0x63, false, 0x37), /* eventChkInf[3] & 0x80 */
+ ELF_MSG_FLAG(CHECK, 0x65, false, 0x43), /* eventChkInf[4] & 0x8 */
+ ELF_MSG_MEDALLION(CHECK, 0x66, false, ITEM_MEDALLION_FOREST),
+ ELF_MSG_MEDALLION(CHECK, 0x66, false, ITEM_MEDALLION_FIRE),
+ ELF_MSG_MEDALLION(CHECK, 0x66, false, ITEM_MEDALLION_WATER),
+ ELF_MSG_SONG(CHECK, 0x67, false, ITEM_SONG_STORMS),
+ ELF_MSG_MEDALLION(CHECK, 0x68, false, ITEM_MEDALLION_SPIRIT),
+ ELF_MSG_MEDALLION(CHECK, 0x68, false, ITEM_MEDALLION_SHADOW),
+ ELF_MSG_END(0x69),
};
ElfMessage sAdultSariaMsgs[] = {
- { 0x06, 0x30, 0x6A, 0x66 }, { 0x06, 0x30, 0x6B, 0x67 }, { 0x06, 0x30, 0x6B, 0x68 },
- { 0x06, 0x30, 0x6C, 0x69 }, { 0x06, 0x30, 0x6C, 0x6A }, { 0xE0, 0x00, 0x6D, 0x00 },
+ ELF_MSG_MEDALLION(CHECK, 0x6A, false, ITEM_MEDALLION_FOREST),
+ ELF_MSG_MEDALLION(CHECK, 0x6B, false, ITEM_MEDALLION_FIRE),
+ ELF_MSG_MEDALLION(CHECK, 0x6B, false, ITEM_MEDALLION_WATER),
+ ELF_MSG_MEDALLION(CHECK, 0x6C, false, ITEM_MEDALLION_SPIRIT),
+ ELF_MSG_MEDALLION(CHECK, 0x6C, false, ITEM_MEDALLION_SHADOW),
+ ELF_MSG_END(0x6D),
};
u32 ElfMessage_CheckCondition(ElfMessage* msg) {
@@ -18,29 +31,29 @@ u32 ElfMessage_CheckCondition(ElfMessage* msg) {
u16 flag;
switch (type) {
- case 0:
+ case (ELF_MSG_CONDITION_FLAG << 1):
flag = 1 << (msg->byte1 & 0x0F);
return ((msg->byte0 & 1) == 1) == ((flag & gSaveContext.eventChkInf[(msg->byte1 & 0xF0) >> 4]) != 0);
- case 2:
+ case (ELF_MSG_CONDITION_DUNGEON_ITEM << 1):
return ((msg->byte0 & 1) == 1) ==
(CHECK_DUNGEON_ITEM(msg->byte1 - ITEM_KEY_BOSS, gSaveContext.mapIndex) != 0);
- case 4:
+ case (ELF_MSG_CONDITION_ITEM << 1):
return ((msg->byte0 & 1) == 1) == (msg->byte3 == INV_CONTENT(msg->byte1));
- case 6:
+ case (ELF_MSG_CONDITION_OTHER << 1):
switch (msg->byte1 & 0xF0) {
- case 0x00:
+ case (ELF_MSG_CONDITION_STRENGTH_UPG << 4):
return ((msg->byte0 & 1) == 1) == ((msg->byte1 & 0x0F) == CUR_UPG_VALUE(UPG_STRENGTH));
- case 0x10:
+ case (ELF_MSG_CONDITION_BOOTS << 4):
return ((msg->byte0 & 1) == 1) ==
(((gBitFlags[msg->byte3 - ITEM_BOOTS_KOKIRI] << gEquipShifts[EQUIP_BOOTS]) &
gSaveContext.inventory.equipment) != 0);
- case 0x20:
+ case (ELF_MSG_CONDITION_SONG << 4):
return ((msg->byte0 & 1) == 1) ==
(CHECK_QUEST_ITEM(msg->byte3 - ITEM_SONG_MINUET + QUEST_SONG_MINUET) != 0);
- case 0x30:
+ case (ELF_MSG_CONDITION_MEDALLION << 4):
return ((msg->byte0 & 1) == 1) ==
(CHECK_QUEST_ITEM(msg->byte3 - ITEM_MEDALLION_FOREST + QUEST_MEDALLION_FOREST) != 0);
- case 0x40:
+ case (ELF_MSG_CONDITION_MAGIC << 4):
return ((msg->byte0 & 1) == 1) == (((void)0, gSaveContext.magicAcquired) != 0);
}
}
@@ -54,7 +67,7 @@ u32 ElfMessage_CheckCondition(ElfMessage* msg) {
u32 func_8006BE88(ElfMessage** msgp) {
u32 temp = true;
- while (((*msgp)->byte0 & 0xE0) == 0x20) {
+ while (((*msgp)->byte0 & 0xE0) == (ELF_MSG_TYPE_UNK_1 << 5)) {
if (!ElfMessage_CheckCondition(*msgp)) {
temp = false;
}
@@ -80,7 +93,7 @@ u32 func_8006BF1C(ElfMessage** msgp) {
temp1 += sp44[temp2];
temp2++;
msg++;
- } while ((msg->byte0 & 0xE0) == 0x40);
+ } while ((msg->byte0 & 0xE0) == (ELF_MSG_TYPE_UNK_2 << 5));
if (temp1 == 0) {
return false;
@@ -104,28 +117,28 @@ u32 func_8006BF1C(ElfMessage** msgp) {
u16 ElfMessage_GetTextFromMsgs(ElfMessage* msg) {
while (true) {
switch (msg->byte0 & 0xE0) {
- case 0x00:
+ case (ELF_MSG_TYPE_CHECK << 5):
if (ElfMessage_CheckCondition(msg)) {
return msg->byte2 | 0x100;
}
break;
- case 0x20:
+ case (ELF_MSG_TYPE_UNK_1 << 5):
if (func_8006BE88(&msg)) {
return msg->byte2 | 0x100;
}
break;
- case 0x40:
+ case (ELF_MSG_TYPE_UNK_2 << 5):
if (func_8006BF1C(&msg)) {
return msg->byte2 | 0x100;
}
break;
- case 0x60:
+ case (ELF_MSG_TYPE_SKIP << 5):
if (ElfMessage_CheckCondition(msg)) {
msg += msg->byte2;
msg--;
}
break;
- case 0xE0:
+ case (ELF_MSG_TYPE_END << 5):
return msg->byte2 | 0x100;
default:
LOG_STRING("企画外 条件", "../z_elf_message.c", 281); // "Unplanned conditions"
diff --git a/src/elf_message/elf_message_field.c b/src/elf_message/elf_message_field.c
new file mode 100644
index 000000000..fe1e8ee97
--- /dev/null
+++ b/src/elf_message/elf_message_field.c
@@ -0,0 +1,33 @@
+#include "global.h"
+#include "z64elf_message.h"
+
+ElfMessage gOverworldNaviMsgs[] = {
+ ELF_MSG_FLAG(CHECK, 0x40, false, 0x05), /* eventChkInf[0] & 0x20 */
+ ELF_MSG_FLAG(CHECK, 0x41, false, 0x09), /* eventChkInf[0] & 0x200 */
+ ELF_MSG_FLAG(CHECK, 0x42, false, 0x12), /* eventChkInf[1] & 0x4 */
+ ELF_MSG_FLAG(CHECK, 0x43, false, 0x14), /* eventChkInf[1] & 0x10 */
+ ELF_MSG_FLAG(CHECK, 0x44, false, 0x40), /* eventChkInf[4] & 0x1 */
+ ELF_MSG_SONG(CHECK, 0x45, false, ITEM_SONG_SARIA),
+ ELF_MSG_STRENGTH_UPG(CHECK, 0x46, true, 0),
+ ELF_MSG_FLAG(CHECK, 0x47, false, 0x25), /* eventChkInf[2] & 0x20 */
+ ELF_MSG_MAGIC(CHECK, 0x48, false),
+ ELF_MSG_FLAG(CHECK, 0x49, false, 0x33), /* eventChkInf[3] & 0x8 */
+ ELF_MSG_FLAG(CHECK, 0x4A, false, 0x37), /* eventChkInf[3] & 0x80 */
+ ELF_MSG_FLAG(CHECK, 0x4B, false, 0x80), /* eventChkInf[8] & 0x1 */
+ ELF_MSG_FLAG(CHECK, 0x4C, false, 0x43), /* eventChkInf[4] & 0x8 */
+ ELF_MSG_FLAG(CHECK, 0x4D, false, 0x45), /* eventChkInf[4] & 0x20 */
+ ELF_MSG_ITEM(CHECK, 0x4E, true, ITEM_HOOKSHOT, ITEM_NONE),
+ ELF_MSG_MEDALLION(CHECK, 0x50, false, ITEM_MEDALLION_FOREST),
+ ELF_MSG_MEDALLION(CHECK, 0x51, false, ITEM_MEDALLION_FIRE),
+ ELF_MSG_BOOTS(CHECK, 0x52, false, ITEM_BOOTS_IRON),
+ ELF_MSG_MEDALLION(CHECK, 0x53, false, ITEM_MEDALLION_WATER),
+ ELF_MSG_FLAG(CHECK, 0x54, false, 0xAA), /* eventChkInf[10] & 0x400 */
+ ELF_MSG_ITEM(CHECK, 0x55, true, ITEM_LENS, ITEM_NONE),
+ ELF_MSG_MEDALLION(CHECK, 0x57, false, ITEM_MEDALLION_SHADOW),
+ ELF_MSG_SONG(CHECK, 0x58, false, ITEM_SONG_REQUIEM),
+ ELF_MSG_STRENGTH_UPG(CHECK, 0x56, true, 1),
+ ELF_MSG_MEDALLION(CHECK, 0x5A, false, ITEM_MEDALLION_SPIRIT),
+ ELF_MSG_ITEM(CHECK, 0x5B, true, ITEM_ARROW_LIGHT, ITEM_NONE),
+ ELF_MSG_FLAG(CHECK, 0x5C, false, 0xC3), /* eventChkInf[12] & 0x8 */
+ ELF_MSG_END(0x5F),
+};
diff --git a/src/elf_message/elf_message_ydan.c b/src/elf_message/elf_message_ydan.c
new file mode 100644
index 000000000..54050e372
--- /dev/null
+++ b/src/elf_message/elf_message_ydan.c
@@ -0,0 +1,6 @@
+#include "global.h"
+#include "z64elf_message.h"
+
+ElfMessage gDungeonNaviMsgs[] = {
+ ELF_MSG_END(0x5F),
+};