diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/code/z_elf_message.c | 59 | ||||
| -rw-r--r-- | src/elf_message/elf_message_field.c | 33 | ||||
| -rw-r--r-- | src/elf_message/elf_message_ydan.c | 6 |
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), +}; |
