summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Longstaff <JordanLongstaff@users.noreply.github.com>2026-01-17 00:35:45 -0500
committerGitHub <noreply@github.com>2026-01-17 05:35:45 +0000
commit7850fa82dfea0c31b8e1da01c956d4121da5b989 (patch)
treed70e663f483515c6b3fc37bbe2b12cd3cac7dbb4
parent0821c2e3150ece5ff9d85260cf451785b6c12999 (diff)
Modularize enemy defeat count hook & fix counting bugs (#5885)
-rw-r--r--soh/soh/Enhancements/GameplayStats/EnemyDefeatCounts.cpp223
-rw-r--r--soh/soh/Enhancements/gameplaystats.cpp182
-rw-r--r--soh/soh/Enhancements/mods.cpp208
3 files changed, 314 insertions, 299 deletions
diff --git a/soh/soh/Enhancements/GameplayStats/EnemyDefeatCounts.cpp b/soh/soh/Enhancements/GameplayStats/EnemyDefeatCounts.cpp
new file mode 100644
index 000000000..0174cc74d
--- /dev/null
+++ b/soh/soh/Enhancements/GameplayStats/EnemyDefeatCounts.cpp
@@ -0,0 +1,223 @@
+#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
+#include "soh/ShipInit.hpp"
+
+extern "C" {
+#include "src/overlays/actors/ovl_En_Bb/z_en_bb.h"
+#include "src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.h"
+#include "src/overlays/actors/ovl_En_Mb/z_en_mb.h"
+#include "src/overlays/actors/ovl_En_Tite/z_en_tite.h"
+#include "src/overlays/actors/ovl_En_Zf/z_en_zf.h"
+#include "src/overlays/actors/ovl_En_Wf/z_en_wf.h"
+#include "src/overlays/actors/ovl_En_Reeba/z_en_reeba.h"
+#include "src/overlays/actors/ovl_En_Peehat/z_en_peehat.h"
+#include "src/overlays/actors/ovl_En_Po_Field/z_en_po_field.h"
+#include "src/overlays/actors/ovl_En_Poh/z_en_poh.h"
+#include "src/overlays/actors/ovl_En_Tp/z_en_tp.h"
+#include "src/overlays/actors/ovl_En_Firefly/z_en_firefly.h"
+
+extern SaveContext gSaveContext;
+}
+
+static void IncrementEnemyDefeatCount(GameplayStatCount countType) {
+ gSaveContext.ship.stats.count[countType]++;
+}
+
+#define ENEMY_DEFEAT_COUNT(actorID, func) \
+ COND_ID_HOOK(OnEnemyDefeat, actorID, true, [](void* refActor) { func(static_cast<Actor*>(refActor)); });
+
+#define ENEMY_DEFEAT_COUNT_UNIQUE(actorID, countType) \
+ COND_ID_HOOK(OnEnemyDefeat, actorID, true, [](void*) { IncrementEnemyDefeatCount(countType); });
+
+static void EnemyDefeatCounts_EnBb(Actor* actor) {
+ GameplayStatCount countType;
+ switch (actor->params) {
+ case ENBB_GREEN:
+ case ENBB_GREEN_BIG:
+ countType = COUNT_ENEMIES_DEFEATED_BUBBLE_GREEN;
+ break;
+ case ENBB_BLUE:
+ countType = COUNT_ENEMIES_DEFEATED_BUBBLE_BLUE;
+ break;
+ case ENBB_WHITE:
+ countType = COUNT_ENEMIES_DEFEATED_BUBBLE_WHITE;
+ break;
+ case ENBB_RED:
+ countType = COUNT_ENEMIES_DEFEATED_BUBBLE_RED;
+ break;
+ default:
+ return;
+ }
+
+ IncrementEnemyDefeatCount(countType);
+}
+
+static void EnemyDefeatCounts_EnDekubaba(Actor* actor) {
+ GameplayStatCount countType =
+ (actor->params == DEKUBABA_BIG) ? COUNT_ENEMIES_DEFEATED_DEKU_BABA_BIG : COUNT_ENEMIES_DEFEATED_DEKU_BABA;
+ IncrementEnemyDefeatCount(countType);
+}
+
+static void EnemyDefeatCounts_EnZf(Actor* actor) {
+ GameplayStatCount countType =
+ (actor->params == ENZF_TYPE_DINOLFOS) ? COUNT_ENEMIES_DEFEATED_DINOLFOS : COUNT_ENEMIES_DEFEATED_LIZALFOS;
+ IncrementEnemyDefeatCount(countType);
+}
+
+static void EnemyDefeatCounts_EnRd(Actor* actor) {
+ GameplayStatCount countType = (actor->params >= -1) ? COUNT_ENEMIES_DEFEATED_REDEAD : COUNT_ENEMIES_DEFEATED_GIBDO;
+ IncrementEnemyDefeatCount(countType);
+}
+
+static void EnemyDefeatCounts_EnIk(Actor* actor) {
+ GameplayStatCount countType =
+ (actor->params == 0) ? COUNT_ENEMIES_DEFEATED_IRON_KNUCKLE_NABOORU : COUNT_ENEMIES_DEFEATED_IRON_KNUCKLE;
+ IncrementEnemyDefeatCount(countType);
+}
+
+static void EnemyDefeatCounts_EnFirefly(Actor* actor) {
+ GameplayStatCount countType;
+ switch (actor->params) {
+ case KEESE_NORMAL_FLY:
+ case KEESE_NORMAL_PERCH:
+ countType = COUNT_ENEMIES_DEFEATED_KEESE;
+ break;
+ case KEESE_FIRE_FLY:
+ case KEESE_FIRE_PERCH:
+ countType = COUNT_ENEMIES_DEFEATED_KEESE_FIRE;
+ break;
+ case KEESE_ICE_FLY:
+ countType = COUNT_ENEMIES_DEFEATED_KEESE_ICE;
+ break;
+ default:
+ return;
+ }
+
+ IncrementEnemyDefeatCount(countType);
+}
+
+static void EnemyDefeatCounts_EnTp(Actor* actor) {
+ // Only count the head, otherwise each body segment will increment
+ if (actor->params == TAILPASARAN_HEAD) {
+ IncrementEnemyDefeatCount(COUNT_ENEMIES_DEFEATED_TAILPASARAN);
+ }
+}
+
+static void EnemyDefeatCounts_EnReeba(Actor* actor) {
+ EnReeba* reeba = (EnReeba*)actor;
+ GameplayStatCount countType = reeba->isBig ? COUNT_ENEMIES_DEFEATED_LEEVER_BIG : COUNT_ENEMIES_DEFEATED_LEEVER;
+ IncrementEnemyDefeatCount(countType);
+}
+
+static void EnemyDefeatCounts_EnMb(Actor* actor) {
+ GameplayStatCount countType =
+ (actor->params == 0) ? COUNT_ENEMIES_DEFEATED_MOBLIN_CLUB : COUNT_ENEMIES_DEFEATED_MOBLIN;
+ IncrementEnemyDefeatCount(countType);
+}
+
+static void EnemyDefeatCounts_EnPeehat(Actor* actor) {
+ GameplayStatCount countType =
+ (actor->params == PEAHAT_TYPE_LARVA) ? COUNT_ENEMIES_DEFEATED_PEAHAT_LARVA : COUNT_ENEMIES_DEFEATED_PEAHAT;
+ IncrementEnemyDefeatCount(countType);
+}
+
+static void EnemyDefeatCounts_EnPoh(Actor* actor) {
+ GameplayStatCount countType = (actor->params == EN_POH_FLAT || actor->params == EN_POH_SHARP)
+ ? COUNT_ENEMIES_DEFEATED_POE_COMPOSER
+ : COUNT_ENEMIES_DEFEATED_POE;
+ IncrementEnemyDefeatCount(countType);
+}
+
+static void EnemyDefeatCounts_EnPoField(Actor* actor) {
+ GameplayStatCount countType =
+ (actor->params == EN_PO_FIELD_BIG) ? COUNT_ENEMIES_DEFEATED_POE_BIG : COUNT_ENEMIES_DEFEATED_POE;
+ IncrementEnemyDefeatCount(countType);
+}
+
+static void EnemyDefeatCounts_EnSt(Actor* actor) {
+ GameplayStatCount countType =
+ (actor->params == 1) ? COUNT_ENEMIES_DEFEATED_SKULLTULA_BIG : COUNT_ENEMIES_DEFEATED_SKULLTULA;
+ IncrementEnemyDefeatCount(countType);
+}
+
+static void EnemyDefeatCounts_EnSw(Actor* actor) {
+ GameplayStatCount countType;
+ if (((actor->params & 0xE000) >> 0xD) != 0) {
+ countType = COUNT_ENEMIES_DEFEATED_SKULLTULA_GOLD;
+ } else {
+ countType = COUNT_ENEMIES_DEFEATED_SKULLWALLTULA;
+ }
+
+ IncrementEnemyDefeatCount(countType);
+}
+
+static void EnemyDefeatCounts_EnTite(Actor* actor) {
+ GameplayStatCount countType =
+ (actor->params == TEKTITE_BLUE) ? COUNT_ENEMIES_DEFEATED_TEKTITE_BLUE : COUNT_ENEMIES_DEFEATED_TEKTITE_RED;
+ IncrementEnemyDefeatCount(countType);
+}
+
+static void EnemyDefeatCounts_EnWf(Actor* actor) {
+ GameplayStatCount countType =
+ (actor->params == WOLFOS_WHITE) ? COUNT_ENEMIES_DEFEATED_WOLFOS_WHITE : COUNT_ENEMIES_DEFEATED_WOLFOS;
+ IncrementEnemyDefeatCount(countType);
+}
+
+static void RegisterEnemyDefeatCounts() {
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_ANUBICE, COUNT_ENEMIES_DEFEATED_ANUBIS);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_AM, COUNT_ENEMIES_DEFEATED_ARMOS);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_CLEAR_TAG, COUNT_ENEMIES_DEFEATED_ARWING);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_VALI, COUNT_ENEMIES_DEFEATED_BARI);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_VM, COUNT_ENEMIES_DEFEATED_BEAMOS);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_BIGOKUTA, COUNT_ENEMIES_DEFEATED_BIG_OCTO);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_BILI, COUNT_ENEMIES_DEFEATED_BIRI);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_DNS, COUNT_ENEMIES_DEFEATED_BUSINESS_SCRUB);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_TORCH2, COUNT_ENEMIES_DEFEATED_DARK_LINK);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_DH, COUNT_ENEMIES_DEFEATED_DEAD_HAND);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_HINTNUTS, COUNT_ENEMIES_DEFEATED_DEKU_SCRUB);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_DODONGO, COUNT_ENEMIES_DEFEATED_DODONGO);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_DODOJR, COUNT_ENEMIES_DEFEATED_DODONGO_BABY);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_DOOR_KILLER, COUNT_ENEMIES_DEFEATED_DOOR_TRAP);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_FD, COUNT_ENEMIES_DEFEATED_FLARE_DANCER);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_FLOORMAS, COUNT_ENEMIES_DEFEATED_FLOORMASTER);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_TUBO_TRAP, COUNT_ENEMIES_DEFEATED_FLYING_POT);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_YUKABYUN, COUNT_ENEMIES_DEFEATED_FLOOR_TILE);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_FZ, COUNT_ENEMIES_DEFEATED_FREEZARD);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_GELDB, COUNT_ENEMIES_DEFEATED_GERUDO_THIEF);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_GOMA, COUNT_ENEMIES_DEFEATED_GOHMA_LARVA);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_CROW, COUNT_ENEMIES_DEFEATED_GUAY);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_RR, COUNT_ENEMIES_DEFEATED_LIKE_LIKE);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_DEKUNUTS, COUNT_ENEMIES_DEFEATED_MAD_SCRUB);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_OKUTA, COUNT_ENEMIES_DEFEATED_OCTOROK);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_BA, COUNT_ENEMIES_DEFEATED_PARASITIC_TENTACLE);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_PO_SISTERS, COUNT_ENEMIES_DEFEATED_POE_SISTERS);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_BUBBLE, COUNT_ENEMIES_DEFEATED_SHABOM);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_SB, COUNT_ENEMIES_DEFEATED_SHELLBLADE);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_SKJ, COUNT_ENEMIES_DEFEATED_SKULL_KID);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_NY, COUNT_ENEMIES_DEFEATED_SPIKE);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_SKB, COUNT_ENEMIES_DEFEATED_STALCHILD);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_TEST, COUNT_ENEMIES_DEFEATED_STALFOS);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_EIYER, COUNT_ENEMIES_DEFEATED_STINGER);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_WEIYER, COUNT_ENEMIES_DEFEATED_STINGER);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_BW, COUNT_ENEMIES_DEFEATED_TORCH_SLUG);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_WALLMAS, COUNT_ENEMIES_DEFEATED_WALLMASTER);
+ ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_KAREBABA, COUNT_ENEMIES_DEFEATED_WITHERED_DEKU_BABA);
+
+ ENEMY_DEFEAT_COUNT(ACTOR_EN_BB, EnemyDefeatCounts_EnBb);
+ ENEMY_DEFEAT_COUNT(ACTOR_EN_DEKUBABA, EnemyDefeatCounts_EnDekubaba);
+ ENEMY_DEFEAT_COUNT(ACTOR_EN_ZF, EnemyDefeatCounts_EnZf);
+ ENEMY_DEFEAT_COUNT(ACTOR_EN_RD, EnemyDefeatCounts_EnRd);
+ ENEMY_DEFEAT_COUNT(ACTOR_EN_IK, EnemyDefeatCounts_EnIk);
+ ENEMY_DEFEAT_COUNT(ACTOR_EN_FIREFLY, EnemyDefeatCounts_EnFirefly);
+ ENEMY_DEFEAT_COUNT(ACTOR_EN_TP, EnemyDefeatCounts_EnTp);
+ ENEMY_DEFEAT_COUNT(ACTOR_EN_REEBA, EnemyDefeatCounts_EnReeba);
+ ENEMY_DEFEAT_COUNT(ACTOR_EN_MB, EnemyDefeatCounts_EnMb);
+ ENEMY_DEFEAT_COUNT(ACTOR_EN_PEEHAT, EnemyDefeatCounts_EnPeehat);
+ ENEMY_DEFEAT_COUNT(ACTOR_EN_POH, EnemyDefeatCounts_EnPoh);
+ ENEMY_DEFEAT_COUNT(ACTOR_EN_PO_FIELD, EnemyDefeatCounts_EnPoField);
+ ENEMY_DEFEAT_COUNT(ACTOR_EN_ST, EnemyDefeatCounts_EnSt);
+ ENEMY_DEFEAT_COUNT(ACTOR_EN_SW, EnemyDefeatCounts_EnSw);
+ ENEMY_DEFEAT_COUNT(ACTOR_EN_TITE, EnemyDefeatCounts_EnTite);
+ ENEMY_DEFEAT_COUNT(ACTOR_EN_WF, EnemyDefeatCounts_EnWf);
+}
+
+static RegisterShipInitFunc initFunc(RegisterEnemyDefeatCounts);
diff --git a/soh/soh/Enhancements/gameplaystats.cpp b/soh/soh/Enhancements/gameplaystats.cpp
index ca360543f..c7df74f35 100644
--- a/soh/soh/Enhancements/gameplaystats.cpp
+++ b/soh/soh/Enhancements/gameplaystats.cpp
@@ -137,97 +137,97 @@ const char* const sceneMappings[] = {
};
const char* const countMappings[] = {
- "Anubis:",
- "Armos:",
- "Arwing:",
- "Bari:",
- "Biri:",
- "Beamos:",
- "Big Octo:",
- "Bubble (Blue):",
- "Bubble (Green):",
- "Bubble (Red):",
- "Bubble (White):",
- "Business Scrub:",
- "Dark Link:",
- "Dead Hand:",
- "Deku Baba:",
- "Deku Baba (Big):",
- "Deku Scrub:",
- "Dinolfos:",
- "Dodongo:",
- "Dodongo (Baby):",
- "Door Mimic:",
- "Flare Dancer:",
- "Floormaster:",
- "Flying Floor Tile:",
- "Flying Pot:",
- "Freezard:",
- "Gerudo Thief:",
- "Gibdo:",
- "Gohma Larva:",
- "Guay:",
- "Iron Knuckle:",
- "Iron Knuckle (Nab):",
- "Keese:",
- "Keese (Fire):",
- "Keese (Ice):",
- "Leever:",
- "Leever (Big):",
- "Like-Like:",
- "Lizalfos:",
- "Mad Scrub:",
- "Moblin:",
- "Moblin (Club):",
- "Octorok:",
- "Parasitic Tentacle:",
- "Peahat:",
- "Peahat Larva:",
- "Poe:",
- "Poe (Big):",
- "Poe (Composer):",
- "Poe Sisters:",
- "Redead:",
- "Shabom:",
- "Shell Blade:",
- "Skull Kid:",
- "Skulltula:",
- "Skulltula (Big):",
- "Skulltula (Gold):",
- "Skullwalltula:",
- "Spike:",
- "Stalchild:",
- "Stalfos:",
- "Stinger:",
- "Tailpasaran:",
- "Tektite (Blue):",
- "Tektite (Red):",
- "Torch Slug:",
- "Wallmaster:",
- "Withered Deku Baba:",
- "Wolfos:",
- "Wolfos (White):",
- "Deku Sticks:",
- "Deku Nuts:",
- "Bombs:",
- "Arrows:",
- "Deku Seeds:",
- "Bombchus:",
- "Beans:",
- "A:",
- "B:",
- "L:",
- "R:",
- "Z:",
- "C-Up:",
- "C-Right:",
- "C-Down:",
- "C-Left:",
- "D-Up:",
- "D-Right:",
- "D-Down:",
- "D-Left:",
- "Start:",
+ "Anubis:", // COUNT_ENEMIES_DEFEATED_ANUBIS
+ "Armos:", // COUNT_ENEMIES_DEFEATED_ARMOS
+ "Arwing:", // COUNT_ENEMIES_DEFEATED_ARWING
+ "Bari:", // COUNT_ENEMIES_DEFEATED_BARI
+ "Beamos:", // COUNT_ENEMIES_DEFEATED_BEAMOS
+ "Big Octo:", // COUNT_ENEMIES_DEFEATED_BIG_OCTO
+ "Biri:", // COUNT_ENEMIES_DEFEATED_BIRI
+ "Bubble (Green):", // COUNT_ENEMIES_DEFEATED_BUBBLE_GREEN
+ "Bubble (Blue):", // COUNT_ENEMIES_DEFEATED_BUBBLE_BLUE
+ "Bubble (White):", // COUNT_ENEMIES_DEFEATED_BUBBLE_WHITE
+ "Bubble (Red):", // COUNT_ENEMIES_DEFEATED_BUBBLE_RED
+ "Business Scrub:", // COUNT_ENEMIES_DEFEATED_BUSINESS_SCRUB
+ "Dark Link:", // COUNT_ENEMIES_DEFEATED_DARK_LINK
+ "Dead Hand:", // COUNT_ENEMIES_DEFEATED_DEAD_HAND
+ "Deku Baba:", // COUNT_ENEMIES_DEFEATED_DEKU_BABA
+ "Deku Baba (Big):", // COUNT_ENEMIES_DEFEATED_DEKU_BABA_BIG
+ "Deku Scrub:", // COUNT_ENEMIES_DEFEATED_DEKU_SCRUB
+ "Dinolfos:", // COUNT_ENEMIES_DEFEATED_DINOLFOS
+ "Dodongo:", // COUNT_ENEMIES_DEFEATED_DODONGO
+ "Dodongo (Baby):", // COUNT_ENEMIES_DEFEATED_DODONGO_BABY
+ "Door Mimic:", // COUNT_ENEMIES_DEFEATED_DOOR_TRAP
+ "Flare Dancer:", // COUNT_ENEMIES_DEFEATED_FLARE_DANCER
+ "Floormaster:", // COUNT_ENEMIES_DEFEATED_FLOORMASTER
+ "Flying Pot:", // COUNT_ENEMIES_DEFEATED_FLYING_POT
+ "Flying Floor Tile:", // COUNT_ENEMIES_DEFEATED_FLOOR_TILE
+ "Freezard:", // COUNT_ENEMIES_DEFEATED_FREEZARD
+ "Gerudo Thief:", // COUNT_ENEMIES_DEFEATED_GERUDO_THIEF
+ "Gibdo:", // COUNT_ENEMIES_DEFEATED_GIBDO
+ "Gohma Larva:", // COUNT_ENEMIES_DEFEATED_GOHMA_LARVA
+ "Guay:", // COUNT_ENEMIES_DEFEATED_GUAY
+ "Iron Knuckle:", // COUNT_ENEMIES_DEFEATED_IRON_KNUCKLE
+ "Iron Knuckle (Nab):", // COUNT_ENEMIES_DEFEATED_IRON_KNUCKLE_NABOORU
+ "Keese:", // COUNT_ENEMIES_DEFEATED_KEESE
+ "Keese (Fire):", // COUNT_ENEMIES_DEFEATED_KEESE_FIRE
+ "Keese (Ice):", // COUNT_ENEMIES_DEFEATED_KEESE_ICE
+ "Leever:", // COUNT_ENEMIES_DEFEATED_LEEVER
+ "Leever (Big):", // COUNT_ENEMIES_DEFEATED_LEEVER_BIG
+ "Like-Like:", // COUNT_ENEMIES_DEFEATED_LIKE_LIKE
+ "Lizalfos:", // COUNT_ENEMIES_DEFEATED_LIZALFOS
+ "Mad Scrub:", // COUNT_ENEMIES_DEFEATED_MAD_SCRUB
+ "Moblin:", // COUNT_ENEMIES_DEFEATED_MOBLIN
+ "Moblin (Club):", // COUNT_ENEMIES_DEFEATED_MOBLIN_CLUB
+ "Octorok:", // COUNT_ENEMIES_DEFEATED_OCTOROK
+ "Parasitic Tentacle:", // COUNT_ENEMIES_DEFEATED_PARASITIC_TENTACLE
+ "Peahat:", // COUNT_ENEMIES_DEFEATED_PEAHAT
+ "Peahat Larva:", // COUNT_ENEMIES_DEFEATED_PEAHAT_LARVA
+ "Poe:", // COUNT_ENEMIES_DEFEATED_POE
+ "Poe (Big):", // COUNT_ENEMIES_DEFEATED_POE_BIG
+ "Poe (Composer):", // COUNT_ENEMIES_DEFEATED_POE_COMPOSER
+ "Poe Sisters:", // COUNT_ENEMIES_DEFEATED_POE_SISTERS
+ "Redead:", // COUNT_ENEMIES_DEFEATED_REDEAD
+ "Shabom:", // COUNT_ENEMIES_DEFEATED_SHABOM
+ "Shell Blade:", // COUNT_ENEMIES_DEFEATED_SHELLBLADE
+ "Skulltula:", // COUNT_ENEMIES_DEFEATED_SKULLTULA
+ "Skulltula (Big):", // COUNT_ENEMIES_DEFEATED_SKULLTULA_BIG
+ "Skulltula (Gold):", // COUNT_ENEMIES_DEFEATED_SKULLTULA_GOLD
+ "Skullwalltula:", // COUNT_ENEMIES_DEFEATED_SKULLWALLTULA
+ "Skull Kid:", // COUNT_ENEMIES_DEFEATED_SKULL_KID
+ "Spike:", // COUNT_ENEMIES_DEFEATED_SPIKE
+ "Stalchild:", // COUNT_ENEMIES_DEFEATED_STALCHILD
+ "Stalfos:", // COUNT_ENEMIES_DEFEATED_STALFOS
+ "Stinger:", // COUNT_ENEMIES_DEFEATED_STINGER
+ "Tailpasaran:", // COUNT_ENEMIES_DEFEATED_TAILPASARAN
+ "Tektite (Blue):", // COUNT_ENEMIES_DEFEATED_TEKTITE_BLUE
+ "Tektite (Red):", // COUNT_ENEMIES_DEFEATED_TEKTITE_RED
+ "Torch Slug:", // COUNT_ENEMIES_DEFEATED_TORCH_SLUG
+ "Wallmaster:", // COUNT_ENEMIES_DEFEATED_WALLMASTER
+ "Withered Deku Baba:", // COUNT_ENEMIES_DEFEATED_WITHERED_DEKU_BABA
+ "Wolfos:", // COUNT_ENEMIES_DEFEATED_WOLFOS
+ "Wolfos (White):", // COUNT_ENEMIES_DEFEATED_WOLFOS_WHITE
+ "Deku Sticks:", // COUNT_AMMO_USED_STICK
+ "Deku Nuts:", // COUNT_AMMO_USED_NUT
+ "Bombs:", // COUNT_AMMO_USED_BOMB
+ "Arrows:", // COUNT_AMMO_USED_ARROW
+ "Deku Seeds:", // COUNT_AMMO_USED_SEED
+ "Bombchus:", // COUNT_AMMO_USED_BOMBCHU
+ "Beans:", // COUNT_AMMO_USED_BEAN
+ "A:", // COUNT_BUTTON_PRESSES_A
+ "B:", // COUNT_BUTTON_PRESSES_B
+ "L:", // COUNT_BUTTON_PRESSES_L
+ "R:", // COUNT_BUTTON_PRESSES_R
+ "Z:", // COUNT_BUTTON_PRESSES_Z
+ "C-Up:", // COUNT_BUTTON_PRESSES_CUP
+ "C-Right:", // COUNT_BUTTON_PRESSES_CRIGHT
+ "C-Down:", // COUNT_BUTTON_PRESSES_CDOWN
+ "C-Left:", // COUNT_BUTTON_PRESSES_CLEFT
+ "D-Up:", // COUNT_BUTTON_PRESSES_DUP
+ "D-Right:", // COUNT_BUTTON_PRESSES_DRIGHT
+ "D-Down:", // COUNT_BUTTON_PRESSES_DDOWN
+ "D-Left:", // COUNT_BUTTON_PRESSES_DLEFT
+ "Start:", // COUNT_BUTTON_PRESSES_START
};
#define COLOR_WHITE ImVec4(1.00f, 1.00f, 1.00f, 1.00f)
diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp
index a5a3e4980..56918a6ad 100644
--- a/soh/soh/Enhancements/mods.cpp
+++ b/soh/soh/Enhancements/mods.cpp
@@ -14,24 +14,7 @@
#include "soh/Enhancements/timesaver_hook_handlers.h"
#include "soh/Enhancements/randomizer/hook_handlers.h"
-#include "src/overlays/actors/ovl_En_Bb/z_en_bb.h"
-#include "src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.h"
-#include "src/overlays/actors/ovl_En_Mb/z_en_mb.h"
-#include "src/overlays/actors/ovl_En_Tite/z_en_tite.h"
-#include "src/overlays/actors/ovl_En_Zf/z_en_zf.h"
-#include "src/overlays/actors/ovl_En_Wf/z_en_wf.h"
-#include "src/overlays/actors/ovl_En_Reeba/z_en_reeba.h"
-#include "src/overlays/actors/ovl_En_Peehat/z_en_peehat.h"
-#include "src/overlays/actors/ovl_En_Po_Field/z_en_po_field.h"
-#include "src/overlays/actors/ovl_En_Poh/z_en_poh.h"
-#include "src/overlays/actors/ovl_En_Tp/z_en_tp.h"
-#include "src/overlays/actors/ovl_En_Firefly/z_en_firefly.h"
-#include "src/overlays/actors/ovl_En_Xc/z_en_xc.h"
-#include "src/overlays/actors/ovl_Fishing/z_fishing.h"
#include "src/overlays/actors/ovl_Obj_Switch/z_obj_switch.h"
-#include "src/overlays/actors/ovl_Door_Shutter/z_door_shutter.h"
-#include "src/overlays/actors/ovl_Door_Gerudo/z_door_gerudo.h"
-#include "src/overlays/actors/ovl_En_Elf/z_en_elf.h"
#include "objects/object_link_boy/object_link_boy.h"
#include "objects/object_link_child/object_link_child.h"
#include "soh_assets.h"
@@ -426,196 +409,6 @@ void RegisterResetNaviTimer() {
});
}
-// this map is used for enemies that can be uniquely identified by their id
-// and that are always counted
-// enemies that can't be uniquely identified by their id
-// or only sometimes count (like ACTOR_EN_TP)
-// have to be manually handled in RegisterEnemyDefeatCounts
-static std::unordered_map<u16, u16> uniqueEnemyIdToStatCount = {
- { ACTOR_EN_ANUBICE, COUNT_ENEMIES_DEFEATED_ANUBIS },
- { ACTOR_EN_AM, COUNT_ENEMIES_DEFEATED_ARMOS },
- { ACTOR_EN_CLEAR_TAG, COUNT_ENEMIES_DEFEATED_ARWING },
- { ACTOR_EN_VALI, COUNT_ENEMIES_DEFEATED_BARI },
- { ACTOR_EN_VM, COUNT_ENEMIES_DEFEATED_BEAMOS },
- { ACTOR_EN_BIGOKUTA, COUNT_ENEMIES_DEFEATED_BIG_OCTO },
- { ACTOR_EN_BILI, COUNT_ENEMIES_DEFEATED_BIRI },
- { ACTOR_EN_DNS, COUNT_ENEMIES_DEFEATED_BUSINESS_SCRUB },
- { ACTOR_EN_TORCH, COUNT_ENEMIES_DEFEATED_DARK_LINK },
- { ACTOR_EN_DH, COUNT_ENEMIES_DEFEATED_DEAD_HAND },
- { ACTOR_EN_HINTNUTS, COUNT_ENEMIES_DEFEATED_DEKU_SCRUB },
- { ACTOR_EN_DODONGO, COUNT_ENEMIES_DEFEATED_DODONGO },
- { ACTOR_EN_DODOJR, COUNT_ENEMIES_DEFEATED_DODONGO_BABY },
- { ACTOR_DOOR_KILLER, COUNT_ENEMIES_DEFEATED_DOOR_TRAP },
- { ACTOR_EN_FD, COUNT_ENEMIES_DEFEATED_FLARE_DANCER },
- { ACTOR_EN_FLOORMAS, COUNT_ENEMIES_DEFEATED_FLOORMASTER },
- { ACTOR_EN_TUBO_TRAP, COUNT_ENEMIES_DEFEATED_FLYING_POT },
- { ACTOR_EN_YUKABYUN, COUNT_ENEMIES_DEFEATED_FLOOR_TILE },
- { ACTOR_EN_FZ, COUNT_ENEMIES_DEFEATED_FREEZARD },
- { ACTOR_EN_GELDB, COUNT_ENEMIES_DEFEATED_GERUDO_THIEF },
- { ACTOR_EN_GOMA, COUNT_ENEMIES_DEFEATED_GOHMA_LARVA },
- { ACTOR_EN_CROW, COUNT_ENEMIES_DEFEATED_GUAY },
- { ACTOR_EN_RR, COUNT_ENEMIES_DEFEATED_LIKE_LIKE },
- { ACTOR_EN_DEKUNUTS, COUNT_ENEMIES_DEFEATED_MAD_SCRUB },
- { ACTOR_EN_OKUTA, COUNT_ENEMIES_DEFEATED_OCTOROK },
- { ACTOR_EN_BA, COUNT_ENEMIES_DEFEATED_PARASITIC_TENTACLE },
- { ACTOR_EN_PO_SISTERS, COUNT_ENEMIES_DEFEATED_POE_SISTERS },
- { ACTOR_EN_BUBBLE, COUNT_ENEMIES_DEFEATED_SHABOM },
- { ACTOR_EN_SB, COUNT_ENEMIES_DEFEATED_SHELLBLADE },
- { ACTOR_EN_SKJ, COUNT_ENEMIES_DEFEATED_SKULL_KID },
- { ACTOR_EN_NY, COUNT_ENEMIES_DEFEATED_SPIKE },
- { ACTOR_EN_SKB, COUNT_ENEMIES_DEFEATED_STALCHILD },
- { ACTOR_EN_TEST, COUNT_ENEMIES_DEFEATED_STALFOS },
- { ACTOR_EN_WEIYER, COUNT_ENEMIES_DEFEATED_STINGER },
- { ACTOR_EN_BW, COUNT_ENEMIES_DEFEATED_TORCH_SLUG },
- { ACTOR_EN_WALLMAS, COUNT_ENEMIES_DEFEATED_WALLMASTER },
- { ACTOR_EN_KAREBABA, COUNT_ENEMIES_DEFEATED_WITHERED_DEKU_BABA },
-};
-
-void RegisterEnemyDefeatCounts() {
- GameInteractor::Instance->RegisterGameHook<GameInteractor::OnEnemyDefeat>([](void* refActor) {
- Actor* actor = static_cast<Actor*>(refActor);
- if (uniqueEnemyIdToStatCount.contains(actor->id)) {
- gSaveContext.ship.stats.count[uniqueEnemyIdToStatCount[actor->id]]++;
- } else {
- switch (actor->id) {
- case ACTOR_EN_BB:
- if (actor->params == ENBB_GREEN || actor->params == ENBB_GREEN_BIG) {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_BUBBLE_GREEN]++;
- } else if (actor->params == ENBB_BLUE) {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_BUBBLE_BLUE]++;
- } else if (actor->params == ENBB_WHITE) {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_BUBBLE_WHITE]++;
- } else if (actor->params == ENBB_RED) {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_BUBBLE_RED]++;
- }
- break;
-
- case ACTOR_EN_DEKUBABA:
- if (actor->params == DEKUBABA_BIG) {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_DEKU_BABA_BIG]++;
- } else {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_DEKU_BABA]++;
- }
- break;
-
- case ACTOR_EN_ZF:
- if (actor->params == ENZF_TYPE_DINOLFOS) {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_DINOLFOS]++;
- } else {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_LIZALFOS]++;
- }
- break;
-
- case ACTOR_EN_RD:
- if (actor->params >= -1) {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_REDEAD]++;
- } else {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_GIBDO]++;
- }
- break;
-
- case ACTOR_EN_IK:
- if (actor->params == 0) {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_IRON_KNUCKLE_NABOORU]++;
- } else {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_IRON_KNUCKLE]++;
- }
- break;
-
- case ACTOR_EN_FIREFLY:
- if (actor->params == KEESE_NORMAL_FLY || actor->params == KEESE_NORMAL_PERCH) {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_KEESE]++;
- } else if (actor->params == KEESE_FIRE_FLY || actor->params == KEESE_FIRE_PERCH) {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_KEESE_FIRE]++;
- } else if (actor->params == KEESE_ICE_FLY) {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_KEESE_ICE]++;
- }
- break;
-
- case ACTOR_EN_REEBA: {
- EnReeba* reeba = (EnReeba*)actor;
- if (reeba->isBig) {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_LEEVER_BIG]++;
- } else {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_LEEVER]++;
- }
- } break;
-
- case ACTOR_EN_MB:
- if (actor->params == 0) {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_MOBLIN_CLUB]++;
- } else {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_MOBLIN]++;
- }
- break;
-
- case ACTOR_EN_PEEHAT:
- if (actor->params == PEAHAT_TYPE_LARVA) {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_PEAHAT_LARVA]++;
- } else {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_PEAHAT]++;
- }
- break;
-
- case ACTOR_EN_POH:
- if (actor->params == EN_POH_FLAT || actor->params == EN_POH_SHARP) {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_POE_COMPOSER]++;
- } else {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_POE]++;
- }
- break;
-
- case ACTOR_EN_PO_FIELD:
- if (actor->params == EN_PO_FIELD_BIG) {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_POE_BIG]++;
- } else {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_POE]++;
- }
- break;
-
- case ACTOR_EN_ST:
- if (actor->params == 1) {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_SKULLTULA_BIG]++;
- } else {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_SKULLTULA]++;
- }
- break;
-
- case ACTOR_EN_SW:
- if (((actor->params & 0xE000) >> 0xD) != 0) {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_SKULLTULA_GOLD]++;
- } else {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_SKULLWALLTULA]++;
- }
- break;
-
- case ACTOR_EN_TP:
- // Only count the head, otherwise each body segment will increment
- if (actor->params == TAILPASARAN_HEAD) {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_TAILPASARAN]++;
- }
- break;
-
- case ACTOR_EN_TITE:
- if (actor->params == TEKTITE_BLUE) {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_TEKTITE_BLUE]++;
- } else {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_TEKTITE_RED]++;
- }
- break;
-
- case ACTOR_EN_WF:
- if (actor->params == WOLFOS_WHITE) {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_WOLFOS_WHITE]++;
- } else {
- gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_WOLFOS]++;
- }
- break;
- }
- }
- });
-}
-
void RegisterBossDefeatTimestamps() {
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnBossDefeat>([](void* refActor) {
Actor* actor = static_cast<Actor*>(refActor);
@@ -728,7 +521,6 @@ void InitMods() {
RegisterMenuPathFix();
RegisterMirrorModeHandler();
RegisterResetNaviTimer();
- RegisterEnemyDefeatCounts();
RegisterBossDefeatTimestamps();
RegisterFloorSwitchesHook();
RegisterPatchHandHandler();