From f05d1723d6c0ee94fb4342958395f67ef751bdfe Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Fri, 9 Jun 2023 04:46:13 +1000 Subject: [PATCH] Persistent Cycle Weekeventregs (#1267) * persistent weekeventregs * move macro * PR Suggestions * 2 to ALT * PR Suggestions --- include/macros.h | 11 ++ include/z64cutscene.h | 11 -- include/z64save.h | 2 +- src/code/z_sram_NES.c | 251 ++++++++++++++++++++++++++----------- tools/disasm/variables.txt | 4 +- 5 files changed, 195 insertions(+), 84 deletions(-) diff --git a/include/macros.h b/include/macros.h index d2b98dec5a..6b54474b60 100644 --- a/include/macros.h +++ b/include/macros.h @@ -68,6 +68,17 @@ #define ALIGN64(val) (((val) + 0x3F) & ~0x3F) #define ALIGN256(val) (((val) + 0xFF) & ~0xFF) +#define BIT_FLAG_TO_SHIFT(flag) \ + ((flag & 0x80) ? 7 : \ + (flag & 0x40) ? 6 : \ + (flag & 0x20) ? 5 : \ + (flag & 0x10) ? 4 : \ + (flag & 0x8) ? 3 : \ + (flag & 0x4) ? 2 : \ + (flag & 0x2) ? 1 : \ + (flag & 0x1) ? 0 : \ + 0) + /** * `x` vertex x * `y` vertex y diff --git a/include/z64cutscene.h b/include/z64cutscene.h index 1fc32be289..742398a31a 100644 --- a/include/z64cutscene.h +++ b/include/z64cutscene.h @@ -580,17 +580,6 @@ typedef union CutsceneData { s8 b[4]; } CutsceneData; -#define BIT_FLAG_TO_SHIFT(flag) \ - ((flag & 0x80) ? 7 : \ - (flag & 0x40) ? 6 : \ - (flag & 0x20) ? 5 : \ - (flag & 0x10) ? 4 : \ - (flag & 0x8) ? 3 : \ - (flag & 0x4) ? 2 : \ - (flag & 0x2) ? 1 : \ - (flag & 0x1) ? 0 : \ - 0) - // Do not trigger the scripted cutscene upon any spawn #define CS_SPAWN_FLAG_NONE 0xFF // Always trigger the scripted cutscene upon the specified spawn diff --git a/include/z64save.h b/include/z64save.h index 312b18b2e1..69b9e7ad8b 100644 --- a/include/z64save.h +++ b/include/z64save.h @@ -970,7 +970,7 @@ typedef enum { #define WEEKEVENTREG_51_40 PACK_WEEKEVENTREG_FLAG(51, 0x40) #define WEEKEVENTREG_51_80 PACK_WEEKEVENTREG_FLAG(51, 0x80) -// ProtectedCremia +// Protected Cremia #define WEEKEVENTREG_ESCORTED_CREMIA PACK_WEEKEVENTREG_FLAG(52, 0x01) // Lose Milk Run minigame #define WEEKEVENTREG_52_02 PACK_WEEKEVENTREG_FLAG(52, 0x02) diff --git a/src/code/z_sram_NES.c b/src/code/z_sram_NES.c index 21bfaf7efa..fa690758c1 100644 --- a/src/code/z_sram_NES.c +++ b/src/code/z_sram_NES.c @@ -11,12 +11,12 @@ void func_80147414(SramContext* sramCtx, s32 fileNum, s32 arg2); ((newf)[0] != 'Z' || (newf)[1] != 'E' || (newf)[2] != 'L' || (newf)[3] != 'D' || (newf)[4] != 'A' || \ (newf)[5] != '3') -typedef struct PersistentCycleFlags { +typedef struct PersistentCycleSceneFlags { /* 0x0 */ u32 switch0; /* 0x4 */ u32 switch1; /* 0x8 */ u32 chest; /* 0xC */ u32 collectible; -} PersistentCycleFlags; // size = 0x10 +} PersistentCycleSceneFlags; // size = 0x10 #define PERSISTENT_CYCLE_FLAGS_SET(switch0, switch1, chest, collectible) { switch0, switch1, chest, collectible }, #define PERSISTENT_CYCLE_FLAGS_NONE PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, 0) @@ -28,58 +28,105 @@ typedef struct PersistentCycleFlags { /** * Array of bitwise flags which won't be turned off on a cycle reset (will persist between cycles) */ -PersistentCycleFlags sPersistentCycleFlags[SCENE_MAX] = { +PersistentCycleSceneFlags sPersistentCycleSceneFlags[SCENE_MAX] = { #include "tables/scene_table.h" }; #undef DEFINE_SCENE #undef DEFINE_SCENE_UNSET -// TODO: figure out a way to use the WEEKEVENTREG defines here +// Each flag has 2 bits to store persistence over the three-day reset cycle +// Only 1 of these bits need to be set to persist (Values 1, 2, 3). +// Therefore, the final game does not distinguish between these two macros in use +#define PERSISTENT_WEEKEVENTREG(flag) (3 << (2 * BIT_FLAG_TO_SHIFT(flag))) +#define PERSISTENT_WEEKEVENTREG_ALT(flag) (2 << (2 * BIT_FLAG_TO_SHIFT(flag))) + // weekEventReg flags which will be not be cleared on a cycle reset -u16 D_801C66D0[ARRAY_COUNT(gSaveContext.save.saveInfo.weekEventReg)] = { - /* 0 */ 0xFFFC, - /* 1 */ 0xFFFF, - /* 2 */ 0xFFFF, - /* 3 */ 0xFFFF, +//! @note The index of the flag in this array must be the same to its index in the WeekeventReg array +//! Only the mask is read from the `PERSISTENT_` macros. +u16 sPersistentCycleWeekEventRegs[ARRAY_COUNT(gSaveContext.save.saveInfo.weekEventReg)] = { + /* 0 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_TERMINA_FIELD) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_IKANA_GRAVEYARD) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_ROMANI_RANCH) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_GORMAN_TRACK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_MOUNTAIN_VILLAGE_WINTER) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_GORON_SHRINE) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_SNOWHEAD), + /* 1 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_SOUTHERN_SWAMP_POISONED) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_WOODFALL) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_DEKU_PALACE) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_GREAT_BAY_COAST) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_PIRATES_FORTRESS) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_ZORA_HALL) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_WATERFALL_RAPIDS) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_IKANA_CANYON), + /* 2 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_IKANA_CASTLE) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_STONE_TOWER) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_STONE_TOWER_INVERTED) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_EAST_CLOCK_TOWN) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_WEST_CLOCK_TOWN) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_NORTH_CLOCK_TOWN) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_WOODFALL_TEMPLE) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_SNOWHEAD_TEMPLE), + /* 3 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_PIRATES_FORTRESS_EXTERIOR) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_STONE_TOWER_TEMPLE) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_STONE_TOWER_TEMPLE_INVERTED) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_THE_MOON) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_MOON_DEKU_TRIAL) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_MOON_GORON_TRIAL) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_MOON_ZORA_TRIAL) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_03_80), /* 4 */ 0, /* 5 */ 0, /* 6 */ 0, - /* 7 */ 0xC000, - /* 8 */ 0xC00, + /* 7 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_WOODFALL_TEMPLE_PRISON), + /* 8 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_DOGGY_RACETRACK_HEART_PIECE), /* 9 */ 0, - /* 10 */ 0xC0, + /* 10 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_10_08), /* 11 */ 0, - /* 12 */ 0x300, - /* 13 */ 0x3000, - /* 14 */ 0xC000, - /* 15 */ 0xC00, + /* 12 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_12_10), + /* 13 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_OCEANSIDE_WALLET_UPGRADE), + /* 14 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_14_80), + /* 15 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_15_20), /* 16 */ 0, /* 17 */ 0, /* 18 */ 0, /* 19 */ 0, /* 20 */ 0, /* 21 */ 0, - /* 22 */ 0xC00C, - /* 23 */ 0xC00C, - /* 24 */ 0xC008, - /* 25 */ 3, - /* 26 */ 0x3000, + /* 22 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_22_02) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_22_80), + /* 23 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_23_02) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_23_80), + /* 24 */ PERSISTENT_WEEKEVENTREG_ALT(WEEKEVENTREG_24_02) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_24_80), + /* 25 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_25_01), + /* 26 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_26_40), /* 27 */ 0, /* 28 */ 0, /* 29 */ 0, - /* 30 */ 0xFF00, - /* 31 */ 0xC3F, - /* 32 */ 0x3F, + /* 30 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_30_10) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_30_20) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_30_40) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_30_80), + /* 31 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_31_01) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_31_02) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_31_04) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_31_20), + /* 32 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_32_01) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_32_02) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_32_04), /* 33 */ 0, /* 34 */ 0, - /* 35 */ 0xCFFF, + /* 35 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_35_01) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_35_02) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_35_04) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_35_08) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_35_10) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_35_20) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_35_80), /* 36 */ 0, /* 37 */ 0, - /* 38 */ 0xC00, - /* 39 */ 0xC00, + /* 38 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_38_20), + /* 39 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_39_20), /* 40 */ 0, - /* 41 */ 0xC0, + /* 41 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_41_08), /* 42 */ 0, /* 43 */ 0, /* 44 */ 0, @@ -88,50 +135,111 @@ u16 D_801C66D0[ARRAY_COUNT(gSaveContext.save.saveInfo.weekEventReg)] = { /* 47 */ 0, /* 48 */ 0, /* 49 */ 0, - /* 50 */ 0x3C, - /* 51 */ 0x20, + /* 50 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_50_02) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_50_04), + /* 51 */ PERSISTENT_WEEKEVENTREG_ALT(WEEKEVENTREG_51_04), /* 52 */ 0, - /* 53 */ 0x300C, - /* 54 */ 0x3000, + /* 53 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_53_02) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_53_40), + /* 54 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_54_40), /* 55 */ 0, - /* 56 */ 0xC, - /* 57 */ 0xC0, + /* 56 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_56_02), + /* 57 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_57_08), /* 58 */ 0, - /* 59 */ 0xFF0, - /* 60 */ 0x300, + /* 59 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_59_04) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_59_08) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_59_10) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_59_20), + /* 60 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_60_10), /* 61 */ 0, /* 62 */ 0, - /* 63 */ 0xC00, + /* 63 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_63_20), /* 64 */ 0, /* 65 */ 0, - /* 66 */ 0xFFFF, - /* 67 */ 0xFFFF, - /* 68 */ 0xFFFF, - /* 69 */ 0xFFFF, - /* 70 */ 0xFFFF, - /* 71 */ 0xFFFF, - /* 72 */ 0xFFFF, - /* 73 */ 0xC0, + /* 66 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ANJU) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_KAFEI) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_BOMB_SHOP_LADY) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ROMANI) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_CREMIA) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_MAYOR_DOTOUR) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_MADAME_AROMA), + /* 67 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_TOTO) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GORMAN) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_POSTMAN) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ROSA_SISTERS) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_TOILET_HAND) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ANJUS_GRANDMOTHER) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_KAMARO) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GROG), + /* 68 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_SHIRO) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GURU_GURU) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_BOMBERS) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROOM_KEY) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_MIDNIGHT_MEETING) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_MEET_KAFEI) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_LETTER_TO_KAFEI), + /* 69 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DEPOSITED_LETTER_TO_KAFEI) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_PENDANT_OF_MEMORIES) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DELIVERED_PENDANT_OF_MEMORIES) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_ESCAPED_SAKONS_HIDEOUT) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_HELP_WITH_THEM) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DEFENDED_AGAINST_THEM) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_MILK_BOTTLE) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_ESCORTED_CREMIA), + /* 70 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROMANIS_MASK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KEATON_MASK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_PRIORITY_MAIL) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DELIVERED_PRIORITY_MAIL) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_MAYOR_HP) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROSA_SISTERS_HP), + /* 71 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_TOILET_HAND_HP) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_SHORT_STORY_HP) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_LONG_STORY_HP) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMAN_HP) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAFEIS_MASK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ALL_NIGHT_MASK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK), + /* 72 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMANS_HAT) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_COUPLES_MASK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BLAST_MASK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BREMEN_MASK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_72_80), + /* 73 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_73_08), /* 74 */ 0, - /* 75 */ 0xC000, + /* 75 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_75_80), /* 76 */ 0, - /* 77 */ 3, + /* 77 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_77_01), /* 78 */ 0, - /* 79 */ 0xC000, + /* 79 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_79_80), /* 80 */ 0, - /* 81 */ 0xC0, - /* 82 */ 0x300, + /* 81 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_81_08), + /* 82 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_82_10), /* 83 */ 0, /* 84 */ 0, /* 85 */ 0, - /* 86 */ 0xC000, - /* 87 */ 0xFFF0, + /* 86 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_86_80), + /* 87 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_87_04) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_87_08) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_87_10) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_87_20) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_87_40) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_87_80), /* 88 */ 0, /* 89 */ 0, - /* 90 */ 0x300, + /* 90 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_90_10), /* 91 */ 0, - /* 92 */ 0xC000, - /* 93 */ 0xF0, + /* 92 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_92_80), + /* 93 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_93_04) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_93_08), /* 94 */ 0, /* 95 */ 0, /* 96 */ 0, @@ -266,7 +374,10 @@ s32 gFlashSaveSizes[] = { offsetof(SaveContext, fileNum), // size = 0x3CA0 - File 2 Owl Save Backup }; -u8 D_801C6890[8] = { 1 << 0, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; +// Bit Flag array in which sBitFlags8[n] is (1 << n) +u8 sBitFlags8[] = { + (1 << 0), (1 << 1), (1 << 2), (1 << 3), (1 << 4), (1 << 5), (1 << 6), (1 << 7), +}; u16 D_801F6AF0; u8 D_801F6AF2; @@ -326,21 +437,21 @@ void Sram_SaveEndOfCycle(PlayState* play) { sceneId = Play_GetOriginalSceneId(play->sceneId); Play_SaveCycleSceneFlags(&play->state); - play->actorCtx.sceneFlags.chest &= sPersistentCycleFlags[sceneId].chest; - play->actorCtx.sceneFlags.switches[0] &= sPersistentCycleFlags[sceneId].switch0; - play->actorCtx.sceneFlags.switches[1] &= sPersistentCycleFlags[sceneId].switch1; - play->actorCtx.sceneFlags.collectible[0] &= sPersistentCycleFlags[sceneId].collectible; + play->actorCtx.sceneFlags.chest &= sPersistentCycleSceneFlags[sceneId].chest; + play->actorCtx.sceneFlags.switches[0] &= sPersistentCycleSceneFlags[sceneId].switch0; + play->actorCtx.sceneFlags.switches[1] &= sPersistentCycleSceneFlags[sceneId].switch1; + play->actorCtx.sceneFlags.collectible[0] &= sPersistentCycleSceneFlags[sceneId].collectible; play->actorCtx.sceneFlags.clearedRoom = 0; for (i = 0; i < SCENE_MAX; i++) { gSaveContext.cycleSceneFlags[i].switch0 = - ((void)0, gSaveContext.cycleSceneFlags[i].switch0) & sPersistentCycleFlags[i].switch0; + ((void)0, gSaveContext.cycleSceneFlags[i].switch0) & sPersistentCycleSceneFlags[i].switch0; gSaveContext.cycleSceneFlags[i].switch1 = - ((void)0, gSaveContext.cycleSceneFlags[i].switch1) & sPersistentCycleFlags[i].switch1; + ((void)0, gSaveContext.cycleSceneFlags[i].switch1) & sPersistentCycleSceneFlags[i].switch1; gSaveContext.cycleSceneFlags[i].chest = - ((void)0, gSaveContext.cycleSceneFlags[i].chest) & sPersistentCycleFlags[i].chest; + ((void)0, gSaveContext.cycleSceneFlags[i].chest) & sPersistentCycleSceneFlags[i].chest; gSaveContext.cycleSceneFlags[i].collectible = - ((void)0, gSaveContext.cycleSceneFlags[i].collectible) & sPersistentCycleFlags[i].collectible; + ((void)0, gSaveContext.cycleSceneFlags[i].collectible) & sPersistentCycleSceneFlags[i].collectible; gSaveContext.cycleSceneFlags[i].clearedRoom = 0; gSaveContext.save.saveInfo.permanentSceneFlags[i].unk_14 = 0; gSaveContext.save.saveInfo.permanentSceneFlags[i].rooms = 0; @@ -362,15 +473,15 @@ void Sram_SaveEndOfCycle(PlayState* play) { Inventory_DeleteItem(ITEM_MASK_FIERCE_DEITY, SLOT(ITEM_MASK_FIERCE_DEITY)); } - for (i = 0; i < ARRAY_COUNT(D_801C66D0); i++) { - u16 phi_v1_3 = D_801C66D0[i]; + for (i = 0; i < ARRAY_COUNT(sPersistentCycleWeekEventRegs); i++) { + u16 isPersistentBits = sPersistentCycleWeekEventRegs[i]; - for (j = 0; j < ARRAY_COUNT(D_801C6890); j++) { - if ((phi_v1_3 & 3) == 0) { + for (j = 0; j < ARRAY_COUNT(sBitFlags8); j++) { + if (!(isPersistentBits & 3)) { gSaveContext.save.saveInfo.weekEventReg[i] = - ((void)0, gSaveContext.save.saveInfo.weekEventReg[i]) & (0xFF ^ D_801C6890[j]); + ((void)0, gSaveContext.save.saveInfo.weekEventReg[i]) & (0xFF ^ sBitFlags8[j]); } - phi_v1_3 >>= 2; + isPersistentBits >>= 2; } } diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index 749ee5878f..e4c0138f33 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -1925,8 +1925,8 @@ 0x801C5EB0:("D_801C5EB0","UNK_TYPE4","",0x4), 0x801C5EC4:("D_801C5EC4","UNK_TYPE2","",0x2), 0x801C5F44:("D_801C5F44","UNK_TYPE4","",0x4), - 0x801C5FC0:("sPersistentCycleFlags","u32","[452]",0x710), - 0x801C66D0:("D_801C66D0","UNK_TYPE2","",0x2), + 0x801C5FC0:("sPersistentCycleSceneFlags","u32","[452]",0x710), + 0x801C66D0:("sPersistentCycleWeekEventRegs","UNK_TYPE2","",0x2), 0x801C6798:("gSramSlotOffsets","UNK_TYPE4","",0x4), 0x801C67B0:("gAmmoItems","UNK_TYPE1","",0x1), 0x801C67C8:("gFlashSaveStartPages","s32","[10]",0x28),