Skip to content

Commit 7850fa8

Browse files
Modularize enemy defeat count hook & fix counting bugs (#5885)
1 parent 0821c2e commit 7850fa8

File tree

3 files changed

+314
-299
lines changed

3 files changed

+314
-299
lines changed
Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
2+
#include "soh/ShipInit.hpp"
3+
4+
extern "C" {
5+
#include "src/overlays/actors/ovl_En_Bb/z_en_bb.h"
6+
#include "src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.h"
7+
#include "src/overlays/actors/ovl_En_Mb/z_en_mb.h"
8+
#include "src/overlays/actors/ovl_En_Tite/z_en_tite.h"
9+
#include "src/overlays/actors/ovl_En_Zf/z_en_zf.h"
10+
#include "src/overlays/actors/ovl_En_Wf/z_en_wf.h"
11+
#include "src/overlays/actors/ovl_En_Reeba/z_en_reeba.h"
12+
#include "src/overlays/actors/ovl_En_Peehat/z_en_peehat.h"
13+
#include "src/overlays/actors/ovl_En_Po_Field/z_en_po_field.h"
14+
#include "src/overlays/actors/ovl_En_Poh/z_en_poh.h"
15+
#include "src/overlays/actors/ovl_En_Tp/z_en_tp.h"
16+
#include "src/overlays/actors/ovl_En_Firefly/z_en_firefly.h"
17+
18+
extern SaveContext gSaveContext;
19+
}
20+
21+
static void IncrementEnemyDefeatCount(GameplayStatCount countType) {
22+
gSaveContext.ship.stats.count[countType]++;
23+
}
24+
25+
#define ENEMY_DEFEAT_COUNT(actorID, func) \
26+
COND_ID_HOOK(OnEnemyDefeat, actorID, true, [](void* refActor) { func(static_cast<Actor*>(refActor)); });
27+
28+
#define ENEMY_DEFEAT_COUNT_UNIQUE(actorID, countType) \
29+
COND_ID_HOOK(OnEnemyDefeat, actorID, true, [](void*) { IncrementEnemyDefeatCount(countType); });
30+
31+
static void EnemyDefeatCounts_EnBb(Actor* actor) {
32+
GameplayStatCount countType;
33+
switch (actor->params) {
34+
case ENBB_GREEN:
35+
case ENBB_GREEN_BIG:
36+
countType = COUNT_ENEMIES_DEFEATED_BUBBLE_GREEN;
37+
break;
38+
case ENBB_BLUE:
39+
countType = COUNT_ENEMIES_DEFEATED_BUBBLE_BLUE;
40+
break;
41+
case ENBB_WHITE:
42+
countType = COUNT_ENEMIES_DEFEATED_BUBBLE_WHITE;
43+
break;
44+
case ENBB_RED:
45+
countType = COUNT_ENEMIES_DEFEATED_BUBBLE_RED;
46+
break;
47+
default:
48+
return;
49+
}
50+
51+
IncrementEnemyDefeatCount(countType);
52+
}
53+
54+
static void EnemyDefeatCounts_EnDekubaba(Actor* actor) {
55+
GameplayStatCount countType =
56+
(actor->params == DEKUBABA_BIG) ? COUNT_ENEMIES_DEFEATED_DEKU_BABA_BIG : COUNT_ENEMIES_DEFEATED_DEKU_BABA;
57+
IncrementEnemyDefeatCount(countType);
58+
}
59+
60+
static void EnemyDefeatCounts_EnZf(Actor* actor) {
61+
GameplayStatCount countType =
62+
(actor->params == ENZF_TYPE_DINOLFOS) ? COUNT_ENEMIES_DEFEATED_DINOLFOS : COUNT_ENEMIES_DEFEATED_LIZALFOS;
63+
IncrementEnemyDefeatCount(countType);
64+
}
65+
66+
static void EnemyDefeatCounts_EnRd(Actor* actor) {
67+
GameplayStatCount countType = (actor->params >= -1) ? COUNT_ENEMIES_DEFEATED_REDEAD : COUNT_ENEMIES_DEFEATED_GIBDO;
68+
IncrementEnemyDefeatCount(countType);
69+
}
70+
71+
static void EnemyDefeatCounts_EnIk(Actor* actor) {
72+
GameplayStatCount countType =
73+
(actor->params == 0) ? COUNT_ENEMIES_DEFEATED_IRON_KNUCKLE_NABOORU : COUNT_ENEMIES_DEFEATED_IRON_KNUCKLE;
74+
IncrementEnemyDefeatCount(countType);
75+
}
76+
77+
static void EnemyDefeatCounts_EnFirefly(Actor* actor) {
78+
GameplayStatCount countType;
79+
switch (actor->params) {
80+
case KEESE_NORMAL_FLY:
81+
case KEESE_NORMAL_PERCH:
82+
countType = COUNT_ENEMIES_DEFEATED_KEESE;
83+
break;
84+
case KEESE_FIRE_FLY:
85+
case KEESE_FIRE_PERCH:
86+
countType = COUNT_ENEMIES_DEFEATED_KEESE_FIRE;
87+
break;
88+
case KEESE_ICE_FLY:
89+
countType = COUNT_ENEMIES_DEFEATED_KEESE_ICE;
90+
break;
91+
default:
92+
return;
93+
}
94+
95+
IncrementEnemyDefeatCount(countType);
96+
}
97+
98+
static void EnemyDefeatCounts_EnTp(Actor* actor) {
99+
// Only count the head, otherwise each body segment will increment
100+
if (actor->params == TAILPASARAN_HEAD) {
101+
IncrementEnemyDefeatCount(COUNT_ENEMIES_DEFEATED_TAILPASARAN);
102+
}
103+
}
104+
105+
static void EnemyDefeatCounts_EnReeba(Actor* actor) {
106+
EnReeba* reeba = (EnReeba*)actor;
107+
GameplayStatCount countType = reeba->isBig ? COUNT_ENEMIES_DEFEATED_LEEVER_BIG : COUNT_ENEMIES_DEFEATED_LEEVER;
108+
IncrementEnemyDefeatCount(countType);
109+
}
110+
111+
static void EnemyDefeatCounts_EnMb(Actor* actor) {
112+
GameplayStatCount countType =
113+
(actor->params == 0) ? COUNT_ENEMIES_DEFEATED_MOBLIN_CLUB : COUNT_ENEMIES_DEFEATED_MOBLIN;
114+
IncrementEnemyDefeatCount(countType);
115+
}
116+
117+
static void EnemyDefeatCounts_EnPeehat(Actor* actor) {
118+
GameplayStatCount countType =
119+
(actor->params == PEAHAT_TYPE_LARVA) ? COUNT_ENEMIES_DEFEATED_PEAHAT_LARVA : COUNT_ENEMIES_DEFEATED_PEAHAT;
120+
IncrementEnemyDefeatCount(countType);
121+
}
122+
123+
static void EnemyDefeatCounts_EnPoh(Actor* actor) {
124+
GameplayStatCount countType = (actor->params == EN_POH_FLAT || actor->params == EN_POH_SHARP)
125+
? COUNT_ENEMIES_DEFEATED_POE_COMPOSER
126+
: COUNT_ENEMIES_DEFEATED_POE;
127+
IncrementEnemyDefeatCount(countType);
128+
}
129+
130+
static void EnemyDefeatCounts_EnPoField(Actor* actor) {
131+
GameplayStatCount countType =
132+
(actor->params == EN_PO_FIELD_BIG) ? COUNT_ENEMIES_DEFEATED_POE_BIG : COUNT_ENEMIES_DEFEATED_POE;
133+
IncrementEnemyDefeatCount(countType);
134+
}
135+
136+
static void EnemyDefeatCounts_EnSt(Actor* actor) {
137+
GameplayStatCount countType =
138+
(actor->params == 1) ? COUNT_ENEMIES_DEFEATED_SKULLTULA_BIG : COUNT_ENEMIES_DEFEATED_SKULLTULA;
139+
IncrementEnemyDefeatCount(countType);
140+
}
141+
142+
static void EnemyDefeatCounts_EnSw(Actor* actor) {
143+
GameplayStatCount countType;
144+
if (((actor->params & 0xE000) >> 0xD) != 0) {
145+
countType = COUNT_ENEMIES_DEFEATED_SKULLTULA_GOLD;
146+
} else {
147+
countType = COUNT_ENEMIES_DEFEATED_SKULLWALLTULA;
148+
}
149+
150+
IncrementEnemyDefeatCount(countType);
151+
}
152+
153+
static void EnemyDefeatCounts_EnTite(Actor* actor) {
154+
GameplayStatCount countType =
155+
(actor->params == TEKTITE_BLUE) ? COUNT_ENEMIES_DEFEATED_TEKTITE_BLUE : COUNT_ENEMIES_DEFEATED_TEKTITE_RED;
156+
IncrementEnemyDefeatCount(countType);
157+
}
158+
159+
static void EnemyDefeatCounts_EnWf(Actor* actor) {
160+
GameplayStatCount countType =
161+
(actor->params == WOLFOS_WHITE) ? COUNT_ENEMIES_DEFEATED_WOLFOS_WHITE : COUNT_ENEMIES_DEFEATED_WOLFOS;
162+
IncrementEnemyDefeatCount(countType);
163+
}
164+
165+
static void RegisterEnemyDefeatCounts() {
166+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_ANUBICE, COUNT_ENEMIES_DEFEATED_ANUBIS);
167+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_AM, COUNT_ENEMIES_DEFEATED_ARMOS);
168+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_CLEAR_TAG, COUNT_ENEMIES_DEFEATED_ARWING);
169+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_VALI, COUNT_ENEMIES_DEFEATED_BARI);
170+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_VM, COUNT_ENEMIES_DEFEATED_BEAMOS);
171+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_BIGOKUTA, COUNT_ENEMIES_DEFEATED_BIG_OCTO);
172+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_BILI, COUNT_ENEMIES_DEFEATED_BIRI);
173+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_DNS, COUNT_ENEMIES_DEFEATED_BUSINESS_SCRUB);
174+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_TORCH2, COUNT_ENEMIES_DEFEATED_DARK_LINK);
175+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_DH, COUNT_ENEMIES_DEFEATED_DEAD_HAND);
176+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_HINTNUTS, COUNT_ENEMIES_DEFEATED_DEKU_SCRUB);
177+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_DODONGO, COUNT_ENEMIES_DEFEATED_DODONGO);
178+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_DODOJR, COUNT_ENEMIES_DEFEATED_DODONGO_BABY);
179+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_DOOR_KILLER, COUNT_ENEMIES_DEFEATED_DOOR_TRAP);
180+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_FD, COUNT_ENEMIES_DEFEATED_FLARE_DANCER);
181+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_FLOORMAS, COUNT_ENEMIES_DEFEATED_FLOORMASTER);
182+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_TUBO_TRAP, COUNT_ENEMIES_DEFEATED_FLYING_POT);
183+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_YUKABYUN, COUNT_ENEMIES_DEFEATED_FLOOR_TILE);
184+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_FZ, COUNT_ENEMIES_DEFEATED_FREEZARD);
185+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_GELDB, COUNT_ENEMIES_DEFEATED_GERUDO_THIEF);
186+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_GOMA, COUNT_ENEMIES_DEFEATED_GOHMA_LARVA);
187+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_CROW, COUNT_ENEMIES_DEFEATED_GUAY);
188+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_RR, COUNT_ENEMIES_DEFEATED_LIKE_LIKE);
189+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_DEKUNUTS, COUNT_ENEMIES_DEFEATED_MAD_SCRUB);
190+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_OKUTA, COUNT_ENEMIES_DEFEATED_OCTOROK);
191+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_BA, COUNT_ENEMIES_DEFEATED_PARASITIC_TENTACLE);
192+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_PO_SISTERS, COUNT_ENEMIES_DEFEATED_POE_SISTERS);
193+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_BUBBLE, COUNT_ENEMIES_DEFEATED_SHABOM);
194+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_SB, COUNT_ENEMIES_DEFEATED_SHELLBLADE);
195+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_SKJ, COUNT_ENEMIES_DEFEATED_SKULL_KID);
196+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_NY, COUNT_ENEMIES_DEFEATED_SPIKE);
197+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_SKB, COUNT_ENEMIES_DEFEATED_STALCHILD);
198+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_TEST, COUNT_ENEMIES_DEFEATED_STALFOS);
199+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_EIYER, COUNT_ENEMIES_DEFEATED_STINGER);
200+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_WEIYER, COUNT_ENEMIES_DEFEATED_STINGER);
201+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_BW, COUNT_ENEMIES_DEFEATED_TORCH_SLUG);
202+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_WALLMAS, COUNT_ENEMIES_DEFEATED_WALLMASTER);
203+
ENEMY_DEFEAT_COUNT_UNIQUE(ACTOR_EN_KAREBABA, COUNT_ENEMIES_DEFEATED_WITHERED_DEKU_BABA);
204+
205+
ENEMY_DEFEAT_COUNT(ACTOR_EN_BB, EnemyDefeatCounts_EnBb);
206+
ENEMY_DEFEAT_COUNT(ACTOR_EN_DEKUBABA, EnemyDefeatCounts_EnDekubaba);
207+
ENEMY_DEFEAT_COUNT(ACTOR_EN_ZF, EnemyDefeatCounts_EnZf);
208+
ENEMY_DEFEAT_COUNT(ACTOR_EN_RD, EnemyDefeatCounts_EnRd);
209+
ENEMY_DEFEAT_COUNT(ACTOR_EN_IK, EnemyDefeatCounts_EnIk);
210+
ENEMY_DEFEAT_COUNT(ACTOR_EN_FIREFLY, EnemyDefeatCounts_EnFirefly);
211+
ENEMY_DEFEAT_COUNT(ACTOR_EN_TP, EnemyDefeatCounts_EnTp);
212+
ENEMY_DEFEAT_COUNT(ACTOR_EN_REEBA, EnemyDefeatCounts_EnReeba);
213+
ENEMY_DEFEAT_COUNT(ACTOR_EN_MB, EnemyDefeatCounts_EnMb);
214+
ENEMY_DEFEAT_COUNT(ACTOR_EN_PEEHAT, EnemyDefeatCounts_EnPeehat);
215+
ENEMY_DEFEAT_COUNT(ACTOR_EN_POH, EnemyDefeatCounts_EnPoh);
216+
ENEMY_DEFEAT_COUNT(ACTOR_EN_PO_FIELD, EnemyDefeatCounts_EnPoField);
217+
ENEMY_DEFEAT_COUNT(ACTOR_EN_ST, EnemyDefeatCounts_EnSt);
218+
ENEMY_DEFEAT_COUNT(ACTOR_EN_SW, EnemyDefeatCounts_EnSw);
219+
ENEMY_DEFEAT_COUNT(ACTOR_EN_TITE, EnemyDefeatCounts_EnTite);
220+
ENEMY_DEFEAT_COUNT(ACTOR_EN_WF, EnemyDefeatCounts_EnWf);
221+
}
222+
223+
static RegisterShipInitFunc initFunc(RegisterEnemyDefeatCounts);

0 commit comments

Comments
 (0)