SSBM Decomp
Loading...
Searching...
No Matches
inlines.h
Go to the documentation of this file.
1#ifndef MELEE_FT_INLINES_H
2#define MELEE_FT_INLINES_H
3
4#include <Runtime/platform.h>
5
6#include <melee/ft/forward.h>
7#include <melee/mp/forward.h>
8
9#include <dolphin/mtx.h>
10#include <melee/ef/eflib.h>
11#include <melee/ft/ftanim.h>
12#include <melee/ft/types.h>
13#include <melee/it/it_26B1.h>
14#include <melee/lb/lbvector.h>
19
20#define PUSH_ATTRS(fp, attributeName) \
21 do { \
22 void* backup = (fp)->dat_attrs_backup; \
23 attributeName* src = (attributeName*) (fp)->ft_data->ext_attr; \
24 void** da = &(fp)->dat_attrs; \
25 *(attributeName*) (fp)->dat_attrs_backup = *src; \
26 *da = backup; \
27 } while (false)
28
30#define COPY_ATTRS(gobj, attributeName) \
31 Fighter* fp = GET_FIGHTER(gobj); \
32 attributeName* sA2 = (attributeName*) fp->dat_attrs; \
33 attributeName* ext_attr = (attributeName*) fp->ft_data->ext_attr; \
34 *sA2 = *ext_attr;
35
36#ifdef M2C
37#define GET_FIGHTER(gobj) ((Fighter*) HSD_GObjGetUserData((HSD_GObj*) gobj))
38#else
39#define GET_FIGHTER(gobj) ((Fighter*) HSD_GObjGetUserData(gobj))
40#endif
41
47
49static inline Fighter* getFighter(Fighter_GObj* gobj)
50{
51 return gobj->user_data;
52}
53
55static inline Fighter* getFighterPlus(Fighter_GObj* gobj)
56{
57 Fighter* fp = gobj->user_data;
58 return fp;
59}
60
61static inline void* getFtSpecialAttrs(Fighter* fp)
62{
63 void* fighter_attr = fp->dat_attrs;
64 return fighter_attr;
65}
66
67static inline void* getFtSpecialAttrsD(Fighter* fp) // Direct
68{
69 return fp->dat_attrs;
70}
71
72static inline s32 ftGetKind(Fighter* fp)
73{
74 return fp->kind;
75}
76
77static inline s32 ftGetAction(Fighter* fp)
78{
79 return fp->motion_id;
80}
81
82static inline void* getFtSpecialAttrs2CC(Fighter* fp)
83{
84 void* fighter_attr = fp->x2CC;
85 return fighter_attr;
86}
87
88static inline ftCo_DatAttrs* getFtAttrs(Fighter* fp)
89{
90 return &fp->co_attrs;
91}
92
93static inline CollData* getFtColl(Fighter* fp)
94{
95 return &fp->coll_data;
96}
97
98static inline Fighter_GObj* getFtVictim(Fighter* fp)
99{
100 return fp->victim_gobj;
101}
102
104{
105 return fp->target_item_gobj;
106}
107
108static inline bool ftGetGroundAir(Fighter* fp)
109{
110 return fp->ground_or_air;
111}
112
113static inline int getStickDirX(Fighter* fp)
114{
115 if (fp->input.lstick[0].x < 0.0f) {
116 return -1;
117 } else {
118 return +1;
119 }
120}
121
122static inline float stickGetDir(float x1, float x2)
123{
124 if (x1 < x2) {
125 return -x1;
126 } else {
127 return x1;
128 }
129}
130
131static inline void getAccelAndTarget(Fighter* fp, float* accel,
132 float* target_vel)
133{
134 ftCo_DatAttrs* co_attrs = &fp->co_attrs;
135 *accel = fp->input.lstick[0].x * fp->co_attrs.dash_accel_mul;
136 *accel += fp->input.lstick[0].x > 0 ? +co_attrs->dash_accel_base
137 : -co_attrs->dash_accel_base;
138 *target_vel = fp->input.lstick[0].x * co_attrs->dash_max_velocity;
139}
140
142static inline void Fighter_OnItemPickup(Fighter_GObj* gobj, bool catchItemFlag,
143 bool bool2, bool bool3)
144{
145 Fighter* fp = GET_FIGHTER(gobj);
146 if (!itIsHeavy(fp->item_gobj)) {
147 switch (itGetHoldKind(fp->item_gobj)) {
148 case 1:
149 ftAnim_80070FB4(gobj, bool2, 1);
150 break;
151 case 2:
152 ftAnim_80070FB4(gobj, bool2, 0);
153 break;
154 case 3:
155 ftAnim_80070FB4(gobj, bool2, 2);
156 break;
157 case 4:
158 ftAnim_80070FB4(gobj, bool2, 3);
159 break;
160 default:
161 break;
162 }
163 if (catchItemFlag) {
164 ftAnim_80070C48(gobj, bool3);
165 }
166 }
167}
168
169static inline void Fighter_OnItemInvisible(Fighter_GObj* gobj, bool flag)
170{
171 Fighter* fp = GET_FIGHTER(gobj);
172 if (!itIsHeavy(fp->item_gobj)) {
173 ftAnim_80070CC4(gobj, flag);
174 }
175}
176
177static inline void Fighter_OnItemVisible(Fighter_GObj* gobj, bool flag)
178{
179 Fighter* fp = GET_FIGHTER(gobj);
180 if (!itIsHeavy(fp->item_gobj)) {
181 ftAnim_80070C48(gobj, flag);
182 }
183}
184
185static inline void Fighter_OnItemDrop(Fighter_GObj* gobj, bool dropItemFlag,
186 bool bool2, bool bool3)
187{
188 ftAnim_80070FB4(gobj, bool2, -1);
189 if (dropItemFlag) {
190 ftAnim_80070CC4(gobj, bool3);
191 }
192}
193
194static inline void Fighter_OnKnockbackEnter(Fighter_GObj* gobj, s32 arg1)
195{
196 ftAnim_800704F0(gobj, arg1, 3.0f);
197 ftAnim_800704F0(gobj, 0, 3.0f);
198}
199
200static inline void Fighter_OnKnockbackExit(Fighter_GObj* gobj, s32 arg1)
201{
202 ftAnim_800704F0(gobj, arg1, 0.0f);
203 ftAnim_800704F0(gobj, 0, 0.0f);
204}
205
206static inline void Fighter_UnsetCmdVar0(Fighter_GObj* gobj)
207{
208 Fighter* fp = GET_FIGHTER(gobj);
209 fp->cmd_vars[0] = 0;
210}
211
212static inline void Fighter_SetDamageCallback(Fighter_GObj* gobj,
214{
215 Fighter* fp = GET_FIGHTER(gobj);
216 fp->take_dmg_cb = cb;
217 fp->death2_cb = cb;
218}
219
220static inline void Fighter_SetDamageCallbacks(Fighter* fp,
221 HSD_GObjEvent take_dmg_cb,
222 HSD_GObjEvent death2_cb)
223{
224 fp->take_dmg_cb = take_dmg_cb;
225 fp->death2_cb = death2_cb;
226}
227
228static inline void Fighter_ClearCmdVars(Fighter* fp)
229{
230 fp->cmd_vars[3] = 0;
231 fp->cmd_vars[2] = 0;
232 fp->cmd_vars[1] = 0;
233 fp->cmd_vars[0] = 0;
234}
235
237{
238 return &fp->coll_data;
239}
240
241static inline void ftCommon_HandleTeleportCollisions(Fighter_GObj* gobj,
242 Fighter* fp,
243 CollData* coll,
244 const int* angle_clamp,
245 HSD_GObjEvent on_collide)
246{
247 if ((coll->env_flags & Collide_CeilingMask) &&
249 MTXDegToRad(90.0f + *angle_clamp))
250 {
251 on_collide(gobj);
252 }
253 if ((coll->env_flags & Collide_LeftWallMask) &&
255 MTXDegToRad(90.0f + *angle_clamp))
256 {
257 on_collide(gobj);
258 }
259 if ((coll->env_flags & Collide_RightWallMask) &&
261 MTXDegToRad(90.0f + *angle_clamp))
262 {
263 on_collide(gobj);
264 }
265}
266
268static inline bool ftCheckThrowB0(Fighter* fp)
269{
270 if (fp->x2210.x0.throw_flags_b0) {
271 fp->x2210.x0.throw_flags_b0 = false;
272 return true;
273 } else {
274 return false;
275 }
276}
277
278static inline bool ftCheckThrowB3(Fighter* fp)
279{
280 if (fp->x2210.x0.throw_flags_b3) {
281 fp->x2210.x0.throw_flags_b3 = false;
282 return true;
283 } else {
284 return false;
285 }
286}
287
288static inline bool ftCheckThrowB4(Fighter* fp)
289{
290 if (fp->x2210.x0.throw_flags_b4) {
291 fp->x2210.x0.throw_flags_b4 = false;
292 return true;
293 } else {
294 return false;
295 }
296}
297
298static inline float ftGetFacingDir(Fighter_GObj* gobj)
299{
300 return GET_FIGHTER(gobj)->facing_dir;
301}
302
303static inline int ftGetFacingDirInt(Fighter* fp)
304{
305 if (fp->facing_dir < 0.0f) {
306 return -1;
307 } else {
308 return +1;
309 }
310}
311
312#endif
void efLib_ResumeAll(HSD_GObj *gobj)
Definition eflib.c:258
void efLib_PauseAll(HSD_GObj *gobj)
Definition eflib.c:231
static void cb(long result, struct DVDCommandBlock *block)
Definition fstload.c:19
static void Fighter_SetDamageCallbacks(Fighter *fp, HSD_GObjEvent take_dmg_cb, HSD_GObjEvent death2_cb)
Definition inlines.h:220
static void Fighter_OnKnockbackExit(Fighter_GObj *gobj, s32 arg1)
Definition inlines.h:200
static void Fighter_ClearCmdVars(Fighter *fp)
Definition inlines.h:228
static s32 ftGetKind(Fighter *fp)
Definition inlines.h:72
static void * getFtSpecialAttrsD(Fighter *fp)
Definition inlines.h:67
static int getStickDirX(Fighter *fp)
Definition inlines.h:113
static s32 ftGetAction(Fighter *fp)
Definition inlines.h:77
static void getAccelAndTarget(Fighter *fp, float *accel, float *target_vel)
Definition inlines.h:131
static void Fighter_OnItemVisible(Fighter_GObj *gobj, bool flag)
Definition inlines.h:177
static void Fighter_OnItemDrop(Fighter_GObj *gobj, bool dropItemFlag, bool bool2, bool bool3)
Definition inlines.h:185
static Fighter * getFighterPlus(Fighter_GObj *gobj)
Definition inlines.h:55
static void * getFtSpecialAttrs(Fighter *fp)
Definition inlines.h:61
static int ftGetFacingDirInt(Fighter *fp)
Definition inlines.h:303
static bool ftCheckThrowB4(Fighter *fp)
Definition inlines.h:288
static bool ftCheckThrowB3(Fighter *fp)
Definition inlines.h:278
static void * getFtSpecialAttrs2CC(Fighter *fp)
Definition inlines.h:82
static Fighter * getFighter(Fighter_GObj *gobj)
Definition inlines.h:49
static bool ftGetGroundAir(Fighter *fp)
Definition inlines.h:108
static ftCo_DatAttrs * getFtAttrs(Fighter *fp)
Definition inlines.h:88
static void Fighter_OnKnockbackEnter(Fighter_GObj *gobj, s32 arg1)
Definition inlines.h:194
#define GET_FIGHTER(gobj)
Definition inlines.h:39
static float ftGetFacingDir(Fighter_GObj *gobj)
Definition inlines.h:298
static void Fighter_SetDamageCallback(Fighter_GObj *gobj, HSD_GObjEvent cb)
Definition inlines.h:212
static void Fighter_UnsetCmdVar0(Fighter_GObj *gobj)
Definition inlines.h:206
static float stickGetDir(float x1, float x2)
Definition inlines.h:122
static void Fighter_SetEffectHitlagCallbacks(Fighter *fp)
Definition inlines.h:42
static void ftCommon_HandleTeleportCollisions(Fighter_GObj *gobj, Fighter *fp, CollData *coll, const int *angle_clamp, HSD_GObjEvent on_collide)
Definition inlines.h:241
static void Fighter_OnItemPickup(Fighter_GObj *gobj, bool catchItemFlag, bool bool2, bool bool3)
used for all fighters except Kirby and Purin
Definition inlines.h:142
static Item_GObj * getFtTargetItem(Fighter *fp)
Definition inlines.h:103
static bool ftCheckThrowB0(Fighter *fp)
Definition inlines.h:268
static CollData * getFtColl(Fighter *fp)
Definition inlines.h:93
static void Fighter_OnItemInvisible(Fighter_GObj *gobj, bool flag)
Definition inlines.h:169
static Fighter_GObj * getFtVictim(Fighter *fp)
Definition inlines.h:98
static CollData * Fighter_GetCollData(Fighter *fp)
Definition inlines.h:236
void ftAnim_80070FB4(Fighter_GObj *arg0, s32 arg1, s32 arg2)
Definition ftanim.c:1364
void ftAnim_800704F0(Fighter_GObj *gobj, int tobj_idx, float frame)
Definition ftanim.c:1059
void ftAnim_80070CC4(Fighter_GObj *gobj, int arg1)
Definition ftanim.c:1306
void ftAnim_80070C48(Fighter_GObj *gobj, s32 arg1)
Definition ftanim.c:1278
Item_HoldKinds itGetHoldKind(HSD_GObj *gobj)
Return item hold kind.
Definition it_26B1.c:127
bool itIsHeavy(HSD_GObj *gobj)
Check if item is heavy.
Definition it_26B1.c:91
float lbVector_AngleXY(Vec3 *a, Vec3 *b)
8000D790 - returns the angle between a and b
Definition lbvector.c:105
#define MTXDegToRad(a)
Definition mtx.h:59
signed int s32
Definition types.h:12
HSD_GObj Item_GObj
Definition forward.h:64
#define Collide_RightWallMask
Definition forward.h:104
#define Collide_CeilingMask
Definition forward.h:109
#define Collide_LeftWallMask
Definition forward.h:101
Definition types.h:205
SurfaceData right_facing_wall
Definition types.h:241
SurfaceData left_facing_wall
Definition types.h:240
SurfaceData ceiling
Definition types.h:242
s16 facing_dir
Definition types.h:215
s32 env_flags
Definition types.h:235
Vec2 lstick[3]
lstick buffer
Definition types.h:1588
u8 throw_flags_b0
Definition types.h:1887
u8 throw_flags_b3
Definition types.h:1890
u8 throw_flags_b4
Definition types.h:1891
Definition types.h:1481
HSD_GObjEvent take_dmg_cb
Definition types.h:1872
GroundOrAir ground_or_air
Definition types.h:1508
Item_GObj * target_item_gobj
Definition types.h:1777
ftCo_DatAttrs co_attrs
Definition types.h:1522
void * dat_attrs
Definition types.h:1527
struct Fighter::Fighter_input input
float facing_dir
Definition types.h:1494
HSD_GObjEvent death2_cb
Definition types.h:1875
CollData coll_data
Definition types.h:1629
HSD_GObjEvent post_hitlag_cb
Definition types.h:1871
union Fighter::Fighter_x2210 x2210
u32 cmd_vars[4]
Definition types.h:1883
HSD_GObjEvent pre_hitlag_cb
Definition types.h:1870
FighterKind kind
Definition types.h:1483
Item_GObj * item_gobj
Definition types.h:1732
ftDonkeyAttributes * x2CC
Definition types.h:1525
Fighter_GObj * victim_gobj
Definition types.h:1775
Vec3 self_vel
Definition types.h:1500
FtMotionId motion_id
Definition types.h:1487
Vec3 normal
Definition types.h:168
f32 x
Definition mtx.h:11
Definition types.h:876
float dash_accel_base
Definition types.h:893
float dash_accel_mul
Definition types.h:892
float dash_max_velocity
Definition types.h:894
void(* HSD_GObjEvent)(HSD_GObj *gobj)
Definition forward.h:113
struct Fighter::Fighter_x2210::Fighter_x2210_x0 x0