Skip to content

Commit 3e32d05

Browse files
authored
macready -> dev
2 parents 897d3ef + 2216b68 commit 3e32d05

File tree

12 files changed

+108
-52
lines changed

12 files changed

+108
-52
lines changed

.github/workflows/generate-builds.yml

-1
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,6 @@ jobs:
288288
- name: Install dependencies
289289
if: ${{ !vars.LINUX_RUNNER }}
290290
run: |
291-
sudo apt-get update
292291
sudo apt-get install -y ninja-build
293292
sudo apt-get remove -y cmake
294293
wget https://github.com/Kitware/CMake/releases/download/v3.28.3/cmake-3.28.3-linux-x86_64.sh -O /tmp/cmake.sh

soh/soh/Enhancements/randomizer/3drando/fill.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -851,10 +851,10 @@ static void RandomizeDungeonItems() {
851851
}
852852

853853
if (GerudoKeys.Is(GERUDOKEYS_ANY_DUNGEON)) {
854-
auto gerudoKeys = FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == GERUDO_FORTRESS_SMALL_KEY; });
854+
auto gerudoKeys = FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == GERUDO_FORTRESS_SMALL_KEY || i == GERUDO_FORTRESS_KEY_RING; });
855855
AddElementsToPool(anyDungeonItems, gerudoKeys);
856856
} else if (GerudoKeys.Is(GERUDOKEYS_OVERWORLD)) {
857-
auto gerudoKeys = FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == GERUDO_FORTRESS_SMALL_KEY; });
857+
auto gerudoKeys = FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == GERUDO_FORTRESS_SMALL_KEY || i == GERUDO_FORTRESS_KEY_RING; });
858858
AddElementsToPool(overworldItems, gerudoKeys);
859859
}
860860

soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp

+48-22
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,23 @@ std::map<SceneID, RandomizerCheckArea> DungeonRCAreasBySceneID = {
103103
{SCENE_INSIDE_GANONS_CASTLE, RCAREA_GANONS_CASTLE},
104104
};
105105

106+
// Dungeon entrances with obvious visual differences between MQ and vanilla qualifying as spoiling on sight
107+
std::vector<uint32_t> spoilingEntrances = {
108+
0x0000, // ENTR_DEKU_TREE_0
109+
0x0467, // ENTR_DODONGOS_CAVERN_1
110+
0x0028, // ENTR_JABU_JABU_0
111+
0x0407, // ENTR_JABU_JABU_1
112+
0x0169, // ENTR_FOREST_TEMPLE_0
113+
0x0165, // ENTR_FIRE_TEMPLE_0
114+
0x0175, // ENTR_FIRE_TEMPLE_1
115+
0x0423, // ENTR_WATER_TEMPLE_1
116+
0x0082, // ENTR_SPIRIT_TEMPLE_0
117+
0x02B2, // ENTR_SHADOW_TEMPLE_1
118+
0x0088, // ENTR_ICE_CAVERN_0
119+
0x0008, // ENTR_GERUDO_TRAINING_GROUNDS_0
120+
0x0467 // ENTR_INSIDE_GANONS_CASTLE_0
121+
};
122+
106123
std::map<RandomizerCheckArea, std::vector<RandomizerCheckObject>> checksByArea;
107124
bool areasFullyChecked[RCAREA_INVALID];
108125
u32 areasSpoiled = 0;
@@ -263,6 +280,10 @@ void SetCheckCollected(RandomizerCheck rc) {
263280
}
264281
SaveManager::Instance->SaveSection(gSaveContext.fileNum, sectionId, true);
265282

283+
if (!IsAreaSpoiled(rcObj.rcArea)) {
284+
SetAreaSpoiled(rcObj.rcArea);
285+
}
286+
266287
doAreaScroll = true;
267288
UpdateOrdering(rcObj.rcArea);
268289
UpdateInventoryChecks();
@@ -467,9 +488,14 @@ void CheckTrackerLoadGame(int32_t fileNum) {
467488
areaChecksGotten[realRcObj.rcArea]++;
468489
}
469490
}
470-
471-
if (areaChecksGotten[realRcObj.rcArea] != 0 || RandomizerCheckObjects::AreaIsOverworld(realRcObj.rcArea)) {
472-
areasSpoiled |= (1 << realRcObj.rcArea);
491+
}
492+
for (int i = RCAREA_KOKIRI_FOREST; i < RCAREA_INVALID; i++) {
493+
if (!IsAreaSpoiled(static_cast<RandomizerCheckArea>(i)) && (RandomizerCheckObjects::AreaIsOverworld(static_cast<RandomizerCheckArea>(i)) || !IS_RANDO ||
494+
OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_RANDOM_MQ_DUNGEONS) == RO_MQ_DUNGEONS_NONE ||
495+
OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_RANDOM_MQ_DUNGEONS) == RO_MQ_DUNGEONS_SELECTION ||
496+
(OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_RANDOM_MQ_DUNGEONS) == RO_MQ_DUNGEONS_SET_NUMBER &&
497+
OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) == 12))) {
498+
SetAreaSpoiled(static_cast<RandomizerCheckArea>(i));
473499
}
474500
}
475501
if (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LINKS_POCKET) != RO_LINKS_POCKET_NOTHING && IS_RANDO) {
@@ -539,6 +565,9 @@ void CheckTrackerTransition(uint32_t sceneNum) {
539565
SetShopSeen(sceneNum, false);
540566
break;
541567
}
568+
if (!IsAreaSpoiled(currentArea) && (RandomizerCheckObjects::AreaIsOverworld(currentArea) || std::find(spoilingEntrances.begin(), spoilingEntrances.end(), gPlayState->nextEntranceIndex) != spoilingEntrances.end())) {
569+
SetAreaSpoiled(currentArea);
570+
}
542571
}
543572

544573
void CheckTrackerFrame() {
@@ -756,6 +785,7 @@ void CheckTrackerFlagSet(int16_t flagType, int32_t flag) {
756785

757786
void InitTrackerData(bool isDebug) {
758787
TrySetAreas();
788+
areasSpoiled = 0;
759789
for (auto& [rc, rco] : RandomizerCheckObjects::GetAllRCObjects()) {
760790
if (rc != RC_UNKNOWN_CHECK && rc != RC_MAX) {
761791
DefaultCheckData(rc);
@@ -782,6 +812,7 @@ void SaveTrackerData(SaveContext* saveContext, int sectionID, bool gameSave) {
782812
SaveManager::Instance->SaveData("hintItem", saveContext->checkTrackerData[i].hintItem);
783813
});
784814
});
815+
SaveManager::Instance->SaveData("areasSpoiled", areasSpoiled);
785816
}
786817

787818
void SaveFile(SaveContext* saveContext, int sectionID, bool fullSave) {
@@ -797,6 +828,7 @@ void LoadFile() {
797828
SaveManager::Instance->LoadData("hintItem", gSaveContext.checkTrackerData[i].hintItem);
798829
});
799830
});
831+
SaveManager::Instance->LoadData("areasSpoiled", areasSpoiled);
800832
}
801833

802834
void Teardown() {
@@ -808,6 +840,15 @@ void Teardown() {
808840
lastLocationChecked = RC_UNKNOWN_CHECK;
809841
}
810842

843+
bool IsAreaSpoiled(RandomizerCheckArea rcArea) {
844+
return areasSpoiled & (1 << rcArea);
845+
}
846+
847+
void SetAreaSpoiled(RandomizerCheckArea rcArea) {
848+
areasSpoiled |= (1 << rcArea);
849+
SaveManager::Instance->SaveSection(gSaveContext.fileNum, sectionId, true);
850+
}
851+
811852
void UpdateCheck(uint32_t check, RandomizerCheckTrackerData data) {
812853
auto area = RandomizerCheckObjects::GetAllRCObjects().find(static_cast<RandomizerCheck>(check))->second.rcArea;
813854
if ((!gSaveContext.checkTrackerData[check].skipped && data.skipped) ||
@@ -826,10 +867,6 @@ void UpdateCheck(uint32_t check, RandomizerCheckTrackerData data) {
826867
void CheckTrackerWindow::DrawElement() {
827868
ImGui::SetNextWindowSize(ImVec2(400, 540), ImGuiCond_FirstUseEver);
828869

829-
if (!initialized && (gPlayState == nullptr || gSaveContext.fileNum < 0 || gSaveContext.fileNum > 2)) {
830-
return;
831-
}
832-
833870
if (CVarGetInteger("gCheckTrackerWindowType", TRACKER_WINDOW_WINDOW) == TRACKER_WINDOW_FLOATING) {
834871
if (CVarGetInteger("gCheckTrackerShowOnlyPaused", 0) && (gPlayState == nullptr || gPlayState->pauseCtx.state == 0)) {
835872
return;
@@ -850,7 +887,7 @@ void CheckTrackerWindow::DrawElement() {
850887

851888
BeginFloatWindows("Check Tracker", mIsVisible, ImGuiWindowFlags_NoScrollbar);
852889

853-
if (!GameInteractor::IsSaveLoaded()) {
890+
if (!GameInteractor::IsSaveLoaded() || !initialized) {
854891
ImGui::Text("Waiting for file load..."); //TODO Language
855892
EndFloatWindows();
856893
return;
@@ -861,8 +898,6 @@ void CheckTrackerWindow::DrawElement() {
861898
sceneId = (SceneID)gPlayState->sceneNum;
862899
}
863900

864-
areasSpoiled |= (1 << currentArea);
865-
866901
//Quick Options
867902
#ifdef __WIIU__
868903
float headerHeight = 40.0f;
@@ -924,7 +959,6 @@ void CheckTrackerWindow::DrawElement() {
924959
Color_RGBA8 mainColor;
925960
Color_RGBA8 extraColor;
926961
std::string stemp;
927-
s32 areaMask = 1;
928962

929963
for (auto& [rcArea, objs] : checksByArea) {
930964
RandomizerCheckArea thisArea = currentArea;
@@ -977,11 +1011,7 @@ void CheckTrackerWindow::DrawElement() {
9771011
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(extraColor.r / 255.0f, extraColor.g / 255.0f,
9781012
extraColor.b / 255.0f, extraColor.a / 255.0f));
9791013

980-
isThisAreaSpoiled = areasSpoiled & areaMask || CVarGetInteger("gCheckTrackerOptionMQSpoilers", 0) || !IS_RANDO ||
981-
OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_RANDOM_MQ_DUNGEONS) == RO_MQ_DUNGEONS_NONE ||
982-
OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_RANDOM_MQ_DUNGEONS) == RO_MQ_DUNGEONS_SELECTION ||
983-
(OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_RANDOM_MQ_DUNGEONS) == RO_MQ_DUNGEONS_SET_NUMBER &&
984-
OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) == 12);
1014+
isThisAreaSpoiled = IsAreaSpoiled(rcArea) || CVarGetInteger("gCheckTrackerOptionMQSpoilers", 0);
9851015

9861016
if (isThisAreaSpoiled) {
9871017
if (showVOrMQ && RandomizerCheckObjects::AreaIsDungeon(rcArea)) {
@@ -1014,7 +1044,6 @@ void CheckTrackerWindow::DrawElement() {
10141044
ImGui::TreePop();
10151045
}
10161046
}
1017-
areaMask <<= 1;
10181047
}
10191048

10201049
ImGui::EndTable(); //Checks Lead-out
@@ -1218,10 +1247,10 @@ bool IsVisibleInCheckTracker(RandomizerCheckObject rcObj) {
12181247
}
12191248

12201249
void UpdateInventoryChecks() {
1221-
//For all the areas with compasses, if you have one, spoil the area
1250+
//For all the areas with maps, if you have one, spoil the area
12221251
for (auto [scene, area] : DungeonRCAreasBySceneID) {
12231252
if (CHECK_DUNGEON_ITEM(DUNGEON_MAP, scene)) {
1224-
areasSpoiled |= (1 << area);
1253+
SetAreaSpoiled(area);
12251254
}
12261255
}
12271256
}
@@ -1231,9 +1260,6 @@ void UpdateAreaFullyChecked(RandomizerCheckArea area) {
12311260

12321261
void UpdateAreas(RandomizerCheckArea area) {
12331262
areasFullyChecked[area] = areaChecksGotten[area] == checksByArea.find(area)->second.size();
1234-
if (areaChecksGotten[area] != 0 || RandomizerCheckObjects::AreaIsOverworld(area)) {
1235-
areasSpoiled |= (1 << area);
1236-
}
12371263
}
12381264

12391265
void UpdateAllOrdering() {

soh/soh/Enhancements/randomizer/randomizer_check_tracker.h

+2
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ bool IsVisibleInCheckTracker(RandomizerCheckObject rcObj);
5050
void InitTrackerData(bool isDebug);
5151
RandomizerCheckArea GetCheckArea();
5252
void UpdateCheck(uint32_t, RandomizerCheckTrackerData);
53+
bool IsAreaSpoiled(RandomizerCheckArea rcArea);
54+
void SetAreaSpoiled(RandomizerCheckArea rcArea);
5355
} // namespace CheckTracker
5456

5557

soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp

+31-22
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <vector>
1010
#include <libultraship/libultraship.h>
1111
#include "soh/Enhancements/game-interactor/GameInteractor.h"
12+
#include "randomizer_check_tracker.h"
1213
#include <algorithm>
1314

1415
extern "C" {
@@ -290,15 +291,15 @@ bool IsValidSaveFile() {
290291
}
291292

292293
bool HasSong(ItemTrackerItem item) {
293-
return (1 << item.id) & gSaveContext.inventory.questItems;
294+
return GameInteractor::IsSaveLoaded() ? ((1 << item.id) & gSaveContext.inventory.questItems) : false;
294295
}
295296

296297
bool HasQuestItem(ItemTrackerItem item) {
297-
return (item.data & gSaveContext.inventory.questItems) != 0;
298+
return GameInteractor::IsSaveLoaded() ? (item.data & gSaveContext.inventory.questItems) : false;
298299
}
299300

300301
bool HasEquipment(ItemTrackerItem item) {
301-
return (item.data & gSaveContext.inventory.equipment) != 0;
302+
return GameInteractor::IsSaveLoaded() ? (item.data & gSaveContext.inventory.equipment) : false;
302303
}
303304

304305
ItemTrackerNumbers GetItemCurrentAndMax(ItemTrackerItem item) {
@@ -406,8 +407,12 @@ ItemTrackerNumbers GetItemCurrentAndMax(ItemTrackerItem item) {
406407
#define IM_COL_GREEN IM_COL32(0, 255, 0, 255)
407408
#define IM_COL_GRAY IM_COL32(155, 155, 155, 255)
408409
#define IM_COL_PURPLE IM_COL32(180, 90, 200, 255)
410+
#define IM_COL_LIGHT_YELLOW IM_COL32(255, 255, 130, 255)
409411

410-
void DrawItemCount(ItemTrackerItem item) {
412+
void DrawItemCount(ItemTrackerItem item, bool hideMax) {
413+
if (!GameInteractor::IsSaveLoaded()) {
414+
return;
415+
}
411416
int iconSize = CVarGetInteger("gItemTrackerIconSize", 36);
412417
int textSize = CVarGetInteger("gTrackers.ItemTracker.ItemTrackerTextSize", 13);
413418
ItemTrackerNumbers currentAndMax = GetItemCurrentAndMax(item);
@@ -437,7 +442,7 @@ void DrawItemCount(ItemTrackerItem item) {
437442

438443
if (item.id == ITEM_KEY_SMALL && IsValidSaveFile()) {
439444
std::string currentString = "";
440-
std::string maxString = std::to_string(currentAndMax.maxCapacity);
445+
std::string maxString = hideMax ? "???" : std::to_string(currentAndMax.maxCapacity);
441446
ImU32 currentColor = IM_COL_WHITE;
442447
ImU32 maxColor = IM_COL_GREEN;
443448
// "Collected / Max", "Current / Collected / Max", "Current / Max"
@@ -569,7 +574,7 @@ void DrawQuest(ItemTrackerItem item) {
569574
ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1));
570575

571576
if (item.id == QUEST_SKULL_TOKEN) {
572-
DrawItemCount(item);
577+
DrawItemCount(item, false);
573578
}
574579

575580
ImGui::EndGroup();
@@ -579,7 +584,7 @@ void DrawQuest(ItemTrackerItem item) {
579584

580585
void DrawItem(ItemTrackerItem item) {
581586

582-
uint32_t actualItemId = INV_CONTENT(item.id);
587+
uint32_t actualItemId = GameInteractor::IsSaveLoaded() ? INV_CONTENT(item.id) : ITEM_NONE;
583588
int iconSize = CVarGetInteger("gItemTrackerIconSize", 36);
584589
bool hasItem = actualItemId != ITEM_NONE;
585590
std::string itemName = "";
@@ -638,7 +643,7 @@ void DrawItem(ItemTrackerItem item) {
638643
ImGui::Image(LUS::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasItem && IsValidSaveFile() ? item.name : item.nameFaded),
639644
ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1));
640645

641-
DrawItemCount(item);
646+
DrawItemCount(item, false);
642647
ImGui::EndGroup();
643648

644649
if (itemName == "") {
@@ -649,7 +654,7 @@ void DrawItem(ItemTrackerItem item) {
649654
}
650655

651656
void DrawBottle(ItemTrackerItem item) {
652-
uint32_t actualItemId = gSaveContext.inventory.items[SLOT(item.id) + item.data];
657+
uint32_t actualItemId = GameInteractor::IsSaveLoaded() ? (gSaveContext.inventory.items[SLOT(item.id) + item.data]) : false;
653658
bool hasItem = actualItemId != ITEM_NONE;
654659

655660
if (GameInteractor::IsSaveLoaded() && (hasItem && item.id != actualItemId && actualItemTrackerItemMap.find(actualItemId) != actualItemTrackerItemMap.end())) {
@@ -668,8 +673,8 @@ void DrawDungeonItem(ItemTrackerItem item) {
668673
ImU32 dungeonColor = IM_COL_WHITE;
669674
uint32_t bitMask = 1 << (item.id - ITEM_KEY_BOSS); // Bitset starts at ITEM_KEY_BOSS == 0. the rest are sequential
670675
int iconSize = CVarGetInteger("gItemTrackerIconSize", 36);
671-
bool hasItem = (bitMask & gSaveContext.inventory.dungeonItems[item.data]) != 0;
672-
bool hasSmallKey = (gSaveContext.inventory.dungeonKeys[item.data]) >= 0;
676+
bool hasItem = GameInteractor::IsSaveLoaded() ? (bitMask & gSaveContext.inventory.dungeonItems[item.data]) : false;
677+
bool hasSmallKey = GameInteractor::IsSaveLoaded() ? ((gSaveContext.inventory.dungeonKeys[item.data]) >= 0) : false;
673678
ImGui::BeginGroup();
674679
if (itemId == ITEM_KEY_SMALL) {
675680
ImGui::Image(LUS::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasSmallKey && IsValidSaveFile() ? item.name : item.nameFaded),
@@ -680,16 +685,18 @@ void DrawDungeonItem(ItemTrackerItem item) {
680685
ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1));
681686
}
682687

683-
if (ResourceMgr_IsSceneMasterQuest(item.data) && (CHECK_DUNGEON_ITEM(DUNGEON_MAP, item.data) || item.data == SCENE_GERUDO_TRAINING_GROUND || item.data == SCENE_INSIDE_GANONS_CASTLE)) {
684-
dungeonColor = IM_COL_PURPLE;
688+
if (CheckTracker::IsAreaSpoiled(RandomizerCheckObjects::GetRCAreaBySceneID(static_cast<SceneID>(item.data))) && GameInteractor::IsSaveLoaded()) {
689+
dungeonColor = (ResourceMgr_IsSceneMasterQuest(item.data) ? IM_COL_PURPLE : IM_COL_LIGHT_YELLOW);
685690
}
686691

687692
if (itemId == ITEM_KEY_SMALL) {
688-
DrawItemCount(item);
693+
DrawItemCount(item, !CheckTracker::IsAreaSpoiled(RandomizerCheckObjects::GetRCAreaBySceneID(static_cast<SceneID>(item.data))));
689694

690695
ImVec2 p = ImGui::GetCursorScreenPos();
696+
// offset puts the text at the correct level. for some reason, if the save is loaded, the margin is 3 pixels higher only for small keys, so we use 16 then. Otherwise, 13 is where everything else is
697+
int offset = GameInteractor::IsSaveLoaded() ? 16 : 13;
691698
std::string dungeonName = itemTrackerDungeonShortNames[item.data];
692-
ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(dungeonName.c_str()).x / 2), p.y - (iconSize + CVarGetInteger("gTrackers.ItemTracker.ItemTrackerTextSize", 13) + 3)));
699+
ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(dungeonName.c_str()).x / 2), p.y - (iconSize + offset)));
693700
ImGui::PushStyleColor(ImGuiCol_Text, dungeonColor);
694701
ImGui::Text("%s", dungeonName.c_str());
695702
ImGui::PopStyleColor();
@@ -746,13 +753,15 @@ void DrawNotes(bool resizeable = false) {
746753
}
747754
};
748755
ImVec2 size = resizeable ? ImVec2(-FLT_MIN, ImGui::GetContentRegionAvail().y) : ImVec2(((iconSize + iconSpacing) * 6) - 8, 200);
749-
if (ItemTrackerNotes::TrackerNotesInputTextMultiline("##ItemTrackerNotes", &itemTrackerNotes, size, ImGuiInputTextFlags_AllowTabInput)) {
750-
notesNeedSave = true;
751-
notesIdleFrames = 0;
752-
}
753-
if ((ImGui::IsItemDeactivatedAfterEdit() || (notesNeedSave && notesIdleFrames > notesMaxIdleFrames)) && IsValidSaveFile()) {
754-
notesNeedSave = false;
755-
SaveManager::Instance->SaveSection(gSaveContext.fileNum, itemTrackerSectionId, true);
756+
if (GameInteractor::IsSaveLoaded()) {
757+
if (ItemTrackerNotes::TrackerNotesInputTextMultiline("##ItemTrackerNotes", &itemTrackerNotes, size, ImGuiInputTextFlags_AllowTabInput)) {
758+
notesNeedSave = true;
759+
notesIdleFrames = 0;
760+
}
761+
if ((ImGui::IsItemDeactivatedAfterEdit() || (notesNeedSave && notesIdleFrames > notesMaxIdleFrames)) && IsValidSaveFile()) {
762+
notesNeedSave = false;
763+
SaveManager::Instance->SaveSection(gSaveContext.fileNum, itemTrackerSectionId, true);
764+
}
756765
}
757766
ImGui::EndGroup();
758767
}

soh/src/code/z_actor.c

+8-1
Original file line numberDiff line numberDiff line change
@@ -1240,7 +1240,7 @@ void Actor_Init(Actor* actor, PlayState* play) {
12401240
actor->floorBgId = BGCHECK_SCENE;
12411241
ActorShape_Init(&actor->shape, 0.0f, NULL, 0.0f);
12421242
if (Object_IsLoaded(&play->objectCtx, actor->objBankIndex)) {
1243-
//Actor_SetObjectDependency(play, actor);
1243+
Actor_SetObjectDependency(play, actor);
12441244
actor->init(actor, play);
12451245
actor->init = NULL;
12461246

@@ -2589,6 +2589,13 @@ void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx) {
25892589
Actor_SetObjectDependency(play, actor);
25902590
actor->init(actor, play);
25912591
actor->init = NULL;
2592+
2593+
GameInteractor_ExecuteOnActorInit(actor);
2594+
2595+
// For enemy health bar we need to know the max health during init
2596+
if (actor->category == ACTORCAT_ENEMY) {
2597+
actor->maximumHealth = actor->colChkInfo.health;
2598+
}
25922599
}
25932600
actor = actor->next;
25942601
} else if (!Object_IsLoaded(&play->objectCtx, actor->objBankIndex)) {

soh/src/code/z_bgcheck.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,7 @@ s32 CollisionPoly_LineVsPoly(CollisionPoly* poly, Vec3s* vtxList, Vec3f* posA, V
398398
(poly->normal.x * posB->x + poly->normal.y * posB->y + poly->normal.z * posB->z) * COLPOLY_NORMAL_FRAC +
399399
plane.originDist;
400400

401-
#ifdef __WIIU__
401+
#if defined(__SWITCH__) || defined(__WIIU__)
402402
// on some platforms this ends up as very small numbers due to rounding issues
403403
if (IS_ZERO(planeDistA)) {
404404
planeDistA = 0.0f;

soh/src/code/z_fcurve_data_skelanime.c

+4
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,10 @@ void SkelCurve_DrawLimb(PlayState* play, s32 limbIndex, SkelAnimeCurve* skelCurv
131131
Matrix_TranslateRotateZYX(&pos, &rot);
132132
Matrix_Scale(scale.x, scale.y, scale.z, MTXMODE_APPLY);
133133

134+
if (CVarGetInteger("gDisableLOD", 0)) {
135+
lod = 0;
136+
}
137+
134138
if (lod == 0) {
135139
s32 pad1;
136140

0 commit comments

Comments
 (0)