From bc2201598711ba1980789384e0c79c3593cd25f0 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Wed, 2 Aug 2023 20:50:18 +0200 Subject: [PATCH] SaveFile cleanup part 1 --- include/global.h | 7 ++++++ include/room.h | 13 +++++++--- include/save.h | 40 ++++++++++++++++-------------- include/windcrest.h | 15 +++++++++++ src/affine.c | 2 +- src/beanstalkSubtask.c | 4 +-- src/code_0805EC04.c | 2 +- src/color.c | 2 +- src/enemyUtils.c | 2 +- src/game.c | 2 +- src/gameUtils.c | 24 ++++++++++-------- src/item/itemJarEmpty.c | 32 ++++++++++++------------ src/itemUtils.c | 2 +- src/kinstone.c | 3 +-- src/manager/rollingBarrelManager.c | 2 +- src/menu/pauseMenu.c | 29 +++++++++++++--------- src/menu/pauseMenuScreen6.c | 2 +- src/npc/forestMinish.c | 4 +-- src/npc/stockwell.c | 6 ++--- src/object/bigBarrel.c | 4 +-- src/object/figurineDevice.c | 6 ++--- src/playerUtils.c | 13 +++++----- src/roomInit.c | 31 ++++++++++++----------- src/subtask.c | 19 ++++++++------ src/subtask/subtaskFastTravel.c | 2 +- src/subtask/subtaskMapHint.c | 2 +- src/title.c | 4 +-- src/ui.c | 3 ++- 28 files changed, 160 insertions(+), 117 deletions(-) create mode 100644 include/windcrest.h diff --git a/include/global.h b/include/global.h index 9b3557ce..423af161 100644 --- a/include/global.h +++ b/include/global.h @@ -145,4 +145,11 @@ union SplitHWord { /* forward decls */ struct Entity_; +/** + * bitset macros + */ + +#define BIT(bit) (1 << (bit)) +#define IS_BIT_SET(value, bit) ((value) & BIT(bit)) + #endif // GLOBAL_H diff --git a/include/room.h b/include/room.h index 57999ae2..eec4e46d 100644 --- a/include/room.h +++ b/include/room.h @@ -133,7 +133,7 @@ typedef struct { /* 0x04 */ s16 start_pos_x; /* 0x06 */ s16 start_pos_y; /* 0x08 */ u8 layer; - /* 0x09 */ u8 field_0x15; + /* 0x09 */ u8 filler9; /* 0x0a */ u8 dungeon_area; /* 0x0b */ u8 dungeon_room; /* 0x0c */ s16 dungeon_x; @@ -142,7 +142,7 @@ typedef struct { /* 0x12 */ u16 dungeon_map_y; /* 0x14 */ u16 overworld_map_x; /* 0x16 */ u16 overworld_map_y; - /* 0x18 */ u8 field_0x24[8]; + /* 0x18 */ u8 filler18[8]; } PlayerRoomStatus; static_assert(sizeof(PlayerRoomStatus) == 0x20); @@ -155,7 +155,14 @@ typedef struct { /* 0x0a */ u16 stairs_idx; // seems to be a tile type /* 0x0c */ PlayerRoomStatus player_status; /* 0x2c */ u8 entity_update_type; // differentiates entity priority on kinstone menu? - /* 0x2d */ u8 field_0x2c[0x8]; + /* 0x2d */ u8 field2d; + /* 0x2e */ u8 location; + /* 0x2f */ u8 field2f; + /* 0x30 */ u8 field30; + /* 0x31 */ u8 field31; + /* 0x32 */ u8 field32; + /* 0x33 */ u8 field33; + /* 0x34 */ u8 hint_heightEU; /* 0x35 */ u8 hint_height; /* 0x36 */ u16 hint_idx; /* 0x38 */ u8 field_0x38; diff --git a/include/save.h b/include/save.h index aa206fe5..ac3e7294 100644 --- a/include/save.h +++ b/include/save.h @@ -33,25 +33,27 @@ extern SaveResult HandleSave(u32 idx); * The contents of this structure are read from and written to EEPROM. */ typedef struct { - /*0x000*/ u8 invalid; /**< File is invalid. */ - /*0x001*/ u8 initialized; /**< File is initialized. */ - /*0x002*/ u8 msg_speed; /**< Message speed. */ - /*0x003*/ u8 brightness; /**< Brightness. */ - /*0x004*/ u8 filler4[0x2]; - /*0x006*/ u8 saw_staffroll; - /*0x007*/ u8 unk7; // TODO rolling barrel state? - /*0x008*/ u8 global_progress; /**< @see UpdateGlobalProgress */ - /*0x009*/ u8 field_0x9[0x17]; - /*0x020*/ u16 field_0x20; - /*0x022*/ u8 field_0x22[0x1e]; - /*0x040*/ u32 windcrests; /**< Windcrest flags. */ - /*0x044*/ u8 filler44[0xC]; - /*0x050*/ u32 unk50; - /*0x054*/ u8 filler54[0x8]; - /*0x05C*/ u32 unk5C; - /*0x060*/ u32 areaVisitFlags[8]; /**< Area visit flags. */ - /*0x080*/ char name[FILENAME_LENGTH]; /**< Save file name. */ - /*0x086*/ u8 filler86[0x2]; + /*0x000*/ u8 invalid; /**< File is invalid. */ + /*0x001*/ u8 initialized; /**< File is initialized. */ + /*0x002*/ u8 msg_speed; /**< Message speed. */ + /*0x003*/ u8 brightness; /**< Brightness. */ + /*0x004*/ u8 filler4[0x2]; /**< unused filler */ + /*0x006*/ u8 saw_staffroll; /**< beat the game and watched the credits */ + /*0x007*/ u8 dws_barrel_state; /**< state of the big barrel in DWS, 0 or 2 */ + /*0x008*/ u8 global_progress; /**< @see UpdateGlobalProgress */ + /*0x009*/ u8 available_figurines; /**< figurines available to get */ + /*0x00A*/ u8 fillerA[0x16]; /**< unused filler */ + /*0x020*/ u16 map_hints; /**< bitmask, used by subtask MapHint */ + /*0x022*/ u8 filler22[0x1e]; /**< unused filler */ + /*0x040*/ u32 windcrests; /**< upper 8 bit Windcrest flags @see WindcrestID + * lower bits used for other things */ + /*0x044*/ u8 filler44[0xC]; /**< unused filler */ + /*0x050*/ u32 enemies_killed; /**< number of enemies killed */ + /*0x054*/ u8 filler54[0x8]; /**< unused filler */ + /*0x05C*/ u32 items_bought; /**< number of items bought in stockwells shop */ + /*0x060*/ u32 areaVisitFlags[8]; /**< Area visit flags. */ + /*0x080*/ char name[FILENAME_LENGTH]; /**< Save file name. */ + /*0x086*/ u8 filler86[0x2]; /**< unused filler */ /*0x088*/ PlayerRoomStatus saved_status; /**< Player room status. */ /*0x0A8*/ Stats stats; /**< Player stats. */ /*0x0D0*/ u8 fillerD0[34]; diff --git a/include/windcrest.h b/include/windcrest.h new file mode 100644 index 00000000..2c81c1e4 --- /dev/null +++ b/include/windcrest.h @@ -0,0 +1,15 @@ +#ifndef SAVEFILE_WINDCREST_H +#define SAVEFILE_WINDCREST_H + +typedef enum WindcrestID { + WINDCREST_MT_CRENEL = 24, + WINDCREST_VEIL_FALLS, + WINDCREST_CLOUD_TOPS, + WINDCREST_HYRULE_TOWN, + WINDCREST_LAKE_HYLIA, + WINDCREST_CASTOR_WILDS, + WINDCREST_SOUTH_HYRULE_FIELD, + WINDCREST_MINISH_WOODS, +} WindcrestID; + +#endif // SAVEFILE_WINDCREST_H diff --git a/src/affine.c b/src/affine.c index eb114665..04c0be86 100644 --- a/src/affine.c +++ b/src/affine.c @@ -53,7 +53,7 @@ void CopyOAM(void) { void DrawEntities(void) { void (*fn)(void); - gOAMControls._0[6] = gRoomTransition.field_0x2c[2] ? 15 : 0; + gOAMControls._0[6] = gRoomTransition.field2f ? 15 : 0; gOAMControls._4 = gRoomControls.aff_x + gRoomControls.scroll_x; gOAMControls._6 = gRoomControls.aff_y + gRoomControls.scroll_y; gOAMControls.field_0x1++; diff --git a/src/beanstalkSubtask.c b/src/beanstalkSubtask.c index f1f85a4a..89e2f40c 100644 --- a/src/beanstalkSubtask.c +++ b/src/beanstalkSubtask.c @@ -1024,7 +1024,7 @@ void sub_0801AE44(bool32 loadGfx) { } sub_080809D4(); UpdateIsDiggingCave(); - if (gRoomTransition.field_0x2c[0] != 0) { + if (gRoomTransition.field2d != 0) { sub_0807C898(); } if (gArea.lightType != 0) { @@ -1061,7 +1061,7 @@ void SetMultipleTiles(const TileData* tileData, u32 basePosition, u32 layer) { // Add a new entry at the end of gUnk_0200B240 void sub_0801AF48(u32 data, u32 position, u32 layer) { u32 index; - if ((data < 0x4000) && (gRoomTransition.field_0x2c[3] == 0)) { + if ((data < 0x4000) && (gRoomTransition.field30 == 0)) { index = gRoomVars.unk_0e; if (index < 0x100) { gUnk_0200B240[index].data = data; diff --git a/src/code_0805EC04.c b/src/code_0805EC04.c index c3a7bdbd..01fa2d32 100644 --- a/src/code_0805EC04.c +++ b/src/code_0805EC04.c @@ -183,7 +183,7 @@ u32 ConvInputToState(u32 keys) { } void sub_0805EE88(void) { - if ((gRoomTransition.field_0x2c[2] != 0) && ((gRoomTransition.frameCount & 3) == 0)) { + if ((gRoomTransition.field2f != 0) && ((gRoomTransition.frameCount & 3) == 0)) { LoadPaletteGroup((((u32)gRoomTransition.frameCount & 0xc) >> 2) + 0x2f); } } diff --git a/src/color.c b/src/color.c index 78cb5a11..8df8a607 100644 --- a/src/color.c +++ b/src/color.c @@ -54,7 +54,7 @@ void sub_0801D000(u32 a1) { tmp = 0; } - roomTransition->field_0x2c[2] = tmp; + roomTransition->field2f = tmp; if (a1) { CleanUpObjPalettes(); sub_0801CFD0(0xf); diff --git a/src/enemyUtils.c b/src/enemyUtils.c index d484865a..05d59a98 100644 --- a/src/enemyUtils.c +++ b/src/enemyUtils.c @@ -192,7 +192,7 @@ void CreateDeathFx(GenericEntity* parent, u32 parentId, u32 fixedItem) { int tmp = parent->base.gustJarState & 2; if (tmp == 0) { sub_08049CF4(&(parent->base)); - gSave.unk50++; + gSave.enemies_killed++; parent->base.gustJarState |= 2; parent->base.timer = 255; SetDefaultPriority(&(parent->base), 3); diff --git a/src/game.c b/src/game.c index 206b9ef2..e1a0822f 100644 --- a/src/game.c +++ b/src/game.c @@ -229,7 +229,7 @@ static void GameMain_ChangeRoom(void) { sub_0801855C(); } #elif defined(DEMO_JP) - if (gRoomTransition.field_0x2c[4]) + if (gRoomTransition.field31) CheckAreaDiscovery(); if (gArea.unk28.textBaseIndex != 0xff) { sub_0801855C(); diff --git a/src/gameUtils.c b/src/gameUtils.c index eb2eb7fb..bb93d78a 100644 --- a/src/gameUtils.c +++ b/src/gameUtils.c @@ -449,15 +449,17 @@ void DisplayEzloMessage(void) { u32 height; u32 idx; #if defined(JP) || defined(EU) - idx = 0x10; + if (gRoomTransition.hint_heightEU == 0) { #else - idx = 0x11; + if (gRoomTransition.hint_height == 0) { #endif - - if (gRoomTransition.player_status.field_0x24[idx] == 0) { height = gPlayerEntity.y.HALF.HI - gRoomControls.scroll_y > 96 ? 1 : 13; } else { - height = gRoomTransition.player_status.field_0x24[idx]; +#if defined(JP) || defined(EU) + height = gRoomTransition.hint_heightEU; +#else + height = gRoomTransition.hint_height; +#endif } MessageAtHeight(gRoomTransition.hint_idx, height); } @@ -466,11 +468,11 @@ void DisplayEzloMessage(void) { void CreateMiscManager(void) { Entity* e = NULL; - if (gRoomTransition.player_status.field_0x24[13]) + if (gRoomTransition.field31) return; - gRoomTransition.player_status.field_0x24[13] = 1; + gRoomTransition.field31 = 1; #ifndef DEMO_JP - gRoomTransition.player_status.field_0x24[10] = gArea.locationIndex; + gRoomTransition.location = gArea.locationIndex; #endif e = (Entity*)GetEmptyManager(); if (e == NULL) @@ -714,7 +716,7 @@ u32 sub_08053144(void) { return 0; ret = 0; if (gArea.locationIndex != 0) - ret = !!(gRoomTransition.player_status.field_0x24[10] ^ gArea.locationIndex); + ret = !!(gRoomTransition.location ^ gArea.locationIndex); return ret; } @@ -722,7 +724,7 @@ void CheckAreaDiscovery(void) { if (!sub_08053144()) return; - gRoomTransition.player_status.field_0x24[10] = gArea.locationIndex; + gRoomTransition.location = gArea.locationIndex; if (!CheckGlobalFlag(TABIDACHI)) return; @@ -772,7 +774,7 @@ void sub_0805329C(void) { if (sub_08053144()) { switch (gRoomControls.area) { case AREA_DEEPWOOD_SHRINE: - gSave.unk7 = 0; + gSave.dws_barrel_state = 0; break; case AREA_CAVE_OF_FLAMES: sub_080530B0(); diff --git a/src/item/itemJarEmpty.c b/src/item/itemJarEmpty.c index 60997922..cf4b06ec 100644 --- a/src/item/itemJarEmpty.c +++ b/src/item/itemJarEmpty.c @@ -24,30 +24,30 @@ void sub_08077534(ItemBehavior* this, u32 index) { sub_08077BB8(this); this->priority |= 0xf; tmp = this->behaviorId; - this->timer = gSave.filler86[tmp + 0x14]; + this->timer = gSave.stats.bottles[tmp - ITEM_BOTTLE1]; switch (this->timer) { - case 0x20: + case ITEM_BOTTLE_EMPTY: SetItemAnim(this, 0x614); return; - case 0x21: - case 0x22: - case 0x23: - case 0x24: - case 0x25: - case 0x29: - case 0x2a: - case 0x2b: - case 0x2c: - case 0x2d: - case 0x2e: + case ITEM_BOTTLE_BUTTER: + case ITEM_BOTTLE_MILK: + case ITEM_BOTTLE_HALF_MILK: + case ITEM_BOTTLE_RED_POTION: + case ITEM_BOTTLE_BLUE_POTION: + case ITEM_BOTTLE_PICOLYTE_RED: + case ITEM_BOTTLE_PICOLYTE_ORANGE: + case ITEM_BOTTLE_PICOLYTE_YELLOW: + case ITEM_BOTTLE_PICOLYTE_GREEN: + case ITEM_BOTTLE_PICOLYTE_BLUE: + case ITEM_BOTTLE_PICOLYTE_WHITE: this->stateID = 3; gPlayerEntity.animationState = 4; gPlayerEntity.spriteSettings.flipX = 0; SetItemAnim(this, 0x2df); break; - case 0x2f: - case 0x30: - case 0x31: + case BOTTLE_CHARM_NAYRU: + case BOTTLE_CHARM_FARORE: + case BOTTLE_CHARM_DIN: default: this->stateID = 3; SetItemAnim(this, 0x610); diff --git a/src/itemUtils.c b/src/itemUtils.c index 72cd7608..9436621f 100644 --- a/src/itemUtils.c +++ b/src/itemUtils.c @@ -385,7 +385,7 @@ void sub_08054524(void) { bVar1 = gArea.locationIndex; if (gArea.locationIndex == 0) { - bVar1 = gRoomTransition.player_status.field_0x24[0xa]; + bVar1 = gRoomTransition.location; } if (bVar1 > 0x16) { bVar1 = 0; diff --git a/src/kinstone.c b/src/kinstone.c index 1dff20c6..936d07aa 100644 --- a/src/kinstone.c +++ b/src/kinstone.c @@ -180,8 +180,7 @@ void GenerateAreaHint(void) { gPlayerState.queued_action = PLAYER_TALKEZLO; #if defined(EU) || defined(JP) - // TODO what fields of the room transition are switched in these variants? - gRoomTransition.field_0x2c[7] = 0; + gRoomTransition.hint_heightEU = 0; #else gRoomTransition.hint_height = 0; #endif diff --git a/src/manager/rollingBarrelManager.c b/src/manager/rollingBarrelManager.c index 3b1d6d41..20c8b3f1 100644 --- a/src/manager/rollingBarrelManager.c +++ b/src/manager/rollingBarrelManager.c @@ -192,7 +192,7 @@ void sub_08058B5C(RollingBarrelManager* this, u32 unk1) { gRoomTransition.player_status.start_anim = unk1 & 1 ? 4 : 0; gRoomTransition.player_status.start_pos_x = gUnk_081082E8[unk1 * 3]; gRoomTransition.player_status.start_pos_y = gUnk_081082E8[unk1 * 3 + 1]; - gSave.unk7 = gUnk_081082E8[unk1 * 3 + 2]; + gSave.dws_barrel_state = gUnk_081082E8[unk1 * 3 + 2]; SoundReq(SFX_STAIRS); } diff --git a/src/menu/pauseMenu.c b/src/menu/pauseMenu.c index 7561c19a..27f747d9 100644 --- a/src/menu/pauseMenu.c +++ b/src/menu/pauseMenu.c @@ -431,7 +431,7 @@ void PauseMenu_ItemMenu_Update(void) { case MENU_SLOT_BOTTLE2: case MENU_SLOT_BOTTLE3: if (item != 0) { - item = gSave.saved_status.field_0x24[item - 6]; + item = gSave.stats.bottles[item - ITEM_BOTTLE1]; } break; case MENU_SLOT_SAVE_BUTTON: @@ -1232,7 +1232,7 @@ bool32 sub_080A5F24(void) { return result; } -void sub_080A5F48(u32 param_1, u32 param_2) { +void sub_080A5F48(Item item, u32 param_2) { extern u32 gSprite_082E68F4[]; u32 ammoCount; u32 tensDigit; @@ -1242,19 +1242,24 @@ void sub_080A5F48(u32 param_1, u32 param_2) { u32 temp3; register u32 rem asm("r1"); - switch (param_1) { - case 0x1c ... 0x1f: - param_1 = (u32)gSave.saved_status.field_0x24[param_1 - 6]; + switch (item) { + case ITEM_BOTTLE1: + case ITEM_BOTTLE2: + case ITEM_BOTTLE3: + case ITEM_BOTTLE4: + item = gSave.stats.bottles[item - ITEM_BOTTLE1]; + break; + default: break; } temp1 = param_2 * 0x20 + 0x6010000; - temp3 = gSpriteAnimations_322[param_1]->index; + temp3 = gSpriteAnimations_322[item]->index; temp2 = &gMoreSpritePtrs[1][temp3 * 2]; DmaCopy32(3, &gMoreSpritePtrs[2][temp2[1] * 0x10], temp1, 0x40 * 4); ammoCount = -1; - switch (param_1) { + switch (item) { case 7: case 8: ammoCount = gSave.stats.bombCount; @@ -1267,12 +1272,12 @@ void sub_080A5F48(u32 param_1, u32 param_2) { if (-1 < (int)ammoCount) { tensDigit = Div(ammoCount, 10); - param_1 = rem; + item = rem; if ((int)tensDigit >= 10) { tensDigit = 9; } DmaCopy32(3, gUnk_085C4620 + tensDigit * 0x8, temp1, 0x8 * 4); - DmaCopy32(3, gUnk_085C4620 + (param_1 + 10) * 0x8, temp1 + 0x20, 0x8 * 4); + DmaCopy32(3, gUnk_085C4620 + (item + 10) * 0x8, temp1 + 0x20, 0x8 * 4); } } @@ -1431,7 +1436,7 @@ void sub_080A62E0(void) { switch (gInput.newKeys) { case A_BUTTON: - if ((gSave.windcrests & (1 << gMenu.field_0x3)) != 0) { + if (IS_BIT_SET(gSave.windcrests, gMenu.field_0x3)) { SoundReq(SFX_TEXTBOX_SELECT); sub_080A4E84(6); windcrest = -1; @@ -1495,7 +1500,7 @@ void sub_080A6438(void) { gOamCmd._4 = 0x400; gOamCmd._6 = 0; gOamCmd._8 = 0; - uVar1 = gSave.field_0x20 & gGenericMenu.unk10.h[0]; + uVar1 = gSave.map_hints & gGenericMenu.unk10.h[0]; for (pcVar2 = gUnk_08128F58, uVar3 = 0; pcVar2->frameIndex != 0; uVar3++, pcVar2++) { if ((1 << uVar3 & uVar1) != 0) { gOamCmd.x = pcVar2->unk1; @@ -1512,7 +1517,7 @@ void sub_080A6498(void) { gOamCmd._6 = 0; gOamCmd._8 = 0; for (i = 0; i <= 0x10; i++) { - if ((gSave.windcrests & (1 << i)) == 0) { + if (!IS_BIT_SET(gSave.windcrests, i)) { gUnk_08128DE8_struct* ptr = &gUnk_08128DE8[i]; gOamCmd.x = ptr->unk6; gOamCmd.y = ptr->unk7; diff --git a/src/menu/pauseMenuScreen6.c b/src/menu/pauseMenuScreen6.c index c9a085c9..89ef214b 100644 --- a/src/menu/pauseMenuScreen6.c +++ b/src/menu/pauseMenuScreen6.c @@ -196,7 +196,7 @@ void sub_080A68D4(void) { sub_080A698C(gRoomTransition.player_status.overworld_map_x, gRoomTransition.player_status.overworld_map_y, DRAW_DIRECT_SPRITE_INDEX, iVar6 + 0x100); uVar1 = sub_080A6F40(); - uVar1 &= gSave.field_0x20; + uVar1 &= gSave.map_hints; for (pcVar4 = gUnk_08128F58, i = 0; pcVar4->frameIndex != 0; i++, pcVar4++) { if (((1 << i) & uVar1) != 0) { diff --git a/src/npc/forestMinish.c b/src/npc/forestMinish.c index b002d976..f8fd8219 100644 --- a/src/npc/forestMinish.c +++ b/src/npc/forestMinish.c @@ -706,13 +706,13 @@ void sub_08060318(void) { } void sub_08060340(void) { - gSave.timers[1] = gSave.unk50; + gSave.timers[1] = gSave.enemies_killed; } u32 sub_08060354(void) { s32 iVar2; - iVar2 = gSave.unk50 - gSave.timers[1]; + iVar2 = gSave.enemies_killed - gSave.timers[1]; if (CheckGlobalFlag(DRUG_1) == 0) { if (4 < iVar2) { return 0x8444; diff --git a/src/npc/stockwell.c b/src/npc/stockwell.c index fa1e1305..e9fcae3c 100644 --- a/src/npc/stockwell.c +++ b/src/npc/stockwell.c @@ -251,11 +251,11 @@ void sub_08065370(Entity* this, ScriptExecutionContext* context) { if (localFlag) { SetLocalFlag(localFlag); } - if (gSave.unk5C <= ~1u) { - gSave.unk5C++; + if (gSave.items_bought <= ~1u) { + gSave.items_bought++; } - if (gSave.unk5C >= 10) { + if (gSave.items_bought >= 10) { context->intVariable = TEXT_INDEX(TEXT_STOCKWELL, 0x11); } else { if (itemPrice >= 100) { diff --git a/src/object/bigBarrel.c b/src/object/bigBarrel.c index f40c90a3..b1b3df30 100644 --- a/src/object/bigBarrel.c +++ b/src/object/bigBarrel.c @@ -53,9 +53,9 @@ void sub_08088A68(BigBarrelEntity* this) { super->spriteSettings.draw = 3; super->updatePriority = 3; if (CheckGlobalFlag(LV1TARU_OPEN)) { - super->frameIndex = gSave.unk7 + 1; + super->frameIndex = gSave.dws_barrel_state + 1; } else { - super->frameIndex = gSave.unk7; + super->frameIndex = gSave.dws_barrel_state; } sub_08088BE0(this); if (CheckPlayerInRegion(super->x.HALF.HI - gRoomControls.origin_x, super->y.HALF.HI - gRoomControls.origin_y, diff --git a/src/object/figurineDevice.c b/src/object/figurineDevice.c index bf406be3..16766cb8 100644 --- a/src/object/figurineDevice.c +++ b/src/object/figurineDevice.c @@ -474,11 +474,11 @@ void sub_080880D8(FigurineDeviceEntity* this) { it++; } if (++this->unk_7b == 4) { - if (gSave.field_0x9[0] != this->unk_80) { - if (gSave.field_0x9[0] != 0) { + if (gSave.available_figurines != this->unk_80) { + if (gSave.available_figurines != 0) { SetRoomFlag(6); } - gSave.field_0x9[0] = this->unk_80; + gSave.available_figurines = this->unk_80; } if (CheckLocalFlag(SHOP07_COMPLETE) && (this->unk_80 != gSave.stats.filler[0])) { ClearLocalFlag(SHOP07_COMPLETE); diff --git a/src/playerUtils.c b/src/playerUtils.c index 3515748c..0e3802eb 100644 --- a/src/playerUtils.c +++ b/src/playerUtils.c @@ -1289,8 +1289,7 @@ void CreateEzloHint(u32 hintId, u32 hintHeight) { gPlayerState.queued_action = PLAYER_TALKEZLO; gRoomTransition.hint_idx = hintId; #if defined(EU) || defined(JP) - // TODO what fields of the room transition are switched in these variants? - gRoomTransition.field_0x2c[7] = hintHeight; + gRoomTransition.hint_heightEU = hintHeight; #else gRoomTransition.hint_height = hintHeight; #endif @@ -3509,10 +3508,10 @@ void LoadRoomGfx(void) { MemClear(gMapBottom.mapData, sizeof(gMapBottom.mapData)); tmp = TRUE; } - if (gRoomTransition.field_0x2c[0] == 0) { + if (gRoomTransition.field2d == 0) { MemCopy(gMapBottom.mapData, gMapBottom.mapDataClone, sizeof(gMapBottom.mapData)); MemCopy(gMapTop.mapData, gMapTop.mapDataClone, sizeof(gMapBottom.mapData)); - } else if (gRoomTransition.field_0x2c[0] == 2) { + } else if (gRoomTransition.field2d == 2) { MemCopy(gMapBottom.mapData, gMapBottom.unkData3, 0x1000); MemCopy(gMapBottom.mapDataClone, gMapBottom.mapData, 0x1000); MemCopy(gMapBottom.unkData3, gMapBottom.mapDataClone, 0x1000); @@ -3844,15 +3843,15 @@ void sub_0807C810(void) { * This function is used to create a copy of the map data for temporary cutscene changes. */ void CloneMapData(void) { - gRoomTransition.field_0x2c[0] = 1; + gRoomTransition.field2d = 1; MemCopy(&gMapBottom.mapData, &gMapBottom.mapDataClone, 0x2000); MemCopy(&gMapTop.mapData, &gMapTop.mapDataClone, 0x2000); } void sub_0807C898(void) { - gRoomTransition.field_0x2c[0] = 2; + gRoomTransition.field2d = 2; LoadRoomGfx(); - gRoomTransition.field_0x2c[0] = 0; + gRoomTransition.field2d = 0; } ASM_FUNC("asm/non_matching/playerUtils/sub_0807C8B0.inc", void sub_0807C8B0(u16* a, u32 b, u32 c)) diff --git a/src/roomInit.c b/src/roomInit.c index 51b92921..bbe55eae 100644 --- a/src/roomInit.c +++ b/src/roomInit.c @@ -13,6 +13,7 @@ #include "screen.h" #include "screenTransitions.h" #include "sound.h" +#include "windcrest.h" extern u32 sub_08060354(void); extern void sub_08057E64(void); @@ -1219,7 +1220,7 @@ void sub_StateChange_CastorWilds_Main(void) { if (CheckKinstoneFused(KINSTONE_5B)) LoadRoomEntityList(&gUnk_080D9CC8); - if ((gSave.windcrests & 0x20000000) == 0) + if (!IS_BIT_SET(gSave.windcrests, WINDCREST_CASTOR_WILDS)) LoadRoomEntityList(&gUnk_080D9CE8); if (!GetInventoryValue(ITEM_PEGASUS_BOOTS)) @@ -1227,7 +1228,7 @@ void sub_StateChange_CastorWilds_Main(void) { } void sub_unk1_CastorWilds_Main(void) { - if ((gSave.windcrests & 0x20000000) == 0) + if (!IS_BIT_SET(gSave.windcrests, WINDCREST_CASTOR_WILDS)) LoadRoomEntityList(&gUnk_080D9CE8); } @@ -2003,13 +2004,13 @@ u32 sub_unk3_CloudTops_House(void) { extern EntityData gUnk_080DD364; void sub_StateChange_CloudTops_House(void) { - if (!(gSave.windcrests & 0x4000000)) { + if (!IS_BIT_SET(gSave.windcrests, WINDCREST_CLOUD_TOPS)) { LoadRoomEntityList(&gUnk_080DD364); } } void sub_unk1_CloudTops_House(void) { - if (!(gSave.windcrests & 0x4000000)) { + if (!IS_BIT_SET(gSave.windcrests, WINDCREST_CLOUD_TOPS)) { LoadRoomEntityList(&gUnk_080DD364); } } @@ -2187,7 +2188,7 @@ u32 sub_unk3_DeepwoodShrine_Barrel(void) { } void sub_StateChange_DeepwoodShrine_Barrel(void) { - switch (gSave.unk7) { + switch (gSave.dws_barrel_state) { case 0: default: SetTileType(0x90, 0x20b, 1); @@ -4420,7 +4421,7 @@ void sub_StateChange_HyruleTown_0(void) { if ((gSave.global_progress < 6) && !CheckGlobalFlag(MIZUKAKI_START)) { LoadRoomEntityList(&gUnk_080EEA9C); } - if ((gSave.windcrests & 0x8000000) == 0) { + if (!IS_BIT_SET(gSave.windcrests, WINDCREST_HYRULE_TOWN)) { LoadRoomEntityList(&gUnk_080EEBAC); } sub_0804E150(); @@ -4428,7 +4429,7 @@ void sub_StateChange_HyruleTown_0(void) { } void sub_unk1_HyruleTown_8(void) { - if ((gSave.windcrests & 0x8000000) == 0) { + if (!IS_BIT_SET(gSave.windcrests, WINDCREST_HYRULE_TOWN)) { LoadRoomEntityList(&gUnk_080EEBAC); } } @@ -5207,7 +5208,7 @@ void sub_StateChange_MinishWoods_Main(void) { if (CheckKinstoneFused(KINSTONE_4E)) { LoadRoomEntityList(&gUnk_080F4F10); } - if ((s32)gSave.windcrests > -1) { + if (!IS_BIT_SET(gSave.windcrests, WINDCREST_MINISH_WOODS)) { LoadRoomEntityList(&gUnk_080F4E10); } #ifdef DEMO_USA @@ -5217,7 +5218,7 @@ void sub_StateChange_MinishWoods_Main(void) { } void sub_unk1_MinishWoods_Main(void) { - if ((s32)gSave.windcrests > -1) { + if (!IS_BIT_SET(gSave.windcrests, WINDCREST_MINISH_WOODS)) { LoadRoomEntityList(&gUnk_080F4E10); } } @@ -5652,7 +5653,7 @@ void sub_StateChange_HyruleField_SouthHyruleField(void) { if (!CheckGlobalFlag(TABIDACHI)) { gArea.queued_bgm = BGM_FESTIVAL_APPROACH; } - if ((gSave.windcrests & 0x40000000) == 0) { + if (!IS_BIT_SET(gSave.windcrests, WINDCREST_SOUTH_HYRULE_FIELD)) { LoadRoomEntityList(&gUnk_080F70D8); } if (gSave.global_progress > 3) { @@ -5661,7 +5662,7 @@ void sub_StateChange_HyruleField_SouthHyruleField(void) { } void sub_unk1_HyruleField_SouthHyruleField(void) { - if ((gSave.windcrests & 0x40000000) == 0) { + if (!IS_BIT_SET(gSave.windcrests, WINDCREST_SOUTH_HYRULE_FIELD)) { LoadRoomEntityList(&gUnk_080F70D8); } } @@ -6169,13 +6170,13 @@ u32 sub_unk3_VeilFalls_Main(void) { extern EntityData gUnk_080F9304; void sub_StateChange_VeilFalls_Main(void) { - if ((gSave.windcrests & 0x2000000) == 0) { + if (!IS_BIT_SET(gSave.windcrests, WINDCREST_VEIL_FALLS)) { LoadRoomEntityList(&gUnk_080F9304); } } void sub_unk1_VeilFalls_Main(void) { - if ((gSave.windcrests & 0x2000000) == 0) { + if (!IS_BIT_SET(gSave.windcrests, WINDCREST_VEIL_FALLS)) { LoadRoomEntityList(&gUnk_080F9304); } } @@ -6581,7 +6582,7 @@ void sub_StateChange_MtCrenel_CaveOfFlamesEntrance(void) { if (CheckGlobalFlag(LV2_CLEAR) && !CheckLocalFlag(LV1_CLEAR)) { LoadRoomEntityList(&gUnk_080FAFE4); } - if ((gSave.windcrests & 0x1000000) == 0) { + if (!IS_BIT_SET(gSave.windcrests, WINDCREST_MT_CRENEL)) { LoadRoomEntityList(&gUnk_080FB004); } if (GetInventoryValue(ITEM_GREEN_SWORD)) { @@ -6590,7 +6591,7 @@ void sub_StateChange_MtCrenel_CaveOfFlamesEntrance(void) { } void sub_unk1_MtCrenel_CaveOfFlamesEntrance(void) { - if ((gSave.windcrests & 0x1000000) == 0) { + if (!IS_BIT_SET(gSave.windcrests, WINDCREST_MT_CRENEL)) { LoadRoomEntityList(&gUnk_080FB004); } } diff --git a/src/subtask.c b/src/subtask.c index 6af46d94..e801bade 100644 --- a/src/subtask.c +++ b/src/subtask.c @@ -13,6 +13,7 @@ #include "screen.h" #include "subtask.h" #include "ui.h" +#include "windcrest.h" extern Screen gUnk_03001020; extern u8 gPaletteBufferBackup[]; @@ -61,7 +62,7 @@ void sub_080A6F6C(u32 textIndexOrPtr) { gScreen.bg0.yOffset = 2; } -void sub_080A6FB4(u32 param_1, u32 param_2) { +void sub_080A6FB4(WindcrestID windcrest, u32 param_2) { extern u16 gUnk_08128FF0[]; extern Font gUnk_08128FD8; extern Font gUnk_08128FC0; @@ -71,16 +72,20 @@ void sub_080A6FB4(u32 param_1, u32 param_2) { textIndexOrPtr = 0; switch (param_2) { case 0: - if ((gSave.windcrests & (1 << param_1)) == 0) + if (!IS_BIT_SET(gSave.windcrests, windcrest)) break; case 2: - textIndexOrPtr = gUnk_08127F94[param_1]._6; + // TODO this probably references later data with index param_1-24 + textIndexOrPtr = gUnk_08127F94[windcrest]._6; font = &gUnk_08128FC0; break; case 1: - textIndexOrPtr = gUnk_08128FF0[param_1]; + // TODO this probably references later data with index param_1-24 + textIndexOrPtr = gUnk_08128FF0[windcrest]; font = &gUnk_08128FD8; break; + default: + break; } if (gGenericMenu.unk2e.HWORD != textIndexOrPtr) { @@ -211,7 +216,7 @@ void Subtask_FadeIn(void) { MemCopy(gUnk_03000420, gUI.unk_2a8, sizeof(gUI.unk_2a8)); MemCopy(&gActiveScriptInfo, &gUI.activeScriptInfo, sizeof(ActiveScriptInfo)); sub_0805E958(); - gUI.unk_d = gRoomTransition.field_0x2c[2]; + gUI.unk_d = gRoomTransition.field2f; gUI.controlMode = gPlayerState.controlMode; gUI.currentRoomProperties = gCurrentRoomProperties; gUI.mapBottomBgSettings = gMapBottom.bgSettings; @@ -234,7 +239,7 @@ void Subtask_Init(void) { ResetPaletteTable(0); gGFXSlots.unk0 = 1; gUI.nextToLoad = 2; // Subtask_Update - gRoomTransition.field_0x2c[3] = 1; + gRoomTransition.field30 = 1; } } @@ -263,7 +268,7 @@ void Subtask_FadeOut(void) { SetFadeInverted(gUI.fadeInTime); } gUI.nextToLoad = 4; // Subtask_Die - gRoomTransition.field_0x2c[3] = 0; + gRoomTransition.field30 = 0; } } diff --git a/src/subtask/subtaskFastTravel.c b/src/subtask/subtaskFastTravel.c index 0f657cb7..6e4749e6 100644 --- a/src/subtask/subtaskFastTravel.c +++ b/src/subtask/subtaskFastTravel.c @@ -168,7 +168,7 @@ void sub_080A6E70(void) { DrawDirect(DRAW_DIRECT_SPRITE_INDEX, frameIndex); for (i = 0; i < 8; i++) { - if ((gSave.windcrests & (1 << (i + 0x18))) != 0) { + if (IS_BIT_SET(gSave.windcrests, i + 24)) { sub_080A6EE0(i); DrawDirect(DRAW_DIRECT_SPRITE_INDEX, 0x5c); } diff --git a/src/subtask/subtaskMapHint.c b/src/subtask/subtaskMapHint.c index 2a802f2b..201a8638 100644 --- a/src/subtask/subtaskMapHint.c +++ b/src/subtask/subtaskMapHint.c @@ -38,7 +38,7 @@ void Subtask_MapHint_0(void) { gScreen.lcd.displayControl = gScreen.lcd.displayControl & 0xf7ff; SetColor(0, gPaletteBuffer[0x51]); val = gUnk_08128F4C[gUI.field_0x3]; - gSave.field_0x20 |= val; + gSave.map_hints |= val; gGenericMenu.unk10.h[1] = val & gGenericMenu.unk10.h[0]; gGenericMenu.unk10.h[0] = 0; gMenu.transitionTimer = 60; diff --git a/src/title.c b/src/title.c index 4473b24b..353604e3 100644 --- a/src/title.c +++ b/src/title.c @@ -72,9 +72,9 @@ static const SaveFile gDemoSave = { .msg_speed = 1, .brightness = 1, .global_progress = 1, - .field_0x20 = 0x1F, + .map_hints = 0x1F, .windcrests = 0x00013780, - .unk50 = 7, + .enemies_killed = 7, .areaVisitFlags = { 0x0114C300 }, .name = "\x97\x7f\xdd", .saved_status = { diff --git a/src/ui.c b/src/ui.c index 7e660167..dcc5b573 100644 --- a/src/ui.c +++ b/src/ui.c @@ -8,6 +8,7 @@ #include "player.h" #include "area.h" #include "game.h" +#include "item.h" extern void sub_0805ECEC(u32, u32, u32, u32); extern u32 sub_08000E44(u32); @@ -664,7 +665,7 @@ u32 sub_0801CC80(UIElement* element) { u32 buttonId = (type ^ 3) != 0; u32 itemId = gSave.stats.itemButtons[buttonId]; if (ItemIsBottle(itemId)) { - itemId = gSave.saved_status.field_0x24[itemId - 6]; + itemId = gSave.stats.bottles[itemId - ITEM_BOTTLE1]; } return itemId; }