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 <platform.h>
5
6#include "ef/eflib.h"
7
8#include "ft/forward.h"
9
10#include "ft/ftanim.h"
11#include "ft/types.h"
12#include "gm/gm_16AE.h"
13#include "it/it_26B1.h"
14#include "lb/lbvector.h"
15
16#include "mp/forward.h"
17
18#include <math.h>
19#include <dolphin/mtx.h>
20#include <baselib/archive.h>
21#include <baselib/dobj.h>
22#include <baselib/gobj.h>
23#include <baselib/jobj.h>
24#include <baselib/lobj.h>
25
26#define PUSH_ATTRS(fp, attributeName) \
27 do { \
28 void* backup = (fp)->dat_attrs_backup; \
29 attributeName* src = (attributeName*) (fp)->ft_data->ext_attr; \
30 void** da = &(fp)->dat_attrs; \
31 *(attributeName*) (fp)->dat_attrs_backup = *src; \
32 *da = backup; \
33 } while (0)
34
36#define COPY_ATTRS(gobj, attributeName) \
37 Fighter* fp = GET_FIGHTER(gobj); \
38 attributeName* sA2 = (attributeName*) fp->dat_attrs; \
39 attributeName* ext_attr = (attributeName*) fp->ft_data->ext_attr; \
40 *sA2 = *ext_attr;
41
42#ifdef M2C
43#define GET_FIGHTER(gobj) ((Fighter*) HSD_GObjGetUserData((HSD_GObj*) gobj))
44#else
45#define GET_FIGHTER(gobj) ((Fighter*) HSD_GObjGetUserData(gobj))
46#endif
47
53
55static inline Fighter* getFighter(Fighter_GObj* gobj)
56{
57 return gobj->user_data;
58}
59
61static inline Fighter* getFighterPlus(Fighter_GObj* gobj)
62{
63 Fighter* fp = gobj->user_data;
64 return fp;
65}
66
67static inline void* getFtSpecialAttrs(Fighter* fp)
68{
69 void* fighter_attr = fp->dat_attrs;
70 return fighter_attr;
71}
72
73static inline void* getFtSpecialAttrsD(Fighter* fp) // Direct
74{
75 return fp->dat_attrs;
76}
77
78static inline s32 ftGetKind(Fighter* fp)
79{
80 return fp->kind;
81}
82
83static inline s32 ftGetAction(Fighter* fp)
84{
85 return fp->motion_id;
86}
87
88static inline void* getFtSpecialAttrs2CC(Fighter* fp)
89{
90 void* fighter_attr = fp->x2CC;
91 return fighter_attr;
92}
93
94static inline ftCo_DatAttrs* getFtAttrs(Fighter* fp)
95{
96 return &fp->co_attrs;
97}
98
99static inline CollData* getFtColl(Fighter* fp)
100{
101 return &fp->coll_data;
102}
103
104static inline Fighter_GObj* getFtVictim(Fighter* fp)
105{
106 return fp->victim_gobj;
107}
108
110{
111 return fp->target_item_gobj;
112}
113
114static inline bool ftGetGroundAir(Fighter* fp)
115{
116 return fp->ground_or_air;
117}
118
119static inline int getStickDirX(Fighter* fp)
120{
121 if (fp->input.lstick.x < 0.0f) {
122 return -1;
123 } else {
124 return +1;
125 }
126}
127
128static inline float stickGetDir(float x1, float x2)
129{
130 if (x1 < x2) {
131 return -x1;
132 } else {
133 return x1;
134 }
135}
136
137static inline void getAccelAndTarget(Fighter* fp, float* accel,
138 float* target_vel)
139{
140 ftCo_DatAttrs* co_attrs = &fp->co_attrs;
141 *accel = fp->input.lstick.x * fp->co_attrs.dash_run_acceleration_a;
142 *accel += fp->input.lstick.x > 0 ? +co_attrs->dash_run_acceleration_b
143 : -co_attrs->dash_run_acceleration_b;
144 *target_vel = fp->input.lstick.x * co_attrs->dash_run_terminal_velocity;
145}
146
148static inline void Fighter_OnItemPickup(Fighter_GObj* gobj, bool catchItemFlag,
149 bool bool2, bool bool3)
150{
151 Fighter* fp = GET_FIGHTER(gobj);
152 if (!itIsHeavy(fp->item_gobj)) {
153 switch (itGetHoldKind(fp->item_gobj)) {
154 case 1:
155 ftAnim_80070FB4(gobj, bool2, 1);
156 break;
157 case 2:
158 ftAnim_80070FB4(gobj, bool2, 0);
159 break;
160 case 3:
161 ftAnim_80070FB4(gobj, bool2, 2);
162 break;
163 case 4:
164 ftAnim_80070FB4(gobj, bool2, 3);
165 break;
166 }
167 if (catchItemFlag) {
168 ftAnim_80070C48(gobj, bool3);
169 }
170 }
171}
172
173static inline void Fighter_OnItemInvisible(Fighter_GObj* gobj, bool flag)
174{
175 Fighter* fp = GET_FIGHTER(gobj);
176 if (!itIsHeavy(fp->item_gobj)) {
177 ftAnim_80070CC4(gobj, flag);
178 }
179}
180
181static inline void Fighter_OnItemVisible(Fighter_GObj* gobj, bool flag)
182{
183 Fighter* fp = GET_FIGHTER(gobj);
184 if (!itIsHeavy(fp->item_gobj)) {
185 ftAnim_80070C48(gobj, flag);
186 }
187}
188
189static inline void Fighter_OnItemDrop(Fighter_GObj* gobj, bool dropItemFlag,
190 bool bool2, bool bool3)
191{
192 ftAnim_80070FB4(gobj, bool2, -1);
193 if (dropItemFlag) {
194 ftAnim_80070CC4(gobj, bool3);
195 }
196}
197
198static inline void Fighter_OnKnockbackEnter(Fighter_GObj* gobj, s32 arg1)
199{
200 ftAnim_800704F0(gobj, arg1, 3.0f);
201 ftAnim_800704F0(gobj, 0, 3.0f);
202}
203
204static inline void Fighter_OnKnockbackExit(Fighter_GObj* gobj, s32 arg1)
205{
206 ftAnim_800704F0(gobj, arg1, 0.0f);
207 ftAnim_800704F0(gobj, 0, 0.0f);
208}
209
210static inline void Fighter_UnsetCmdVar0(Fighter_GObj* gobj)
211{
212 Fighter* fp = GET_FIGHTER(gobj);
213 fp->cmd_vars[0] = 0;
214}
215
217{
218 return &fp->coll_data;
219}
220
221static inline void ftCommon_HandleTeleportCollisions(Fighter_GObj* gobj,
222 Fighter* fp,
223 CollData* coll,
224 const int* angle_clamp,
225 HSD_GObjEvent on_collide)
226{
227 if ((coll->env_flags & Collide_CeilingMask) &&
229 deg_to_rad * (90.0f + *angle_clamp))
230 {
231 on_collide(gobj);
232 }
233 if ((coll->env_flags & Collide_LeftWallMask) &&
235 deg_to_rad * (90.0f + *angle_clamp))
236 {
237 on_collide(gobj);
238 }
239 if ((coll->env_flags & Collide_RightWallMask) &&
241 deg_to_rad * (90.0f + *angle_clamp))
242 {
243 on_collide(gobj);
244 }
245}
246
248static inline bool ftCheckThrowB0(Fighter* fp)
249{
250 if (fp->throw_flags_b0) {
251 fp->throw_flags_b0 = false;
252 return true;
253 } else {
254 return false;
255 }
256}
257
258static inline bool ftCheckThrowB3(Fighter* fp)
259{
260 if (fp->throw_flags_b3) {
261 fp->throw_flags_b3 = false;
262 return true;
263 } else {
264 return false;
265 }
266}
267
268static inline bool ftCheckThrowB4(Fighter* fp)
269{
270 if (fp->throw_flags_b4) {
271 fp->throw_flags_b4 = false;
272 return true;
273 } else {
274 return false;
275 }
276}
277
278static inline float ftGetFacingDir(Fighter_GObj* gobj)
279{
280 return GET_FIGHTER(gobj)->facing_dir;
281}
282
283static inline int ftGetFacingDirInt(Fighter* fp)
284{
285 if (fp->facing_dir < 0.0f) {
286 return -1;
287 } else {
288 return +1;
289 }
290}
291
292static inline int ftGetFacingDirInt2(Fighter_GObj* gobj)
293{
294 return ftGetFacingDirInt(GET_FIGHTER(gobj));
295}
296
298#define gmScriptEventCast(p_event, type) ((type*) p_event)
299#define gmScriptEventUpdatePtr(event, type) \
300 (event = (void*) ((uintptr_t) event + 4))
301
303{
304 return &fp->x3E4_fighterCmdScript;
305}
306
307static inline bool canUseCstick(Fighter* fp)
308{
311 if (!gm_8016B0FC() || it_8026B30C(fp->item_gobj) == 0) {
312 return true;
313 } else {
314 return false;
315 }
316}
317
318#endif
UnkFlagStruct x1
Definition dbbonus.c:21
void efLib_ResumeAll(HSD_GObj *gobj)
Definition eflib.c:316
void efLib_PauseAll(HSD_GObj *gobj)
Definition eflib.c:289
static void Fighter_OnKnockbackExit(Fighter_GObj *gobj, s32 arg1)
Definition inlines.h:204
static s32 ftGetKind(Fighter *fp)
Definition inlines.h:78
static void * getFtSpecialAttrsD(Fighter *fp)
Definition inlines.h:73
static int getStickDirX(Fighter *fp)
Definition inlines.h:119
static bool canUseCstick(Fighter *fp)
Definition inlines.h:307
static s32 ftGetAction(Fighter *fp)
Definition inlines.h:83
static void getAccelAndTarget(Fighter *fp, float *accel, float *target_vel)
Definition inlines.h:137
static void Fighter_OnItemVisible(Fighter_GObj *gobj, bool flag)
Definition inlines.h:181
static void Fighter_OnItemDrop(Fighter_GObj *gobj, bool dropItemFlag, bool bool2, bool bool3)
Definition inlines.h:189
static int ftGetFacingDirInt2(Fighter_GObj *gobj)
Definition inlines.h:292
static Fighter * getFighterPlus(Fighter_GObj *gobj)
Definition inlines.h:61
static void * getFtSpecialAttrs(Fighter *fp)
Definition inlines.h:67
static int ftGetFacingDirInt(Fighter *fp)
Definition inlines.h:283
static bool ftCheckThrowB4(Fighter *fp)
Definition inlines.h:268
static bool ftCheckThrowB3(Fighter *fp)
Definition inlines.h:258
static void * getFtSpecialAttrs2CC(Fighter *fp)
Definition inlines.h:88
static Fighter * getFighter(Fighter_GObj *gobj)
Definition inlines.h:55
static bool ftGetGroundAir(Fighter *fp)
Definition inlines.h:114
static ftCo_DatAttrs * getFtAttrs(Fighter *fp)
Definition inlines.h:94
static void Fighter_OnKnockbackEnter(Fighter_GObj *gobj, s32 arg1)
Definition inlines.h:198
#define GET_FIGHTER(gobj)
Definition inlines.h:45
static float ftGetFacingDir(Fighter_GObj *gobj)
Definition inlines.h:278
static void Fighter_UnsetCmdVar0(Fighter_GObj *gobj)
Definition inlines.h:210
static float stickGetDir(float x1, float x2)
Definition inlines.h:128
static void Fighter_SetEffectHitlagCallbacks(Fighter *fp)
Definition inlines.h:48
static void ftCommon_HandleTeleportCollisions(Fighter_GObj *gobj, Fighter *fp, CollData *coll, const int *angle_clamp, HSD_GObjEvent on_collide)
Definition inlines.h:221
static void Fighter_OnItemPickup(Fighter_GObj *gobj, bool catchItemFlag, bool bool2, bool bool3)
used for all fighters except Kirby and Purin
Definition inlines.h:148
static Item_GObj * getFtTargetItem(Fighter *fp)
Definition inlines.h:109
static bool ftCheckThrowB0(Fighter *fp)
Definition inlines.h:248
static CollData * getFtColl(Fighter *fp)
Definition inlines.h:99
static void Fighter_OnItemInvisible(Fighter_GObj *gobj, bool flag)
Definition inlines.h:173
static Fighter_GObj * getFtVictim(Fighter *fp)
Definition inlines.h:104
static CollData * Fighter_GetCollData(Fighter *fp)
Definition inlines.h:216
CommandInfo * getCmdScript(Fighter *fp)
Definition inlines.h:302
void ftAnim_80070FB4(Fighter_GObj *arg0, s32 arg1, s32 arg2)
Definition ftanim.c:1367
void ftAnim_800704F0(Fighter_GObj *gobj, int tobj_idx, float frame)
Definition ftanim.c:1061
void ftAnim_80070CC4(Fighter_GObj *gobj, int arg1)
Definition ftanim.c:1308
void ftAnim_80070C48(Fighter_GObj *gobj, s32 arg1)
Definition ftanim.c:1280
u8 x2
Definition gm_1601.c:149
bool gm_8016B0FC(void)
single-button mode enabled
Definition gm_16AE.c:178
signed long s32
Definition hsd_3B2B.h:1
enum_t itGetHoldKind(HSD_GObj *gobj)
Return item hold kind.
Definition it_26B1.c:126
enum_t it_8026B30C(Item_GObj *gobj)
Return flag from Item Attributes.
Definition it_26B1.c:119
bool itIsHeavy(HSD_GObj *gobj)
Check if item is heavy.
Definition it_26B1.c:90
static float const deg_to_rad
Definition itparasol.c:15
float lbVector_AngleXY(Vec3 *a, Vec3 *b)
8000D790 - returns the angle between a and b
Definition lbvector.c:111
HSD_GObj Item_GObj
Definition forward.h:55
#define Collide_RightWallMask
Definition forward.h:94
#define Collide_CeilingMask
Definition forward.h:99
#define Collide_LeftWallMask
Definition forward.h:91
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:964
Definition types.h:1134
FtMotionId motion_id
Definition types.h:1139
u8 throw_flags_b4
Definition types.h:1591
HSD_GObjEvent pre_hitlag_cb
Definition types.h:1570
Item_GObj * item_gobj
Definition types.h:1429
Vec3 self_vel
Definition types.h:1152
u8 throw_flags_b0
Definition types.h:1587
Item_GObj * target_item_gobj
Definition types.h:1474
struct Fighter::@237322252372014117116113031343114120130274157263 input
GroundOrAir ground_or_air
Definition types.h:1160
CollData coll_data
Definition types.h:1306
ftCo_DatAttrs co_attrs
Definition types.h:1174
u32 cmd_vars[4]
Definition types.h:1583
CommandInfo x3E4_fighterCmdScript
Definition types.h:1200
HSD_GObjEvent post_hitlag_cb
Definition types.h:1571
float facing_dir
Definition types.h:1146
Fighter_GObj * victim_gobj
Definition types.h:1472
void * dat_attrs
Definition types.h:1191
FighterKind kind
Definition types.h:1136
ftDonkeyAttributes * x2CC
Definition types.h:1177
Vec2 lstick
Definition types.h:1252
u8 throw_flags_b3
Definition types.h:1590
Vec3 normal
Definition types.h:165
f32 x
Definition mtx.h:11
Definition types.h:690
float dash_run_acceleration_b
Definition types.h:700
float dash_run_terminal_velocity
Definition types.h:701
float dash_run_acceleration_a
Definition types.h:699
void(* HSD_GObjEvent)(HSD_GObj *gobj)
Definition forward.h:109