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 "db/db.h"
5#include "ef/eflib.h"
6#include "it/inlines.h"
7#include "it/it_26B1.h"
8#include "it/it_2725.h"
9#include "it/itCharItems.h"
10#include "it/item.h"
12#include "it/itmaplib.h"
13#include "it/itzako.h"
14#include "it/types.h"
15#include "lb/lbrefract.h"
16#include "lb/lbvector.h"
17
18#include <math.h>
19#include <baselib/gobj.h>
20#include <baselib/jobj.h>
21#include <MSL/math.h>
22
23static inline void Item_RetractChain(ItemLink* link, Vec3* pos,
24 f32 target_dist, const f32* max_dist,
25 ItemLink** next_out, ItemLink** cur_out,
26 f32* remaining_out)
27{
28 ItemLink* cur;
30 f32 distance;
31 f32 remaining;
32 f32 limit;
33 Vec3 dir;
34
35 cur = link;
36 next = link->prev;
37
38 while (next != NULL && !cur->x2C_b0) {
39 cur = next;
40 next = next->prev;
41 }
42
43 distance = it_802A3C98(&cur->pos, pos, &dir);
44
45 while (next != NULL && target_dist > distance) {
46 cur->x2C_b0 = false;
47 distance = it_802A3C98(&next->pos, pos, &dir);
48 cur = next;
49 next = next->prev;
50 }
51
52 remaining = distance - target_dist;
53 limit = *max_dist;
54 if (remaining > limit) {
55 remaining = limit;
56 }
57 *next_out = next;
58 *cur_out = cur;
59 *remaining_out = remaining;
60}
61
62static inline void Item_InitSpawn(SpawnItem* spawn, HSD_GObj* parent,
63 Vec3* pos, f32 dir)
64{
65 spawn->prev_pos = *pos;
66 spawn->pos = spawn->prev_pos;
67 spawn->facing_dir = dir;
68 spawn->x3C_damage = 0;
69 spawn->vel.x = spawn->vel.y = spawn->vel.z = 0.0F;
70 spawn->x0_parent_gobj = parent;
71 spawn->x4_parent_gobj2 = spawn->x0_parent_gobj;
72 spawn->x44_flag.b0 = true;
73 spawn->x40 = 0;
74}
75
76static inline Item_GObj*
78{
79 Item_8026AB54(item_gobj, parent, part);
80 db_80225DD8(item_gobj, parent);
81 return item_gobj;
82}
83
84static inline void Item_AttachGameWatchArticle(HSD_GObj* parent,
85 Fighter_Part part,
86 Item_GObj* item_gobj,
87 void** attributes)
88{
89 Item_AttachToParent(item_gobj, parent, part);
90 it_8027CE64(item_gobj, parent, attributes[0]);
91}
92
93static inline void Item_EnterAirStateWithHitlag(Item_GObj* gobj, enum_t msid)
94{
95 Item* item = GET_ITEM(gobj);
96 it_802762BC(item);
100}
101
103{
104 Item* item = GET_ITEM(gobj);
105 it_802762BC(item);
109 it_80273670(gobj, 0, 0.0F);
110}
111
112static inline void Item_UpdateRollingShellRotation(Item_GObj* gobj, Item* ip,
113 HSD_JObj* jobj,
114 const f32* rotation_rate)
115{
116 it_80276CB8(gobj);
117 jobj = HSD_JObjGetChild(jobj);
118 HSD_JObjAddRotationY(jobj, *rotation_rate * ABS(ip->x40_vel.x));
119}
120
121static inline void Item_ClampAngle(f32* angle)
122{
123 while (*angle < -M_PI) {
124 *angle += M_TAU;
125 }
126 while (*angle > M_PI) {
127 *angle -= M_TAU;
128 }
129}
130
131static inline void Item_ClampAngleReverse(f32* angle)
132{
133 while (*angle > M_PI) {
134 *angle -= M_TAU;
135 }
136 while (*angle < -M_PI) {
137 *angle += M_TAU;
138 }
139}
140
141static inline bool Item_UpdateRayAnimation(Item_GObj* gobj, Item* ip,
142 HSD_JObj* jobj,
143 const f32* max_scale,
144 f32 scale_divisor)
145{
146 f32 dir;
147 f32 vel_x;
148
149 ip->x40_vel.x =
151 ip->x40_vel.y =
153 ip->x40_vel.z = 0.0F;
154 if (ip->x40_vel.x > 0.0F) {
155 dir = +1.0F;
156 } else {
157 dir = -1.0F;
158 }
159 ip->facing_dir = dir;
161 if (ip->facing_dir == 1.0F) {
162 vel_x = -ip->x40_vel.x;
163 } else {
164 vel_x = +ip->x40_vel.x;
165 }
166 HSD_JObjSetRotationX(jobj, M_PI + atan2f(ip->x40_vel.y, vel_x));
167 ip->xDD4_itemVar.ray.scale +=
168 ABS(ip->xDD4_itemVar.ray.speed) / scale_divisor;
169 if (ip->xDD4_itemVar.ray.scale > *max_scale) {
170 ip->xDD4_itemVar.ray.scale = *max_scale;
171 }
172 if (ip->xDD4_itemVar.ray.scale < 1e-5F) {
173 ip->xDD4_itemVar.ray.scale = 1e-3F;
174 }
176 return it_80273130(gobj);
177}
178
179static inline bool Item_BounceRayOffShield(Item_GObj* gobj)
180{
181 Item* ip = GET_ITEM(gobj);
182
183 lbVector_Mirror(&ip->x40_vel, &ip->xC58);
184 ip->xDD4_itemVar.ray.scale = 1e-3F;
185 ip->xDD4_itemVar.ray.angle = atan2f(ip->x40_vel.y, ip->x40_vel.x);
186 while (ip->xDD4_itemVar.ray.angle < 0.0F) {
188 }
189 while (ip->xDD4_itemVar.ray.angle > M_TAU) {
191 }
192 return false;
193}
194
195static inline void Item_ResetRayAfterReflection(Item* ip, HSD_JObj* jobj)
196{
197 HSD_JObjSetScaleZ(jobj, ip->xDD4_itemVar.ray.scale = 1e-3F);
198 ip->xDD4_itemVar.ray.angle += M_PI;
199 while (ip->xDD4_itemVar.ray.angle < 0.0F) {
201 }
202 while (ip->xDD4_itemVar.ray.angle > M_TAU) {
204 }
205}
206
207static inline void Item_InitRaySpawnFields(SpawnItem* spawn, HSD_GObj* parent,
208 f32 facing_dir)
209{
210 spawn->facing_dir = facing_dir;
211 spawn->x3C_damage = 0;
212 spawn->vel.x = spawn->vel.y = spawn->vel.z = 0.0F;
213 spawn->x0_parent_gobj = parent;
214 spawn->x4_parent_gobj2 = spawn->x0_parent_gobj;
215 spawn->x44_flag.b0 = true;
216 spawn->x40 = 0;
217}
218
219static inline void Item_InitRaySpawnPosition(SpawnItem* spawn,
220 HSD_GObj* parent, Vec3* pos)
221{
222 spawn->prev_pos = *pos;
223 spawn->prev_pos.z = 0.0F;
224 it_8026BB68(parent, &spawn->pos);
225}
226
227static inline void itUpdateVelocityFromBone(HSD_JObj* jobj, Item* ip,
228 Vec3* previous_pos)
229{
230 Vec3 pos;
231 Vec3 zero;
232
233 if (jobj != NULL) {
234 zero.x = zero.y = zero.z = 0.0F;
235 HSD_JObjGetTranslation(jobj, &pos);
236 ip->x40_vel.x = ip->facing_dir * (pos.z - previous_pos->z);
237 ip->x40_vel.y = pos.y - previous_pos->y;
238 ip->x40_vel.z = pos.x - previous_pos->x;
239 *previous_pos = pos;
241 }
242}
243
245{
246 const f32 PI_2 = M_PI / 2;
247 Item* ip = (Item*) HSD_GObjGetUserData(gobj);
248 HSD_JObj* jobj = (HSD_JObj*) HSD_GObjGetHSDObj(gobj);
249
250 it_80273030(gobj);
251 HSD_JObjSetRotationY(jobj, PI_2 * ip->facing_dir);
252 return false;
253}
254
255static inline void Item_InitSpawnOnPlane(SpawnItem* spawn, HSD_GObj* parent,
256 Vec3* pos, f32 dir)
257{
258 spawn->prev_pos = *pos;
259 spawn->prev_pos.z = 0.0F;
260 spawn->pos = spawn->prev_pos;
261 spawn->facing_dir = dir;
262 spawn->x3C_damage = 0;
263 spawn->vel.x = spawn->vel.y = spawn->vel.z = 0.0F;
264 spawn->x0_parent_gobj = parent;
265 spawn->x4_parent_gobj2 = spawn->x0_parent_gobj;
266 spawn->x44_flag.b0 = true;
267 spawn->x40 = 0;
268}
269
271 HSD_GObj* parent,
272 Vec3* pos, f32 dir)
273{
274 spawn->prev_pos = *pos;
275 spawn->prev_pos.z = 0.0F;
276 spawn->pos = spawn->prev_pos;
277 spawn->facing_dir = dir;
278 spawn->x3C_damage = 0;
279 spawn->vel.x = spawn->vel.y = spawn->vel.z = 0.0F;
280 spawn->x0_parent_gobj = parent;
281 spawn->x4_parent_gobj2 = spawn->x0_parent_gobj;
282 spawn->x44_flag.b0 = false;
283 spawn->x40 = 0;
284}
285
286#endif
void efLib_ResumeAll(HSD_GObj *gobj)
Definition eflib.c:316
void efLib_PauseAll(HSD_GObj *gobj)
Definition eflib.c:289
struct Vec Vec3
float f32
Definition types.h:13
float atan2f(float, float)
Definition lbtrigf.c:17
static const Vec3 zero
Definition ftLk_SpecialN.c:202
static void * HSD_GObjGetUserData(HSD_GObj *gobj)
Definition gobj.h:144
static void * HSD_GObjGetHSDObj(HSD_GObj *gobj)
Definition gobj.h:149
#define M_TAU
Definition grbigblue.c:110
#define GET_ITEM(gobj)
Definition inlines.h:14
static void itUpdateVelocityFromBone(HSD_JObj *jobj, Item *ip, Vec3 *previous_pos)
Definition inlines.h:227
static void Item_InitSpawnOnPlaneNoInitialCollision(SpawnItem *spawn, HSD_GObj *parent, Vec3 *pos, f32 dir)
Definition inlines.h:270
static void Item_InitSpawn(SpawnItem *spawn, HSD_GObj *parent, Vec3 *pos, f32 dir)
Definition inlines.h:62
static bool Item_UpdateRayAnimation(Item_GObj *gobj, Item *ip, HSD_JObj *jobj, const f32 *max_scale, f32 scale_divisor)
Definition inlines.h:141
static void Item_ClampAngle(f32 *angle)
Definition inlines.h:121
static void Item_InitRaySpawnFields(SpawnItem *spawn, HSD_GObj *parent, f32 facing_dir)
Definition inlines.h:207
static bool itReflectItemAndUpdateRotation(Item_GObj *gobj)
Definition inlines.h:244
static void Item_AttachGameWatchArticle(HSD_GObj *parent, Fighter_Part part, Item_GObj *item_gobj, void **attributes)
Definition inlines.h:84
static void Item_InitSpawnOnPlane(SpawnItem *spawn, HSD_GObj *parent, Vec3 *pos, f32 dir)
Definition inlines.h:255
static void Item_EnterAirStateWithHitlag(Item_GObj *gobj, enum_t msid)
Definition inlines.h:93
static void Item_UpdateRollingShellRotation(Item_GObj *gobj, Item *ip, HSD_JObj *jobj, const f32 *rotation_rate)
Definition inlines.h:112
static void Item_ClampAngleReverse(f32 *angle)
Definition inlines.h:131
static void Item_InitRaySpawnPosition(SpawnItem *spawn, HSD_GObj *parent, Vec3 *pos)
Definition inlines.h:219
static Item_GObj * Item_AttachToParent(Item_GObj *item_gobj, HSD_GObj *parent, Fighter_Part part)
Definition inlines.h:77
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:23
static void Item_ResetRayAfterReflection(Item *ip, HSD_JObj *jobj)
Definition inlines.h:195
static void Item_EnterAirStateWithHitlagAndStateDesc(Item_GObj *gobj)
Definition inlines.h:102
static bool Item_BounceRayOffShield(Item_GObj *gobj)
Definition inlines.h:179
void it_802762BC(Item *)
Definition itmaplib.c:301
bool it_80273130(Item_GObj *)
Definition it_2725.c:452
bool it_80273030(Item_GObj *)
Definition it_2725.c:412
void it_8026BB68(HSD_GObj *fighter_gobj, Vec3 *pos)
Adjust item's position to fp bone.
Definition it_26B1.c:691
void it_80273670(Item_GObj *item_gobj, int arg1, f32 arg8)
Definition it_2725.c:623
void Item_80268E5C(HSD_GObj *gobj, enum_t msid, Item_StateChangeFlags flags)
Change item state.
Definition item.c:1165
void Item_8026AB54(Item_GObj *gobj, HSD_GObj *owner_gobj, Fighter_Part part)
Pick up item.
Definition item.c:2029
float it_802A3C98(Vec3 *arg0, Vec3 *arg1, Vec3 *arg2)
Definition itlinkhookshot.c:868
void it_80276CB8(Item_GObj *item_gobj)
Definition itmaplib.c:564
#define M_PI
Definition itparasol.c:14
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:708
static void HSD_JObjSetRotationY(HSD_JObj *jobj, f32 y)
Definition jobj.h:314
static HSD_JObj * HSD_JObjGetChild(HSD_JObj *jobj)
Definition jobj.h:195
static void HSD_JObjSetScaleZ(HSD_JObj *jobj, f32 z)
Definition jobj.h:435
static void HSD_JObjSetRotationX(HSD_JObj *jobj, f32 x)
Definition jobj.h:294
static void HSD_JObjGetTranslation(HSD_JObj *jobj, Vec3 *translate)
Definition jobj.h:564
static void HSD_JObjAddRotationY(HSD_JObj *jobj, float y)
Definition jobj.h:615
static void HSD_JObjSetTranslate(HSD_JObj *jobj, Vec3 *translate)
Definition jobj.h:478
Refraction visual effects using GX indirect textures.
void lbVector_Mirror(Vec3 *a, Vec3 *unit_mirror_axis)
8000DC6C - compute a -= 2*<a,b>*b.
Definition lbvector.c:260
Fighter_Part
Definition forward.h:252
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
int enum_t
The underlying type of an enum, used as a placeholder.
Definition platform.h:27
static unsigned long int next
Definition rand.c:3
float cosf(float x)
Definition trigf.c:70
float sinf(float x)
Definition trigf.c:26
#define M_PI_2
Definition math.h:13
#define ABS(x)
Definition math.h:87
void db_80225DD8(Item_GObj *item, Fighter_GObj *owner)
Definition dbitem.c:210
#define NULL
Definition stddef.h:19
Definition gobj.h:24
Definition jobj.h:107
Definition types.h:218
union Item::Item_ItemVars xDD4_itemVar
HSD_GObjEvent exited_hitlag
Definition types.h:462
Vec3 xC58
Definition types.h:381
Vec3 x40_vel
Definition types.h:267
f32 facing_dir
Definition types.h:252
HSD_GObjEvent entered_hitlag
Runs after applying hitlag in damage.
Definition types.h:459
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:322
float speed
Definition itCommonItems.h:324
float angle
Definition itCommonItems.h:323
itRay_ItemVars ray
Definition types.h:603
u8 b0
Definition types.h:22