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 <melee/db/db.h>
7#include <melee/ef/eflib.h>
8#include <melee/it/inlines.h>
9#include <melee/it/it_26B1.h>
10#include <melee/it/it_2725.h>
12#include <melee/it/item.h>
13#include <melee/it/itmaplib.h>
14#include <melee/it/itzako.h>
16#include <melee/it/types.h>
17#include <melee/lb/lbvector.h>
20
21static inline void Item_RetractChain(ItemLink* link, Vec3* pos,
22 f32 target_dist, const f32* max_dist,
23 ItemLink** next_out, ItemLink** cur_out,
24 f32* remaining_out)
25{
26 ItemLink* cur;
28 f32 distance;
29 f32 remaining;
30 f32 limit;
31 Vec3 dir;
32
33 cur = link;
34 next = link->prev;
35
36 while (next != NULL && !cur->x2C_b0) {
37 cur = next;
38 next = next->prev;
39 }
40
41 distance = it_802A3C98(&cur->pos, pos, &dir);
42
43 while (next != NULL && target_dist > distance) {
44 cur->x2C_b0 = false;
45 distance = it_802A3C98(&next->pos, pos, &dir);
46 cur = next;
47 next = next->prev;
48 }
49
50 remaining = distance - target_dist;
51 limit = *max_dist;
52 if (remaining > limit) {
53 remaining = limit;
54 }
55 *next_out = next;
56 *cur_out = cur;
57 *remaining_out = remaining;
58}
59
60static inline void Item_InitSpawn(SpawnItem* spawn, HSD_GObj* parent,
61 Vec3* pos, f32 dir)
62{
63 spawn->prev_pos = *pos;
64 spawn->pos = spawn->prev_pos;
65 spawn->facing_dir = dir;
66 spawn->x3C_damage = 0;
67 spawn->vel.x = spawn->vel.y = spawn->vel.z = 0.0F;
68 spawn->x0_parent_gobj = parent;
69 spawn->x4_parent_gobj2 = spawn->x0_parent_gobj;
70 spawn->x44_flag.b0 = true;
71 spawn->x40 = 0;
72}
73
74static inline Item_GObj*
76{
77 Item_8026AB54(item_gobj, parent, part);
78 db_80225DD8(item_gobj, parent);
79 return item_gobj;
80}
81
82static inline void Item_AttachGameWatchArticle(HSD_GObj* parent,
83 Fighter_Part part,
84 Item_GObj* item_gobj,
85 void** attributes)
86{
87 Item_AttachToParent(item_gobj, parent, part);
88 it_8027CE64(item_gobj, parent, attributes[0]);
89}
90
99
109
111 HSD_JObj* jobj,
112 const f32* rotation_rate)
113{
115 jobj = HSD_JObjGetChild(jobj);
116 HSD_JObjAddRotationY(jobj, *rotation_rate * ABS(ip->x40_vel.x));
117}
118
119static inline void Item_ClampAngle(f32* angle)
120{
121 while (*angle < -M_PI) {
122 *angle += M_TAU;
123 }
124 while (*angle > M_PI) {
125 *angle -= M_TAU;
126 }
127}
128
129static inline void Item_ClampAngleReverse(f32* angle)
130{
131 while (*angle > M_PI) {
132 *angle -= M_TAU;
133 }
134 while (*angle < -M_PI) {
135 *angle += M_TAU;
136 }
137}
138
140 HSD_JObj* jobj,
141 const f32* max_scale,
142 f32 scale_divisor)
143{
144 f32 dir;
145 f32 vel_x;
146
147 ip->x40_vel.x =
149 ip->x40_vel.y =
151 ip->x40_vel.z = 0.0F;
152 if (ip->x40_vel.x > 0.0F) {
153 dir = +1.0F;
154 } else {
155 dir = -1.0F;
156 }
157 ip->facing_dir = dir;
159 if (ip->facing_dir == 1.0F) {
160 vel_x = -ip->x40_vel.x;
161 } else {
162 vel_x = +ip->x40_vel.x;
163 }
164 HSD_JObjSetRotationX(jobj, M_PI + atan2f(ip->x40_vel.y, vel_x));
165 ip->xDD4_itemVar.ray.scale +=
166 ABS(ip->xDD4_itemVar.ray.speed) / scale_divisor;
167 if (ip->xDD4_itemVar.ray.scale > *max_scale) {
168 ip->xDD4_itemVar.ray.scale = *max_scale;
169 }
170 if (ip->xDD4_itemVar.ray.scale < 1e-5F) {
171 ip->xDD4_itemVar.ray.scale = 1e-3F;
172 }
174 return it_80273130(gobj);
175}
176
178{
179 Item* ip = GET_ITEM(gobj);
180
181 lbVector_Mirror(&ip->x40_vel, &ip->xC58);
182 ip->xDD4_itemVar.ray.scale = 1e-3F;
183 ip->xDD4_itemVar.ray.angle = atan2f(ip->x40_vel.y, ip->x40_vel.x);
184 while (ip->xDD4_itemVar.ray.angle < 0.0F) {
186 }
187 while (ip->xDD4_itemVar.ray.angle > M_TAU) {
189 }
190 return false;
191}
192
193static inline void Item_ResetRayAfterReflection(Item* ip, HSD_JObj* jobj)
194{
195 HSD_JObjSetScaleZ(jobj, ip->xDD4_itemVar.ray.scale = 1e-3F);
196 ip->xDD4_itemVar.ray.angle += M_PI;
197 while (ip->xDD4_itemVar.ray.angle < 0.0F) {
199 }
200 while (ip->xDD4_itemVar.ray.angle > M_TAU) {
202 }
203}
204
205static inline void Item_InitRaySpawnFields(SpawnItem* spawn, HSD_GObj* parent,
206 f32 facing_dir)
207{
208 spawn->facing_dir = facing_dir;
209 spawn->x3C_damage = 0;
210 spawn->vel.x = spawn->vel.y = spawn->vel.z = 0.0F;
211 spawn->x0_parent_gobj = parent;
212 spawn->x4_parent_gobj2 = spawn->x0_parent_gobj;
213 spawn->x44_flag.b0 = true;
214 spawn->x40 = 0;
215}
216
217static inline void Item_InitRaySpawnPosition(SpawnItem* spawn,
218 HSD_GObj* parent, Vec3* pos)
219{
220 spawn->prev_pos = *pos;
221 spawn->prev_pos.z = 0.0F;
222 it_8026BB68(parent, &spawn->pos);
223}
224
225static inline void itUpdateVelocityFromBone(HSD_JObj* jobj, Item* ip,
226 Vec3* previous_pos)
227{
228 Vec3 pos;
229 Vec3 zero;
230
231 if (jobj != NULL) {
232 zero.x = zero.y = zero.z = 0.0F;
233 HSD_JObjGetTranslation(jobj, &pos);
234 ip->x40_vel.x = ip->facing_dir * (pos.z - previous_pos->z);
235 ip->x40_vel.y = pos.y - previous_pos->y;
236 ip->x40_vel.z = pos.x - previous_pos->x;
237 *previous_pos = pos;
239 }
240}
241
243{
244 const f32 PI_2 = M_PI / 2;
247
249 HSD_JObjSetRotationY(jobj, PI_2 * ip->facing_dir);
250 return false;
251}
252
253static inline void Item_InitSpawnOnPlane(SpawnItem* spawn, HSD_GObj* parent,
254 Vec3* pos, f32 dir)
255{
256 spawn->prev_pos = *pos;
257 spawn->prev_pos.z = 0.0F;
258 spawn->pos = spawn->prev_pos;
259 spawn->facing_dir = dir;
260 spawn->x3C_damage = 0;
261 spawn->vel.x = spawn->vel.y = spawn->vel.z = 0.0F;
262 spawn->x0_parent_gobj = parent;
263 spawn->x4_parent_gobj2 = spawn->x0_parent_gobj;
264 spawn->x44_flag.b0 = true;
265 spawn->x40 = 0;
266}
267
269 HSD_GObj* parent,
270 Vec3* pos, f32 dir)
271{
272 spawn->prev_pos = *pos;
273 spawn->prev_pos.z = 0.0F;
274 spawn->pos = spawn->prev_pos;
275 spawn->facing_dir = dir;
276 spawn->x3C_damage = 0;
277 spawn->vel.x = spawn->vel.y = spawn->vel.z = 0.0F;
278 spawn->x0_parent_gobj = parent;
279 spawn->x4_parent_gobj2 = spawn->x0_parent_gobj;
280 spawn->x44_flag.b0 = false;
281 spawn->x40 = 0;
282}
283
284#endif
void efLib_ResumeAll(HSD_GObj *gobj)
Definition eflib.c:312
void efLib_PauseAll(HSD_GObj *gobj)
Definition eflib.c:285
struct Vec Vec3
float f32
Definition types.h:13
static const Vec3 zero
Definition ftlinkspecialn.c:199
HSD_GObj * gobj
Definition gm_19EF.c:73
static void * HSD_GObjGetUserData(HSD_GObj *gobj)
Definition gobj.h:147
static void * HSD_GObjGetHSDObj(HSD_GObj *gobj)
Definition gobj.h:152
#define GET_ITEM(gobj)
Definition inlines.h:13
static void itUpdateVelocityFromBone(HSD_JObj *jobj, Item *ip, Vec3 *previous_pos)
Definition inlines.h:225
static void Item_InitSpawnOnPlaneNoInitialCollision(SpawnItem *spawn, HSD_GObj *parent, Vec3 *pos, f32 dir)
Definition inlines.h:268
static void Item_InitSpawn(SpawnItem *spawn, HSD_GObj *parent, Vec3 *pos, f32 dir)
Definition inlines.h:60
static bool Item_UpdateRayAnimation(Item_GObj *gobj, Item *ip, HSD_JObj *jobj, const f32 *max_scale, f32 scale_divisor)
Definition inlines.h:139
static void Item_ClampAngle(f32 *angle)
Definition inlines.h:119
static void Item_InitRaySpawnFields(SpawnItem *spawn, HSD_GObj *parent, f32 facing_dir)
Definition inlines.h:205
static bool itReflectItemAndUpdateRotation(Item_GObj *gobj)
Definition inlines.h:242
static void Item_AttachGameWatchArticle(HSD_GObj *parent, Fighter_Part part, Item_GObj *item_gobj, void **attributes)
Definition inlines.h:82
static void Item_InitSpawnOnPlane(SpawnItem *spawn, HSD_GObj *parent, Vec3 *pos, f32 dir)
Definition inlines.h:253
static void Item_EnterAirStateWithHitlag(Item_GObj *gobj, enum_t msid)
Definition inlines.h:91
static void Item_UpdateRollingShellRotation(Item_GObj *gobj, Item *ip, HSD_JObj *jobj, const f32 *rotation_rate)
Definition inlines.h:110
static void Item_ClampAngleReverse(f32 *angle)
Definition inlines.h:129
static void Item_InitRaySpawnPosition(SpawnItem *spawn, HSD_GObj *parent, Vec3 *pos)
Definition inlines.h:217
static Item_GObj * Item_AttachToParent(Item_GObj *item_gobj, HSD_GObj *parent, Fighter_Part part)
Definition inlines.h:75
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:21
static void Item_ResetRayAfterReflection(Item *ip, HSD_JObj *jobj)
Definition inlines.h:193
static void Item_EnterAirStateWithHitlagAndStateDesc(Item_GObj *gobj)
Definition inlines.h:100
static bool Item_BounceRayOffShield(Item_GObj *gobj)
Definition inlines.h:177
void it_802762BC(Item *)
Definition itmaplib.c:301
bool it_80273130(Item_GObj *)
Definition it_2725.c:458
bool it_80273030(Item_GObj *)
Definition it_2725.c:418
void it_8026BB68(HSD_GObj *fighter_gobj, Vec3 *pos)
Adjust item's position to fp bone.
Definition it_26B1.c:655
void it_80273670(Item_GObj *item_gobj, int arg1, f32 arg8)
Definition it_2725.c:629
#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:1120
void Item_8026AB54(Item_GObj *gobj, HSD_GObj *owner_gobj, Fighter_Part part)
Pick up item.
Definition item.c:1983
float it_802A3C98(Vec3 *arg0, Vec3 *arg1, Vec3 *arg2)
Definition itlinkhookshot.c:873
void it_80276CB8(Item_GObj *item_gobj)
Definition itmaplib.c:566
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:718
static void HSD_JObjSetRotationY(HSD_JObj *jobj, f32 y)
Definition jobj.h:315
static HSD_JObj * HSD_JObjGetChild(HSD_JObj *jobj)
Definition jobj.h:192
static void HSD_JObjSetScaleZ(HSD_JObj *jobj, f32 z)
Definition jobj.h:436
static void HSD_JObjSetRotationX(HSD_JObj *jobj, f32 x)
Definition jobj.h:295
static void HSD_JObjGetTranslation(HSD_JObj *jobj, Vec3 *translate)
Definition jobj.h:565
static void HSD_JObjAddRotationY(HSD_JObj *jobj, float y)
Definition jobj.h:616
static void HSD_JObjSetTranslate(HSD_JObj *jobj, Vec3 *translate)
Definition jobj.h:479
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
Fighter_Part
Definition forward.h:255
HSD_GObj Item_GObj
Definition forward.h:55
@ ITEM_ANIM_UPDATE
Updates item model with target Item State's AnimJoint, MatAnimJoint and extra HSD archive node if ava...
Definition forward.h:62
#define ABS(x)
Definition platform.h:198
int enum_t
The underlying type of an enum, used as a placeholder.
Definition platform.h:28
static unsigned long int next
Definition rand.c:3
float cosf(float)
Definition trigf.c:68
float sinf(float)
Definition trigf.c:24
#define M_PI_2
Definition math.h:16
#define M_PI
Definition math.h:15
void db_80225DD8(Item_GObj *item, Fighter_GObj *owner)
Definition dbitem.c:210
#define NULL
Definition stddef.h:14
Definition gobj.h:28
Definition jobj.h:104
Definition types.h:213
union Item::Item_ItemVars xDD4_itemVar
HSD_GObjEvent exited_hitlag
Definition types.h:457
Vec3 xC58
Definition types.h:376
Vec3 x40_vel
Definition types.h:262
f32 facing_dir
Definition types.h:247
HSD_GObjEvent entered_hitlag
Runs after applying hitlag in damage.
Definition types.h:454
Definition types.dox:42
Vec3 vel
Definition types.dox:67
s32 x40
Definition types.dox:72
Vec3 prev_pos
Definition types.dox:64
s16 x3C_damage
Definition types.dox:70
HSD_GObj * x0_parent_gobj
Definition types.dox:44
UnkFlagStruct x44_flag
Definition types.dox:73
f32 facing_dir
Definition types.dox:68
HSD_GObj * x4_parent_gobj2
Definition types.dox:48
Vec3 pos
Definition types.dox:61
f32 z
Definition mtx.h:15
f32 x
Definition mtx.h:15
f32 y
Definition mtx.h:15
float scale
Definition itCommonItems.h:320
float speed
Definition itCommonItems.h:322
float angle
Definition itCommonItems.h:321
itRay_ItemVars ray
Definition types.h:598
u8 b0
Definition types.h:25