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(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 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([](void* refActor) { - Actor* actor = static_cast(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([](void* refActor) { Actor* actor = static_cast(refActor); @@ -728,7 +521,6 @@ void InitMods() { RegisterMenuPathFix(); RegisterMirrorModeHandler(); RegisterResetNaviTimer(); - RegisterEnemyDefeatCounts(); RegisterBossDefeatTimestamps(); RegisterFloorSwitchesHook(); RegisterPatchHandHandler();