summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Dubé <serprex@users.noreply.github.com>2025-08-13 16:46:36 +0000
committerGitHub <noreply@github.com>2025-08-13 09:46:36 -0700
commitfadae4997740d6073d6ce01db2950c8a24b3cbb0 (patch)
tree2a65f2157d42a37dc916359b8e1455e40685730e
parentee20f7f76222cf63f929f8d5f57764266f89ca7e (diff)
shipinit bonk damage (#5653)
* shipinit bonk damage * no initFunc
-rw-r--r--soh/soh/Enhancements/BonkDamage.cpp51
-rw-r--r--soh/soh/Enhancements/mods.cpp44
2 files changed, 51 insertions, 44 deletions
diff --git a/soh/soh/Enhancements/BonkDamage.cpp b/soh/soh/Enhancements/BonkDamage.cpp
new file mode 100644
index 000000000..e11f46b78
--- /dev/null
+++ b/soh/soh/Enhancements/BonkDamage.cpp
@@ -0,0 +1,51 @@
+#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
+#include "soh/ShipInit.hpp"
+#include "./enhancementTypes.h"
+
+extern "C" {
+#include "functions.h"
+#include "macros.h"
+extern PlayState* gPlayState;
+extern SaveContext gSaveContext;
+}
+
+void RegisterBonkDamage() {
+ COND_HOOK(OnPlayerBonk, CVarGetInteger(CVAR_ENHANCEMENT("BonkDamageMult"), BONK_DAMAGE_NONE) != BONK_DAMAGE_NONE,
+ [] {
+ uint16_t bonkDamage = 0;
+ switch (CVarGetInteger(CVAR_ENHANCEMENT("BonkDamageMult"), BONK_DAMAGE_NONE)) {
+ case BONK_DAMAGE_NONE:
+ return;
+ case BONK_DAMAGE_OHKO:
+ gSaveContext.health = 0;
+ return;
+ case BONK_DAMAGE_QUARTER_HEART:
+ bonkDamage = 4;
+ break;
+ case BONK_DAMAGE_HALF_HEART:
+ bonkDamage = 8;
+ break;
+ case BONK_DAMAGE_1_HEART:
+ bonkDamage = 16;
+ break;
+ case BONK_DAMAGE_2_HEARTS:
+ bonkDamage = 32;
+ break;
+ case BONK_DAMAGE_4_HEARTS:
+ bonkDamage = 64;
+ break;
+ case BONK_DAMAGE_8_HEARTS:
+ bonkDamage = 128;
+ break;
+ default:
+ break;
+ }
+
+ Health_ChangeBy(gPlayState, -bonkDamage);
+ // Set invincibility to make Link flash red as a visual damage indicator.
+ Player* player = GET_PLAYER(gPlayState);
+ player->invincibilityTimer = 28;
+ });
+}
+
+static RegisterShipInitFunc registerBonkDamage(RegisterBonkDamage, { CVAR_ENHANCEMENT("BonkDamageMult") });
diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp
index 5fef9befc..f276e19d3 100644
--- a/soh/soh/Enhancements/mods.cpp
+++ b/soh/soh/Enhancements/mods.cpp
@@ -299,49 +299,6 @@ void UpdateHyperEnemiesState() {
}
}
-void RegisterBonkDamage() {
- GameInteractor::Instance->RegisterGameHook<GameInteractor::OnPlayerBonk>([]() {
- uint8_t bonkOption = CVarGetInteger(CVAR_ENHANCEMENT("BonkDamageMult"), BONK_DAMAGE_NONE);
- if (bonkOption == BONK_DAMAGE_NONE) {
- return;
- }
-
- if (bonkOption == BONK_DAMAGE_OHKO) {
- gSaveContext.health = 0;
- return;
- }
-
- uint16_t bonkDamage = 0;
- switch (bonkOption) {
- case BONK_DAMAGE_QUARTER_HEART:
- bonkDamage = 4;
- break;
- case BONK_DAMAGE_HALF_HEART:
- bonkDamage = 8;
- break;
- case BONK_DAMAGE_1_HEART:
- bonkDamage = 16;
- break;
- case BONK_DAMAGE_2_HEARTS:
- bonkDamage = 32;
- break;
- case BONK_DAMAGE_4_HEARTS:
- bonkDamage = 64;
- break;
- case BONK_DAMAGE_8_HEARTS:
- bonkDamage = 128;
- break;
- default:
- break;
- }
-
- Health_ChangeBy(gPlayState, -bonkDamage);
- // Set invincibility to make Link flash red as a visual damage indicator.
- Player* player = GET_PLAYER(gPlayState);
- player->invincibilityTimer = 28;
- });
-}
-
void UpdateDirtPathFixState(int32_t sceneNum) {
switch (sceneNum) {
case SCENE_HYRULE_FIELD:
@@ -982,7 +939,6 @@ void InitMods() {
RegisterDeleteFileOnDeath();
RegisterHyperBosses();
UpdateHyperEnemiesState();
- RegisterBonkDamage();
RegisterMenuPathFix();
RegisterMirrorModeHandler();
RegisterResetNaviTimer();