From 78ffb41cd2d8fa3e68ee9fcb1fb496ddeede878e Mon Sep 17 00:00:00 2001 From: Malkierian Date: Mon, 13 Nov 2023 16:11:29 -0700 Subject: [PATCH 01/18] Moved the check for `!seqInfo.canBeUsedAsReplacement` in `InitializeShufflePool` to exclude them before modifying either shuffle pool. (#3370) --- soh/soh/Enhancements/audio/AudioCollection.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/audio/AudioCollection.cpp b/soh/soh/Enhancements/audio/AudioCollection.cpp index a5499bd4f..9da742f91 100644 --- a/soh/soh/Enhancements/audio/AudioCollection.cpp +++ b/soh/soh/Enhancements/audio/AudioCollection.cpp @@ -400,8 +400,9 @@ void AudioCollection::InitializeShufflePool() { if (shufflePoolInitialized) return; for (auto& [seqId, seqInfo] : sequenceMap) { + if (!seqInfo.canBeUsedAsReplacement) continue; const std::string cvarKey = "gAudioEditor.Excluded." + seqInfo.sfxKey; - if (CVarGetInteger(cvarKey.c_str(), 0) && !seqInfo.canBeUsedAsReplacement) { + if (CVarGetInteger(cvarKey.c_str(), 0)) { excludedSequences.insert(&seqInfo); } else { includedSequences.insert(&seqInfo); From dd6271ecae9868c99bdc79324c6143f082fbcc65 Mon Sep 17 00:00:00 2001 From: PurpleHato Date: Tue, 14 Nov 2023 00:13:46 +0100 Subject: [PATCH 02/18] ADD: No HUD Heart animation (#3348) * ADD: No HUD Heart Animation I've seen this requested multiple times for modding purposes for the case of using "lifebars" instead of hearts * TWEAK: Move it under the the mods * REM: Whitespace * REM: Whitespace2 * Tweak: Cvar Oppsie --- soh/soh/SohMenuBar.cpp | 2 ++ soh/src/code/z_lifemeter.c | 25 ++++++++++++++++++------- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/soh/soh/SohMenuBar.cpp b/soh/soh/SohMenuBar.cpp index a5fc12299..c871a8d04 100644 --- a/soh/soh/SohMenuBar.cpp +++ b/soh/soh/SohMenuBar.cpp @@ -913,6 +913,8 @@ void DrawEnhancementsMenu() { UIWidgets::Tooltip("Disables grottos rotating with the camera. To be used in conjunction with mods that want to replace grottos with 3D objects."); UIWidgets::PaddedEnhancementCheckbox("Invisible Bunny Hood", "gHideBunnyHood", true, false); UIWidgets::Tooltip("Turns Bunny Hood invisible while still maintaining its effects."); + UIWidgets::PaddedEnhancementCheckbox("Disable HUD Heart animations", "gNoHUDHeartAnimation", true, false); + UIWidgets::Tooltip("Disables the beating animation of the hearts on the HUD."); ImGui::EndMenu(); } diff --git a/soh/src/code/z_lifemeter.c b/soh/src/code/z_lifemeter.c index 8d5e41a20..69cba24b4 100644 --- a/soh/src/code/z_lifemeter.c +++ b/soh/src/code/z_lifemeter.c @@ -601,13 +601,24 @@ void HealthMeter_Draw(PlayState* play) { { Mtx* matrix = Graph_Alloc(gfxCtx, sizeof(Mtx)); - Matrix_SetTranslateScaleMtx2(matrix, - HeartsScale+(HeartsScale/3) - ((HeartsScale/3) * sp144), - HeartsScale+(HeartsScale/3) - ((HeartsScale/3) * sp144), - HeartsScale+(HeartsScale/3) - ((HeartsScale/3) * sp144), - -130+offsetX, //Pos X - (-94+offsetY) *-1, //Pos Y - 0.0f); + + if (CVarGetInteger("gNoHUDHeartAnimation", 0)) { + Matrix_SetTranslateScaleMtx2(matrix, + HeartsScale, // Scale X + HeartsScale, // Scale Y + HeartsScale, // Scale Z + -130 + offsetX, // Pos X + (-94 + offsetY) * -1, // Pos Y + 0.0f); + } else { + Matrix_SetTranslateScaleMtx2(matrix, HeartsScale + (HeartsScale / 3) - ((HeartsScale / 3) * sp144), + HeartsScale + (HeartsScale / 3) - ((HeartsScale / 3) * sp144), + HeartsScale + (HeartsScale / 3) - ((HeartsScale / 3) * sp144), + -130 + offsetX, // Pos X + (-94 + offsetY) * -1, // Pos Y + 0.0f); + } + gSPMatrix(OVERLAY_DISP++, matrix, G_MTX_MODELVIEW | G_MTX_LOAD); gSPVertex(OVERLAY_DISP++, sp154, 4, 0); gSP1Quadrangle(OVERLAY_DISP++, 0, 2, 3, 1, 0); From cf88b3d2bf0b7e63506f823b0e1bac0d2743124b Mon Sep 17 00:00:00 2001 From: Ralphie Morell Date: Mon, 13 Nov 2023 23:45:15 -0500 Subject: [PATCH 03/18] Fix edge case of MS shuffle (#3364) --- soh/src/code/z_parameter.c | 1 + 1 file changed, 1 insertion(+) diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index ec25d2062..bbaa8d90b 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -1469,6 +1469,7 @@ void Inventory_SwapAgeEquipment(void) { gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; } else { gSaveContext.equips.buttonItems[0] = ITEM_NONE; + Flags_SetInfTable(INFTABLE_SWORDLESS); } if (gSaveContext.inventory.items[SLOT_NUT] != ITEM_NONE) { From 60687aff0d862e473a1c610a40da46260045dca4 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Mon, 13 Nov 2023 21:45:41 -0700 Subject: [PATCH 04/18] Move everything in `RandomizerCheckTracker::LoadFile()` except the block to load the "trackerData" section to a new `OnLoadGame` hook function to fix crashes on transferred saves. (#3368) --- .../randomizer/randomizer_check_tracker.cpp | 112 +++++++++--------- 1 file changed, 58 insertions(+), 54 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 5f7790dd0..6123c1a27 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -452,6 +452,63 @@ bool HasItemBeenCollected(RandomizerCheck rc) { return false; } +void CheckTrackerLoadGame(int32_t fileNum) { + LoadSettings(); + TrySetAreas(); + for (auto [rc, rcObj] : RandomizerCheckObjects::GetAllRCObjects()) { + RandomizerCheckTrackerData rcTrackerData = gSaveContext.checkTrackerData[rc]; + if (rc == RC_UNKNOWN_CHECK || rc == RC_MAX || rc == RC_LINKS_POCKET || + !RandomizerCheckObjects::GetAllRCObjects().contains(rc)) + continue; + + RandomizerCheckObject realRcObj; + if (rc == RC_GIFT_FROM_SAGES && !IS_RANDO) { + realRcObj = RCO_RAORU; + } else { + realRcObj = rcObj; + } + if (!IsVisibleInCheckTracker(realRcObj)) continue; + + checksByArea.find(realRcObj.rcArea)->second.push_back(realRcObj); + if (rcTrackerData.status == RCSHOW_SAVED || rcTrackerData.skipped) { + areaChecksGotten[realRcObj.rcArea]++; + } + + if (areaChecksGotten[realRcObj.rcArea] != 0 || RandomizerCheckObjects::AreaIsOverworld(realRcObj.rcArea)) { + areasSpoiled |= (1 << realRcObj.rcArea); + } + } + if (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LINKS_POCKET) != RO_LINKS_POCKET_NOTHING && IS_RANDO) { + s8 startingAge = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_STARTING_AGE); + RandomizerCheckArea startingArea; + switch (startingAge) { + case RO_AGE_CHILD: + startingArea = RCAREA_KOKIRI_FOREST; + break; + case RO_AGE_ADULT: + startingArea = RCAREA_MARKET; + break; + default: + startingArea = RCAREA_KOKIRI_FOREST; + break; + } + RandomizerCheckObject linksPocket = { RC_LINKS_POCKET, RCVORMQ_BOTH, RCTYPE_LINKS_POCKET, startingArea, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, GI_NONE, false, "Link's Pocket", "Link's Pocket" }; + + checksByArea.find(startingArea)->second.push_back(linksPocket); + areaChecksGotten[startingArea]++; + } + + showVOrMQ = (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_RANDOM_MQ_DUNGEONS) == RO_MQ_DUNGEONS_RANDOM_NUMBER || + (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_RANDOM_MQ_DUNGEONS) == RO_MQ_DUNGEONS_SET_NUMBER && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) < 12)); + LinksPocket(); + SongFromImpa(); + GiftFromSages(); + initialized = true; + UpdateAllOrdering(); + UpdateInventoryChecks(); +} + void CheckTrackerDialogClosed() { if (messageCloseCheck) { messageCloseCheck = false; @@ -679,9 +736,6 @@ void SaveFile(SaveContext* saveContext, int sectionID, bool fullSave) { } void LoadFile() { - Teardown(); - LoadSettings(); - TrySetAreas(); SaveManager::Instance->LoadArray("checks", RC_MAX, [](size_t i) { SaveManager::Instance->LoadStruct("", [&]() { SaveManager::Instance->LoadData("status", gSaveContext.checkTrackerData[i].status); @@ -689,58 +743,7 @@ void LoadFile() { SaveManager::Instance->LoadData("price", gSaveContext.checkTrackerData[i].price); SaveManager::Instance->LoadData("hintItem", gSaveContext.checkTrackerData[i].hintItem); }); - RandomizerCheckTrackerData entry = gSaveContext.checkTrackerData[i]; - RandomizerCheck rc = static_cast(i); - if (rc == RC_UNKNOWN_CHECK || rc == RC_MAX || - !RandomizerCheckObjects::GetAllRCObjects().contains(rc)) - return; - - RandomizerCheckObject entry2; - if (rc == RC_GIFT_FROM_SAGES && !IS_RANDO) { - entry2 = RCO_RAORU; - } else { - entry2 = RandomizerCheckObjects::GetAllRCObjects().find(rc)->second; - } - if (!IsVisibleInCheckTracker(entry2)) return; - - checksByArea.find(entry2.rcArea)->second.push_back(entry2); - if (entry.status == RCSHOW_SAVED || entry.skipped) { - areaChecksGotten[entry2.rcArea]++; - } - - if (areaChecksGotten[entry2.rcArea] != 0 || RandomizerCheckObjects::AreaIsOverworld(entry2.rcArea)) { - areasSpoiled |= (1 << entry2.rcArea); - } }); - if (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LINKS_POCKET) != RO_LINKS_POCKET_NOTHING && IS_RANDO) { - s8 startingAge = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_STARTING_AGE); - RandomizerCheckArea startingArea; - switch (startingAge) { - case RO_AGE_CHILD: - startingArea = RCAREA_KOKIRI_FOREST; - break; - case RO_AGE_ADULT: - startingArea = RCAREA_MARKET; - break; - default: - startingArea = RCAREA_KOKIRI_FOREST; - break; - } - RandomizerCheckObject linksPocket = { RC_LINKS_POCKET, RCVORMQ_BOTH, RCTYPE_LINKS_POCKET, startingArea, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, GI_NONE, false, "Link's Pocket", "Link's Pocket" }; - - checksByArea.find(startingArea)->second.push_back(linksPocket); - areaChecksGotten[startingArea]++; - } - - showVOrMQ = (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_RANDOM_MQ_DUNGEONS) == RO_MQ_DUNGEONS_RANDOM_NUMBER || - (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_RANDOM_MQ_DUNGEONS) == RO_MQ_DUNGEONS_SET_NUMBER && - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) < 12)); - LinksPocket(); - SongFromImpa(); - GiftFromSages(); - initialized = true; - UpdateAllOrdering(); - UpdateInventoryChecks(); } void Teardown() { @@ -1533,6 +1536,7 @@ void CheckTrackerWindow::InitElement() { SaveManager::Instance->AddInitFunction(InitTrackerData); sectionId = SaveManager::Instance->AddSaveFunction("trackerData", 1, SaveFile, true, -1); SaveManager::Instance->AddLoadFunction("trackerData", 1, LoadFile); + GameInteractor::Instance->RegisterGameHook(CheckTrackerLoadGame); GameInteractor::Instance->RegisterGameHook([](uint32_t fileNum) { Teardown(); }); From 384403edb5cd7dd5e2d37e86ff048845b315be05 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Mon, 13 Nov 2023 21:45:52 -0700 Subject: [PATCH 05/18] Rename all instances of Desert Wasteland to Haunted Wasteland. (#3372) --- soh/soh/ActorDB.cpp | 2 +- soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp | 2 +- soh/soh/Enhancements/randomizer/randomizer_tricks.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/soh/soh/ActorDB.cpp b/soh/soh/ActorDB.cpp index 2cf4d8fe7..a66048b32 100644 --- a/soh/soh/ActorDB.cpp +++ b/soh/soh/ActorDB.cpp @@ -439,7 +439,7 @@ static std::unordered_map actorDescriptions = { { ACTOR_EN_DAIKU_KAKARIKO, "Carpenters (Kakariko)" }, { ACTOR_BG_BOWL_WALL, "Bombchu Bowling Alley Wall" }, { ACTOR_EN_WALL_TUBO, "Bombchu Bowling Alley Bullseyes" }, - { ACTOR_EN_PO_DESERT, "Poe Guide (Desert Wasteland)" }, + { ACTOR_EN_PO_DESERT, "Poe Guide (Haunted Wasteland)" }, { ACTOR_EN_CROW, "Guay" }, { ACTOR_DOOR_KILLER, "Fake Door" }, { ACTOR_BG_SPOT11_OASIS, "Oasis (Desert Colossus)" }, diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index 9a3669582..d7f99edfb 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -783,7 +783,7 @@ std::map rcAreaNames = { { RCAREA_LAKE_HYLIA, "Lake Hylia"}, { RCAREA_GERUDO_VALLEY, "Gerudo Valley"}, { RCAREA_GERUDO_FORTRESS, "Gerudo Fortress"}, - { RCAREA_WASTELAND, "Desert Wasteland"}, + { RCAREA_WASTELAND, "Haunted Wasteland"}, { RCAREA_DESERT_COLOSSUS, "Desert Colossus"}, { RCAREA_MARKET, "Hyrule Market"}, { RCAREA_HYRULE_CASTLE, "Hyrule Castle"}, diff --git a/soh/soh/Enhancements/randomizer/randomizer_tricks.cpp b/soh/soh/Enhancements/randomizer/randomizer_tricks.cpp index 398077f6e..8a397f840 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_tricks.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_tricks.cpp @@ -219,7 +219,7 @@ std::unordered_map rtAreaNames = { { RTAREA_LAKE_HYLIA, "Lake Hylia"}, { RTAREA_GERUDO_VALLEY, "Gerudo Valley"}, { RTAREA_GERUDO_FORTRESS, "Gerudo Fortress"}, - { RTAREA_WASTELAND, "Desert Wasteland"}, + { RTAREA_WASTELAND, "Haunted Wasteland"}, { RTAREA_DESERT_COLOSSUS, "Desert Colossus"}, { RTAREA_MARKET, "Hyrule Market"}, { RTAREA_HYRULE_CASTLE, "Hyrule Castle"}, From fe9c0fa4f722e01a099addb13268a4dedb2d71c7 Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Mon, 13 Nov 2023 21:10:56 -0800 Subject: [PATCH 06/18] bump lus (#3394) --- libultraship | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libultraship b/libultraship index c75ff3653..9509806ae 160000 --- a/libultraship +++ b/libultraship @@ -1 +1 @@ -Subproject commit c75ff3653f699cb1a8c017b10e4b3986259d8cf0 +Subproject commit 9509806ae3ca6e35882fb976de70c5bde471b8f5 From 304016ddd2ac45e5101e03faa66f0a88f431d213 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Mon, 13 Nov 2023 22:12:08 -0700 Subject: [PATCH 07/18] [Feature Fix] Tunics stolen by like likes now removed from the item buttons (#3375) * Extends `Assignable Boots and Tunics` functionality to check for and remove Goron and Zora tunics from item buttons when like likes steal them. * Comment documentation. --- soh/src/code/code_80097A00.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/soh/src/code/code_80097A00.c b/soh/src/code/code_80097A00.c index 9e20d66aa..eb83738e3 100644 --- a/soh/src/code/code_80097A00.c +++ b/soh/src/code/code_80097A00.c @@ -204,6 +204,17 @@ u8 Inventory_DeleteEquipment(PlayState* play, s16 equipment) { if (equipment == EQUIP_TYPE_TUNIC) { gSaveContext.equips.equipment |= EQUIP_VALUE_TUNIC_KOKIRI << (EQUIP_TYPE_TUNIC * 4); + // non-vanilla: remove goron and zora tunics from item buttons if assignable tunics is on + if (CVarGetInteger("gAssignableTunicsAndBoots", 0) && equipValue != EQUIP_VALUE_TUNIC_KOKIRI) { + ItemID item = (equipValue == EQUIP_VALUE_TUNIC_GORON ? ITEM_TUNIC_GORON : ITEM_TUNIC_ZORA); + for (int i = 1; i < ARRAY_COUNT(gSaveContext.equips.buttonItems); i++) { + if (gSaveContext.equips.buttonItems[i] == item) { + gSaveContext.equips.buttonItems[i] = ITEM_NONE; + gSaveContext.equips.cButtonSlots[i - 1] = SLOT_NONE; + } + } + } + // end non-vanilla } if (equipment == EQUIP_TYPE_SWORD) { From 4e9040d761dfcda2b0788364f76cef2ae8fe70ba Mon Sep 17 00:00:00 2001 From: Malkierian Date: Tue, 14 Nov 2023 14:35:19 -0700 Subject: [PATCH 08/18] [Feature] Remove `performDelayedSave` functionality from Autosave (#3387) * Removes delayed save functionality, making autosave work everywhere except Ganon and Chamber of Sages scenes. * Change AutoSave comment to remove the scenarios we no longer block autosave in. * handle temp B on saving outside of kaleido --------- Co-authored-by: Adam Bird --- soh/soh/Enhancements/mods.cpp | 26 +++----------------------- soh/src/code/z_play.c | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 6d66ff055..0bbeff8ca 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -35,8 +35,6 @@ extern PlayState* gPlayState; extern void Overlay_DisplayText(float duration, const char* text); uint32_t ResourceMgr_IsSceneMasterQuest(s16 sceneNum); } -bool performDelayedSave = false; -bool performSave = false; // TODO: When there's more uses of something like this, create a new GI::RawAction? void ReloadSceneTogglingLinkAge() { @@ -258,14 +256,12 @@ void RegisterOcarinaTimeTravel() { void AutoSave(GetItemEntry itemEntry) { u8 item = itemEntry.itemId; + bool performSave = false; // Don't autosave immediately after buying items from shops to prevent getting them for free! // Don't autosave in the Chamber of Sages since resuming from that map breaks the game // Don't autosave during the Ganon fight when picking up the Master Sword - // Don't autosave in the fishing pond to prevent getting rod on B outside of the pond - // Don't autosave in the bombchu bowling alley to prevent having chus on B outside of the minigame - // Don't autosave in grottos since resuming from grottos breaks the game. if ((CVarGetInteger("gAutosave", AUTOSAVE_OFF) != AUTOSAVE_OFF) && (gPlayState != NULL) && (gSaveContext.pendingSale == ITEM_NONE) && - (gPlayState->gameplayFrames > 60 && gSaveContext.cutsceneIndex < 0xFFF0) && (gPlayState->sceneNum != SCENE_GANON_BOSS)) { + (gPlayState->gameplayFrames > 60 && gSaveContext.cutsceneIndex < 0xFFF0) && (gPlayState->sceneNum != SCENE_GANON_BOSS) && (gPlayState->sceneNum != SCENE_CHAMBER_OF_THE_SAGES)) { if (((CVarGetInteger("gAutosave", AUTOSAVE_OFF) == AUTOSAVE_LOCATION_AND_ALL_ITEMS) || (CVarGetInteger("gAutosave", AUTOSAVE_OFF) == AUTOSAVE_ALL_ITEMS)) && (item != ITEM_NONE)) { // Autosave for all items performSave = true; @@ -326,25 +322,9 @@ void AutoSave(GetItemEntry itemEntry) { CVarGetInteger("gAutosave", AUTOSAVE_OFF) == AUTOSAVE_LOCATION) { performSave = true; } - if (gPlayState->sceneNum == SCENE_FAIRYS_FOUNTAIN || gPlayState->sceneNum == SCENE_GROTTOS || - gPlayState->sceneNum == SCENE_CHAMBER_OF_THE_SAGES || gPlayState->sceneNum == SCENE_FISHING_POND || - gPlayState->sceneNum == SCENE_BOMBCHU_BOWLING_ALLEY) { - if (CVarGetInteger("gAutosave", AUTOSAVE_OFF) == AUTOSAVE_LOCATION_AND_MAJOR_ITEMS || - CVarGetInteger("gAutosave", AUTOSAVE_OFF) == AUTOSAVE_LOCATION_AND_ALL_ITEMS || - CVarGetInteger("gAutosave", AUTOSAVE_OFF) == AUTOSAVE_LOCATION) { - performSave = false; - return; - } - if (performSave) { - performSave = false; - performDelayedSave = true; - } - return; - } - if (performSave || performDelayedSave) { + if (performSave) { Play_PerformSave(gPlayState); performSave = false; - performDelayedSave = false; } } } diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index bf7016884..841de8f13 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -2329,8 +2329,28 @@ void Play_PerformSave(PlayState* play) { if (play != NULL && gSaveContext.fileNum != 0xFF) { Play_SaveSceneFlags(play); gSaveContext.savedSceneNum = play->sceneNum; + + // Track values from temp B + uint8_t prevB = gSaveContext.equips.buttonItems[0]; + uint8_t prevStatus = gSaveContext.buttonStatus[0]; + + // Replicate the B button restore from minigames/epona that kaleido does + if (gSaveContext.equips.buttonItems[0] == ITEM_SLINGSHOT || + gSaveContext.equips.buttonItems[0] == ITEM_BOW || + gSaveContext.equips.buttonItems[0] == ITEM_BOMBCHU || + gSaveContext.equips.buttonItems[0] == ITEM_FISHING_POLE || + (gSaveContext.equips.buttonItems[0] == ITEM_NONE && !Flags_GetInfTable(INFTABLE_SWORDLESS))) { + + gSaveContext.equips.buttonItems[0] = gSaveContext.buttonStatus[0]; + Interface_RandoRestoreSwordless(); + } + Save_SaveFile(); + // Restore temp B values back + gSaveContext.equips.buttonItems[0] = prevB; + gSaveContext.buttonStatus[0] = prevStatus; + uint8_t triforceHuntCompleted = IS_RANDO && gSaveContext.triforcePiecesCollected == Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED) && From bf31f2b330b53a212437cdcda9d6e0e147cc8c63 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Tue, 14 Nov 2023 15:36:05 -0600 Subject: [PATCH 09/18] Stop hardcoding skeleton type to flex (#3397) --- soh/soh/resource/importer/SkeletonFactory.cpp | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/soh/soh/resource/importer/SkeletonFactory.cpp b/soh/soh/resource/importer/SkeletonFactory.cpp index 559da0cea..2ce651dee 100644 --- a/soh/soh/resource/importer/SkeletonFactory.cpp +++ b/soh/soh/resource/importer/SkeletonFactory.cpp @@ -103,38 +103,42 @@ void SkeletonFactoryV0::ParseFileXML(tinyxml2::XMLElement* reader, std::shared_p { std::shared_ptr skel = std::static_pointer_cast(resource); - std::string skeletonType = reader->Attribute("Type"); - // std::string skeletonLimbType = reader->Attribute("LimbType"); - int numLimbs = reader->IntAttribute("LimbCount"); - int numDLs = reader->IntAttribute("DisplayListCount"); + skel->type = SkeletonType::Flex; // Default to Flex for legacy reasons + if (reader->FindAttribute("Type")) { + std::string skeletonType = reader->Attribute("Type"); - if (skeletonType == "Flex") { - skel->type = SkeletonType::Flex; - } else if (skeletonType == "Curve") { - skel->type = SkeletonType::Curve; - } else if (skeletonType == "Normal") { - skel->type = SkeletonType::Normal; + if (skeletonType == "Flex") { + skel->type = SkeletonType::Flex; + } else if (skeletonType == "Curve") { + skel->type = SkeletonType::Curve; + } else if (skeletonType == "Normal") { + skel->type = SkeletonType::Normal; + } } - skel->type = SkeletonType::Flex; - skel->limbType = LimbType::LOD; + skel->limbType = LimbType::LOD; // Default to LOD for legacy reasons + if (reader->FindAttribute("LimbType")) { + std::string skeletonLimbType = reader->Attribute("LimbType"); - // if (skeletonLimbType == "Standard") - // skel->limbType = LimbType::Standard; - // else if (skeletonLimbType == "LOD") - // skel->limbType = LimbType::LOD; - // else if (skeletonLimbType == "Curve") - // skel->limbType = LimbType::Curve; - // else if (skeletonLimbType == "Skin") - // skel->limbType = LimbType::Skin; - // else if (skeletonLimbType == "Legacy") - // Sskel->limbType = LimbType::Legacy; + if (skeletonLimbType == "Standard") { + skel->limbType = LimbType::Standard; + } else if (skeletonLimbType == "LOD") { + skel->limbType = LimbType::LOD; + } else if (skeletonLimbType == "Curve") { + skel->limbType = LimbType::Curve; + } else if (skeletonLimbType == "Skin") { + skel->limbType = LimbType::Skin; + } else if (skeletonLimbType == "Legacy") { + skel->limbType = LimbType::Legacy; + } + } + + + skel->limbCount = reader->IntAttribute("LimbCount"); + skel->dListCount = reader->IntAttribute("DisplayListCount"); auto child = reader->FirstChildElement(); - skel->limbCount = numLimbs; - skel->dListCount = numDLs; - while (child != nullptr) { std::string childName = child->Name(); From e66eb8756d572c49101eba4c016848e93967bfdb Mon Sep 17 00:00:00 2001 From: Adam Bird Date: Tue, 14 Nov 2023 16:37:03 -0500 Subject: [PATCH 10/18] Fix: Prevent patching custom models (#3367) * fix prevent patching custom models * prevent patching chests textures for custom chest models * add tooltip for cosmetic editor about custom models * chest texture handling for alt toggles --- .../Enhancements/cosmetics/CosmeticsEditor.cpp | 4 ++++ soh/soh/OTRGlobals.cpp | 15 +++++++++++++++ soh/soh/OTRGlobals.h | 1 + soh/soh/SohMenuBar.cpp | 2 ++ soh/src/overlays/actors/ovl_En_Box/z_en_box.c | 16 ++++++++++++++-- 5 files changed, 36 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp index 8c2707453..9c56ac32b 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp @@ -1767,6 +1767,10 @@ void CosmeticsEditorWindow::DrawElement() { ImGui::SameLine(); UIWidgets::EnhancementCombobox("gCosmetics.DefaultColorScheme", colorSchemes, COLORSCHEME_N64); UIWidgets::EnhancementCheckbox("Advanced Mode", "gCosmetics.AdvancedMode"); + UIWidgets::InsertHelpHoverText( + "Some cosmetic options may not apply if you have any mods that provide custom models for the cosmetic option.\n\n" + "For example, if you have custom Link model, then the Link's Hair color option will most likely not apply." + ); if (CVarGetInteger("gCosmetics.AdvancedMode", 0)) { if (ImGui::Button("Lock All Advanced", ImVec2(ImGui::GetContentRegionAvail().x / 2, 30.0f))) { for (auto& [id, cosmeticOption] : cosmeticOptions) { diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 1199a7e99..ad57d1ca5 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1569,6 +1569,11 @@ extern "C" Gfx* ResourceMgr_LoadGfxByName(const char* path) return (Gfx*)&res->Instructions[0]; } +extern "C" uint8_t ResourceMgr_FileIsCustomByName(const char* path) { + auto res = std::static_pointer_cast(GetResourceByNameHandlingMQ(path)); + return res->GetInitData()->IsCustom; +} + typedef struct { int index; Gfx instruction; @@ -1600,6 +1605,11 @@ extern "C" void ResourceMgr_PatchGfxByName(const char* path, const char* patchNa // index /= 2; // } + // Do not patch custom assets as they most likely do not have the same instructions as authentic assets + if (res->GetInitData()->IsCustom) { + return; + } + Gfx* gfx = (Gfx*)&res->Instructions[index]; if (!originalGfx.contains(path) || !originalGfx[path].contains(patchName)) { @@ -1616,6 +1626,11 @@ extern "C" void ResourceMgr_PatchGfxCopyCommandByName(const char* path, const ch auto res = std::static_pointer_cast( LUS::Context::GetInstance()->GetResourceManager()->LoadResource(path)); + // Do not patch custom assets as they most likely do not have the same instructions as authentic assets + if (res->GetInitData()->IsCustom) { + return; + } + Gfx* destinationGfx = (Gfx*)&res->Instructions[destinationIndex]; Gfx sourceGfx = res->Instructions[sourceIndex]; diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index 82659dbc4..e00cfecd5 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -101,6 +101,7 @@ AnimationHeaderCommon* ResourceMgr_LoadAnimByName(const char* path); char* ResourceMgr_GetNameByCRC(uint64_t crc, char* alloc); Gfx* ResourceMgr_LoadGfxByCRC(uint64_t crc); Gfx* ResourceMgr_LoadGfxByName(const char* path); +uint8_t ResourceMgr_FileIsCustomByName(const char* path); void ResourceMgr_PatchGfxByName(const char* path, const char* patchName, int index, Gfx instruction); void ResourceMgr_UnpatchGfxByName(const char* path, const char* patchName); char* ResourceMgr_LoadArrayByNameAsVec3s(const char* path); diff --git a/soh/soh/SohMenuBar.cpp b/soh/soh/SohMenuBar.cpp index a5fc12299..a71d2b8e3 100644 --- a/soh/soh/SohMenuBar.cpp +++ b/soh/soh/SohMenuBar.cpp @@ -532,6 +532,8 @@ void DrawEnhancementsMenu() { " - Small keys: Small silver chest\n" " - Boss keys: Vanilla size and texture\n" " - Skulltula Tokens: Small skulltula chest\n" + "\n" + "NOTE: Textures will not apply if you are using a mod pack with a custom chest model." ); if (CVarGetInteger("gChestSizeAndTextureMatchesContents", CSMC_DISABLED) != CSMC_DISABLED) { UIWidgets::PaddedEnhancementCheckbox("Chests of Agony", "gChestSizeDependsStoneOfAgony", true, false); diff --git a/soh/src/overlays/actors/ovl_En_Box/z_en_box.c b/soh/src/overlays/actors/ovl_En_Box/z_en_box.c index 1e2c4d6cd..9e8705c33 100644 --- a/soh/src/overlays/actors/ovl_En_Box/z_en_box.c +++ b/soh/src/overlays/actors/ovl_En_Box/z_en_box.c @@ -88,6 +88,7 @@ Gfx gKeyTreasureChestChestFrontDL[128] = {0}; Gfx gChristmasRedTreasureChestChestFrontDL[128] = {0}; Gfx gChristmasGreenTreasureChestChestFrontDL[128] = {0}; u8 hasCreatedRandoChestTextures = 0; +u8 hasCustomChestDLs = 0; u8 hasChristmasChestTexturesAvailable = 0; void EnBox_SetupAction(EnBox* this, EnBoxActionFunc actionFunc) { @@ -690,7 +691,7 @@ void EnBox_UpdateSizeAndTexture(EnBox* this, PlayState* play) { } // Change texture - if (!isVanilla && (csmc == CSMC_BOTH || csmc == CSMC_TEXTURE)) { + if (!isVanilla && hasCreatedRandoChestTextures && !hasCustomChestDLs && (csmc == CSMC_BOTH || csmc == CSMC_TEXTURE)) { switch (getItemCategory) { case ITEM_CATEGORY_MAJOR: this->boxBodyDL = gGoldTreasureChestChestFrontDL; @@ -725,7 +726,7 @@ void EnBox_UpdateSizeAndTexture(EnBox* this, PlayState* play) { } } - if (CVarGetInteger("gLetItSnow", 0) && hasChristmasChestTexturesAvailable) { + if (CVarGetInteger("gLetItSnow", 0) && hasChristmasChestTexturesAvailable && hasCreatedRandoChestTextures && !hasCustomChestDLs) { if (this->dyna.actor.scale.x == 0.01f) { this->boxBodyDL = gChristmasRedTreasureChestChestFrontDL; this->boxLidDL = gChristmasRedTreasureChestChestSideAndLidDL; @@ -767,7 +768,18 @@ void EnBox_UpdateSizeAndTexture(EnBox* this, PlayState* play) { } void EnBox_CreateExtraChestTextures() { + // Don't patch textures for custom chest models, as they do not import textures the exact same way as vanilla chests + // OTRTODO: Make it so model packs can provide a unique DL per chest type, instead of us copying the brown chest and attempting to patch + if (ResourceMgr_FileIsCustomByName(gTreasureChestChestFrontDL) || + ResourceMgr_FileIsCustomByName(gTreasureChestChestSideAndLidDL)) { + hasCustomChestDLs = 1; + return; + } + + hasCustomChestDLs = 0; + if (hasCreatedRandoChestTextures) return; + Gfx gTreasureChestChestTextures[] = { gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, gSkullTreasureChestFrontTex), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, gSkullTreasureChestSideAndTopTex), From bd0672767af6b3f5e229b300b814e1d896731470 Mon Sep 17 00:00:00 2001 From: AltoXorg <56553686+Alto1772@users.noreply.github.com> Date: Wed, 15 Nov 2023 05:37:54 +0800 Subject: [PATCH 11/18] Use substr method to determine file extension (#3390) See https://github.com/HarbourMasters/OTRExporter/pull/12 --- OTRExporter | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OTRExporter b/OTRExporter index 0d8f5570a..04b85b95f 160000 --- a/OTRExporter +++ b/OTRExporter @@ -1 +1 @@ -Subproject commit 0d8f5570a8e57f302ec6633d65615ee21ab39454 +Subproject commit 04b85b95fab07a394b62dcd28a502a3040f08e0c From ba987c49e2e4bfaaccdcff740709489bf59b34d5 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Tue, 14 Nov 2023 14:46:38 -0700 Subject: [PATCH 12/18] SaveManager cleanup (#3386) * Move threadpool initialization and `OnExitGame` registration from `SaveManager::Init` to SM's constructor. Comment on `Init` to mention it's not an initializer for `SaveManager`. Added check for `SaveManager::SaveSection` to prevent firing a save worker if the game is already exited from a reset. * Removed `IsSaveLoaded` check in favor of another `ThreadPoolWait()` at the start of `SaveManager::Init()`. --- soh/soh/SaveManager.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index 14ab736dc..2d1f6e68b 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -65,6 +65,10 @@ SaveManager::SaveManager() { AddInitFunction(InitFileImpl); + GameInteractor::Instance->RegisterGameHook([this](uint32_t fileNum) { ThreadPoolWait(); }); + + smThreadPool = std::make_shared(1); + for (SaveFileMetaInfo& info : fileMetaInfo) { info.valid = false; info.deaths = 0; @@ -357,12 +361,14 @@ void SaveManager::SaveRandomizer(SaveContext* saveContext, int sectionID, bool f }); } +// Init() here is an extension of InitSram, and thus not truly an initializer for SaveManager itself. don't put any class initialization stuff here void SaveManager::Init() { + // Wait on saves that snuck through the Wait in OnExitGame + ThreadPoolWait(); const std::filesystem::path sSavePath(LUS::Context::GetPathRelativeToAppDirectory("Save")); const std::filesystem::path sGlobalPath = sSavePath / std::string("global.sav"); auto sOldSavePath = LUS::Context::GetPathRelativeToAppDirectory("oot_save.sav"); auto sOldBackupSavePath = LUS::Context::GetPathRelativeToAppDirectory("oot_save.bak"); - GameInteractor::Instance->RegisterGameHook([this](uint32_t fileNum) { ThreadPoolWait(); }); // If the save directory does not exist, create it if (!std::filesystem::exists(sSavePath)) { @@ -403,7 +409,6 @@ void SaveManager::Init() { } else { CreateDefaultGlobal(); } - smThreadPool = std::make_shared(1); // Load files to initialize metadata for (int fileNum = 0; fileNum < MaxFiles; fileNum++) { From fb45b66903b2c7449a4673a331c2117a94ce02cb Mon Sep 17 00:00:00 2001 From: Josh Bodner <30329717+jbodner09@users.noreply.github.com> Date: Tue, 14 Nov 2023 14:08:45 -0800 Subject: [PATCH 13/18] Fix magic being zeroed out when using fast file select (#3389) * Move to frame counter init to a place that fast file select also touches * Undo removing old fix * Reset on gameover --- soh/soh/Enhancements/debugconsole.cpp | 1 + soh/src/code/z_play.c | 7 +++++++ .../overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c | 2 ++ 3 files changed, 10 insertions(+) diff --git a/soh/soh/Enhancements/debugconsole.cpp b/soh/soh/Enhancements/debugconsole.cpp index 3e61505b2..88a23718e 100644 --- a/soh/soh/Enhancements/debugconsole.cpp +++ b/soh/soh/Enhancements/debugconsole.cpp @@ -207,6 +207,7 @@ static bool ResetHandler(std::shared_ptr Console, std::vectorgameplayFrames = 0; SET_NEXT_GAMESTATE(&gPlayState->state, TitleSetup_Init, GameState); gPlayState->state.running = false; GameInteractor::Instance->ExecuteHooks(gSaveContext.fileNum); diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index 841de8f13..59a5d0619 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -33,6 +33,7 @@ u64 D_801614D0[0xA00]; #endif PlayState* gPlayState; +s16 firstInit = 0; s16 gEnPartnerId; @@ -490,6 +491,12 @@ void Play_Init(GameState* thisx) { } } + // Properly initialize the frame counter so it doesn't use garbage data + if (!firstInit) { + play->gameplayFrames = 0; + firstInit = 1; + } + // Invalid entrance, so immediately exit the game to opening title if (gSaveContext.entranceIndex == -1) { gSaveContext.entranceIndex = 0; diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c index 55a5075a6..35490f079 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c @@ -4290,6 +4290,8 @@ void KaleidoScope_Update(PlayState* play) if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_ENTRANCES)) { Grotto_ForceGrottoReturn(); } + // Reset frame counter to prevent autosave on respawn + play->gameplayFrames = 0; gSaveContext.nextTransitionType = 2; gSaveContext.health = CVarGetInteger("gFullHealthSpawn", 0) ? gSaveContext.healthCapacity : 0x30; Audio_QueueSeqCmd(0xF << 28 | SEQ_PLAYER_BGM_MAIN << 24 | 0xA); From afe032ea215215273a38b810d5c7be0705aaa460 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Tue, 14 Nov 2023 18:46:50 -0700 Subject: [PATCH 14/18] [Feature/fix] Save to temp file first (#3376) * Add temp file flow to `SaveManager::SaveFileThreaded`. Add "Save finish" info log message. * Fix WiiU/Switch --- soh/soh/SaveManager.cpp | 84 +++++++++++++++++++++++++++-------------- soh/soh/SaveManager.h | 1 + 2 files changed, 57 insertions(+), 28 deletions(-) diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index 2d1f6e68b..e61cf9223 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -47,6 +47,11 @@ std::filesystem::path SaveManager::GetFileName(int fileNum) { return sSavePath / ("file" + std::to_string(fileNum + 1) + ".sav"); } +std::filesystem::path SaveManager::GetFileTempName(int fileNum) { + const std::filesystem::path sSavePath(LUS::Context::GetPathRelativeToAppDirectory("Save")); + return sSavePath / ("file" + std::to_string(fileNum + 1) + ".temp"); +} + SaveManager::SaveManager() { coreSectionIDsByName["base"] = SECTION_ID_BASE; coreSectionIDsByName["randomizer"] = SECTION_ID_RANDOMIZER; @@ -874,6 +879,32 @@ void SaveManager::InitFileMaxed() { gSaveContext.sceneFlags[5].swch = 0x40000000; } +#if defined(__WIIU__) || defined(__SWITCH__) +// std::filesystem::copy_file doesn't work properly with the Wii U's toolchain atm +int copy_file(const char* src, const char* dst) { + alignas(0x40) uint8_t buf[4096]; + FILE* r = fopen(src, "r"); + if (!r) { + return -1; + } + FILE* w = fopen(dst, "w"); + if (!w) { + return -2; + } + + size_t res; + while ((res = fread(buf, 1, sizeof(buf), r)) > 0) { + if (fwrite(buf, 1, res, w) != res) { + break; + } + } + + fclose(r); + fclose(w); + return res >= 0 ? 0 : res; +} +#endif + // Threaded SaveFile takes copy of gSaveContext for local unmodified storage void SaveManager::SaveFileThreaded(int fileNum, SaveContext* saveContext, int sectionID) { @@ -915,19 +946,42 @@ void SaveManager::SaveFileThreaded(int fileNum, SaveContext* saveContext, int se svi.func(saveContext, sectionID, false); } + std::filesystem::path fileName = GetFileName(fileNum); + std::filesystem::path tempFile = GetFileTempName(fileNum); + + if (std::filesystem::exists(tempFile)) { + std::filesystem::remove(tempFile); + } + #if defined(__SWITCH__) || defined(__WIIU__) - FILE* w = fopen(GetFileName(fileNum).c_str(), "w"); + FILE* w = fopen(tempFile.c_str(), "w"); std::string json_string = saveBlock.dump(4); fwrite(json_string.c_str(), sizeof(char), json_string.length(), w); fclose(w); #else - std::ofstream output(GetFileName(fileNum)); + std::ofstream output(tempFile); output << std::setw(4) << saveBlock << std::endl; + output.close(); #endif + if (std::filesystem::exists(fileName)) { + std::filesystem::remove(fileName); + } + +#if defined(__SWITCH__) || defined(__WIIU__) + copy_file(tempFile.c_str(), fileName.c_str()); +#else + std::filesystem::copy_file(tempFile, fileName); +#endif + + if (std::filesystem::exists(tempFile)) { + std::filesystem::remove(tempFile); + } + delete saveContext; InitMeta(fileNum); GameInteractor::Instance->ExecuteHooks(fileNum); + SPDLOG_INFO("Save File Finish - fileNum: {}", fileNum); } // SaveSection creates a copy of gSaveContext to prevent mid-save data modification, and passes its reference to SaveFileThreaded @@ -2110,32 +2164,6 @@ void SaveManager::LoadStruct(const std::string& name, LoadStructFunc func) { } } -#if defined(__WIIU__) || defined(__SWITCH__) -// std::filesystem::copy_file doesn't work properly with the Wii U's toolchain atm -int copy_file(const char* src, const char* dst) { - alignas(0x40) uint8_t buf[4096]; - FILE* r = fopen(src, "r"); - if (!r) { - return -1; - } - FILE* w = fopen(dst, "w"); - if (!w) { - return -2; - } - - size_t res; - while ((res = fread(buf, 1, sizeof(buf), r)) > 0) { - if (fwrite(buf, 1, res, w) != res) { - break; - } - } - - fclose(r); - fclose(w); - return res >= 0 ? 0 : res; -} -#endif - void SaveManager::CopyZeldaFile(int from, int to) { assert(std::filesystem::exists(GetFileName(from))); DeleteZeldaFile(to); diff --git a/soh/soh/SaveManager.h b/soh/soh/SaveManager.h index 892aec923..310ecda7d 100644 --- a/soh/soh/SaveManager.h +++ b/soh/soh/SaveManager.h @@ -142,6 +142,7 @@ class SaveManager { private: std::filesystem::path GetFileName(int fileNum); + std::filesystem::path GetFileTempName(int fileNum); nlohmann::json saveBlock; void ConvertFromUnversioned(); From 044d32a46f1ed5bd7287b78d5c52233b27c0d262 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Tue, 14 Nov 2023 19:47:07 -0600 Subject: [PATCH 15/18] Add gFixEyesOpenWhileSleeping (#3365) --- soh/soh/SohMenuBar.cpp | 2 ++ soh/src/overlays/actors/ovl_player_actor/z_player.c | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/soh/soh/SohMenuBar.cpp b/soh/soh/SohMenuBar.cpp index a71d2b8e3..8db6c7703 100644 --- a/soh/soh/SohMenuBar.cpp +++ b/soh/soh/SohMenuBar.cpp @@ -1061,6 +1061,8 @@ void DrawEnhancementsMenu() { UIWidgets::Tooltip("Fixes the bushes to drop items correctly rather than spawning undefined items."); UIWidgets::PaddedEnhancementCheckbox("Fix falling from vine edges", "gFixVineFall", true, false); UIWidgets::Tooltip("Prevents immediately falling off climbable surfaces if climbing on the edges."); + UIWidgets::PaddedEnhancementCheckbox("Fix Link's eyes open while sleeping", "gFixEyesOpenWhileSleeping", true, false); + UIWidgets::Tooltip("Fixes Link's eyes being open in the opening cutscene when he is supposed to be sleeping."); ImGui::EndMenu(); } diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 09e33f2e4..497935a69 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -15169,6 +15169,10 @@ void func_80852C50(PlayState* play, Player* this, CsCmdActorAction* arg2) { sp24 = D_808547C4[this->unk_446]; func_80852B4C(play, this, linkCsAction, &D_80854E50[ABS(sp24)]); + + if (CVarGetInteger("gFixEyesOpenWhileSleeping", 0) && (play->csCtx.linkAction->action == 28 || play->csCtx.linkAction->action == 29)) { + this->skelAnime.jointTable[22].x = 8; + } } void func_80852E14(Player* this, PlayState* play) { From 2dfbbc63e3358f4fec9c518f6cba978aa93d71db Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Tue, 14 Nov 2023 20:14:47 -0600 Subject: [PATCH 16/18] Version bump to MacReady Bravo (#3398) --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0633ab80a..fccae7f36 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,8 +5,8 @@ set(CMAKE_CXX_STANDARD 20 CACHE STRING "The C++ standard to use") set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version") -project(Ship VERSION 8.0.0 LANGUAGES C CXX) -set(PROJECT_BUILD_NAME "MacReady Alfa" CACHE STRING "") +project(Ship VERSION 8.0.1 LANGUAGES C CXX) +set(PROJECT_BUILD_NAME "MacReady Bravo" CACHE STRING "") set(PROJECT_TEAM "github.com/harbourmasters" CACHE STRING "") set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT soh) From 6ba73171dace0d2daf80ccec82a4836fe909606f Mon Sep 17 00:00:00 2001 From: Caladius Date: Thu, 16 Nov 2023 13:55:37 -0500 Subject: [PATCH 17/18] Big boi commit, v2 Dana overlay DLs, un-unaliving Kak NPCs and moving them to better locations. Added Melons Wonder Item for the star and cleaned up their code for it. among other changes... --- .../object_kakariko_decor/CuccoBedding_32 | Bin 0 -> 2140 bytes .../object_kakariko_decor/String_BYBY_32 | Bin 0 -> 2140 bytes .../object_kakariko_decor/gKakarikoDecorDL | 22 + .../gKakarikoDecorDL_tri_0 | 27 + .../gKakarikoDecorDL_tri_1 | 186 +++++ .../gKakarikoDecorDL_tri_2 | 19 + .../gKakarikoDecorDL_tri_3 | 8 + .../gKakarikoDecorDL_tri_4 | 6 + .../gKakarikoDecorDL_vtx_0 | 82 +++ .../gKakarikoDecorDL_vtx_1 | 646 ++++++++++++++++++ .../gKakarikoDecorDL_vtx_2 | 54 ++ .../gKakarikoDecorDL_vtx_3 | 14 + .../gKakarikoDecorDL_vtx_4 | 6 + .../gKakarikoDecorDL_vtx_cull | 10 + .../mat_gKakarikoDecorDL_f3dlite_CuccoBedding | 21 + .../mat_gKakarikoDecorDL_f3dlite_SnowBuildup | 21 + .../mat_gKakarikoDecorDL_f3dlite_StringBYBY | 21 + .../mat_gKakarikoDecorDL_f3dlite_StringGRGR | 21 + .../mat_gKakarikoDecorDL_f3dlite_material_004 | 29 + .../spot00_sceneTex_01AB98 | Bin 0 -> 2140 bytes .../spot00_sceneTex_01B398 | Bin 0 -> 604 bytes soh/assets/soh_assets.h | 3 + soh/soh/ActorDB.cpp | 2 +- soh/soh/Enhancements/mods.cpp | 12 + .../ovl_En_ChristmasDeco/z_en_christmasdeco.c | 13 +- .../ovl_En_ChristmasTree/z_en_christmastree.c | 20 +- .../ovl_En_ChristmasTree/z_en_christmastree.h | 1 + soh/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c | 5 +- soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c | 15 +- .../overlays/actors/ovl_En_Kusa/z_en_kusa.c | 9 +- .../overlays/actors/ovl_En_Toryo/z_en_toryo.c | 7 +- .../actors/ovl_En_Wood02/z_en_wood02.c | 16 +- 32 files changed, 1263 insertions(+), 33 deletions(-) create mode 100644 soh/assets/custom/objects/object_kakariko_decor/CuccoBedding_32 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/String_BYBY_32 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_2 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_3 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_4 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_2 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_3 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_4 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_CuccoBedding create mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_SnowBuildup create mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_StringBYBY create mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_StringGRGR create mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_material_004 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/spot00_sceneTex_01AB98 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/spot00_sceneTex_01B398 diff --git a/soh/assets/custom/objects/object_kakariko_decor/CuccoBedding_32 b/soh/assets/custom/objects/object_kakariko_decor/CuccoBedding_32 new file mode 100644 index 0000000000000000000000000000000000000000..68187fbf5f4ebad4d955b9855ee047253e07957e GIT binary patch literal 2140 zcma)7QD`Dd7R~P04nr7%NLECgAQHk5!h9?tUrQb=kLe*u+7;Ipk#quZ72u9)j3GBprez5{4j;5afM4dav`|{%=clOIOvs zx6e8E)XdDx%-{a<*VymiIsOlGrvv`}-`DS9<;&m3ubY1O^UMs4Kg`Tb1g-LIy>xa{ zDAJHwGpi(H1W-cnv#_XJwZbJ%poAO~*+N(E)2h9%_t6}g7pLye4tMrPtLGzYsQ2|U z37A(_!+wQJMo^k1TeMc_i2x6pCH)x3&C+=v`FO-$K}nKP4@kgXp>^>v5sr3#&v*5K zvu8DVPPA}p?Zf(k+QVgfV~s?Xrq1t;K>o{l1s{=2XW0n7{;>WTC7nGIBxz6F{bW|1 z6>$oCbF_w2`oIXz6d+?D8=3MU3%DD~!?WFbq5E$~z8-hMUtgv&U= zqBINDgm{>y**)@^o)5FhYUATOnUBlqRv1UnvaA4 z(XgsWCEI3E(F6=@o@Wllsd6~guQZDi zM!?xa2~h4=Bj{-QWub31<(SiU+PJKC)eBnV+mHj40c%6_#PeWoPw$I+7C{M=q{F*M zsC$UZ)<``tPe@uH=vPLTMN!fm8iDU-kzX&-Ym!xurd)WQy~iTr)Py%|hh*Khy(}Nn zTi#${*ncBER}PJ^c}oE+9M}7WfqH=w&PVZ}9H~9cKYk}#dMSU7i}Z@5`EDbs7S-Np zRWzWQ1S;WUQX|{?mGYJZCiWXn6qi5IBtlo3~r4L4{M!2!44*&tsAL!>=IRp+ijS$Jun%cd40!1fS zEqm_U!Z?auQ1Fk56% zec(R1PvWZ-6JMP@dR^#4zEgR_NPC|9#G;LexaUo05626A&A0x~_0Q1d^|c?hr29B! zRP#GOStDFVzHjlJ$aVa&UabZCP=k5=s! zTrqEG1s@whnzkCWqL(@=EC&b-J+BdEQCxZ-G_nx8Tjoc;vB|QUAd!b&)ZxK{6RkIOPinMM{e?ub+ z3Te?gNkN1geIS8)jezIzZ8A^NXG4-jo491JnAdN9T>GFFSyc0@#XP8$Y@yU0pvS^| z8@zDKj@Xg&A*}s)HUR!I`la5J-$F;8Y6(1`NzE@8l_PU#JwWdqBR_977I{vN8S^A* zgaCsw&#-S=Qx2!~qfL6!2!ms1rkduvJV&c)7nchIvL%DA%xe_4UkShs#nm1-=(XN0 z^vp6%;v>(ab+zbzv==oW^w9-Mf!p5W5_of;E#fkCWd!>3+Z+4u)=1uf2noHn?FYpi zYIB}&@wc()R#x3IKJh(Xh7~$BkoG)9cf+^Wg?c-Rc$T+FSNY za(*NK9(nY|z^YkxbeF{5i1punGN_q`5DPxEm-}a+R|)^%$^YCz-Q=b=zq3sC#X^ey z@Qn-)=5JM_j75(=q`;(_i+><{0F~!g; z&mh8;xEDYIK9@sR_qYk-=ua)D<-`<3_yK;9n*tJFFSA=P`ByGNFb)wx6;z0T1km&l z)2om7=Qgl293LGjD+JddjAI-oT2}l3Ky=qw6u%C=Oa%_^FcvM{xpe}r;JAu-jNTF| zQ#tF;ilZgi8TQd%9Xv=FHv~7@Xv8YzwQ8`kXB`-e=s_9rxg1z7+|i12(MlCMZ7+?|Ir60{KwZ9X)SuyCbakf-86fI+>PoV)KGfS*T5_K=0#wzFdpY`XQ zvBz9|*u*Mt3YFP+YMnZ+w_#jR6ZQL(ZjZRORH^KBjUPiK8=fl1Dt*-@Ucw#=Vx5m6 z{zR}&l=AAyvC~FE9P6@>H+y;^OQ_Nb=Fzb(^Yj?gSldag5|2%fTPo{?M4?B}DRU}Y K+oxXiargsgG<&B2 literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL new file mode 100644 index 000000000..3451b3004 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_0 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_0 new file mode 100644 index 000000000..450d4ad7b --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_0 @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_1 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_1 new file mode 100644 index 000000000..701018d7e --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_1 @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_2 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_2 new file mode 100644 index 000000000..a8f0d1205 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_2 @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_3 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_3 new file mode 100644 index 000000000..5e89bfd9c --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_3 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_4 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_4 new file mode 100644 index 000000000..e0d376897 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_4 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_0 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_0 new file mode 100644 index 000000000..844aa0f3c --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_0 @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_1 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_1 new file mode 100644 index 000000000..3c1ca09b4 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_1 @@ -0,0 +1,646 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_2 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_2 new file mode 100644 index 000000000..cd5e7a3d0 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_2 @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_3 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_3 new file mode 100644 index 000000000..fb8c029cd --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_3 @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_4 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_4 new file mode 100644 index 000000000..043452939 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_4 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_cull b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_cull new file mode 100644 index 000000000..c096976aa --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_CuccoBedding b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_CuccoBedding new file mode 100644 index 000000000..520258210 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_CuccoBedding @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_SnowBuildup b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_SnowBuildup new file mode 100644 index 000000000..a79cca54f --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_SnowBuildup @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_StringBYBY b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_StringBYBY new file mode 100644 index 000000000..5c85eb88f --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_StringBYBY @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_StringGRGR b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_StringGRGR new file mode 100644 index 000000000..b8478fa90 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_StringGRGR @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_material_004 b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_material_004 new file mode 100644 index 000000000..0a479d70a --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_material_004 @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/spot00_sceneTex_01AB98 b/soh/assets/custom/objects/object_kakariko_decor/spot00_sceneTex_01AB98 new file mode 100644 index 0000000000000000000000000000000000000000..454876ed0463d2061a6e06b14cc82324f9ceac02 GIT binary patch literal 2140 zcma)-y>8n;5QLdjd5pY=a7dLpO^UqC0ePXgWFs6)s-rrxBTJSlT@VL&z8#+I04d@H zC5qhHpV`@S*LB^m?>~Qh()VNdvvTS7zyChV^XqvT^!r=a>H5-jTi)}Qx3t#vm@B5c zIv@LGJ@zEaOS-4A-t@U7yydT_VP(_Xsq$Oi+5Yh+&BuB?@@sj7&pid6OjwfTUGMh7 z{hl5X?~xyR7EcwIsJhRK?5^z2f1({hDA3@Ie8)F`s&B?U_~o>y1H9spt69`YUipvJ zHdT69!j}kCV{<%L>)MSMH~E(OI)shFpEaE|I6E<5-Tg9)Giu(-lE>PY7g=9E;N|0r z>3$P>k~so(!L%$`3w(ab;K@K`A3G%iXyaSIL%k`=Esd(&`3HH>dt=Donr>G1VmuWz zw#*xy_lnRL@K1)GQC`a~{E&w{7R9*|p~bo<^VZm#>z<^si!$f;Y43R|;HR?cz4=%V zGdL-`jO=AP)S(o4PMQcZv_QTQ59%XBT%IZYgO3Q;`IuFqIH3N_q&D&F90L)Gl_)h9 zD?2LCn=tXz@N5P6o6yQp`saj*5JvRu%1(S_pi6I+s#o@ge#zFzrnh@S6LbKc-oj3n z*ZLY;86C)D$h|ByrfwIV19KTq-#M6pUz?_Mg+p&E+7o+4@00oYP2dJOONn693%HL@N|$(y4HngTpn^=MBWD^FxnET3k4 zN~6I(6+Q97f)-b~DTaQ~;<;C4Qok5|b3XosSAH~bYO0{+kv!y(Mqo#|1G!xyj_^#- z^~XNy9^XefcR|@FAssW&738T*@GzL2nK+7~Uw#r>Cp=olG)u9k>q-?;pCSo=u{Ya> zM%qc{(<#^zk9>QUOadH}Akuy@XMBq9V4ci99nprTIA+gYlgl$zXf8Zkg`z_%l>Ni} z|7Ay;;A4vK+EEu}v@Qx+IgLJ=ySOVV`VYmV$d-rD9+hjd>O}nh0}ltBu+e?7+NGjv z(=sTgZ&um_*-@%sQ(++XEh-+yZRow)Po zb!g*$Y-chrdr#5xx)%Ejyza<|?C8X=9^*AGXDG}fiG$TaL6o1_*#&@%cOvJ=dXTUx5uual#@*7!^^^qqr;8RmCJO)g nnB11>acX=}Xw0~3kW2_nr4h)PIg1=4;BLm1_@o6c<7K=7R+;+P literal 0 HcmV?d00001 diff --git a/soh/assets/soh_assets.h b/soh/assets/soh_assets.h index b31e3f388..62ac078b4 100644 --- a/soh/assets/soh_assets.h +++ b/soh/assets/soh_assets.h @@ -95,6 +95,9 @@ static const ALIGN_ASSET(2) char gXmasStarDL[] = dgXmasStarDL; #define dgFrontGateDecorDL "__OTR__objects/object_kakariko_decor/gFrontGateDecorDL" static const ALIGN_ASSET(2) char gFrontGateDecorDL[] = dgFrontGateDecorDL; +#define dgKakarikoDecorDL "__OTR__objects/object_kakariko_decor/gKakarikoDecorDL" +static const ALIGN_ASSET(2) char gKakarikoDecorDL[] = dgKakarikoDecorDL; + // overlays #define dgOptionsDividerChangeLangVtx "__OTR__overlays/ovl_file_choose/gOptionsDividerChangeLangVtx" static const ALIGN_ASSET(2) char gOptionsDividerChangeLangVtx[] = dgOptionsDividerChangeLangVtx; diff --git a/soh/soh/ActorDB.cpp b/soh/soh/ActorDB.cpp index fe7d87a25..f143e1723 100644 --- a/soh/soh/ActorDB.cpp +++ b/soh/soh/ActorDB.cpp @@ -609,7 +609,7 @@ static ActorDBInit EnChristmasTreeInit = { "En_ChristmasTree", "Christmas Tree", ACTORCAT_PROP, - (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY), + (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED), OBJECT_GAMEPLAY_KEEP, sizeof(EnChristmasTree), (ActorFunc)EnChristmasTree_Init, diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 6234fbab6..237378f0d 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -1077,6 +1077,17 @@ void RegisterRandomizedEnemySizes() { }); } +void RegisterChristmas() { + GameInteractor::Instance->RegisterGameHook([]() { + Actor* player = &GET_PLAYER(gPlayState)->actor; + Actor* nearbyEndTitle = Actor_FindNearby(gPlayState, player, ACTOR_END_TITLE, ACTORCAT_ITEMACTION, 3000.0f); + + if (gSaveContext.inventory.dungeonItems[SCENE_GANONS_TOWER] > 0 && nearbyEndTitle) { + Camera_ChangeMode(Play_GetCamera(gPlayState, gPlayState->mainCamera.thisIdx), CAM_MODE_STILL); + } + }); +} + void InitMods() { RegisterTTS(); RegisterInfiniteMoney(); @@ -1107,4 +1118,5 @@ void InitMods() { RegisterRandomizerSheikSpawn(); RegisterRandomizedEnemySizes(); NameTag_RegisterHooks(); + RegisterChristmas(); } diff --git a/soh/src/overlays/actors/ovl_En_ChristmasDeco/z_en_christmasdeco.c b/soh/src/overlays/actors/ovl_En_ChristmasDeco/z_en_christmasdeco.c index 49059b6bc..976aa4a4b 100644 --- a/soh/src/overlays/actors/ovl_En_ChristmasDeco/z_en_christmasdeco.c +++ b/soh/src/overlays/actors/ovl_En_ChristmasDeco/z_en_christmasdeco.c @@ -13,7 +13,6 @@ void EnChristmasDeco_Update(Actor* thisx, PlayState* play); void EnChristmasDeco_Draw(Actor* thisx, PlayState* play); void EnChristmasDeco_Init(Actor* thisx, PlayState* play) { - } void EnChristmasDeco_Destroy(Actor* thisx, PlayState* play) { @@ -25,17 +24,19 @@ void EnChristmasDeco_Update(Actor* thisx, PlayState* play) { } void EnChristmasDeco_Draw(Actor* thisx, PlayState* play) { - float decoSize = 1000.0f; + float decoSize = 10.0f; OPEN_DISPS(play->state.gfxCtx); - Gfx_SetupDL_25Opa(play->state.gfxCtx); - + Matrix_Translate(0, 0, 0, MTXMODE_APPLY); + Matrix_RotateZYX(0, 0, 0, MTXMODE_APPLY); Matrix_Scale(decoSize, decoSize, decoSize, MTXMODE_APPLY); - gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); + + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); if (play->sceneNum == SCENE_KAKARIKO_VILLAGE) { - gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gFrontGateDecorDL); + gSPDisplayList(POLY_OPA_DISP++, gFrontGateDecorDL); + gSPDisplayList(POLY_OPA_DISP++, gKakarikoDecorDL); //Assertion Halt in Debug mode, switch to Release when testing. } CLOSE_DISPS(play->state.gfxCtx); diff --git a/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.c b/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.c index 3ce1e1125..2687704e2 100644 --- a/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.c +++ b/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.c @@ -34,7 +34,7 @@ static ColliderCylinderInit sCylinderInit = { BUMP_NONE, OCELEM_ON, }, - { 50, 150, 0, { 0, 0, 0 } }, + { 100, 330, 0, { 0, 0, 0 } }, }; static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE }; @@ -42,7 +42,7 @@ static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE }; void EnChristmasTree_Init(Actor* thisx, PlayState* play) { EnChristmasTree* this = (EnChristmasTree*)thisx; - ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 90.0f); + ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 160.0f); Collider_InitCylinder(play, &this->collider); Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit); CollisionCheck_SetInfo2(&this->actor.colChkInfo, NULL, &sColChkInfoInit); @@ -91,13 +91,6 @@ void EnChristmasTree_Talk(EnChristmasTree* this, PlayState* play) { void EnChristmasTree_SetupEndTitle(EnChristmasTree* this, PlayState* play) { Player* player = GET_PLAYER(play); - player->actor.world.pos.x = -929.336; - player->actor.world.pos.y = 0; - player->actor.world.pos.z = 446.178; - player->actor.shape.rot.x = 0; - player->actor.shape.rot.y = 17537; - player->actor.shape.rot.z = 0; - GameInteractor_SetNoUIActive(1); Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_END_TITLE, 0, 0, 0, 0, 0, 0, 2, false); @@ -122,9 +115,11 @@ void EnChristmasTree_Update(Actor* thisx, PlayState* play) { } void EnChristmasTree_Draw(Actor* thisx, PlayState* play) { + EnChristmasTree* this = (EnChristmasTree*)thisx; + float percentageCompleted = (float)gSaveContext.triforcePiecesCollected / (float)Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED); - float treeSize = 30.0f; + float treeSize = 55.0f; OPEN_DISPS(play->state.gfxCtx); @@ -166,6 +161,11 @@ void EnChristmasTree_Draw(Actor* thisx, PlayState* play) { gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasDecor100DL); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasStarDL); } + if (percentageCompleted >= 1.0f && this->spawnedRupee == 0) { + Actor_Spawn(&play->actorCtx, play, ACTOR_EN_WONDER_ITEM, this->actor.world.pos.x, this->actor.world.pos.y + 280, + this->actor.world.pos.z, 0, 0, LINK_IS_ADULT ? 1 : 4, 0x1ABF, false); + this->spawnedRupee = 1; + } CLOSE_DISPS(play->state.gfxCtx); } diff --git a/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.h b/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.h index 1dbed3396..fd580ac71 100644 --- a/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.h +++ b/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.h @@ -12,6 +12,7 @@ typedef struct EnChristmasTree { Actor actor; ColliderCylinder collider; EnChristmasTreeActionFunc actionFunc; + u8 spawnedRupee; } EnChristmasTree; #ifdef __cplusplus diff --git a/soh/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c b/soh/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c index e2f16a611..a8536e62f 100644 --- a/soh/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c +++ b/soh/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c @@ -66,7 +66,10 @@ void EnHs2_Init(Actor* thisx, PlayState* play) { this->unk_2A8 = 0; this->actor.targetMode = 6; - Actor_Kill(this); + this->actor.world.pos.x = 756.0; + this->actor.world.pos.y = 80.0; + this->actor.world.pos.z = 1378.0; + this->actor.shape.rot.y = 32534; } void EnHs2_Destroy(Actor* thisx, PlayState* play) { diff --git a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c index b790351e4..ef2438acd 100644 --- a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c +++ b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c @@ -829,7 +829,7 @@ s32 EnHy_ShouldSpawn(EnHy* this, PlayState* play) { } else if ((this->actor.params & 0x7F) != ENHY_TYPE_BOJ_12 && IS_NIGHT) { return false; } else { - return false; + return true; } case SCENE_IMPAS_HOUSE: if ((this->actor.params & 0x7F) != ENHY_TYPE_BOJ_10) { @@ -898,6 +898,19 @@ void EnHy_Init(Actor* thisx, PlayState* play) { Actor_Kill(&this->actor); } + if (this->actor.params == 1929) { + this->actor.world.pos.x = 261.826; + this->actor.world.pos.y = 240.0; + this->actor.world.pos.z = 1669.660; + this->actor.shape.rot.y = 23784; + } + if (this->actor.params == 1930) { + this->actor.world.pos.x = 262.224; + this->actor.world.pos.y = 240.0; + this->actor.world.pos.z = 1594.390; + this->actor.shape.rot.y = 7728; + } + this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; this->actionFunc = EnHy_InitImpl; } diff --git a/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c b/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c index 9f8af9c7b..5b743c7e1 100644 --- a/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c +++ b/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c @@ -267,11 +267,12 @@ void EnKusa_Init(Actor* thisx, PlayState* play) { } if (gPlayState->sceneNum == SCENE_KAKARIKO_VILLAGE && this->actor.world.pos.z < 600.0) { - Actor_Kill(this); - } else { - EnKusa_SetupWaitObject(this); + this->actor.world.pos.x += 1620.672; + this->actor.world.pos.y += 80; + this->actor.world.pos.z += 900.884; } - + + EnKusa_SetupWaitObject(this); } void EnKusa_Destroy(Actor* thisx, PlayState* play2) { diff --git a/soh/src/overlays/actors/ovl_En_Toryo/z_en_toryo.c b/soh/src/overlays/actors/ovl_En_Toryo/z_en_toryo.c index 929028fdd..9979c161a 100644 --- a/soh/src/overlays/actors/ovl_En_Toryo/z_en_toryo.c +++ b/soh/src/overlays/actors/ovl_En_Toryo/z_en_toryo.c @@ -105,7 +105,12 @@ void EnToryo_Init(Actor* thisx, PlayState* play) { break; case SCENE_KAKARIKO_VILLAGE: if ((LINK_AGE_IN_YEARS == YEARS_CHILD) && IS_DAY) { - Actor_Kill(this); + this->actor.world.pos.x = 756.0; + this->actor.world.pos.y = 80.0; + this->actor.world.pos.z = 1378.0; + this->actor.shape.rot.y = 32534; + + this->stateFlags |= 2; } break; case SCENE_KAKARIKO_CENTER_GUEST_HOUSE: diff --git a/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c b/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c index 13c1b3edf..e257a184d 100644 --- a/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c +++ b/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c @@ -173,16 +173,14 @@ void EnWood02_Init(Actor* thisx, PlayState* play2) { f32 floorY; s16 extraRot; - if (Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT) == 1) { - if (gPlayState->sceneNum == SCENE_KAKARIKO_VILLAGE && this->actor.params <= WOOD_TREE_KAKARIKO_ADULT) { - Actor_Kill(this); - } + if (gPlayState->sceneNum == SCENE_KAKARIKO_VILLAGE && this->actor.params <= WOOD_TREE_KAKARIKO_ADULT) { + Actor_Kill(this); + } - if (gPlayState->sceneNum == SCENE_KAKARIKO_VILLAGE && this->actor.params >= 0) { - this->actor.world.pos.x = 754.051; - this->actor.world.pos.y = 80.0; - this->actor.world.pos.z = 1429.908; - } + if (gPlayState->sceneNum == SCENE_KAKARIKO_VILLAGE && this->actor.params >= 0) { + this->actor.world.pos.x = 754.051; + this->actor.world.pos.y = 80.0; + this->actor.world.pos.z = 1429.908; } // The tree in Kakariko's day scene does not have the same params to spawn the GS From c829dfb4ec88e256451d148641bb4e38d93fe255 Mon Sep 17 00:00:00 2001 From: aMannus Date: Thu, 16 Nov 2023 21:37:41 +0100 Subject: [PATCH 18/18] Big cleanup, change checks for non-triforce hunt, add more Dana kak models --- .../object_kakariko_decor/SnowBlanket_32 | Bin 0 -> 2140 bytes .../object_kakariko_decor/SnowDissolve_32 | Bin 0 -> 2140 bytes .../objects/object_kakariko_decor/UsagiLeaf_8 | Bin 0 -> 220 bytes .../object_kakariko_decor/YukiUsagi_16 | Bin 0 -> 604 bytes .../gFrontGateDecorDL_tri_1 | 19 - .../gFrontGateDecorDL_vtx_0 | 22 - .../gFrontGateDecorDL_vtx_1 | 54 -- .../gFrontGateDecorDL_vtx_cull | 10 - ...FrontGateDecorDL => gKakarikoAdultDecorDL} | 10 +- .../gKakarikoAdultDecorDL_tri_0 | 7 + ...orDL_tri_0 => gKakarikoAdultDecorDL_tri_1} | 3 +- .../gKakarikoAdultDecorDL_vtx_0 | 10 + .../gKakarikoAdultDecorDL_vtx_1 | 18 + .../gKakarikoAdultDecorDL_vtx_cull | 10 + .../gKakarikoChildDecorDL | 18 + .../gKakarikoChildDecorDL_tri_0 | 37 + .../gKakarikoChildDecorDL_tri_1 | 73 ++ .../gKakarikoChildDecorDL_tri_2 | 14 + .../gKakarikoChildDecorDL_vtx_0 | 106 +++ .../gKakarikoChildDecorDL_vtx_1 | 111 +++ .../gKakarikoChildDecorDL_vtx_2 | 50 ++ .../gKakarikoChildDecorDL_vtx_cull | 10 + .../object_kakariko_decor/gKakarikoDecorDL | 8 +- .../gKakarikoDecorDL_tri_0 | 9 +- .../gKakarikoDecorDL_tri_1 | 77 +- .../gKakarikoDecorDL_tri_2 | 10 +- .../gKakarikoDecorDL_tri_3 | 19 +- .../gKakarikoDecorDL_tri_5 | 6 + .../gKakarikoDecorDL_tri_6 | 330 +++++++++ .../gKakarikoDecorDL_tri_7 | 50 ++ .../gKakarikoDecorDL_vtx_0 | 64 +- .../gKakarikoDecorDL_vtx_1 | 688 +++++++++++------- .../gKakarikoDecorDL_vtx_2 | 76 +- .../gKakarikoDecorDL_vtx_3 | 68 +- .../gKakarikoDecorDL_vtx_5 | 6 + .../gKakarikoDecorDL_vtx_6 | 497 +++++++++++++ .../gKakarikoDecorDL_vtx_7 | 230 ++++++ .../gKakarikoDecorDL_vtx_cull | 16 +- ..._gKakarikoAdultDecorDL_f3dlite_StringGRGR} | 0 ...at_gKakarikoAdultDecorDL_f3dlite_snowlayer | 21 + ...gKakarikoChildDecorDL_f3dlite_SnowBuildup} | 0 ...at_gKakarikoChildDecorDL_f3dlite_UsagiLeaf | 21 + ...KakarikoChildDecorDL_f3dlite_YukiUsagiBody | 21 + .../mat_gKakarikoDecorDL_f3dlite_UsagiLeaf | 21 + ...mat_gKakarikoDecorDL_f3dlite_YukiUsagiBody | 21 + .../mat_gKakarikoDecorDL_f3dlite_material_004 | 29 - .../mat_gKakarikoDecorDL_f3dlite_snowdissolve | 21 + .../mat_gKakarikoDecorDL_f3dlite_snowlayer | 21 + .../spot00_sceneTex_01AB98 | Bin 2140 -> 0 bytes .../spot00_sceneTex_01B398 | Bin 604 -> 0 bytes soh/assets/soh_assets.h | 9 +- soh/soh/Enhancements/mods.cpp | 16 +- soh/src/code/z_play.c | 2 +- .../ovl_En_ChristmasDeco/z_en_christmasdeco.c | 16 +- .../ovl_En_ChristmasTree/z_en_christmastree.c | 48 +- soh/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c | 11 +- soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c | 24 +- 57 files changed, 2478 insertions(+), 560 deletions(-) create mode 100644 soh/assets/custom/objects/object_kakariko_decor/SnowBlanket_32 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/SnowDissolve_32 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/UsagiLeaf_8 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/YukiUsagi_16 delete mode 100644 soh/assets/custom/objects/object_kakariko_decor/gFrontGateDecorDL_tri_1 delete mode 100644 soh/assets/custom/objects/object_kakariko_decor/gFrontGateDecorDL_vtx_0 delete mode 100644 soh/assets/custom/objects/object_kakariko_decor/gFrontGateDecorDL_vtx_1 delete mode 100644 soh/assets/custom/objects/object_kakariko_decor/gFrontGateDecorDL_vtx_cull rename soh/assets/custom/objects/object_kakariko_decor/{gFrontGateDecorDL => gKakarikoAdultDecorDL} (53%) create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_tri_0 rename soh/assets/custom/objects/object_kakariko_decor/{gFrontGateDecorDL_tri_0 => gKakarikoAdultDecorDL_tri_1} (64%) create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_tri_2 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_2 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_5 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_6 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_7 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_5 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_6 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_7 rename soh/assets/custom/objects/object_kakariko_decor/{mat_gFrontGateDecorDL_f3dlite_StringGRGR => mat_gKakarikoAdultDecorDL_f3dlite_StringGRGR} (100%) create mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoAdultDecorDL_f3dlite_snowlayer rename soh/assets/custom/objects/object_kakariko_decor/{mat_gFrontGateDecorDL_f3dlite_SnowBuildup => mat_gKakarikoChildDecorDL_f3dlite_SnowBuildup} (100%) create mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoChildDecorDL_f3dlite_UsagiLeaf create mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoChildDecorDL_f3dlite_YukiUsagiBody create mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_UsagiLeaf create mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_YukiUsagiBody delete mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_material_004 create mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_snowdissolve create mode 100644 soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_snowlayer delete mode 100644 soh/assets/custom/objects/object_kakariko_decor/spot00_sceneTex_01AB98 delete mode 100644 soh/assets/custom/objects/object_kakariko_decor/spot00_sceneTex_01B398 diff --git a/soh/assets/custom/objects/object_kakariko_decor/SnowBlanket_32 b/soh/assets/custom/objects/object_kakariko_decor/SnowBlanket_32 new file mode 100644 index 0000000000000000000000000000000000000000..733b30757353fc612ee61c04b4b3ce8b5be4bea5 GIT binary patch literal 2140 zcmbVLJ66On3^Y_6gPTxM(@=1ma3QWhZUSY>lqr`Pk0+9|G0VexS^1+Gjbv{rrMx}A zzTCmDpC4cRF#YqmN91Gs1bTle1>Zv{mu_s`%8Tu?!Zz61IN!~YL=yksLHsEDh%@4i z&Kz+%!gHTdtlZVFdvNC3H%}((Wq}35Sr5b&Cz%`g`5Q)#yq{C`cy-!)%pdrSin(L^ zdR;g3FUTMI0;yTX8>POncG>v$5jn#^#SG@6H<$b|tJlJxsS6F`-t9Hd*9G==qr=#3aDANYkmhV|#He&y}9JC*|O(dr$* z^W6AjmlVSaX{xazCacwInaHqRzE=ccwn7aizjbd)7*pybff{+S`lF zP;(0tXwH~DW5n3U{I(+Abt~?6{v4q$928IyzR|Eo`@??_daQ^nJrgl}ncd;m4e@cR{uTs?Yx8F^i4w=W7XHbCe?Mzt5W*D?%nx# z&oP$ni+m`09@;CaGMm`s?+8V$FTHIX^uyl)V+>QXh%73b7sTW*+x4e5$MFZhfahxN<%vMpdYI(P5Ewa6>V3E8Fs@9Z1?F{rn9HStle zwn}$$NNy-mO^OpKErOpmEgYQ;{@(uqrrzaXPC1|5vnO|$QI2s$&Ji#7n$=lGcpfK= z(Q?XS&kvP)>_K^Qal`qJhf?C>jL~B~mH@(Plg&Q)aF6G~YN(9Z$FcsnCphck68AA?6ZQZ?<`=fWq2XlioO@=*S+6+p2b_cVk zKr8aBxbq(TqYKA?ph(r-U1oDX OKUUq8@~*UhQuqRir{)a+ literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kakariko_decor/UsagiLeaf_8 b/soh/assets/custom/objects/object_kakariko_decor/UsagiLeaf_8 new file mode 100644 index 0000000000000000000000000000000000000000..fc4d3ff5be301701b1d4e19f16bed932f288061c GIT binary patch literal 220 zcmZQzU|@)F4e@6L((m`Jy$8ZTCeeTisFDMUA(|TO85kPu8z3AgnRB13TSXYc$+@p0 z%-qY|%j5~-LwG9OK>leEA0!9jG511bAv~tj5Lpn9=`=GCLu8dbVKN{-kjDw4VE_Q? CR36;` literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kakariko_decor/YukiUsagi_16 b/soh/assets/custom/objects/object_kakariko_decor/YukiUsagi_16 new file mode 100644 index 0000000000000000000000000000000000000000..2034627ff95af74e080c6e61a6fb128d95cd7f91 GIT binary patch literal 604 zcma)(F%rTc5JkZg$ce11Z7jS=N-T33YddLEa{x*yDJj?eyJ04A3x(ML`~LsQ5a*n` zov#M-hxZdHs)kPo&N&b*e)hd!Pi5+O8)ZJsiF_0e&Ub- literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kakariko_decor/gFrontGateDecorDL_tri_1 b/soh/assets/custom/objects/object_kakariko_decor/gFrontGateDecorDL_tri_1 deleted file mode 100644 index ac9146850..000000000 --- a/soh/assets/custom/objects/object_kakariko_decor/gFrontGateDecorDL_tri_1 +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/soh/assets/custom/objects/object_kakariko_decor/gFrontGateDecorDL_vtx_0 b/soh/assets/custom/objects/object_kakariko_decor/gFrontGateDecorDL_vtx_0 deleted file mode 100644 index 3b2a2a21c..000000000 --- a/soh/assets/custom/objects/object_kakariko_decor/gFrontGateDecorDL_vtx_0 +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/soh/assets/custom/objects/object_kakariko_decor/gFrontGateDecorDL_vtx_1 b/soh/assets/custom/objects/object_kakariko_decor/gFrontGateDecorDL_vtx_1 deleted file mode 100644 index a5aeeaa53..000000000 --- a/soh/assets/custom/objects/object_kakariko_decor/gFrontGateDecorDL_vtx_1 +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/soh/assets/custom/objects/object_kakariko_decor/gFrontGateDecorDL_vtx_cull b/soh/assets/custom/objects/object_kakariko_decor/gFrontGateDecorDL_vtx_cull deleted file mode 100644 index 6e79464b2..000000000 --- a/soh/assets/custom/objects/object_kakariko_decor/gFrontGateDecorDL_vtx_cull +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/soh/assets/custom/objects/object_kakariko_decor/gFrontGateDecorDL b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL similarity index 53% rename from soh/assets/custom/objects/object_kakariko_decor/gFrontGateDecorDL rename to soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL index 5b0d3694f..13d9447f7 100644 --- a/soh/assets/custom/objects/object_kakariko_decor/gFrontGateDecorDL +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL @@ -1,11 +1,11 @@ - + - - - - + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_tri_0 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_tri_0 new file mode 100644 index 000000000..1263127aa --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_tri_0 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gFrontGateDecorDL_tri_0 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_tri_1 similarity index 64% rename from soh/assets/custom/objects/object_kakariko_decor/gFrontGateDecorDL_tri_0 rename to soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_tri_1 index bce87b152..2aff9496e 100644 --- a/soh/assets/custom/objects/object_kakariko_decor/gFrontGateDecorDL_tri_0 +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_tri_1 @@ -1,10 +1,9 @@ - + - diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_vtx_0 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_vtx_0 new file mode 100644 index 000000000..9f3683fed --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_vtx_0 @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_vtx_1 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_vtx_1 new file mode 100644 index 000000000..e438e71cf --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_vtx_cull b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_vtx_cull new file mode 100644 index 000000000..c3ecddb8a --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoAdultDecorDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL new file mode 100644 index 000000000..a3972ce7a --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_tri_0 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_tri_0 new file mode 100644 index 000000000..eb7e92fdf --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_tri_0 @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_tri_1 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_tri_1 new file mode 100644 index 000000000..77468a738 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_tri_1 @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_tri_2 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_tri_2 new file mode 100644 index 000000000..97634bb7b --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_tri_2 @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_0 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_0 new file mode 100644 index 000000000..24e3e3d6e --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_0 @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_1 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_1 new file mode 100644 index 000000000..0b12310ec --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_1 @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_2 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_2 new file mode 100644 index 000000000..f2a81069d --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_2 @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_cull b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_cull new file mode 100644 index 000000000..b2e233783 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoChildDecorDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL index 3451b3004..f0363d242 100644 --- a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL @@ -8,10 +8,16 @@ - + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_0 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_0 index 450d4ad7b..5ee2633e5 100644 --- a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_0 +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_0 @@ -17,11 +17,18 @@ - + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_1 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_1 index 701018d7e..2b52e5ef3 100644 --- a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_1 +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_1 @@ -1,5 +1,13 @@ - + + + + + + + + + @@ -8,7 +16,7 @@ - + @@ -17,7 +25,16 @@ - + + + + + + + + + + @@ -26,7 +43,7 @@ - + @@ -35,7 +52,7 @@ - + @@ -44,7 +61,7 @@ - + @@ -53,7 +70,7 @@ - + @@ -62,7 +79,7 @@ - + @@ -71,7 +88,7 @@ - + @@ -80,7 +97,7 @@ - + @@ -89,7 +106,7 @@ - + @@ -98,7 +115,7 @@ - + @@ -107,7 +124,7 @@ - + @@ -116,7 +133,7 @@ - + @@ -125,7 +142,7 @@ - + @@ -134,7 +151,7 @@ - + @@ -143,7 +160,7 @@ - + @@ -152,7 +169,7 @@ - + @@ -161,7 +178,7 @@ - + @@ -170,7 +187,7 @@ - + @@ -179,7 +196,25 @@ - + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_2 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_2 index a8f0d1205..d6f5dbafe 100644 --- a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_2 +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_2 @@ -8,12 +8,20 @@ - + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_3 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_3 index 5e89bfd9c..f66ba5914 100644 --- a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_3 +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_3 @@ -1,8 +1,25 @@ - + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_5 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_5 new file mode 100644 index 000000000..ca52719c9 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_5 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_6 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_6 new file mode 100644 index 000000000..75be056f5 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_6 @@ -0,0 +1,330 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_7 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_7 new file mode 100644 index 000000000..eeedcf1ee --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_tri_7 @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_0 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_0 index 844aa0f3c..c0a07802c 100644 --- a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_0 +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_0 @@ -27,10 +27,10 @@ - - - - + + + + @@ -39,10 +39,10 @@ - - - - + + + + @@ -51,10 +51,10 @@ - - - - + + + + @@ -63,14 +63,14 @@ - - - - - - - - + + + + + + + + @@ -79,4 +79,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_1 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_1 index 3c1ca09b4..c7615dd3b 100644 --- a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_1 +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_1 @@ -1,12 +1,18 @@ + + + + + + - - - - + + + + @@ -31,14 +37,14 @@ - - - - - - - - + + + + + + + + @@ -59,22 +65,22 @@ - - - - - - - - + + + + + + + + - - - - + + + + @@ -83,14 +89,14 @@ - - - - - - - - + + + + + + + + @@ -107,230 +113,228 @@ - - - - + + + + - - - - + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - + + + + @@ -339,18 +343,18 @@ - - - - + + + + - - - - + + + + @@ -359,42 +363,42 @@ - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + @@ -403,10 +407,10 @@ - - - - + + + + @@ -419,34 +423,34 @@ - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + @@ -455,10 +459,10 @@ - - - - + + + + @@ -471,10 +475,10 @@ - - - - + + + + @@ -487,10 +491,10 @@ - - - - + + + + @@ -499,58 +503,58 @@ - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + @@ -559,38 +563,38 @@ - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - - - + + + + + + + + @@ -607,40 +611,160 @@ - - - - + + + + - - - - + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_2 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_2 index cd5e7a3d0..3ff9d2e43 100644 --- a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_2 +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_2 @@ -7,10 +7,10 @@ - - - - + + + + @@ -19,10 +19,10 @@ - - - - + + + + @@ -31,24 +31,52 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_3 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_3 index fb8c029cd..b0e49797a 100644 --- a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_3 +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_3 @@ -1,8 +1,8 @@ - - - - + + + + @@ -11,4 +11,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_5 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_5 new file mode 100644 index 000000000..46c6ac9a1 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_5 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_6 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_6 new file mode 100644 index 000000000..0e5970505 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_6 @@ -0,0 +1,497 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_7 b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_7 new file mode 100644 index 000000000..1929d460e --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_7 @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_cull b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_cull index c096976aa..a183da293 100644 --- a/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_cull +++ b/soh/assets/custom/objects/object_kakariko_decor/gKakarikoDecorDL_vtx_cull @@ -1,10 +1,10 @@ - - - - - - - - + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gFrontGateDecorDL_f3dlite_StringGRGR b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoAdultDecorDL_f3dlite_StringGRGR similarity index 100% rename from soh/assets/custom/objects/object_kakariko_decor/mat_gFrontGateDecorDL_f3dlite_StringGRGR rename to soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoAdultDecorDL_f3dlite_StringGRGR diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoAdultDecorDL_f3dlite_snowlayer b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoAdultDecorDL_f3dlite_snowlayer new file mode 100644 index 000000000..5456b3893 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoAdultDecorDL_f3dlite_snowlayer @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gFrontGateDecorDL_f3dlite_SnowBuildup b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoChildDecorDL_f3dlite_SnowBuildup similarity index 100% rename from soh/assets/custom/objects/object_kakariko_decor/mat_gFrontGateDecorDL_f3dlite_SnowBuildup rename to soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoChildDecorDL_f3dlite_SnowBuildup diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoChildDecorDL_f3dlite_UsagiLeaf b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoChildDecorDL_f3dlite_UsagiLeaf new file mode 100644 index 000000000..be29498ef --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoChildDecorDL_f3dlite_UsagiLeaf @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoChildDecorDL_f3dlite_YukiUsagiBody b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoChildDecorDL_f3dlite_YukiUsagiBody new file mode 100644 index 000000000..3a2d2c889 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoChildDecorDL_f3dlite_YukiUsagiBody @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_UsagiLeaf b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_UsagiLeaf new file mode 100644 index 000000000..be29498ef --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_UsagiLeaf @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_YukiUsagiBody b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_YukiUsagiBody new file mode 100644 index 000000000..3a2d2c889 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_YukiUsagiBody @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_material_004 b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_material_004 deleted file mode 100644 index 0a479d70a..000000000 --- a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_material_004 +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_snowdissolve b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_snowdissolve new file mode 100644 index 000000000..e86142f29 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_snowdissolve @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_snowlayer b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_snowlayer new file mode 100644 index 000000000..5456b3893 --- /dev/null +++ b/soh/assets/custom/objects/object_kakariko_decor/mat_gKakarikoDecorDL_f3dlite_snowlayer @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kakariko_decor/spot00_sceneTex_01AB98 b/soh/assets/custom/objects/object_kakariko_decor/spot00_sceneTex_01AB98 deleted file mode 100644 index 454876ed0463d2061a6e06b14cc82324f9ceac02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2140 zcma)-y>8n;5QLdjd5pY=a7dLpO^UqC0ePXgWFs6)s-rrxBTJSlT@VL&z8#+I04d@H zC5qhHpV`@S*LB^m?>~Qh()VNdvvTS7zyChV^XqvT^!r=a>H5-jTi)}Qx3t#vm@B5c zIv@LGJ@zEaOS-4A-t@U7yydT_VP(_Xsq$Oi+5Yh+&BuB?@@sj7&pid6OjwfTUGMh7 z{hl5X?~xyR7EcwIsJhRK?5^z2f1({hDA3@Ie8)F`s&B?U_~o>y1H9spt69`YUipvJ zHdT69!j}kCV{<%L>)MSMH~E(OI)shFpEaE|I6E<5-Tg9)Giu(-lE>PY7g=9E;N|0r z>3$P>k~so(!L%$`3w(ab;K@K`A3G%iXyaSIL%k`=Esd(&`3HH>dt=Donr>G1VmuWz zw#*xy_lnRL@K1)GQC`a~{E&w{7R9*|p~bo<^VZm#>z<^si!$f;Y43R|;HR?cz4=%V zGdL-`jO=AP)S(o4PMQcZv_QTQ59%XBT%IZYgO3Q;`IuFqIH3N_q&D&F90L)Gl_)h9 zD?2LCn=tXz@N5P6o6yQp`saj*5JvRu%1(S_pi6I+s#o@ge#zFzrnh@S6LbKc-oj3n z*ZLY;86C)D$h|ByrfwIV19KTq-#M6pUz?_Mg+p&E+7o+4@00oYP2dJOONn693%HL@N|$(y4HngTpn^=MBWD^FxnET3k4 zN~6I(6+Q97f)-b~DTaQ~;<;C4Qok5|b3XosSAH~bYO0{+kv!y(Mqo#|1G!xyj_^#- z^~XNy9^XefcR|@FAssW&738T*@GzL2nK+7~Uw#r>Cp=olG)u9k>q-?;pCSo=u{Ya> zM%qc{(<#^zk9>QUOadH}Akuy@XMBq9V4ci99nprTIA+gYlgl$zXf8Zkg`z_%l>Ni} z|7Ay;;A4vK+EEu}v@Qx+IgLJ=ySOVV`VYmV$d-rD9+hjd>O}nh0}ltBu+e?7+NGjv z(=sTgZ&um_*-@%sQ(++XEh-+yZRow)Po zb!g*$Y-chrdr#5xx)%Ejyza<|?C8X=9^*AGXDG}fiG$TaL6o1_*#&@%cOvJ=dXTUx5uual#@*7!^^^qqr;8RmCJO)g nnB11>acX=}Xw0~3kW2_nr4h)PIg1=4;BLm1_@o6c<7K=7R+;+P diff --git a/soh/assets/soh_assets.h b/soh/assets/soh_assets.h index 62ac078b4..2a5695b6b 100644 --- a/soh/assets/soh_assets.h +++ b/soh/assets/soh_assets.h @@ -92,12 +92,15 @@ static const ALIGN_ASSET(2) char gXmasDecor100DL[] = dgXmasDecor100DL; #define dgXmasStarDL "__OTR__objects/object_xmas_tree/gXmasStarDL" static const ALIGN_ASSET(2) char gXmasStarDL[] = dgXmasStarDL; -#define dgFrontGateDecorDL "__OTR__objects/object_kakariko_decor/gFrontGateDecorDL" -static const ALIGN_ASSET(2) char gFrontGateDecorDL[] = dgFrontGateDecorDL; - #define dgKakarikoDecorDL "__OTR__objects/object_kakariko_decor/gKakarikoDecorDL" static const ALIGN_ASSET(2) char gKakarikoDecorDL[] = dgKakarikoDecorDL; +#define dgKakarikoChildDecorDL "__OTR__objects/object_kakariko_decor/gKakarikoChildDecorDL" +static const ALIGN_ASSET(2) char gKakarikoChildDecorDL[] = dgKakarikoChildDecorDL; + +#define dgKakarikoAdultDecorDL "__OTR__objects/object_kakariko_decor/gKakarikoAdultDecorDL" +static const ALIGN_ASSET(2) char gKakarikoAdultDecorDL[] = dgKakarikoAdultDecorDL; + // overlays #define dgOptionsDividerChangeLangVtx "__OTR__overlays/ovl_file_choose/gOptionsDividerChangeLangVtx" static const ALIGN_ASSET(2) char gOptionsDividerChangeLangVtx[] = dgOptionsDividerChangeLangVtx; diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 0fef052b7..338cbfc40 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -655,7 +655,9 @@ void RegisterGrantGanonsBossKey() { Player* player = GET_PLAYER(gPlayState); // Triforce Hunt needs the check if the player isn't being teleported to the credits scene. if (!GameInteractor::IsGameplayPaused() && Flags_GetRandomizerInf(RAND_INF_GRANT_GANONS_BOSSKEY) && - gPlayState->sceneLoadFlag != 0x14 && (1 << 0 & gSaveContext.inventory.dungeonItems[SCENE_GANONS_TOWER]) == 0) { + gPlayState->sceneLoadFlag != 0x14 && + (1 << 0 & gSaveContext.inventory.dungeonItems[SCENE_GANONS_TOWER]) == 0 && player->stateFlags1 != + PLAYER_STATE1_INPUT_DISABLED) { GetItemEntry getItemEntry = ItemTableManager::Instance->RetrieveItemEntry(MOD_RANDOMIZER, RG_GANONS_CASTLE_BOSS_KEY); GiveItemEntryWithoutActor(gPlayState, getItemEntry); @@ -1057,17 +1059,6 @@ void RegisterRandomizedEnemySizes() { }); } -void RegisterChristmas() { - GameInteractor::Instance->RegisterGameHook([]() { - Actor* player = &GET_PLAYER(gPlayState)->actor; - Actor* nearbyEndTitle = Actor_FindNearby(gPlayState, player, ACTOR_END_TITLE, ACTORCAT_ITEMACTION, 3000.0f); - - if (gSaveContext.inventory.dungeonItems[SCENE_GANONS_TOWER] > 0 && nearbyEndTitle) { - Camera_ChangeMode(Play_GetCamera(gPlayState, gPlayState->mainCamera.thisIdx), CAM_MODE_STILL); - } - }); -} - void InitMods() { RegisterTTS(); RegisterInfiniteMoney(); @@ -1098,5 +1089,4 @@ void InitMods() { RegisterRandomizerSheikSpawn(); RegisterRandomizedEnemySizes(); NameTag_RegisterHooks(); - RegisterChristmas(); } diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index f14948dd9..7cdb5f8dd 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -769,7 +769,7 @@ void Play_Init(GameState* thisx) { GET_PLAYER(play)->actor.world.pos.z, 0, 0, 0, 1, true); } - if (play->sceneNum == SCENE_KAKARIKO_VILLAGE && Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT)) { + if (play->sceneNum == SCENE_KAKARIKO_VILLAGE) { Actor_Spawn(&play->actorCtx, play, gEnChristmasTreeId, -734, 0, 420, 0, 0, 0, 0, true); } diff --git a/soh/src/overlays/actors/ovl_En_ChristmasDeco/z_en_christmasdeco.c b/soh/src/overlays/actors/ovl_En_ChristmasDeco/z_en_christmasdeco.c index 976aa4a4b..0b880b71b 100644 --- a/soh/src/overlays/actors/ovl_En_ChristmasDeco/z_en_christmasdeco.c +++ b/soh/src/overlays/actors/ovl_En_ChristmasDeco/z_en_christmasdeco.c @@ -13,6 +13,7 @@ void EnChristmasDeco_Update(Actor* thisx, PlayState* play); void EnChristmasDeco_Draw(Actor* thisx, PlayState* play); void EnChristmasDeco_Init(Actor* thisx, PlayState* play) { + } void EnChristmasDeco_Destroy(Actor* thisx, PlayState* play) { @@ -28,15 +29,20 @@ void EnChristmasDeco_Draw(Actor* thisx, PlayState* play) { OPEN_DISPS(play->state.gfxCtx); - Matrix_Translate(0, 0, 0, MTXMODE_APPLY); - Matrix_RotateZYX(0, 0, 0, MTXMODE_APPLY); + Gfx_SetupDL_25Opa(play->state.gfxCtx); + Matrix_Scale(decoSize, decoSize, decoSize, MTXMODE_APPLY); - gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); + // Assertion Halt in Debug mode, switch to Release when testing. if (play->sceneNum == SCENE_KAKARIKO_VILLAGE) { - gSPDisplayList(POLY_OPA_DISP++, gFrontGateDecorDL); - gSPDisplayList(POLY_OPA_DISP++, gKakarikoDecorDL); //Assertion Halt in Debug mode, switch to Release when testing. + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gKakarikoDecorDL); + if (LINK_IS_CHILD) { + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gKakarikoChildDecorDL); + } else { + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gKakarikoAdultDecorDL); + } } CLOSE_DISPS(play->state.gfxCtx); diff --git a/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.c b/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.c index 2687704e2..c18e2e098 100644 --- a/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.c +++ b/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.c @@ -65,7 +65,7 @@ void EnChristmasTree_Destroy(Actor* thisx, PlayState* play) { void EnChristmasTree_Wait(EnChristmasTree* this, PlayState* play) { if (Actor_ProcessTalkRequest(&this->actor, play)) { // if talk is initiated this->actionFunc = EnChristmasTree_Talk; - } else if ((this->actor.xzDistToPlayer < 170.0f)) { // talk range + } else if ((this->actor.xzDistToPlayer < 170.0f) && Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT)) { // talk range func_8002F2CC(&this->actor, play, 170.0f); } } @@ -93,12 +93,16 @@ void EnChristmasTree_SetupEndTitle(EnChristmasTree* this, PlayState* play) { GameInteractor_SetNoUIActive(1); - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_END_TITLE, 0, 0, 0, 0, 0, 0, 2, false); + Actor_Spawn(&play->actorCtx, play, ACTOR_END_TITLE, 0, 0, 0, 0, 0, 0, 2, false); player->stateFlags1 = PLAYER_STATE1_INPUT_DISABLED; Flags_SetRandomizerInf(RAND_INF_GRANT_GANONS_BOSSKEY); + Play_PerformSave(play); + + Camera_ChangeMode(Play_GetCamera(play, play->mainCamera.thisIdx), CAM_MODE_STILL); + this->actionFunc = EnChristmasTree_Wait; } @@ -111,15 +115,26 @@ void EnChristmasTree_Update(Actor* thisx, PlayState* play) { Actor_SetFocus(&this->actor, 80.0f); + uint8_t triforceHuntActive = Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT); + float percentageCompleted = (float)gSaveContext.triforcePiecesCollected / + (float)Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED); + + if ((percentageCompleted >= 1.0f || !triforceHuntActive) && !this->spawnedRupee) { + Actor_Spawn(&play->actorCtx, play, ACTOR_EN_WONDER_ITEM, this->actor.world.pos.x, this->actor.world.pos.y + 280, + this->actor.world.pos.z, 0, 0, LINK_IS_ADULT ? 1 : 4, 0x1ABF, false); + this->spawnedRupee = 1; + } + this->actionFunc(this, play); } void EnChristmasTree_Draw(Actor* thisx, PlayState* play) { EnChristmasTree* this = (EnChristmasTree*)thisx; - + + float treeSize = 55.0f; + uint8_t triforceHuntActive = Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT); float percentageCompleted = (float)gSaveContext.triforcePiecesCollected / (float)Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED); - float treeSize = 55.0f; OPEN_DISPS(play->state.gfxCtx); @@ -130,42 +145,37 @@ void EnChristmasTree_Draw(Actor* thisx, PlayState* play) { gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasTreeDL); - if (percentageCompleted >= 0.1f) { + if (percentageCompleted >= 0.1f || !triforceHuntActive) { gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasDecor10DL); } - if (percentageCompleted >= 0.2f) { + if (percentageCompleted >= 0.2f || !triforceHuntActive) { gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasDecor20DL); } - if (percentageCompleted >= 0.3f) { + if (percentageCompleted >= 0.3f || !triforceHuntActive) { gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasDecor30DL); } - if (percentageCompleted >= 0.4f) { + if (percentageCompleted >= 0.4f || !triforceHuntActive) { gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasDecor40DL); } - if (percentageCompleted >= 0.5f) { + if (percentageCompleted >= 0.5f || !triforceHuntActive) { gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasDecor50DL); } - if (percentageCompleted >= 0.6f) { + if (percentageCompleted >= 0.6f || !triforceHuntActive) { gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasDecor60DL); } - if (percentageCompleted >= 0.7f) { + if (percentageCompleted >= 0.7f || !triforceHuntActive) { gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasDecor70DL); } - if (percentageCompleted >= 0.8f) { + if (percentageCompleted >= 0.8f || !triforceHuntActive) { gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasDecor80DL); } - if (percentageCompleted >= 0.9f) { + if (percentageCompleted >= 0.9f || !triforceHuntActive) { gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasDecor90DL); } - if (percentageCompleted >= 1.0f) { + if (percentageCompleted >= 1.0f || !triforceHuntActive) { gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasDecor100DL); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gXmasStarDL); } - if (percentageCompleted >= 1.0f && this->spawnedRupee == 0) { - Actor_Spawn(&play->actorCtx, play, ACTOR_EN_WONDER_ITEM, this->actor.world.pos.x, this->actor.world.pos.y + 280, - this->actor.world.pos.z, 0, 0, LINK_IS_ADULT ? 1 : 4, 0x1ABF, false); - this->spawnedRupee = 1; - } CLOSE_DISPS(play->state.gfxCtx); } diff --git a/soh/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c b/soh/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c index a8536e62f..deeeee1b9 100644 --- a/soh/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c +++ b/soh/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c @@ -66,10 +66,13 @@ void EnHs2_Init(Actor* thisx, PlayState* play) { this->unk_2A8 = 0; this->actor.targetMode = 6; - this->actor.world.pos.x = 756.0; - this->actor.world.pos.y = 80.0; - this->actor.world.pos.z = 1378.0; - this->actor.shape.rot.y = 32534; + if (play->sceneNum == SCENE_KAKARIKO_VILLAGE) { + this->actor.world.pos.x = 756.0; + this->actor.world.pos.y = 80.0; + this->actor.world.pos.z = 1378.0; + this->actor.shape.rot.y = 32534; + } + } void EnHs2_Destroy(Actor* thisx, PlayState* play) { diff --git a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c index ef2438acd..d51c7dd92 100644 --- a/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c +++ b/soh/src/overlays/actors/ovl_En_Hy/z_en_hy.c @@ -898,17 +898,19 @@ void EnHy_Init(Actor* thisx, PlayState* play) { Actor_Kill(&this->actor); } - if (this->actor.params == 1929) { - this->actor.world.pos.x = 261.826; - this->actor.world.pos.y = 240.0; - this->actor.world.pos.z = 1669.660; - this->actor.shape.rot.y = 23784; - } - if (this->actor.params == 1930) { - this->actor.world.pos.x = 262.224; - this->actor.world.pos.y = 240.0; - this->actor.world.pos.z = 1594.390; - this->actor.shape.rot.y = 7728; + if (play->sceneNum == SCENE_KAKARIKO_VILLAGE) { + if (this->actor.params == 1929) { + this->actor.world.pos.x = 261.826; + this->actor.world.pos.y = 240.0; + this->actor.world.pos.z = 1669.660; + this->actor.shape.rot.y = 23784; + } + if (this->actor.params == 1930) { + this->actor.world.pos.x = 262.224; + this->actor.world.pos.y = 240.0; + this->actor.world.pos.z = 1594.390; + this->actor.shape.rot.y = 7728; + } } this->getItemEntry = (GetItemEntry)GET_ITEM_NONE;