SSBM Decomp
Loading...
Searching...
No Matches
inlines.h
Go to the documentation of this file.
1#ifndef MELEE_IT_ITEMS_INLINES_H
2#define MELEE_IT_ITEMS_INLINES_H
3
4#include <math.h>
5
6#include <dolphin/mtx.h>
7#include <melee/cm/camera.h>
8#include <melee/db/db.h>
9#include <melee/ef/eflib.h>
10#include <melee/it/inlines.h>
11#include <melee/it/it_26B1.h>
12#include <melee/it/it_2725.h>
14#include <melee/it/item.h>
15#include <melee/it/ithitbox.h>
16#include <melee/it/itmaplib.h>
17#include <melee/it/itzako.h>
19#include <melee/it/types.h>
20#include <melee/lb/lbvector.h>
23
24static inline void Item_RetractChain(ItemLink* link, Vec3* pos,
25 f32 target_dist, const f32* max_dist,
26 ItemLink** next_out, ItemLink** cur_out,
27 f32* remaining_out)
28{
29 ItemLink* cur;
31 f32 distance;
32 f32 remaining;
33 f32 limit;
34 Vec3 dir;
35
36 cur = link;
37 next = link->prev;
38
39 while (next != NULL && !cur->x2C_b0) {
40 cur = next;
41 next = next->prev;
42 }
43
44 distance = it_802A3C98(&cur->pos, pos, &dir);
45
46 while (next != NULL && target_dist > distance) {
47 cur->x2C_b0 = false;
48 distance = it_802A3C98(&next->pos, pos, &dir);
49 cur = next;
50 next = next->prev;
51 }
52
53 remaining = distance - target_dist;
54 limit = *max_dist;
55 if (remaining > limit) {
56 remaining = limit;
57 }
58 *next_out = next;
59 *cur_out = cur;
60 *remaining_out = remaining;
61}
62
63static inline Item_GObj*
65{
66 Item_8026AB54(item_gobj, parent, part);
67 db_80225DD8(item_gobj, parent);
68 return item_gobj;
69}
70
71static inline void
73 Item_GObj* item_gobj,
74 const itGamewatchAttributes* attributes)
75{
76 Item_AttachToParent(item_gobj, parent, part);
77 it_8027CE64(item_gobj, parent, attributes->x0);
78}
79
80static inline void Item_StopAndEnterState(Item_GObj* gobj, Item* ip, s32 msid)
81{
83 it_8026B390(gobj);
85}
86
87static inline void Item_EnterAirStateWithHitlag(Item_GObj* gobj, enum_t msid)
88{
89 Item* item = GET_ITEM(gobj);
90 it_802762BC(item);
94}
95
97{
98 Item* item = GET_ITEM(gobj);
99 it_802762BC(item);
103 it_80273670(gobj, 0, 0.0F);
104}
105
106static inline void Item_UpdateRollingShellRotation(Item_GObj* gobj, Item* ip,
107 HSD_JObj* jobj,
108 const f32* rotation_rate)
109{
110 it_80276CB8(gobj);
111 jobj = HSD_JObjGetChild(jobj);
112 HSD_JObjAddRotationY(jobj, *rotation_rate * ABS(ip->x40_vel.x));
113}
114
115static inline void Item_ClampAngle(f32* angle)
116{
117 while (*angle < -M_PI) {
118 *angle += M_TAU;
119 }
120 while (*angle > M_PI) {
121 *angle -= M_TAU;
122 }
123}
124
125static inline void Item_ClampAngleReverse(f32* angle)
126{
127 while (*angle > M_PI) {
128 *angle -= M_TAU;
129 }
130 while (*angle < -M_PI) {
131 *angle += M_TAU;
132 }
133}
134
135static inline bool Item_UpdateRayAnimation(Item_GObj* gobj, Item* ip,
136 HSD_JObj* jobj,
137 const f32* max_scale,
138 f32 scale_divisor)
139{
140 f32 dir;
141 f32 vel_x;
142
143 ip->x40_vel.x =
145 ip->x40_vel.y =
147 ip->x40_vel.z = 0.0F;
148 if (ip->x40_vel.x > 0.0F) {
149 dir = +1.0F;
150 } else {
151 dir = -1.0F;
152 }
153 ip->facing_dir = dir;
155 if (ip->facing_dir == 1.0F) {
156 vel_x = -ip->x40_vel.x;
157 } else {
158 vel_x = +ip->x40_vel.x;
159 }
160 HSD_JObjSetRotationX(jobj, M_PI + atan2f(ip->x40_vel.y, vel_x));
161 ip->xDD4_itemVar.ray.scale +=
162 ABS(ip->xDD4_itemVar.ray.speed) / scale_divisor;
163 if (ip->xDD4_itemVar.ray.scale > *max_scale) {
164 ip->xDD4_itemVar.ray.scale = *max_scale;
165 }
166 if (ip->xDD4_itemVar.ray.scale < 1e-5F) {
167 ip->xDD4_itemVar.ray.scale = 1e-3F;
168 }
170 return it_80273130(gobj);
171}
172
173static inline bool Item_BounceRayOffShield(Item_GObj* gobj)
174{
175 Item* ip = GET_ITEM(gobj);
176
177 lbVector_Mirror(&ip->x40_vel, &ip->xC58);
178 ip->xDD4_itemVar.ray.scale = 1e-3F;
179 ip->xDD4_itemVar.ray.angle = atan2f(ip->x40_vel.y, ip->x40_vel.x);
180 while (ip->xDD4_itemVar.ray.angle < 0.0F) {
182 }
183 while (ip->xDD4_itemVar.ray.angle > M_TAU) {
185 }
186 return false;
187}
188
189static inline void Item_ResetRayAfterReflection(Item* ip, HSD_JObj* jobj)
190{
191 HSD_JObjSetScaleZ(jobj, ip->xDD4_itemVar.ray.scale = 1e-3F);
192 ip->xDD4_itemVar.ray.angle += M_PI;
193 while (ip->xDD4_itemVar.ray.angle < 0.0F) {
195 }
196 while (ip->xDD4_itemVar.ray.angle > M_TAU) {
198 }
199}
200
201static inline void Item_InitSpawnPosition(SpawnItem* spawn, Vec3* pos,
202 bool on_plane)
203{
204 spawn->prev_pos = *pos;
205 if (on_plane) {
206 spawn->prev_pos.z = 0.0F;
207 }
208 spawn->pos = spawn->prev_pos;
209}
210
211static inline void Item_InitSpawnCommonFields(SpawnItem* spawn,
212 HSD_GObj* parent, f32 facing_dir,
213 bool initial_collision)
214{
215 spawn->facing_dir = facing_dir;
216 spawn->x3C_damage = 0;
217 spawn->vel.x = spawn->vel.y = spawn->vel.z = 0.0F;
218 spawn->x0_parent_gobj = parent;
219 spawn->x4_parent_gobj2 = spawn->x0_parent_gobj;
220 spawn->x44_flag.x0.b0 = initial_collision;
221 spawn->x40 = 0;
222}
223
224static inline void
226{
227 spawn->prev_pos = *pos;
228 spawn->prev_pos.z = 0.0F;
229 it_8026BB68(parent, &spawn->pos);
230}
231
232static inline void itUpdateVelocityFromBone(HSD_JObj* jobj, Item* ip,
233 Vec3* previous_pos)
234{
235 Vec3 pos;
236 Vec3 zero;
237
238 if (jobj != NULL) {
239 zero.x = zero.y = zero.z = 0.0F;
240 HSD_JObjGetTranslation(jobj, &pos);
241 ip->x40_vel.x = ip->facing_dir * (pos.z - previous_pos->z);
242 ip->x40_vel.y = pos.y - previous_pos->y;
243 ip->x40_vel.z = pos.x - previous_pos->x;
244 *previous_pos = pos;
246 }
247}
248
250{
251 const f32 PI_2 = M_PI / 2;
252 Item* ip = (Item*) HSD_GObjGetUserData(gobj);
253 HSD_JObj* jobj = GET_JOBJ(gobj);
254
255 it_80273030(gobj);
256 HSD_JObjSetRotationY(jobj, PI_2 * ip->facing_dir);
257 return false;
258}
259
260static inline void Item_CopyJObjScale(HSD_JObj* dst, HSD_JObj* src,
261 Vec3* scale)
262{
263 scale->x = scale->y = scale->z = HSD_JObjGetScaleY(src);
265}
266
267static inline void Item_NormalizeAngle(f32* angle)
268{
269 while (*angle < 0.0F) {
270 *angle += M_TAU;
271 }
272 while (*angle > M_TAU) {
273 *angle -= M_TAU;
274 }
275}
276
277static inline void Item_ClearFlagsAndEnterState(Item_GObj* gobj, Item* ip,
278 s32 msid)
279{
280 it_8026B3A8(gobj);
281 ip->xDC8_word.flags.x13 = 0;
282 it_80272940(gobj);
283 Item_80268E5C(gobj, msid, ITEM_ANIM_UPDATE);
284}
285
286static inline void Item_UpdateZakoVelocity(Item_GObj* gobj, Item* ip)
287{
288 it_802762BC(ip);
289 it_8027BA54(gobj, &ip->x40_vel);
290 it_802762BC(ip);
291}
292
293static inline void Item_ZakoDefeat(Item_GObj* gobj, Item* ip)
294{
295 it_8027C9D8(ip);
296 it_802756D0(gobj);
297 it_80275474(gobj);
298 it_8027CE44(gobj);
300}
301
302static inline void Item_InitLinkMtx(Mtx m, f32 z)
303{
304 PSMTXIdentity(m);
305 m[0][3] = 0.0f;
306 m[1][3] = 0.0f;
307 m[2][3] = z;
308}
309
310static inline void Item_InitZakoCollision(Item_GObj* gobj, Item* ip)
311{
312 ip->xD5C = 0;
313 ip->xDC8_word.flags.x15 = 0;
314 it_8027542C(gobj);
315 it_80275270(gobj);
316 ip->xDC8_word.flags.x19 = 1;
317}
318
319#endif
const void * src
Definition __os.h:108
void Camera_RequestQuake(CmQuakeKind kind, Vec3 *pos)
Definition camera.c:4357
void efLib_ResumeAll(HSD_GObj *gobj)
Definition eflib.c:258
void efLib_PauseAll(HSD_GObj *gobj)
Definition eflib.c:231
static const Vec3 zero
Definition ftlinkspecialn.c:193
static void * HSD_GObjGetUserData(HSD_GObj *gobj)
Definition gobj.h:112
#define GET_JOBJ(gobj)
Definition gobj.h:134
static void itResetVelocity(Item *ip)
Definition inlines.h:23
#define GET_ITEM(gobj)
Definition inlines.h:13
static void Item_InitZakoCollision(Item_GObj *gobj, Item *ip)
Definition inlines.h:310
static void itUpdateVelocityFromBone(HSD_JObj *jobj, Item *ip, Vec3 *previous_pos)
Definition inlines.h:232
static void Item_NormalizeAngle(f32 *angle)
Definition inlines.h:267
static void Item_InitSpawnCommonFields(SpawnItem *spawn, HSD_GObj *parent, f32 facing_dir, bool initial_collision)
Definition inlines.h:211
static void Item_ZakoDefeat(Item_GObj *gobj, Item *ip)
Definition inlines.h:293
static bool Item_UpdateRayAnimation(Item_GObj *gobj, Item *ip, HSD_JObj *jobj, const f32 *max_scale, f32 scale_divisor)
Definition inlines.h:135
static void Item_ClampAngle(f32 *angle)
Definition inlines.h:115
static void Item_AttachGameWatchArticle(HSD_GObj *parent, Fighter_Part part, Item_GObj *item_gobj, const itGamewatchAttributes *attributes)
Definition inlines.h:72
static bool itReflectItemAndUpdateRotation(Item_GObj *gobj)
Definition inlines.h:249
static void Item_UpdateZakoVelocity(Item_GObj *gobj, Item *ip)
Definition inlines.h:286
static void Item_EnterAirStateWithHitlag(Item_GObj *gobj, enum_t msid)
Definition inlines.h:87
static void Item_UpdateRollingShellRotation(Item_GObj *gobj, Item *ip, HSD_JObj *jobj, const f32 *rotation_rate)
Definition inlines.h:106
static void Item_InitSpawnPosition(SpawnItem *spawn, Vec3 *pos, bool on_plane)
Definition inlines.h:201
static void Item_ClampAngleReverse(f32 *angle)
Definition inlines.h:125
static void Item_InitLinkMtx(Mtx m, f32 z)
Definition inlines.h:302
static void Item_ClearFlagsAndEnterState(Item_GObj *gobj, Item *ip, s32 msid)
Definition inlines.h:277
static void Item_InitSpawnPositionFromParent(SpawnItem *spawn, HSD_GObj *parent, Vec3 *pos)
Definition inlines.h:225
static Item_GObj * Item_AttachToParent(Item_GObj *item_gobj, HSD_GObj *parent, Fighter_Part part)
Definition inlines.h:64
static void Item_RetractChain(ItemLink *link, Vec3 *pos, f32 target_dist, const f32 *max_dist, ItemLink **next_out, ItemLink **cur_out, f32 *remaining_out)
Definition inlines.h:24
static void Item_ResetRayAfterReflection(Item *ip, HSD_JObj *jobj)
Definition inlines.h:189
static void Item_CopyJObjScale(HSD_JObj *dst, HSD_JObj *src, Vec3 *scale)
Definition inlines.h:260
static void Item_EnterAirStateWithHitlagAndStateDesc(Item_GObj *gobj)
Definition inlines.h:96
static bool Item_BounceRayOffShield(Item_GObj *gobj)
Definition inlines.h:173
static void Item_StopAndEnterState(Item_GObj *gobj, Item *ip, s32 msid)
Definition inlines.h:80
void it_8026B3A8(HSD_GObj *gobj)
Toggle item flag 0x15 in 0xDC8 word OFF.
Definition it_26B1.c:175
void it_8026B390(HSD_GObj *gobj)
Toggle item flag 0x15 in 0xDC8 word ON.
Definition it_26B1.c:166
void it_8026BB68(HSD_GObj *fighter_gobj, Vec3 *pos)
Adjust item's position to fp bone.
Definition it_26B1.c:658
bool it_80273130(Item_GObj *item_gobj)
Definition it_2725.c:399
void it_80272940(Item_GObj *item_gobj)
Definition it_2725.c:182
void it_80273670(Item_GObj *item_gobj, int arg1, f32 arg8)
Definition it_2725.c:570
bool it_80273030(Item_GObj *item_gobj)
Definition it_2725.c:359
void it_80275270(Item_GObj *item_gobj)
Definition it_2725.c:1425
#define M_TAU
Definition itclimbersblizzard.c:20
void Item_80268E5C(HSD_GObj *gobj, enum_t msid, Item_StateChangeFlags flags)
Change item state.
Definition item.c:1142
void Item_8026AB54(Item_GObj *gobj, HSD_GObj *owner_gobj, Fighter_Part part)
Pick up item.
Definition item.c:2031
void it_8027542C(Item_GObj *item_gobj)
Definition ithitbox.c:30
void it_802756D0(Item_GObj *item_gobj)
Definition ithitbox.c:149
void it_80275474(Item_GObj *item_gobj)
Toggle several flags in 0xDCD off.
Definition ithitbox.c:48
static float const scale
Definition itlgunray.c:21
float it_802A3C98(Vec3 *arg0, Vec3 *arg1, Vec3 *arg2)
Definition itlinkhookshot.c:867
void it_80276CB8(Item_GObj *item_gobj)
Definition itmaplib.c:525
void it_802762BC(Item *item)
Definition itmaplib.c:302
void it_8027CE64(Item_GObj *item_gobj, HSD_GObj *fighter_gobj, void *arg_attr_address)
Appears to be a function for Game&Watch items.
Definition itzako.c:693
int it_8027BA54(HSD_GObj *item_gobj, Vec3 *arg1)
Definition itzako.c:212
void it_8027C9D8(Item *item)
Definition itzako.c:540
void it_8027CE44(Item_GObj *item_gobj)
Definition itzako.c:687
static void HSD_JObjSetRotationY(HSD_JObj *jobj, f32 y)
Definition jobj.h:317
static HSD_JObj * HSD_JObjGetChild(HSD_JObj *jobj)
Definition jobj.h:194
static void HSD_JObjSetScale(HSD_JObj *jobj, Vec3 *scale)
Definition jobj.h:382
static void HSD_JObjSetScaleZ(HSD_JObj *jobj, f32 z)
Definition jobj.h:438
static void HSD_JObjSetRotationX(HSD_JObj *jobj, f32 x)
Definition jobj.h:297
static void HSD_JObjGetTranslation(HSD_JObj *jobj, Vec3 *translate)
Definition jobj.h:567
static void HSD_JObjAddRotationY(HSD_JObj *jobj, float y)
Definition jobj.h:618
static void HSD_JObjSetTranslate(HSD_JObj *jobj, Vec3 *translate)
Definition jobj.h:481
static f32 HSD_JObjGetScaleY(HSD_JObj *jobj)
Definition jobj.h:469
float atan2f(float y, float x)
Definition lbtrigf.c:22
void lbVector_Mirror(Vec3 *a, Vec3 *unit_mirror_axis)
8000DC6C - compute a -= 2*<a,b>*b.
Definition lbvector.c:257
void PSMTXIdentity(Mtx m)
struct Vec Vec3
f32 Mtx[3][4]
Definition mtx.h:50
signed int s32
Definition types.h:12
float f32
Definition types.h:18
@ QuakeKind_Small
Definition forward.h:62
Fighter_Part
Definition forward.h:264
HSD_GObj Item_GObj
Definition forward.h:64
@ ITEM_ANIM_UPDATE
Updates item model with target Item State's AnimJoint, MatAnimJoint and extra HSD archive node if ava...
Definition forward.h:76
#define M_PI_2
Definition platform.h:157
#define ABS(x)
Definition platform.h:176
int enum_t
The underlying type of an enum, used as a placeholder.
Definition platform.h:29
#define M_PI
Definition platform.h:156
static u32 next
Definition rand.c:4
float cosf(float)
Definition trigf.c:68
float sinf(float)
Definition trigf.c:24
void db_80225DD8(Item_GObj *item, Fighter_GObj *owner)
Definition dbitem.c:324
#define NULL
Definition stddef.h:19
Definition gobj.h:16
Definition jobj.h:106
Definition types.h:232
Vec3 pos
Definition types.h:270
union Item::Item_ItemVars xDD4_itemVar
HSD_GObjEvent exited_hitlag
Definition types.h:431
Vec3 xC58
Definition types.h:360
Vec3 x40_vel
Definition types.h:268
f32 facing_dir
Definition types.h:258
flag32 xDC8_word
Definition types.h:498
HSD_GObjEvent entered_hitlag
Runs after applying hitlag in damage.
Definition types.h:428
u32 xD5C
Definition types.h:458
Definition types.h:657
Vec3 vel
Definition types.h:669
s32 x40
Definition types.h:673
Vec3 prev_pos
Definition types.h:668
s16 x3C_damage
Definition types.h:671
HSD_GObj * x4_parent_gobj2
Definition types.h:659
UnkFlagStruct x44_flag
Definition types.h:674
HSD_GObj * x0_parent_gobj
Definition types.h:658
f32 facing_dir
Definition types.h:670
Vec3 pos
Definition types.h:667
u8 b0
Definition types.h:28
f32 z
Definition mtx.h:15
f32 x
Definition mtx.h:15
f32 y
Definition mtx.h:15
u32 x15
Definition types.h:63
u32 x13
Definition types.h:61
u32 x19
Definition types.h:66
struct flag32::flag32_flags flags
Definition itCharItems.h:862
void * x0
Definition itCharItems.h:863
float scale
Definition itCommonItems.h:356
float speed
Definition itCommonItems.h:358
float angle
Definition itCommonItems.h:357
itRay_ItemVars ray
Definition types.h:566
struct UnkFlagStruct::UnkFlagStruct_x0 x0