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/gm/gmvs.h>
14#include <melee/it/it_26B1.h>
15#include <melee/lb/lbvector.h>
20
21#define PUSH_ATTRS(fp, attributeName) \
22 do { \
23 void* backup = (fp)->dat_attrs_backup; \
24 attributeName* src = (attributeName*) (fp)->ft_data->ext_attr; \
25 void** da = &(fp)->dat_attrs; \
26 *(attributeName*) (fp)->dat_attrs_backup = *src; \
27 *da = backup; \
28 } while (0)
29
31#define COPY_ATTRS(gobj, attributeName) \
32 Fighter* fp = GET_FIGHTER(gobj); \
33 attributeName* sA2 = (attributeName*) fp->dat_attrs; \
34 attributeName* ext_attr = (attributeName*) fp->ft_data->ext_attr; \
35 *sA2 = *ext_attr;
36
37#ifdef M2C
38#define GET_FIGHTER(gobj) ((Fighter*) HSD_GObjGetUserData((HSD_GObj*) gobj))
39#else
40#define GET_FIGHTER(gobj) ((Fighter*) HSD_GObjGetUserData(gobj))
41#endif
42
48
50static inline Fighter* getFighter(Fighter_GObj* gobj)
51{
52 return gobj->user_data;
53}
54
56static inline Fighter* getFighterPlus(Fighter_GObj* gobj)
57{
58 Fighter* fp = gobj->user_data;
59 return fp;
60}
61
62static inline void* getFtSpecialAttrs(Fighter* fp)
63{
64 void* fighter_attr = fp->dat_attrs;
65 return fighter_attr;
66}
67
68static inline void* getFtSpecialAttrsD(Fighter* fp) // Direct
69{
70 return fp->dat_attrs;
71}
72
73static inline s32 ftGetKind(Fighter* fp)
74{
75 return fp->kind;
76}
77
78static inline s32 ftGetAction(Fighter* fp)
79{
80 return fp->motion_id;
81}
82
83static inline void* getFtSpecialAttrs2CC(Fighter* fp)
84{
85 void* fighter_attr = fp->x2CC;
86 return fighter_attr;
87}
88
89static inline ftCo_DatAttrs* getFtAttrs(Fighter* fp)
90{
91 return &fp->co_attrs;
92}
93
94static inline CollData* getFtColl(Fighter* fp)
95{
96 return &fp->coll_data;
97}
98
99static inline Fighter_GObj* getFtVictim(Fighter* fp)
100{
101 return fp->victim_gobj;
102}
103
105{
106 return fp->target_item_gobj;
107}
108
109static inline bool ftGetGroundAir(Fighter* fp)
110{
111 return fp->ground_or_air;
112}
113
114static inline int getStickDirX(Fighter* fp)
115{
116 if (fp->input.lstick[0].x < 0.0f) {
117 return -1;
118 } else {
119 return +1;
120 }
121}
122
123static inline float stickGetDir(float x1, float x2)
124{
125 if (x1 < x2) {
126 return -x1;
127 } else {
128 return x1;
129 }
130}
131
132static inline void getAccelAndTarget(Fighter* fp, float* accel,
133 float* target_vel)
134{
135 ftCo_DatAttrs* co_attrs = &fp->co_attrs;
136 *accel = fp->input.lstick[0].x * fp->co_attrs.dash_accel_mul;
137 *accel += fp->input.lstick[0].x > 0 ? +co_attrs->dash_accel_base
138 : -co_attrs->dash_accel_base;
139 *target_vel = fp->input.lstick[0].x * co_attrs->dash_max_velocity;
140}
141
143static inline void Fighter_OnItemPickup(Fighter_GObj* gobj, bool catchItemFlag,
144 bool bool2, bool bool3)
145{
146 Fighter* fp = GET_FIGHTER(gobj);
147 if (!itIsHeavy(fp->item_gobj)) {
148 switch (itGetHoldKind(fp->item_gobj)) {
149 case 1:
150 ftAnim_80070FB4(gobj, bool2, 1);
151 break;
152 case 2:
153 ftAnim_80070FB4(gobj, bool2, 0);
154 break;
155 case 3:
156 ftAnim_80070FB4(gobj, bool2, 2);
157 break;
158 case 4:
159 ftAnim_80070FB4(gobj, bool2, 3);
160 break;
161 default:
162 break;
163 }
164 if (catchItemFlag) {
165 ftAnim_80070C48(gobj, bool3);
166 }
167 }
168}
169
170static inline void Fighter_OnItemInvisible(Fighter_GObj* gobj, bool flag)
171{
172 Fighter* fp = GET_FIGHTER(gobj);
173 if (!itIsHeavy(fp->item_gobj)) {
174 ftAnim_80070CC4(gobj, flag);
175 }
176}
177
178static inline void Fighter_OnItemVisible(Fighter_GObj* gobj, bool flag)
179{
180 Fighter* fp = GET_FIGHTER(gobj);
181 if (!itIsHeavy(fp->item_gobj)) {
182 ftAnim_80070C48(gobj, flag);
183 }
184}
185
186static inline void Fighter_OnItemDrop(Fighter_GObj* gobj, bool dropItemFlag,
187 bool bool2, bool bool3)
188{
189 ftAnim_80070FB4(gobj, bool2, -1);
190 if (dropItemFlag) {
191 ftAnim_80070CC4(gobj, bool3);
192 }
193}
194
195static inline void Fighter_OnKnockbackEnter(Fighter_GObj* gobj, s32 arg1)
196{
197 ftAnim_800704F0(gobj, arg1, 3.0f);
198 ftAnim_800704F0(gobj, 0, 3.0f);
199}
200
201static inline void Fighter_OnKnockbackExit(Fighter_GObj* gobj, s32 arg1)
202{
203 ftAnim_800704F0(gobj, arg1, 0.0f);
204 ftAnim_800704F0(gobj, 0, 0.0f);
205}
206
207static inline void Fighter_UnsetCmdVar0(Fighter_GObj* gobj)
208{
209 Fighter* fp = GET_FIGHTER(gobj);
210 fp->cmd_vars[0] = 0;
211}
212
214{
215 return &fp->coll_data;
216}
217
218static inline void ftCommon_HandleTeleportCollisions(Fighter_GObj* gobj,
219 Fighter* fp,
220 CollData* coll,
221 const int* angle_clamp,
222 HSD_GObjEvent on_collide)
223{
224 if ((coll->env_flags & Collide_CeilingMask) &&
226 MTXDegToRad(90.0f + *angle_clamp))
227 {
228 on_collide(gobj);
229 }
230 if ((coll->env_flags & Collide_LeftWallMask) &&
232 MTXDegToRad(90.0f + *angle_clamp))
233 {
234 on_collide(gobj);
235 }
236 if ((coll->env_flags & Collide_RightWallMask) &&
238 MTXDegToRad(90.0f + *angle_clamp))
239 {
240 on_collide(gobj);
241 }
242}
243
245static inline bool ftCheckThrowB0(Fighter* fp)
246{
247 if (fp->throw_flags_b0) {
248 fp->throw_flags_b0 = false;
249 return true;
250 } else {
251 return false;
252 }
253}
254
255static inline bool ftCheckThrowB3(Fighter* fp)
256{
257 if (fp->throw_flags_b3) {
258 fp->throw_flags_b3 = false;
259 return true;
260 } else {
261 return false;
262 }
263}
264
265static inline bool ftCheckThrowB4(Fighter* fp)
266{
267 if (fp->throw_flags_b4) {
268 fp->throw_flags_b4 = false;
269 return true;
270 } else {
271 return false;
272 }
273}
274
275static inline float ftGetFacingDir(Fighter_GObj* gobj)
276{
277 return GET_FIGHTER(gobj)->facing_dir;
278}
279
280static inline int ftGetFacingDirInt(Fighter* fp)
281{
282 if (fp->facing_dir < 0.0f) {
283 return -1;
284 } else {
285 return +1;
286 }
287}
288
289static inline int ftGetFacingDirInt2(Fighter_GObj* gobj)
290{
292}
293
295#define gmScriptEventCast(p_event, type) ((type*) p_event)
296#define gmScriptEventUpdatePtr(event, type) \
297 (event = (void*) ((uintptr_t) event + 4))
298
300{
301 return &fp->x3E4_fighterCmdScript;
302}
303
304static inline bool canUseCstick(Fighter* fp)
305{
308 if (!gm_8016B0FC() || it_8026B30C(fp->item_gobj) == 0) {
309 return true;
310 } else {
311 return false;
312 }
313}
314
315#endif
UnkFlagStruct x1
Definition dbbonus.c:24
void efLib_ResumeAll(HSD_GObj *gobj)
Definition eflib.c:312
void efLib_PauseAll(HSD_GObj *gobj)
Definition eflib.c:285
#define MTXDegToRad(a)
Definition mtx.h:59
signed long s32
Definition types.h:8
static void Fighter_OnKnockbackExit(Fighter_GObj *gobj, s32 arg1)
Definition inlines.h:201
static s32 ftGetKind(Fighter *fp)
Definition inlines.h:73
static void * getFtSpecialAttrsD(Fighter *fp)
Definition inlines.h:68
static CommandInfo * getCmdScript(Fighter *fp)
Definition inlines.h:299
static int getStickDirX(Fighter *fp)
Definition inlines.h:114
static bool canUseCstick(Fighter *fp)
Definition inlines.h:304
static s32 ftGetAction(Fighter *fp)
Definition inlines.h:78
static void getAccelAndTarget(Fighter *fp, float *accel, float *target_vel)
Definition inlines.h:132
static void Fighter_OnItemVisible(Fighter_GObj *gobj, bool flag)
Definition inlines.h:178
static void Fighter_OnItemDrop(Fighter_GObj *gobj, bool dropItemFlag, bool bool2, bool bool3)
Definition inlines.h:186
static int ftGetFacingDirInt2(Fighter_GObj *gobj)
Definition inlines.h:289
static Fighter * getFighterPlus(Fighter_GObj *gobj)
Definition inlines.h:56
static void * getFtSpecialAttrs(Fighter *fp)
Definition inlines.h:62
static int ftGetFacingDirInt(Fighter *fp)
Definition inlines.h:280
static bool ftCheckThrowB4(Fighter *fp)
Definition inlines.h:265
static bool ftCheckThrowB3(Fighter *fp)
Definition inlines.h:255
static void * getFtSpecialAttrs2CC(Fighter *fp)
Definition inlines.h:83
static Fighter * getFighter(Fighter_GObj *gobj)
Definition inlines.h:50
static bool ftGetGroundAir(Fighter *fp)
Definition inlines.h:109
static ftCo_DatAttrs * getFtAttrs(Fighter *fp)
Definition inlines.h:89
static void Fighter_OnKnockbackEnter(Fighter_GObj *gobj, s32 arg1)
Definition inlines.h:195
#define GET_FIGHTER(gobj)
Definition inlines.h:40
static float ftGetFacingDir(Fighter_GObj *gobj)
Definition inlines.h:275
static void Fighter_UnsetCmdVar0(Fighter_GObj *gobj)
Definition inlines.h:207
static float stickGetDir(float x1, float x2)
Definition inlines.h:123
static void Fighter_SetEffectHitlagCallbacks(Fighter *fp)
Definition inlines.h:43
static void ftCommon_HandleTeleportCollisions(Fighter_GObj *gobj, Fighter *fp, CollData *coll, const int *angle_clamp, HSD_GObjEvent on_collide)
Definition inlines.h:218
static void Fighter_OnItemPickup(Fighter_GObj *gobj, bool catchItemFlag, bool bool2, bool bool3)
used for all fighters except Kirby and Purin
Definition inlines.h:143
static Item_GObj * getFtTargetItem(Fighter *fp)
Definition inlines.h:104
static bool ftCheckThrowB0(Fighter *fp)
Definition inlines.h:245
static CollData * getFtColl(Fighter *fp)
Definition inlines.h:94
static void Fighter_OnItemInvisible(Fighter_GObj *gobj, bool flag)
Definition inlines.h:170
static Fighter_GObj * getFtVictim(Fighter *fp)
Definition inlines.h:99
static CollData * Fighter_GetCollData(Fighter *fp)
Definition inlines.h:213
void ftAnim_80070FB4(Fighter_GObj *arg0, s32 arg1, s32 arg2)
Definition ftanim.c:1362
void ftAnim_800704F0(Fighter_GObj *gobj, int tobj_idx, float frame)
Definition ftanim.c:1057
void ftAnim_80070CC4(Fighter_GObj *gobj, int arg1)
Definition ftanim.c:1304
void ftAnim_80070C48(Fighter_GObj *gobj, s32 arg1)
Definition ftanim.c:1276
u8 x2
Definition gm_1601.c:156
HSD_GObj * gobj
Definition gm_19EF.c:73
bool gm_8016B0FC(void)
single-button mode enabled
Definition gmvs.c:191
Item_HoldKinds itGetHoldKind(HSD_GObj *gobj)
Return item hold kind.
Definition it_26B1.c:127
enum_t it_8026B30C(Item_GObj *gobj)
Return flag from Item Attributes.
Definition it_26B1.c:120
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
HSD_GObj Item_GObj
Definition forward.h:62
#define Collide_RightWallMask
Definition forward.h:102
#define Collide_CeilingMask
Definition forward.h:107
#define Collide_LeftWallMask
Definition forward.h:99
Definition types.h:202
SurfaceData right_facing_wall
Definition types.h:238
SurfaceData left_facing_wall
Definition types.h:237
SurfaceData ceiling
Definition types.h:239
s16 facing_dir
Definition types.h:212
s32 env_flags
Definition types.h:232
Definition types.h:920
Definition types.h:1250
u8 throw_flags_b0
Definition types.h:1696
u8 throw_flags_b3
Definition types.h:1699
GroundOrAir ground_or_air
Definition types.h:1276
Item_GObj * target_item_gobj
Definition types.h:1583
ftCo_DatAttrs co_attrs
Definition types.h:1290
void * dat_attrs
Definition types.h:1307
float facing_dir
Definition types.h:1262
CollData coll_data
Definition types.h:1415
u8 throw_flags_b4
Definition types.h:1700
Vec2 lstick[3]
lstick buffer
Definition types.h:1368
HSD_GObjEvent post_hitlag_cb
Definition types.h:1680
u32 cmd_vars[4]
Definition types.h:1692
HSD_GObjEvent pre_hitlag_cb
Definition types.h:1679
FighterKind kind
Definition types.h:1252
Item_GObj * item_gobj
Definition types.h:1538
struct Fighter::@111351162372213271352333051003102312224255052362 input
CommandInfo x3E4_fighterCmdScript
Definition types.h:1316
ftDonkeyAttributes * x2CC
Definition types.h:1293
Fighter_GObj * victim_gobj
Definition types.h:1581
Vec3 self_vel
Definition types.h:1268
FtMotionId motion_id
Definition types.h:1255
Vec3 normal
Definition types.h:165
f32 x
Definition mtx.h:11
Definition types.h:785
float dash_accel_base
Definition types.h:802
float dash_accel_mul
Definition types.h:801
float dash_max_velocity
Definition types.h:803
void(* HSD_GObjEvent)(HSD_GObj *gobj)
Definition forward.h:108