Alchemy
Loading...
Searching...
No Matches

move.c

Go to the documentation of this file.
1/// @file
2/// Move: a hand pushes the target, steered with the d-pad.
3/// Part of psynergy_effects.c, compiled only through it.
4
6
7/// Returns the direction of the d-pad (0x10000 a full turn): right 0, down
8/// 0x4000, left 0x8000, up 0xc000; 0xffff when none or a diagonal is held.
10 // Indexed by the right, left, up and down bits.
11 return gBattleFx_CyclePatternWords[(gKeysHeld >> 4) & 15];
12}
13
14/// Per-frame update of a broken item's main fragment: turns it toward the
15/// object it is linked to, at most 1/16 turn a frame, and sheds a particle
16/// (object 0x11d) round it.
18 struct FieldActor *source = (struct FieldActor *)fieldObject;
19 struct FieldActor *target;
20 struct EffectVector position;
21 struct ItemBreakFragmentObject *fragment;
22 s32 turn;
23 s32 radius;
24
25 target = source->linkedObject;
26 if (target != 0) {
27 s32 dx = target->x.fixed - source->x.fixed;
28 s32 dz = target->z.fixed - source->z.fixed;
29
30 if (dx != 0 || dz != 0) {
31 turn = (s16)(ArcTan2(dz, dx) - source->facing);
32 if (turn > 0x1000)
33 turn = 0x1000;
34 if (turn < -0x1000)
35 turn = -0x1000;
36 source->facing += turn;
37 }
38 source->steeringFlags = 0;
39 }
40
41 // The particle starts 8 to 24 pixels lower and up to 48 pixels away in a
42 // random direction.
43 position.x = source->x.fixed;
44 position.y = source->y.fixed - (Random16() << 4) - 0x80000;
45 position.z = source->z.fixed;
46 radius = Random16() * 3;
47 radius <<= 4;
48 Vector_AddPolarOffset(radius, Random16(), &position);
49
50 fragment = (struct ItemBreakFragmentObject *)Object_Spawn(
51 0x11d, position.x, position.y, position.z);
52 BattleFx_InitializeFallingFragment(fragment);
53}
54
55#define MOVE_CELL_MASK 0xfff00000 ///< a 16-pixel tile
56
57/// Puts the pushing hand beside the target and pushes the target 16 pixels the
58/// way the d-pad points, for as long as the player pushes; A, B, L or R end it.
59///
60/// Abilities: Move (field kind 1), cast on a target.
61///
62/// Where the target cannot go, an error sound plays every 16 frames. When the
63/// push would run into the caster, the caster blocks it or, when the tile
64/// beyond is free, is pushed along too.
66 struct EffectVector position;
67 struct EffectVector beyond;
68 struct BattleFxScene *work;
69 struct FieldActor *user;
70 struct FieldActor *target;
71 struct FieldActor *pusher;
72 struct FieldActor *hit;
73 s32 x;
74 s32 z;
75 s32 angle;
76 s32 moved;
77 s32 direction;
78 s32 keys;
79 s32 cellX;
80 s32 cellZ;
81 struct EffectVector *candidate;
82
83 work = gEffectWork;
84 user = work->mainObject;
85 target = work->child;
86 angle = work->angle + 0x8000; // opposite work->angle
87 moved = 0;
88 if (target == NULL)
89 return;
91 user->linkedObject = target;
94 pusher = BattleFx_StartItemBreak(user);
95 if (pusher == NULL) {
97 return;
98 }
99
100 // The hand goes 16 pixels above the target and 16 pixels toward angle.
101 pusher->linkedObject = target;
102 candidate = &position;
103 SET_POSITION(candidate, target->x.fixed, target->y.fixed + (16 << 16),
104 target->z.fixed);
105 Vector_AddPolarOffset(16 << 16, angle, candidate);
106 Object_SetMoveTargetFar((struct ObjectRuntime *)pusher, candidate->x,
107 candidate->y, candidate->z);
108 BattleFx_SnapScaleToFull((struct MotionObject *)pusher);
109 pusher->speed = 4 << 16;
110 pusher->acceleration = 0x8000;
111 pusher->motionFlags = 4;
112 target->update = ObjectGroup_ApplyRandomChildValues; // cycle its colours
113 target->speed = 0x6666;
114 target->acceleration = 0x3333;
115 target->steeringFlags = moved;
116 target->terrainId = 2;
117 for (;;) {
118 WaitFrames(1);
119 keys = gKeysPressed & (KEY_A | KEY_B | KEYS_SHOULDERS);
120 if (keys != 0)
121 break;
122
123 // With the d-pad released, the hand goes back to its place.
124 direction = (u16)Input_GetDpadAngle(gKeysHeld);
125 if (direction == 0xffff) {
126 position.x = target->x.fixed;
127 position.y = target->y.fixed + (16 << 16);
128 position.z = target->z.fixed;
129 Vector_AddPolarOffset(16 << 16, angle, &position);
130 Object_SetMoveTargetFar((struct ObjectRuntime *)pusher, position.x,
131 position.y, position.z);
133 SET_VELOCITY(pusher, 0, 0, 0);
134 continue;
135 }
136
137 // The hand leans 2 pixels the way it pushes; check the tiles 16 and 32
138 // pixels beyond the target.
139 position.x = target->x.fixed;
140 position.y = target->y.fixed + (16 << 16);
141 position.z = target->z.fixed;
142 Vector_AddPolarOffset(16 << 16, angle, &position);
143 Vector_AddPolarOffset(2 << 16, direction, &position);
144 Object_SetMoveTargetFar((struct ObjectRuntime *)pusher, position.x,
145 position.y, position.z);
147 position.x = target->x.fixed;
148 position.y = target->y.fixed;
149 position.z = target->z.fixed;
150 Vector_AddPolarOffset(16 << 16, direction, &position);
151 beyond.x = target->x.fixed;
152 beyond.y = target->y.fixed;
153 beyond.z = target->z.fixed;
154 Vector_AddPolarOffset(32 << 16, direction, &beyond);
155 if (Map_CheckObjectStepFar((struct ObjectRuntime *)target,
156 (struct FieldPosition *)&position) > 0) {
158 if ((gFrameCount & 15) == 0)
160 continue;
161 }
163 (struct ScriptObjectEntry *)target, (s32 *)candidate);
164 if (hit != NULL) {
165 if (hit != user) {
167 if ((gFrameCount & 15) == 0)
169 continue;
170 }
171
172 // The push runs into the caster: if the caster stands on the tile the
173 // target would move to, it cannot be pushed; if the caster stands on the
174 // tile 32 pixels on, the caster moves along when the tile beyond is free.
175 cellX = user->x.fixed & MOVE_CELL_MASK;
176 cellZ = user->z.fixed & MOVE_CELL_MASK;
177 if (cellX == (candidate->x & MOVE_CELL_MASK) &&
178 cellZ == (candidate->z & MOVE_CELL_MASK)) {
180 if ((gFrameCount & 15) == 0)
182 continue;
183 }
184 if (cellX == (beyond.x & MOVE_CELL_MASK) &&
185 cellZ == (beyond.z & MOVE_CELL_MASK)) {
187 beyond.z) != 0) {
189 if ((gFrameCount & 15) == 0)
191 continue;
192 }
193 moved = 1;
194 }
195 }
196
197 // Push: the hand's animation comes from the turn between angle and the
198 // push (in quarter turns).
200 x = position.x;
201 z = position.z;
203 pusher, gBattleFx_QuadrantModes[(u16)(angle - direction) >> 14]);
204 WaitFrames(15);
205 target->paused = 0;
206 target->speed = 0x3333;
207 target->acceleration = 0x3333;
208 Object_SetMoveTargetFar((struct ObjectRuntime *)target, position.x,
209 position.y, position.z);
210 pusher->motionFlags = 0;
211 pusher->speed = 0x3333;
212 pusher->acceleration = 0x3333;
213 Vector_AddPolarOffset(16 << 16, direction, &position);
214 Object_SetMoveTargetFar((struct ObjectRuntime *)pusher, position.x,
215 position.y + (16 << 16), position.z);
216 if (moved == 1) {
217 Object_GetById(work->firstObjectId)->steeringFlags &= 0xfe;
218 user->speed = 0x3333;
219 user->acceleration = 0x3333;
220 Object_SetMoveTargetFar((struct ObjectRuntime *)user, beyond.x, beyond.y,
221 beyond.z);
222 }
224 target->x.fixed = x;
225 target->z.fixed = z;
226 target->velocityX = 0;
227 target->velocityZ = 0;
228 break;
229 }
230
231 // Restore the target's colours, script and update, and remove the hand.
233 work->savedPalette);
235 work->savedScript);
236 target->update = work->savedCallback;
238 if (moved == 1)
239 (Object_GetById(work->firstObjectId))->steeringFlags |= 1;
242}
243
244/// Effect slot callback of a particle that flies 30 pixels out from where it
245/// started, comes back and is freed.
247 // Forward state-1 fallthrough keeps the callback extent but changes native
248 // instructions; retain the immediate retry until a plain form matches.
249 struct EffectVector position;
250 s8 *statePtr = &slot->state;
251 s32 state;
252
253next_state:
254 state = *statePtr;
255 if (state == 0) {
256 u32 angle;
257
258 position.x = slot->originX;
259 position.z = slot->originZ;
260 angle = Random16();
261 Vector_AddPolarOffset(30 << 16, (u16)angle, &position);
262 slot->targetX = position.x;
263 slot->targetZ = position.z;
264 slot->acceleration = 4 << 16;
265 slot->maxSpeed = 4 << 16;
266 slot->limitTurnStep = state;
267 (*statePtr)++;
268 return;
269 }
270
271 if (state == 1) {
272 if (EffectSlot_HasPendingTarget(slot) == 0) {
273 (*statePtr)++;
274 goto next_state;
275 }
276 return;
277 }
278
279 if (state == 2) {
280 slot->targetX = slot->originX;
281 slot->targetZ = slot->originZ;
282 slot->maxTurnStep = 0x400;
283 slot->limitTurnStep = 1;
284 (*statePtr)++;
285 return;
286 }
287
288 if (state == 3 && EffectSlot_HasPendingTarget(slot) == 0)
290}
291
292/// Shows the broken item beside the caster for 30 frames, then turns it into
293/// particles.
294///
295/// Abilities: Move (field kind 1), cast with no target.
296void FieldFx_RunMove(void) {
297 UNUSED s32 work[3];
298 struct BattleFxScene *scene;
299 void *object;
300
301 scene = gEffectWork;
302 object = scene->mainObject;
303
304 /* FAKEMATCH(one-pass): the call in a do { } while (0), which keeps the
305 * mainObject load below the frame's sub sp; as a plain call, 2 of 24
306 * instructions differ in tbs-en. */
307 do {
309 } while (0);
310 object = BattleFx_StartItemBreak(object);
312 if (object != 0) {
314 WaitFrames(30);
315 }
318}
319
320/// Spawns the broken item (object 215) 16 pixels above object and moves it 16
321/// pixels the way object faces (to the nearest quarter turn), with 8
322/// particles round it. Returns the item, or 0.
323void *BattleFx_StartItemBreak(void *object) {
324 struct MotionObject *source = object;
325 struct MotionObject *parent;
326 struct MotionObject *child;
327 s32 angle;
328 s32 radius;
329 s32 speed;
330 s32 fragmentIndex;
331 u32 spread;
332 u32 jitter;
333
334 angle = (source->angle + 0x2000) & 0xc000; // to the nearest quarter turn
335 parent = (struct MotionObject *)Object_Spawn(
336 215, source->x, source->y + (16 << 16), source->z);
337 if (parent == 0)
338 return 0;
339 parent->scaleY = 0x4000; // from 0.25
340 parent->scaleX = 0x4000;
342 parent->speedLimit = 2 << 16;
343 parent->acceleration = 2 << 16;
344 parent->motionFlags = 0;
347 16 << 16, angle);
348
349 // Particles: 8 to 32 pixels within 1/8 turn of the way it faces, at 1 to 2
350 // pixels a frame.
351 for (fragmentIndex = 7; fragmentIndex >= 0; fragmentIndex--) {
352 child = (struct MotionObject *)Object_Spawn(
353 285, source->x, source->y + (16 << 16), source->z);
354 if (child != 0) {
357 speed = Random16() + 0x10000;
358 child->acceleration = 1 << 16;
359 child->speedLimit = speed;
360 child->motionFlags = 2;
361 child->verticalMotionStrength = 0x51e;
362 spread = Random16();
363 child->velocityY = spread - Random16();
364 radius = Random16() * 24 + (8 << 16);
365 jitter = Random16();
367 (struct ObjectRuntime *)child, radius,
368 ((jitter - Random16()) >> 3) + source->angle);
369 }
370 }
372 return parent;
373}
374
375/// Per-frame update: grows an object's scale by 1/16 a frame up to full size
376/// and fixes its position.
378 s32 next;
379 s32 scale;
380
381 if (obj != NULL) {
382 scale = obj->scaleX;
383 if (scale <= 0xffff) {
384 do {
385 next = scale + 0x1000;
386 scale = next;
387 } while (next <= 0xffff);
388 obj->scaleX = next;
389 obj->scaleY = next;
390 }
392 }
393}
394
395/// Per-frame update: the object spins as it rises for 31 frames, shrinks, and
396/// bursts into 8 particles.
397void UpdateRisingParticleBurst(void *object) {
398 struct MotionObject *src = object;
399 struct MotionObject *child;
400 s32 i;
401 s32 dist;
402 u32 spread;
403
405 for (i = 30; i >= 0; i--) {
406 src->y += 1 << 16;
407 src->angle += 0x2000; // 1/8 turn
408 src->scaleX += -0x800;
409 src->scaleY += -0x800;
410 WaitFrames(1);
411 }
412 for (i = 7; i >= 0; i--) {
413 child = (struct MotionObject *)Object_Spawn(285, src->x, src->y, src->z);
414 if (child != 0) {
415 s32 speed;
416 /* FAKEMATCH(temporary): 1.0 in a block local set before the block's
417 * calls, which loop.c hoists for both uses; as the constant at both
418 * uses, 24 of 93 instructions differ in tbs-en. */
419 s32 unit = 0x10000;
420
423 speed = Random16();
424 child->acceleration = unit;
425 child->speedLimit = speed + unit;
426 child->motionFlags = 2;
427 child->verticalMotionStrength = 0xa3d;
428 spread = Random16();
429 child->velocityY = spread - Random16();
430 dist = Random16() * 24;
431 dist += 8 << 16;
433 dist, Random16());
434 }
435 }
438}
439
440#undef MOVE_CELL_MASK
struct FieldActor * Object_GetById(s32 actor)
Returns an actor, or NULL if it does not exist.
u32 EffectSlot_HasPendingTarget(struct EffectSlot *effect)
Returns nonzero while an effect slot that stops at its target still has one (it has not arrived),...
void BattleFx_ClearOwnedSlot(struct EffectSlot *slot)
Frees an effect slot and its sprite.
struct ScriptObjectEntry * ScriptObject_FindOverlappingEntryFar(struct ScriptObjectEntry *object, s32 *values)
void ObjectDispatch_ReleaseFar(struct DispatchObject *obj)
s32 Map_GetCellAttributeLowNibbleFar(s32 index, s32 x, s32 y)
void ObjectDispatch_SelectAnimationFar(void *raw, s32 no)
void ObjectDispatch_InitializeFar(struct DispatchObject *obj, const s32 *script)
void Object_SetMoveTargetFar(struct ObjectRuntime *object, s32 x, s32 y, s32 z)
void Animation_ApplyChildValuesFar(struct DispatchObject *obj, u32 val)
s32 Map_CheckObjectStepFar(struct ObjectRuntime *object, struct FieldPosition *position)
void FieldObject_WaitForMoveFar(void *fieldObject)
void AudioCommand_PlayFar(s32 id)
void WaitFrames(s32 frames)
The game's frame loop: runs frames frames and returns.
Definition frame.c:97
volatile u32 gFrameCount
Frames WaitFrames has finished.
const u8 gBattleFx_QuadrantModes[4]
Definition fxdata.c:473
const s32 gBattleFx_FragmentScript[]
Definition fxdata.c:456
const s32 gBattleFx_SourceHoldScript[]
Definition fxdata.c:450
const u16 gBattleFx_CyclePatternWords[16]
An angle for each value of the right, left, up and down bits of the +Control Pad; 0xffff for none.
Definition fxdata.c:466
void * gEffectWork
Slot 56: points to a scene-specific structure.
@ KEY_B
Definition io_reg.h:244
@ KEY_A
Definition io_reg.h:243
@ KEYS_SHOULDERS
Definition io_reg.h:256
volatile u32 gKeysHeld
Keys down now.
volatile u32 gKeysPressed
Keys that went down this frame.
#define SET_VELOCITY(p, vx, vy, vz)
Definition macros.h:18
#define SET_POSITION(p, px, py, pz)
Sets the position or the velocity of a particle, a piece of debris or an object in one statement.
Definition macros.h:16
void Vector_AddPolarOffset(s32 radius, s32 angle, void *position)
Moves the point position by radius in direction angle on the ground plane: x by the cosine,...
Definition math.c:23
u32 Random16(void)
Advances the game's random number generator (the C library's classic linear congruential one),...
Definition math.c:10
s32 ArcTan2(s32 x, s32 y)
Returns the angle of the vector (x, y), in 1/65536 turns, measured from the y axis: 0 along +y,...
Definition math.c:36
void BattleFx_UpdateItemBreakFragment(union FieldObject *fieldObject)
Per-frame update of a broken item's main fragment: turns it toward the object it is linked to,...
Definition move.c:17
#define MOVE_CELL_MASK
a 16-pixel tile
Definition move.c:55
s32 Input_GetDpadAngle(u32 unused)
Returns the direction of the d-pad (0x10000 a full turn): right 0, down 0x4000, left 0x8000,...
Definition move.c:9
void * BattleFx_StartItemBreak(void *object)
Spawns the broken item (object 215) 16 pixels above object and moves it 16 pixels the way object face...
Definition move.c:323
void UpdateRisingParticleBurst(void *object)
Per-frame update: the object spins as it rises for 31 frames, shrinks, and bursts into 8 particles.
Definition move.c:397
void BattleFx_UpdateOrbitAndReturn(struct EffectSlot *slot)
Effect slot callback of a particle that flies 30 pixels out from where it started,...
Definition move.c:246
void BattleFx_SnapScaleToFull(struct MotionObject *obj)
Per-frame update: grows an object's scale by 1/16 a frame up to full size and fixes its position.
Definition move.c:377
void BattleFx_SteerPushedTarget(s32 targetId)
Puts the pushing hand beside the target and pushes the target 16 pixels the way the d-pad points,...
Definition move.c:65
void FieldFx_RunMove(void)
Shows the broken item beside the caster for 30 frames, then turns it into particles.
Definition move.c:296
void Motion_SetTargetPositionFromMagnitudeAngle(struct ObjectRuntime *object, s32 magnitude, s32 angle)
Sends an object toward the point magnitude (16.16 pixels) away from it in direction angle: sets its m...
Definition dispatch.c:308
struct ObjectRuntime * Object_Spawn(s32 kind, s32 x, s32 y, s32 z)
Creates an object for an effect, at the caster's ground height, with sprite priority 0 and animation ...
Definition dispatch.c:371
void ObjectGroup_ApplyRandomChildValues(union FieldObject *fieldObject)
Per-frame update: sets every part of an object's sprite to param frame % 6, which cycles its colours.
Definition dispatch.c:270
void BattleEffect_InitializeSharedScene(void)
Saves the palettes for the effect (once, unless an effect is already shown) and fades them toward one...
Definition setup.c:236
void BattleFx_PrepareBufferInterpolation(void)
Fades the palettes back from an effect's colours to the saved ones (or to palette 0x10001 while an ef...
Definition setup.c:275
void EffectRuntime_StopCurrentObject(void)
Stops the caster's per-frame hook and restores its colours.
Definition setup.c:94
What every part of psynergy_effects.c shares: its includes and the macros and types more than one par...
#define SE_131
Definition songs.h:124
#define SE_CAST
Definition songs.h:149
#define SE_175
Definition songs.h:170
#define SE_MENU_ERROR
Definition songs.h:107
#define SE_ITEM_BREAK
Definition songs.h:131
#define NULL
Definition bilibin.h:6
The work of a Psynergy effect scene: its caster and target, where it takes place, the map state it re...
Definition fx_scene.h:31
s32 angle
1/65536 turns
Definition fx_scene.h:32
void * mainObject
the caster's object
Definition fx_scene.h:36
void * child
the target's object, or NULL
Definition fx_scene.h:37
A field object as the object dispatcher's far calls take it.
A particle a Psynergy effect moves and draws: its sprite, its position and target,...
Definition effect_slot.h:18
s8 state
the callback's own step; 0 when it is given
Definition effect_slot.h:38
s32 originX
16.16 fixed-point pixels; where the slot started
Definition effect_slot.h:24
s16 maxTurnStep
1/65536 turns a frame
Definition effect_slot.h:32
s8 limitTurnStep
Clamp steering to maxTurnStep; zero faces the target directly.
Definition effect_slot.h:40
s32 originZ
16.16 fixed-point pixels; where the slot started
Definition effect_slot.h:25
s32 targetZ
16.16 fixed-point pixels; EFFECT_NO_TARGET at rest
Definition effect_slot.h:23
s32 targetX
16.16 fixed-point pixels; EFFECT_NO_TARGET at rest
Definition effect_slot.h:22
s32 maxSpeed
16.16 fixed-point pixels per frame
Definition effect_slot.h:27
s32 acceleration
16.16 fixed-point pixels per frame, each frame
Definition effect_slot.h:28
A world position, as Camera_WorldToScreen converts it to the screen.
Definition battle.h:73
s32 y
16.16 fixed-point pixels
Definition battle.h:75
s32 z
16.16 fixed-point pixels
Definition battle.h:76
s32 x
16.16 fixed-point pixels
Definition battle.h:74
A field actor: a person or thing on the field with a position, motion toward a target,...
Definition field_obj.h:30
s32 speed
speed limit, 16.16 fixed-point pixels per frame
Definition field_obj.h:55
struct FieldActor * linkedObject
The object its action script follows or faces.
Definition field_obj.h:114
u8 steeringFlags
ActorSteeringFlag bits.
Definition field_obj.h:92
u8 motionFlags
ActorMotionFlag bits; zero is free flight in 3D, and 3 is set on creation.
Definition field_obj.h:83
union FieldCoordinate x
16.16 fixed-point pixels
Definition field_obj.h:35
union FieldCoordinate y
16.16 fixed-point pixels
Definition field_obj.h:36
union FieldCoordinate z
16.16 fixed-point pixels
Definition field_obj.h:37
u16 facing
1/65536 turns
Definition field_obj.h:34
s32 acceleration
Added toward the target each frame, or taken off the speed when there is none, in 16....
Definition field_obj.h:58
void(*) update(union FieldObject *object)
Called each frame before the object's script, while the object is live.
Definition field_obj.h:116
u16 work
The side of the player's next footprint (2 after a stop), or scene scratch.
Definition field_obj.h:112
u8 terrainId
The map layer (0 to 3) its ground height is read from, which the scrolling camera updates from the ce...
Definition field_obj.h:47
A position on the field.
s32 z
16.16 fixed-point pixels
A FieldActor seen with the halfword at 0x5e (its lifetime), which FieldActor does not name.
An effect object that moves and draws one sprite: its position, scale, velocity and target,...
Definition motobj.h:20
s32 scaleX
16.16 fixed point, 0x10000 full size
Definition motobj.h:27
s32 speedLimit
16.16 fixed-point pixels per frame
Definition motobj.h:34
s32 z
16.16 fixed-point pixels
Definition motobj.h:25
void(*) update(union FieldObject *object)
run first each frame
Definition motobj.h:63
s32 y
16.16 fixed-point pixels
Definition motobj.h:24
u16 angle
1/65536 turns
Definition motobj.h:22
u8 motionFlags
bits: 4 no terrain slowdown | 3 bigger float | 2 floats | 1 falls | 0 follows terrain
Definition motobj.h:55
s32 acceleration
Horizontal speed gained each frame towards the target, or lost braking without one,...
Definition motobj.h:37
s32 scaleY
16.16 fixed point, 0x10000 full size
Definition motobj.h:28
s32 x
16.16 fixed-point pixels
Definition motobj.h:23
One of the 64 field objects in the object pool (heap slot 5): its script, position,...
s32 velocityZ
16.16 fixed-point pixels per frame
s32 velocityX
16.16 fixed-point pixels per frame
s32 z
16.16 fixed-point pixels
s32 acceleration
Added toward the target each frame, or taken off the speed when there is none, in 16....
s32 x
16.16 fixed-point pixels
A field object as the script commands' overlap checks see it.
signed int s32
Definition types.h:14
unsigned int u32
Definition types.h:15
signed char s8
Definition types.h:10
signed short s16
Definition types.h:12
unsigned short u16
Definition types.h:13
#define UNUSED
Definition types.h:22
s32 fixed
16.16 fixed-point pixels
An object on the field, read as an actor or as an effect.