Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/SPZ/PimPom.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: PimPom Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectPimPom *PimPom;
11
12
void PimPom_Update(void)
13
{
14
RSDK_THIS(PimPom);
15
16
StateMachine_Run(self->state);
17
StateMachine_Run(self->stateMove);
18
19
if (self->sfxTimer > 0)
20
self->sfxTimer--;
21
}
22
23
void PimPom_LateUpdate(void) {}
24
25
void PimPom_StaticUpdate(void) {}
26
27
void PimPom_Draw(void)
28
{
29
RSDK_THIS(PimPom);
30
31
Vector2 drawPos = self->drawPos;
32
drawPos.x = self->drawPos.x + self->offset.x;
33
drawPos.y = self->drawPos.y - self->offset.y;
34
35
for (int32 i = self->length; i >= 0; --i) {
36
RSDK.DrawSprite(&self->animator, &drawPos, false);
37
drawPos.x -= self->moveAmount.x;
38
drawPos.y += self->moveAmount.y;
39
}
40
}
41
42
void PimPom_Create(void *data)
43
{
44
RSDK_THIS(PimPom);
45
46
if (!SceneInfo->inEditor) {
47
self->active = ACTIVE_BOUNDS;
48
self->visible = true;
49
50
self->updateRange.x = (40 - (self->length * (self->gap + 24))) << 16;
51
self->updateRange.y = (40 - (self->length * (self->gap + 24))) << 16;
52
self->drawGroup = Zone->objectDrawGroup[0] + 1;
53
self->newAngle = 0x20 * self->angle;
54
self->angle = 0x20 * self->angle;
55
self->negAngle = 0x100 - self->angle;
56
self->rotation = 2 * self->negAngle;
57
58
int32 offset = self->type ? 24 : 8;
59
60
self->offset.x = ((self->length * (offset + self->gap)) << 8) * RSDK.Cos256(self->angle);
61
self->offset.y = ((self->length * (offset + self->gap)) << 8) * RSDK.Sin256(self->angle);
62
63
self->moveAmount.x = ((offset + self->gap) * RSDK.Cos256(self->angle)) << 9;
64
self->moveAmount.y = ((offset + self->gap) * RSDK.Sin256(self->angle)) << 9;
65
self->drawPos = self->position;
66
67
switch (self->type) {
68
case PIMPOM_SINGLE:
69
RSDK.SetSpriteAnimation(PimPom->aniFrames, 0, &self->animator, true, self->color);
70
self->hitbox.left = -8;
71
self->hitbox.top = -8;
72
self->hitbox.right = 8;
73
self->hitbox.bottom = 8;
74
self->state = PimPom_State_Single;
75
break;
76
77
case PIMPOM_HORIZONTAL:
78
switch (self->angle) {
79
case 0x00: RSDK.SetSpriteAnimation(PimPom->aniFrames, 1, &self->animator, true, 0); break;
80
81
case 0x20:
82
self->drawFX = FX_FLIP;
83
self->direction = FLIP_X;
84
RSDK.SetSpriteAnimation(PimPom->aniFrames, 2, &self->animator, true, 0);
85
break;
86
87
case 0x40: RSDK.SetSpriteAnimation(PimPom->aniFrames, 3, &self->animator, true, 0); break;
88
case 0x60: RSDK.SetSpriteAnimation(PimPom->aniFrames, 2, &self->animator, true, 0); break;
89
default: break;
90
}
91
92
if (self->gap >= 16) {
93
self->hitbox.left = -24;
94
self->hitbox.top = -8;
95
self->hitbox.right = 24;
96
self->hitbox.bottom = 8;
97
self->state = PimPom_State_Horizontal;
98
}
99
else {
100
int32 len = self->length * (self->gap + 24);
101
self->hitbox.bottom = 8;
102
self->state = PimPom_State_Horizontal;
103
self->hitbox.left = -24 - len;
104
self->hitbox.top = -8;
105
self->hitbox.right = len + 24;
106
}
107
break;
108
109
case PIMPOM_DIAGONAL:
110
RSDK.SetSpriteAnimation(PimPom->aniFrames, 2, &self->animator, true, 0);
111
self->drawFX = FX_ROTATE | FX_FLIP;
112
113
self->hitbox.left = -24;
114
self->hitbox.top = -6;
115
self->hitbox.right = 24;
116
self->hitbox.bottom = 6;
117
self->angle = self->direction == FLIP_X ? 0x20 : 0xE0;
118
self->negAngle = 0x100 - self->angle;
119
self->state = PimPom_State_Horizontal;
120
break;
121
122
case PIMPOM_VERTICAL:
123
RSDK.SetSpriteAnimation(PimPom->aniFrames, 1, &self->animator, true, 0);
124
self->drawFX = FX_ROTATE;
125
126
if (self->gap >= 16) {
127
self->hitbox.left = -24;
128
self->hitbox.top = -8;
129
self->hitbox.right = 24;
130
self->hitbox.bottom = 8;
131
}
132
else {
133
int32 len = self->length * (self->gap + 24);
134
self->hitbox.bottom = 8;
135
self->hitbox.left = -24 - len;
136
self->hitbox.top = -8;
137
self->hitbox.right = len + 24;
138
}
139
140
self->state = PimPom_State_Vertical;
141
break;
142
143
default: break;
144
}
145
146
self->amplitude.x >>= 10;
147
self->amplitude.y >>= 10;
148
149
int32 len = 0;
150
151
switch (self->moveType) {
152
case PIMPOM_MOVE_FIXED:
153
default:
154
self->stateMove = PimPom_Move_Fixed;
155
self->updateRange.x = (self->length * (self->gap + 24) + 88) << 16;
156
self->updateRange.y = (self->length * (self->gap + 24) + 88) << 16;
157
break;
158
159
case PIMPOM_MOVE_NORMAL:
160
len = (self->length * (self->gap + 24) + 88) << 6;
161
self->updateRange.x = (abs(self->amplitude.x) + len) << 10;
162
self->updateRange.y = (abs(self->amplitude.y) + len) << 10;
163
self->stateMove = PimPom_Move_Normal;
164
break;
165
166
case PIMPOM_MOVE_CIRCLE:
167
len = (self->length * (self->gap + 24)) << 6;
168
self->updateRange.x = (abs(self->amplitude.x) + len + 0x1600) << 10;
169
self->updateRange.y = (abs(self->amplitude.y) + len + 0x1600) << 10;
170
self->stateMove = PimPom_Move_Circle;
171
break;
172
173
case PIMPOM_MOVE_TRACK:
174
len = (self->length * (self->gap + 24)) << 7;
175
self->updateRange.x = (abs(self->amplitude.x) + len + 0x2C00) << 9;
176
self->updateRange.y = (abs(self->amplitude.y) + len + 0x2C00) << 9;
177
self->stateMove = PimPom_Move_Track;
178
break;
179
180
case PIMPOM_MOVE_PATH:
181
self->active = ACTIVE_NEVER;
182
self->stateMove = PimPom_Move_Path;
183
self->updateRange.x = (self->length * (self->gap + 24) + 88) << 16;
184
self->updateRange.y = (self->length * (self->gap + 24) + 88) << 16;
185
break;
186
}
187
}
188
}
189
190
void PimPom_StageLoad(void)
191
{
192
PimPom->aniFrames = RSDK.LoadSpriteAnimation("SPZ2/PimPom.bin", SCOPE_STAGE);
193
194
PimPom->sfxPimPom = RSDK.GetSfx("Stage/PimPom.wav");
195
PimPom->sfxBumper2 = RSDK.GetSfx("Stage/Bumper2.wav");
196
}
197
198
void PimPom_State_Single(void)
199
{
200
RSDK_THIS(PimPom);
201
202
int32 storeX = self->position.x;
203
int32 storeY = self->position.y;
204
205
self->position.x = self->drawPos.x + self->offset.x;
206
self->position.y = self->drawPos.y - self->offset.y;
207
208
for (int32 l = 0; l <= self->length; ++l) {
209
210
foreach_active(Player, player)
211
{
212
if (Player_CheckBadnikTouch(player, self, &self->hitbox)) {
213
int32 angle = RSDK.ATan2(player->position.x - self->position.x, player->position.y - self->position.y);
214
215
int32 vel = MAX(abs(player->velocity.y + player->velocity.x) >> 8, 0x600);
216
217
int32 power = RSDK.Rand(0x400, vel);
218
angle += RSDK.Rand(-6, 6);
219
220
if (player->animator.animationID != ANI_FLY) {
221
player->velocity.x = power * RSDK.Cos256(angle);
222
player->groundVel = power * RSDK.Cos256(angle);
223
}
224
player->velocity.y = power * RSDK.Sin256(angle);
225
player->onGround = false;
226
player->applyJumpCap = false;
227
228
#if MANIA_USE_PLUS
229
if (player->characterID == ID_MIGHTY && player->state == Player_State_MightyHammerDrop) {
230
RSDK.SetSpriteAnimation(player->aniFrames, ANI_JUMP, &player->animator, false, 0);
231
player->state = Player_State_Air;
232
}
233
#endif
234
if (self->sfxTimer < 1) {
235
RSDK.PlaySfx(PimPom->sfxPimPom, false, 255);
236
self->sfxTimer = 8;
237
}
238
}
239
}
240
241
self->position.x -= self->moveAmount.x;
242
self->position.y += self->moveAmount.y;
243
}
244
245
self->position.x = storeX;
246
self->position.y = storeY;
247
}
248
249
void PimPom_State_Horizontal(void)
250
{
251
RSDK_THIS(PimPom);
252
253
int32 startX = self->position.x;
254
int32 startY = self->position.y;
255
256
int32 len = 0;
257
self->position = self->drawPos;
258
if (self->gap >= 16) {
259
self->position.x += self->offset.x;
260
self->position.y -= self->offset.y;
261
len = self->length;
262
}
263
264
for (int32 l = 0; l <= len; ++l) {
265
foreach_active(Player, player)
266
{
267
int32 playerX = player->position.x;
268
int32 playerY = player->position.y;
269
int32 playerVelX = player->velocity.x;
270
int32 playerVelY = player->velocity.y;
271
272
Vector2 originVel = { 0, 0 };
273
274
Zone_RotateOnPivot(&player->position, &self->position, self->negAngle);
275
Zone_RotateOnPivot(&player->velocity, &originVel, self->negAngle);
276
277
int32 storedVelX = player->velocity.x;
278
int32 storedVelY = player->velocity.y;
279
280
Hitbox hitbox;
281
Hitbox *playerHitbox = Player_GetHitbox(player);
282
if ((((self->angle & 0xFF) - 32) & 0x7F) < 0x40) {
283
hitbox.top = playerHitbox->left;
284
hitbox.bottom = playerHitbox->right;
285
hitbox.left = playerHitbox->top;
286
hitbox.right = playerHitbox->bottom;
287
}
288
else {
289
hitbox = *playerHitbox;
290
}
291
292
uint8 side = RSDK.CheckObjectCollisionBox(self, &self->hitbox, player, &hitbox, true);
293
switch (side) {
294
case C_NONE:
295
player->position.x = playerX;
296
player->position.y = playerY;
297
player->velocity.x = playerVelX;
298
player->velocity.y = playerVelY;
299
break;
300
301
case C_TOP: player->velocity.y = CLAMP(-(storedVelY + (storedVelY >> 4)), -0xE0000, -0x40000); break;
302
case C_LEFT: player->velocity.x = CLAMP(-storedVelX, -0x80000, -0x20000); break;
303
case C_RIGHT: player->velocity.x = CLAMP(-storedVelX, 0x20000, 0x80000); break;
304
case C_BOTTOM: player->velocity.y = CLAMP(-(storedVelY + (storedVelY >> 4)), 0x40000, 0xE0000); break;
305
306
default: break;
307
}
308
309
if (side != C_NONE) {
310
#if MANIA_USE_PLUS
311
if (player->characterID == ID_MIGHTY && player->state == Player_State_MightyHammerDrop) {
312
RSDK.SetSpriteAnimation(player->aniFrames, ANI_JUMP, &player->animator, false, 0);
313
player->state = Player_State_Air;
314
}
315
#endif
316
player->onGround = false;
317
player->applyJumpCap = false;
318
319
Vector2 originVel = { 0, 0 };
320
321
Zone_RotateOnPivot(&player->position, &self->position, self->angle);
322
Zone_RotateOnPivot(&player->velocity, &originVel, self->angle);
323
324
if (self->sfxTimer <= 0) {
325
RSDK.PlaySfx(PimPom->sfxBumper2, false, 255);
326
self->sfxTimer = 8;
327
}
328
}
329
}
330
331
self->position.x -= self->moveAmount.x;
332
self->position.y += self->moveAmount.y;
333
}
334
335
self->position.x = startX;
336
self->position.y = startY;
337
}
338
339
void PimPom_State_Vertical(void)
340
{
341
RSDK_THIS(PimPom);
342
343
int32 spinAngle = Zone->timer * self->spinSpeed;
344
if (self->direction)
345
spinAngle = -spinAngle;
346
347
self->angle = (self->newAngle & 0xFF) + (spinAngle >> 1);
348
self->negAngle = 0x100 - self->angle;
349
self->rotation = 2 * self->negAngle;
350
351
self->offset.x = ((self->length * (self->gap + 24)) << 8) * RSDK.Cos256(self->angle);
352
self->offset.y = ((self->length * (self->gap + 24)) << 8) * RSDK.Sin256(self->angle);
353
354
self->moveAmount.x = ((self->gap + 24) * RSDK.Cos256(self->angle)) << 9;
355
self->moveAmount.y = ((self->gap + 24) * RSDK.Sin256(self->angle)) << 9;
356
357
PimPom_State_Horizontal();
358
}
359
360
void PimPom_Move_Fixed(void)
361
{
362
RSDK_THIS(PimPom);
363
364
self->drawPos.x = self->position.x;
365
self->drawPos.y = self->position.y;
366
}
367
368
void PimPom_Move_Normal(void)
369
{
370
RSDK_THIS(PimPom);
371
372
int32 drawX = self->drawPos.x;
373
int32 drawY = self->drawPos.y;
374
self->drawPos.x = self->position.x + self->amplitude.x * RSDK.Sin1024(self->speed * Zone->timer);
375
self->drawPos.y = self->position.y + self->amplitude.y * RSDK.Sin1024(self->speed * Zone->timer);
376
int32 moveX = self->drawPos.x - drawX;
377
int32 moveY = self->drawPos.y - drawY;
378
379
int32 slot = SceneInfo->entitySlot + 1;
380
for (int32 i = 0; i < self->numChildren; ++i) {
381
Entity *child = RSDK_GET_ENTITY_GEN(slot + i);
382
child->position.x += moveX;
383
child->position.y += moveY;
384
}
385
}
386
387
void PimPom_Move_Circle(void)
388
{
389
RSDK_THIS(PimPom);
390
391
int32 drawX = self->drawPos.x;
392
int32 drawY = self->drawPos.y;
393
self->drawPos.x = self->position.x + self->amplitude.x * RSDK.Cos1024(self->speed * Zone->timer + 4 * self->angleM);
394
self->drawPos.y = self->position.y + self->amplitude.y * RSDK.Sin1024(self->speed * Zone->timer + 4 * self->angleM);
395
int32 moveX = self->drawPos.x - drawX;
396
int32 moveY = self->drawPos.y - drawY;
397
398
int32 slot = SceneInfo->entitySlot + 1;
399
for (int32 i = 0; i < self->numChildren; ++i) {
400
Entity *child = RSDK_GET_ENTITY_GEN(slot + i);
401
child->position.x += moveX;
402
child->position.y += moveY;
403
}
404
}
405
406
void PimPom_Move_Path(void)
407
{
408
RSDK_THIS(PimPom);
409
410
int32 drawX = self->drawPos.x;
411
int32 drawY = self->drawPos.y;
412
self->drawPos.x += self->velocity.x;
413
self->drawPos.y += self->velocity.y;
414
415
Entity *target = RSDK_GET_ENTITY_GEN(self->speed);
416
417
if (self->velocity.x <= 0) {
418
if (self->drawPos.x < target->position.x)
419
self->drawPos.x = target->position.x;
420
}
421
else if (self->drawPos.x > target->position.x)
422
self->drawPos.x = target->position.x;
423
424
if (self->velocity.y <= 0) {
425
if (self->drawPos.y < target->position.y)
426
self->drawPos.y = target->position.y;
427
}
428
else if (self->drawPos.y > target->position.y)
429
self->drawPos.y = target->position.y;
430
431
int32 moveX = self->drawPos.x - drawX;
432
int32 moveY = self->drawPos.y - drawY;
433
434
int32 slot = SceneInfo->entitySlot + 1;
435
for (int32 i = 0; i < self->numChildren; ++i) {
436
Entity *child = RSDK_GET_ENTITY_GEN(slot + i);
437
child->position.x += moveX;
438
child->position.y += moveY;
439
}
440
}
441
442
void PimPom_Move_Track(void)
443
{
444
RSDK_THIS(PimPom);
445
446
int32 drawX = self->drawPos.x;
447
int32 drawY = self->drawPos.y;
448
449
if (((Zone->timer >> 9) & 1) == self->direction) {
450
self->drawPos.x = self->position.x + ((((Zone->timer & 0xFFFF) << 7) * self->amplitude.x) >> 6) - (self->amplitude.x << 15);
451
self->drawPos.y = self->position.y + ((((Zone->timer & 0xFFFF) << 7) * self->amplitude.y) >> 6) - (self->amplitude.y << 15);
452
}
453
else {
454
self->drawPos.x = self->position.x + (self->amplitude.x << 15) - ((((Zone->timer & 0xFFFF) << 7) * self->amplitude.x) >> 6);
455
self->drawPos.y = self->position.y + (self->amplitude.y << 15) - ((((Zone->timer & 0xFFFF) << 7) * self->amplitude.y) >> 6);
456
}
457
458
int32 moveX = self->drawPos.x - drawX;
459
int32 moveY = self->drawPos.y - drawY;
460
461
int32 slot = SceneInfo->entitySlot + 1;
462
for (int32 i = 0; i < self->numChildren; ++i) {
463
Entity *child = RSDK_GET_ENTITY_GEN(slot + i);
464
child->position.x += moveX;
465
child->position.y += moveY;
466
}
467
}
468
469
#if GAME_INCLUDE_EDITOR
470
void PimPom_EditorDraw(void)
471
{
472
RSDK_THIS(PimPom);
473
474
self->drawFX = FX_NONE;
475
self->direction = FLIP_NONE;
476
self->active = ACTIVE_BOUNDS;
477
self->visible = true;
478
479
self->updateRange.x = (40 - (self->length * (self->gap + 24))) << 16;
480
self->updateRange.y = (40 - (self->length * (self->gap + 24))) << 16;
481
self->drawGroup = Zone->objectDrawGroup[0] + 1;
482
self->newAngle = 0x20 * self->angle;
483
self->angle = 0x20 * self->angle;
484
self->negAngle = 0x100 - self->angle;
485
self->rotation = 2 * self->negAngle;
486
487
int32 offset = self->type ? 24 : 8;
488
489
self->offset.x = ((self->length * (offset + self->gap)) << 8) * RSDK.Cos256(self->angle);
490
self->offset.y = ((self->length * (offset + self->gap)) << 8) * RSDK.Sin256(self->angle);
491
492
self->moveAmount.x = ((offset + self->gap) * RSDK.Cos256(self->angle)) << 9;
493
self->moveAmount.y = ((offset + self->gap) * RSDK.Sin256(self->angle)) << 9;
494
self->drawPos = self->position;
495
496
switch (self->type) {
497
case PIMPOM_SINGLE:
498
RSDK.SetSpriteAnimation(PimPom->aniFrames, 0, &self->animator, true, self->color);
499
self->hitbox.left = -8;
500
self->hitbox.top = -8;
501
self->hitbox.right = 8;
502
self->hitbox.bottom = 8;
503
self->state = PimPom_State_Single;
504
break;
505
506
case PIMPOM_HORIZONTAL:
507
switch (self->angle) {
508
case 0x00: RSDK.SetSpriteAnimation(PimPom->aniFrames, 1, &self->animator, true, 0); break;
509
510
case 0x20:
511
self->drawFX = FX_FLIP;
512
self->direction = FLIP_X;
513
RSDK.SetSpriteAnimation(PimPom->aniFrames, 2, &self->animator, true, 0);
514
break;
515
516
case 0x40: RSDK.SetSpriteAnimation(PimPom->aniFrames, 3, &self->animator, true, 0); break;
517
case 0x60: RSDK.SetSpriteAnimation(PimPom->aniFrames, 2, &self->animator, true, 0); break;
518
519
default: break;
520
}
521
break;
522
523
case PIMPOM_DIAGONAL:
524
RSDK.SetSpriteAnimation(PimPom->aniFrames, 2, &self->animator, true, 0);
525
self->drawFX = FX_ROTATE | FX_FLIP;
526
self->angle = self->direction == FLIP_X ? 0x20 : 0xE0;
527
self->negAngle = 0x100 - self->angle;
528
break;
529
530
case PIMPOM_VERTICAL:
531
RSDK.SetSpriteAnimation(PimPom->aniFrames, 1, &self->animator, true, 0);
532
self->drawFX = FX_ROTATE;
533
break;
534
535
default: break;
536
}
537
538
Vector2 amplitude;
539
amplitude.x = self->amplitude.x >> 10;
540
amplitude.y = self->amplitude.y >> 10;
541
542
int32 len = 0;
543
544
switch (self->moveType) {
545
case PIMPOM_MOVE_FIXED:
546
default:
547
self->updateRange.x = (self->length * (self->gap + 24) + 88) << 16;
548
self->updateRange.y = (self->length * (self->gap + 24) + 88) << 16;
549
break;
550
551
case PIMPOM_MOVE_NORMAL:
552
len = (self->length * (self->gap + 24) + 88) << 6;
553
self->updateRange.x = (abs(amplitude.x) + len) << 10;
554
self->updateRange.y = (abs(amplitude.y) + len) << 10;
555
break;
556
557
case PIMPOM_MOVE_CIRCLE:
558
len = (self->length * (self->gap + 24)) << 6;
559
self->updateRange.x = (abs(amplitude.x) + len + 0x1600) << 10;
560
self->updateRange.y = (abs(amplitude.y) + len + 0x1600) << 10;
561
break;
562
563
case PIMPOM_MOVE_TRACK:
564
len = (self->length * (self->gap + 24)) << 7;
565
self->updateRange.x = (abs(amplitude.x) + len + 0x2C00) << 9;
566
self->updateRange.y = (abs(amplitude.y) + len + 0x2C00) << 9;
567
break;
568
569
case PIMPOM_MOVE_PATH:
570
self->updateRange.x = (self->length * (self->gap + 24) + 88) << 16;
571
self->updateRange.y = (self->length * (self->gap + 24) + 88) << 16;
572
break;
573
}
574
575
PimPom_Draw();
576
577
if (showGizmos()) {
578
RSDK_DRAWING_OVERLAY(true);
579
580
Vector2 pos;
581
switch (self->moveType) {
582
case PIMPOM_MOVE_NORMAL:
583
// draw distance previews
584
self->inkEffect = INK_BLEND;
585
self->drawPos.x = amplitude.x * RSDK.Sin1024(0x100) + self->position.x;
586
self->drawPos.y = amplitude.y * RSDK.Sin1024(0x100) + self->position.y;
587
pos = self->drawPos;
588
PimPom_Draw();
589
590
self->drawPos.x = amplitude.x * RSDK.Sin1024(0x300) + self->position.x;
591
self->drawPos.y = amplitude.y * RSDK.Sin1024(0x300) + self->position.y;
592
PimPom_Draw();
593
594
RSDK.DrawLine(pos.x, pos.y, self->drawPos.x, self->drawPos.y, 0x00FF00, 0, INK_NONE, false);
595
break;
596
597
case PIMPOM_MOVE_CIRCLE:
598
// draw distance preview
599
self->inkEffect = INK_BLEND;
600
self->drawPos.x = amplitude.x * RSDK.Cos1024(4 * self->angle) + self->position.x;
601
self->drawPos.y = amplitude.y * RSDK.Sin1024(4 * self->angle) + self->position.y;
602
603
PimPom_Draw();
604
break;
605
606
case PIMPOM_MOVE_TRACK:
607
// draw distance preview
608
self->inkEffect = INK_BLEND;
609
610
// draw distance previews
611
self->inkEffect = INK_BLEND;
612
self->drawPos.x = self->position.x + (0x100 * amplitude.x >> 6) - (amplitude.x << 15);
613
self->drawPos.y = self->position.y + (0x100 * amplitude.y >> 6) - (amplitude.y << 15);
614
pos = self->drawPos;
615
PimPom_Draw();
616
617
self->drawPos.x = self->position.x + (amplitude.x << 15) - (0x000 * amplitude.x >> 6);
618
self->drawPos.y = self->position.y + (amplitude.y << 15) - (0x000 * amplitude.y >> 6);
619
PimPom_Draw();
620
621
RSDK.DrawLine(pos.x, pos.y, self->drawPos.x, self->drawPos.y, 0x00FF00, 0x00, INK_NONE, false);
622
break;
623
624
case PIMPOM_MOVE_PATH: {
625
Entity *target = RSDK_GET_ENTITY_GEN(self->speed);
626
627
if (target)
628
DrawHelpers_DrawArrow(self->position.x, self->position.y, target->position.x, target->position.y, 0x00FF00, INK_NONE, 0xFF);
629
break;
630
}
631
632
default:
633
case PIMPOM_MOVE_FIXED:
634
// nothin'
635
break;
636
}
637
638
self->inkEffect = INK_NONE;
639
640
int32 slot = SceneInfo->entitySlot + 1;
641
for (int32 i = 0; i < self->numChildren; ++i) {
642
Entity *child = RSDK_GET_ENTITY_GEN(slot + i);
643
644
if (child) {
645
DrawHelpers_DrawArrow(self->position.x, self->position.y, child->position.x, child->position.y, 0xE0E0E0, INK_NONE, 0xFF);
646
}
647
}
648
649
RSDK_DRAWING_OVERLAY(false);
650
}
651
}
652
653
void PimPom_EditorLoad(void)
654
{
655
PimPom->aniFrames = RSDK.LoadSpriteAnimation("SPZ2/PimPom.bin", SCOPE_STAGE);
656
657
RSDK_ACTIVE_VAR(PimPom, type);
658
RSDK_ENUM_VAR("Single", PIMPOM_SINGLE);
659
RSDK_ENUM_VAR("Horizontal", PIMPOM_HORIZONTAL);
660
RSDK_ENUM_VAR("Diagonal", PIMPOM_DIAGONAL);
661
RSDK_ENUM_VAR("Vertical", PIMPOM_VERTICAL);
662
663
RSDK_ACTIVE_VAR(PimPom, moveType);
664
RSDK_ENUM_VAR("Fixed", PIMPOM_MOVE_FIXED);
665
RSDK_ENUM_VAR("Normal", PIMPOM_MOVE_NORMAL);
666
RSDK_ENUM_VAR("Circle", PIMPOM_MOVE_CIRCLE);
667
RSDK_ENUM_VAR("Track", PIMPOM_MOVE_TRACK);
668
RSDK_ENUM_VAR("Path", PIMPOM_MOVE_PATH);
669
670
RSDK_ACTIVE_VAR(PimPom, color);
671
RSDK_ENUM_VAR("Cyan", PIMPOM_CLR_CYAN);
672
RSDK_ENUM_VAR("Purple", PIMPOM_CLR_PURPLE);
673
RSDK_ENUM_VAR("Green", PIMPOM_CLR_GREEN);
674
675
RSDK_ACTIVE_VAR(PimPom, direction);
676
RSDK_ENUM_VAR("No Flip", FLIP_NONE);
677
RSDK_ENUM_VAR("Flipped", FLIP_X);
678
}
679
#endif
680
681
void PimPom_Serialize(void)
682
{
683
RSDK_EDITABLE_VAR(PimPom, VAR_ENUM, type);
684
RSDK_EDITABLE_VAR(PimPom, VAR_UINT8, color);
685
RSDK_EDITABLE_VAR(PimPom, VAR_UINT8, direction);
686
RSDK_EDITABLE_VAR(PimPom, VAR_INT32, angle);
687
RSDK_EDITABLE_VAR(PimPom, VAR_UINT8, spinSpeed);
688
RSDK_EDITABLE_VAR(PimPom, VAR_ENUM, moveType);
689
RSDK_EDITABLE_VAR(PimPom, VAR_VECTOR2, amplitude);
690
RSDK_EDITABLE_VAR(PimPom, VAR_ENUM, speed);
691
RSDK_EDITABLE_VAR(PimPom, VAR_INT32, angleM);
692
RSDK_EDITABLE_VAR(PimPom, VAR_UINT8, length);
693
RSDK_EDITABLE_VAR(PimPom, VAR_UINT8, gap);
694
RSDK_EDITABLE_VAR(PimPom, VAR_UINT8, numChildren);
695
}
696
697