Hurt Container Mode (#3336)

* Each Heart Container or full Heart Piece reduces Links hearts by 1

* Based on Briaguya's suggested Code but modified slightly as some parts were missing.

* Static Bool

* The episode without Captain Hook's Hook

---------

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>
Co-authored-by: Garrett Cox <garrettjcox@gmail.com>
This commit is contained in:
Caladius 2024-02-01 20:57:12 -05:00 committed by GitHub
parent be948339b9
commit 695ab6c6ee
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 47 additions and 4 deletions

View File

@ -1090,6 +1090,29 @@ void RegisterRandomizerSheikSpawn() {
}); });
} }
void UpdateHurtContainerModeState(bool newState) {
static bool hurtEnabled = false;
if (hurtEnabled == newState) {
return;
}
hurtEnabled = newState;
uint16_t getHeartPieces = gSaveContext.sohStats.heartPieces / 4;
uint16_t getHeartContainers = gSaveContext.sohStats.heartContainers;
if (hurtEnabled) {
gSaveContext.healthCapacity = 320 - ((getHeartPieces + getHeartContainers) * 16);
} else {
gSaveContext.healthCapacity = 48 + ((getHeartPieces + getHeartContainers) * 16);
}
}
void RegisterHurtContainerModeHandler() {
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnLoadGame>([](int32_t fileNum) {
UpdateHurtContainerModeState(CVarGetInteger("gHurtContainer", 0));
});
}
void RegisterRandomizedEnemySizes() { void RegisterRandomizedEnemySizes() {
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnActorInit>([](void* refActor) { GameInteractor::Instance->RegisterGameHook<GameInteractor::OnActorInit>([](void* refActor) {
// Randomized Enemy Sizes // Randomized Enemy Sizes
@ -1256,4 +1279,5 @@ void InitMods() {
RegisterRandomizedEnemySizes(); RegisterRandomizedEnemySizes();
RegisterToTMedallions(); RegisterToTMedallions();
NameTag_RegisterHooks(); NameTag_RegisterHooks();
RegisterHurtContainerModeHandler();
} }

View File

@ -9,6 +9,7 @@ extern "C" {
void UpdateDirtPathFixState(int32_t sceneNum); void UpdateDirtPathFixState(int32_t sceneNum);
void UpdateMirrorModeState(int32_t sceneNum); void UpdateMirrorModeState(int32_t sceneNum);
void UpdateHurtContainerModeState(bool newState);
void PatchToTMedallions(); void PatchToTMedallions();
void UpdatePermanentHeartLossState(); void UpdatePermanentHeartLossState();
void InitMods(); void InitMods();

View File

@ -1294,6 +1294,14 @@ void DrawEnhancementsMenu() {
} }
} }
UIWidgets::Spacer(0);
if (UIWidgets::PaddedEnhancementCheckbox("Hurt Container Mode", "gHurtContainer", true, false)) {
UpdateHurtContainerModeState(CVarGetInteger("gHurtContainer", 0));
}
UIWidgets::Tooltip("Changes Heart Piece and Heart Container functionality.\n\n"
"- Each Heart Container or full Heart Piece reduces Links hearts by 1.\n"
"- Can be enabled retroactively after a File has already started.");
ImGui::EndMenu(); ImGui::EndMenu();
} }

View File

@ -3361,8 +3361,13 @@ void Message_Update(PlayState* play) {
} }
if ((s32)(gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000) { if ((s32)(gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000) {
gSaveContext.inventory.questItems ^= 0x40000000; gSaveContext.inventory.questItems ^= 0x40000000;
gSaveContext.healthCapacity += 0x10; if (!CVarGetInteger("gHurtContainer", 0)) {
gSaveContext.health += 0x10; gSaveContext.healthCapacity += 0x10;
gSaveContext.health += 0x10;
} else {
gSaveContext.healthCapacity -= 0x10;
gSaveContext.health -= 0x10;
}
} }
if (msgCtx->ocarinaAction != OCARINA_ACTION_CHECK_NOWARP_DONE) { if (msgCtx->ocarinaAction != OCARINA_ACTION_CHECK_NOWARP_DONE) {
if (sLastPlayedSong == OCARINA_SONG_SARIAS) { if (sLastPlayedSong == OCARINA_SONG_SARIAS) {

View File

@ -2278,8 +2278,13 @@ u8 Item_Give(PlayState* play, u8 item) {
gSaveContext.sohStats.heartPieces++; gSaveContext.sohStats.heartPieces++;
return Return_Item(item, MOD_NONE, ITEM_NONE); return Return_Item(item, MOD_NONE, ITEM_NONE);
} else if (item == ITEM_HEART_CONTAINER) { } else if (item == ITEM_HEART_CONTAINER) {
gSaveContext.healthCapacity += 0x10; if (!CVarGetInteger("gHurtContainer", 0)) {
gSaveContext.health += 0x10; gSaveContext.healthCapacity += 0x10;
gSaveContext.health += 0x10;
} else {
gSaveContext.healthCapacity -= 0x10;
gSaveContext.health -= 0x10;
}
gSaveContext.sohStats.heartContainers++; gSaveContext.sohStats.heartContainers++;
return Return_Item(item, MOD_NONE, ITEM_NONE); return Return_Item(item, MOD_NONE, ITEM_NONE);
} else if (item == ITEM_HEART) { } else if (item == ITEM_HEART) {