Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/MMZ/SizeLaser.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: SizeLaser Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectSizeLaser *SizeLaser;
11
12
void SizeLaser_Update(void)
13
{
14
RSDK_THIS(SizeLaser);
15
16
self->mainAnimator.frameID = (Zone->timer >> 2) & 1;
17
self->impactAnimator.frameID = (Zone->timer >> 2) & 1;
18
19
StateMachine_Run(self->state);
20
}
21
22
void SizeLaser_LateUpdate(void) {}
23
24
void SizeLaser_StaticUpdate(void)
25
{
26
foreach_active(Player, player)
27
{
28
int32 playerID = RSDK.GetEntitySlot(player);
29
30
SizeLaser->playerPositions[playerID].x = player->position.x;
31
SizeLaser->playerPositions[playerID].y = player->position.y;
32
33
if (player->scale.x > 0x200) {
34
35
Hitbox *playerHitbox = Player_GetHitbox(player);
36
SizeLaser->playerOuterBox[playerID].left = (player->scale.x * playerHitbox->left) >> 9;
37
SizeLaser->playerOuterBox[playerID].top = (player->scale.x * playerHitbox->top) >> 9;
38
SizeLaser->playerOuterBox[playerID].right = (player->scale.x * playerHitbox->right) >> 9;
39
SizeLaser->playerOuterBox[playerID].bottom = (player->scale.x * playerHitbox->bottom) >> 9;
40
41
playerHitbox = Player_GetAltHitbox(player);
42
SizeLaser->playerInnerBox[playerID].left = (player->scale.x * playerHitbox->left) >> 9;
43
SizeLaser->playerInnerBox[playerID].top = (player->scale.x * playerHitbox->top) >> 9;
44
SizeLaser->playerInnerBox[playerID].right = (player->scale.x * playerHitbox->right) >> 9;
45
SizeLaser->playerInnerBox[playerID].bottom = (player->scale.x * playerHitbox->bottom) >> 9;
46
47
player->outerbox = &SizeLaser->playerOuterBox[playerID];
48
player->innerbox = &SizeLaser->playerInnerBox[playerID];
49
}
50
}
51
}
52
53
void SizeLaser_Draw(void)
54
{
55
RSDK_THIS(SizeLaser);
56
57
RSDK.DrawSprite(&self->mainAnimator, NULL, false);
58
59
if (self->state == SizeLaser_State_Impact)
60
RSDK.DrawSprite(&self->impactAnimator, &self->impactPos, false);
61
}
62
63
void SizeLaser_Create(void *data)
64
{
65
RSDK_THIS(SizeLaser);
66
67
self->drawFX = FX_FLIP;
68
if (!SceneInfo->inEditor) {
69
int32 type = VOID_TO_INT(data);
70
self->visible = true;
71
self->updateRange.x = 0x800000;
72
self->updateRange.y = 0x800000;
73
74
if (!type) {
75
self->active = ACTIVE_BOUNDS;
76
self->drawGroup = Zone->objectDrawGroup[0] + 1;
77
78
self->state = SizeLaser_State_Emitter;
79
switch (self->orientation) {
80
case SIZELASER_ORIENTATION_DOWN:
81
self->direction = FLIP_NONE;
82
RSDK.SetSpriteAnimation(SizeLaser->aniFrames, 2 * self->type, &self->mainAnimator, true, 0);
83
break;
84
85
case SIZELASER_ORIENTATION_RIGHT:
86
case SIZELASER_ORIENTATION_LEFT:
87
self->direction = self->orientation == SIZELASER_ORIENTATION_LEFT ? FLIP_X : FLIP_NONE;
88
RSDK.SetSpriteAnimation(SizeLaser->aniFrames, 2 * self->type + 1, &self->mainAnimator, true, 0);
89
break;
90
}
91
}
92
else {
93
type--;
94
self->active = ACTIVE_NORMAL;
95
self->drawGroup = Zone->objectDrawGroup[0];
96
self->orientation = type >> 2;
97
self->type = type & 1;
98
99
self->state = SizeLaser_State_Laser;
100
switch (self->orientation) {
101
default:
102
case SIZELASER_ORIENTATION_DOWN:
103
self->velocity.y = 0x40000;
104
105
RSDK.SetSpriteAnimation(SizeLaser->aniFrames, 2 * (self->type + 2), &self->mainAnimator, true, 0);
106
RSDK.SetSpriteAnimation(SizeLaser->aniFrames, 2 * (self->type + 4), &self->impactAnimator, true, 0);
107
break;
108
109
case SIZELASER_ORIENTATION_RIGHT:
110
case SIZELASER_ORIENTATION_LEFT:
111
self->direction = self->orientation == SIZELASER_ORIENTATION_LEFT ? FLIP_X : FLIP_NONE;
112
self->velocity.x = self->orientation == SIZELASER_ORIENTATION_LEFT ? -0x40000 : 0x40000;
113
114
RSDK.SetSpriteAnimation(SizeLaser->aniFrames, 2 * self->type + 5, &self->mainAnimator, true, 0);
115
RSDK.SetSpriteAnimation(SizeLaser->aniFrames, 2 * self->type + 9, &self->impactAnimator, true, 0);
116
break;
117
}
118
}
119
}
120
}
121
122
void SizeLaser_StageLoad(void)
123
{
124
SizeLaser->aniFrames = RSDK.LoadSpriteAnimation("MMZ/SizeLaser.bin", SCOPE_STAGE);
125
126
switch (GET_CHARACTER_ID(1)) {
127
case ID_SONIC: SizeLaser->sonicFrames = RSDK.LoadSpriteAnimation("Players/ChibiSonic.bin", SCOPE_STAGE); break;
128
129
case ID_TAILS:
130
SizeLaser->tailsFrames = RSDK.LoadSpriteAnimation("Players/ChibiTails.bin", SCOPE_STAGE);
131
SizeLaser->tailFrames = RSDK.LoadSpriteAnimation("Players/CTailSprite.bin", SCOPE_STAGE);
132
break;
133
134
case ID_KNUCKLES: SizeLaser->knuxFrames = RSDK.LoadSpriteAnimation("Players/ChibiKnux.bin", SCOPE_STAGE); break;
135
136
#if MANIA_USE_PLUS
137
case ID_MIGHTY: SizeLaser->mightyFrames = RSDK.LoadSpriteAnimation("Players/ChibiMighty.bin", SCOPE_STAGE); break;
138
139
case ID_RAY: SizeLaser->rayFrames = RSDK.LoadSpriteAnimation("Players/ChibiRay.bin", SCOPE_STAGE); break;
140
#endif
141
142
default: break;
143
}
144
145
switch (GET_CHARACTER_ID(2)) {
146
case ID_SONIC: SizeLaser->sonicFrames = RSDK.LoadSpriteAnimation("Players/ChibiSonic.bin", SCOPE_STAGE); break;
147
148
case ID_TAILS:
149
SizeLaser->tailsFrames = RSDK.LoadSpriteAnimation("Players/ChibiTails.bin", SCOPE_STAGE);
150
SizeLaser->tailFrames = RSDK.LoadSpriteAnimation("Players/CTailSprite.bin", SCOPE_STAGE);
151
break;
152
153
case ID_KNUCKLES: SizeLaser->knuxFrames = RSDK.LoadSpriteAnimation("Players/ChibiKnux.bin", SCOPE_STAGE); break;
154
155
#if MANIA_USE_PLUS
156
case ID_MIGHTY: SizeLaser->mightyFrames = RSDK.LoadSpriteAnimation("Players/ChibiMighty.bin", SCOPE_STAGE); break;
157
158
case ID_RAY: SizeLaser->rayFrames = RSDK.LoadSpriteAnimation("Players/ChibiRay.bin", SCOPE_STAGE); break;
159
#endif
160
161
default: break;
162
}
163
164
SizeLaser->hitbox.left = -4;
165
SizeLaser->hitbox.top = -4;
166
SizeLaser->hitbox.right = 4;
167
SizeLaser->hitbox.bottom = 4;
168
169
SizeLaser->sfxShrink2 = RSDK.GetSfx("MMZ/Shrink2.wav");
170
SizeLaser->sfxGrow2 = RSDK.GetSfx("MMZ/Grow2.wav");
171
172
Soundboard_LoadSfx("MMZ/SizeLaser.wav", true, SizeLaser_SfxCheck_SizeLaser, StateMachine_None);
173
}
174
175
bool32 SizeLaser_SfxCheck_SizeLaser(void)
176
{
177
int32 activeCount = 0;
178
179
foreach_active(SizeLaser, entity)
180
{
181
if (entity->onScreen)
182
++activeCount;
183
}
184
185
return activeCount > 0;
186
}
187
188
void SizeLaser_SetPlayerSize(EntityPlayer *player, bool32 isChibi)
189
{
190
if (isChibi) {
191
switch (player->characterID) {
192
default:
193
case ID_SONIC:
194
player->aniFrames = SizeLaser->sonicFrames;
195
player->tailFrames = -1;
196
player->isChibi = isChibi;
197
break;
198
199
case ID_TAILS:
200
player->aniFrames = SizeLaser->tailsFrames;
201
player->tailFrames = SizeLaser->tailFrames;
202
player->isChibi = isChibi;
203
break;
204
205
case ID_KNUCKLES:
206
player->aniFrames = SizeLaser->knuxFrames;
207
player->tailFrames = -1;
208
player->isChibi = isChibi;
209
break;
210
211
#if MANIA_USE_PLUS
212
case ID_MIGHTY:
213
player->aniFrames = SizeLaser->mightyFrames;
214
player->tailFrames = -1;
215
player->isChibi = isChibi;
216
break;
217
218
case ID_RAY:
219
player->aniFrames = SizeLaser->rayFrames;
220
player->tailFrames = -1;
221
player->isChibi = isChibi;
222
break;
223
#endif
224
}
225
}
226
else {
227
switch (player->characterID) {
228
default:
229
case ID_SONIC:
230
player->aniFrames = Player->sonicFrames;
231
player->tailFrames = -1;
232
player->isChibi = isChibi;
233
break;
234
235
case ID_TAILS:
236
player->aniFrames = Player->tailsFrames;
237
player->tailFrames = Player->tailsTailsFrames;
238
player->isChibi = false;
239
break;
240
241
case ID_KNUCKLES:
242
player->aniFrames = Player->knuxFrames;
243
player->tailFrames = -1;
244
player->isChibi = isChibi;
245
break;
246
247
#if MANIA_USE_PLUS
248
case ID_MIGHTY:
249
player->aniFrames = Player->mightyFrames;
250
player->tailFrames = -1;
251
player->isChibi = isChibi;
252
break;
253
254
case ID_RAY:
255
player->aniFrames = Player->rayFrames;
256
player->tailFrames = -1;
257
player->isChibi = isChibi;
258
break;
259
#endif
260
}
261
}
262
}
263
264
// used to have a sidekick resize to match the leader's size
265
void SizeLaser_PlayerState_Resize(void)
266
{
267
// ???
268
EntityPlayer *self = RSDK_GET_ENTITY(SceneInfo->entitySlot, Player);
269
270
EntityPlayer *leader = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);
271
272
self->position.x = leader->position.x;
273
self->position.y = leader->position.y;
274
275
self->position.x += self->abilityValues[0];
276
self->position.y += self->abilityValues[1];
277
278
if (self->abilityValues[0] <= 0) {
279
if (self->abilityValues[0] < 0) {
280
self->abilityValues[0] -= self->abilityValues[0] >> 4;
281
282
if (self->abilityValues[0] > 0)
283
self->abilityValues[0] = 0;
284
}
285
}
286
else {
287
self->abilityValues[0] -= self->abilityValues[0] >> 4;
288
289
if (self->abilityValues[0] < 0)
290
self->abilityValues[0] = 0;
291
}
292
293
if (self->abilityValues[1] <= 0) {
294
if (self->abilityValues[1] < 0) {
295
self->abilityValues[1] -= self->abilityValues[0] >> 4;
296
297
if (self->abilityValues[1] > 0)
298
self->abilityValues[1] = 0;
299
}
300
}
301
else {
302
self->abilityValues[1] -= self->abilityValues[0] >> 4;
303
304
if (self->abilityValues[1] < 0)
305
self->abilityValues[1] = 0;
306
}
307
308
if (leader->state == SizeLaser_PlayerState_ShrinkChibi) {
309
if (leader->state == SizeLaser_PlayerState_GrowNormal || !leader->isChibi) {
310
self->state = SizeLaser_PlayerState_GrowNormal;
311
self->interaction = false;
312
}
313
}
314
else if (leader->isChibi) {
315
self->state = SizeLaser_PlayerState_ShrinkChibi;
316
self->interaction = false;
317
}
318
}
319
320
void SizeLaser_PlayerState_GrowNormal(void)
321
{
322
// ???
323
EntityPlayer *self = RSDK_GET_ENTITY(SceneInfo->entitySlot, Player);
324
325
StateMachine(state) = self->abilityPtrs[0];
326
StateMachine_Run(state);
327
328
if (self->scale.x >= 0x200) {
329
self->drawFX &= ~FX_SCALE;
330
self->isChibi = false;
331
self->scale.x = 0x200;
332
self->scale.y = 0x200;
333
self->interaction = true;
334
self->state = Player_State_Air;
335
Player_UpdatePhysicsState(self);
336
self->jumpOffset = self->characterID == ID_TAILS ? 0 : 0x50000;
337
}
338
else {
339
self->state = SizeLaser_PlayerState_GrowNormal;
340
self->scale.x += 6;
341
self->scale.y = self->scale.x;
342
}
343
}
344
345
void SizeLaser_PlayerState_ShrinkChibi(void)
346
{
347
// ???
348
EntityPlayer *self = RSDK_GET_ENTITY(SceneInfo->entitySlot, Player);
349
350
StateMachine(state) = self->abilityPtrs[0];
351
StateMachine_Run(state);
352
353
if (self->scale.x <= 0x140) {
354
switch (self->characterID) {
355
default:
356
case ID_SONIC:
357
self->aniFrames = SizeLaser->sonicFrames;
358
self->tailFrames = -1;
359
break;
360
361
case ID_TAILS:
362
self->aniFrames = SizeLaser->tailsFrames;
363
self->tailFrames = SizeLaser->tailFrames;
364
break;
365
366
case ID_KNUCKLES:
367
self->aniFrames = SizeLaser->knuxFrames;
368
self->tailFrames = -1;
369
break;
370
371
#if MANIA_USE_PLUS
372
case ID_MIGHTY:
373
self->aniFrames = SizeLaser->mightyFrames;
374
self->tailFrames = -1;
375
break;
376
377
case ID_RAY:
378
self->aniFrames = SizeLaser->rayFrames;
379
self->tailFrames = -1;
380
break;
381
#endif
382
}
383
384
self->jumpOffset = 0x40000;
385
RSDK.SetSpriteAnimation(self->aniFrames, ANI_HURT, &self->animator, false, 0);
386
self->isChibi = true;
387
self->drawFX &= ~FX_SCALE;
388
self->scale.x = 0x200;
389
self->scale.y = 0x200;
390
self->interaction = true;
391
392
self->state = Player_State_Air;
393
Player_UpdatePhysicsState(self);
394
}
395
else {
396
self->state = SizeLaser_PlayerState_ShrinkChibi;
397
self->scale.x -= 6;
398
self->scale.y = self->scale.x;
399
}
400
}
401
402
void SizeLaser_PlayerState_GrowGiant(void)
403
{
404
EntityPlayer *self = RSDK_GET_ENTITY(SceneInfo->entitySlot, Player);
405
406
StateMachine(state) = self->abilityPtrs[0];
407
StateMachine_Run(state);
408
409
if (self->scale.x >= 0x300) {
410
self->scale.x = 0x300;
411
self->scale.y = 0x300;
412
self->interaction = true;
413
self->state = Player_State_Air;
414
Player_UpdatePhysicsState(self);
415
}
416
else {
417
self->state = SizeLaser_PlayerState_GrowGiant;
418
self->scale.x += 8;
419
self->scale.y = self->scale.x;
420
}
421
}
422
423
void SizeLaser_CheckPlayerCollisions(void)
424
{
425
RSDK_THIS(SizeLaser);
426
427
int32 entityX = self->position.x;
428
int32 entityY = self->position.y;
429
430
int32 extendX1[2];
431
int32 extendY1[2];
432
int32 extendX2[2];
433
int32 extendY2[2];
434
435
switch (self->orientation) {
436
default: break;
437
438
case SIZELASER_ORIENTATION_DOWN:
439
extendX1[0] = entityX - 0x80000;
440
extendX1[1] = entityX + 0x80000;
441
442
extendY1[0] = entityY - 0x200000;
443
extendY1[1] = entityY - 0x200000;
444
445
extendX2[0] = entityX - 0x80000;
446
extendX2[1] = entityX + 0x80000;
447
448
extendY2[0] = entityY + (self->extend << 16);
449
extendY2[1] = entityY + (self->extend << 16);
450
break;
451
452
case SIZELASER_ORIENTATION_RIGHT:
453
extendX1[0] = entityX - 0x200000;
454
extendX1[1] = entityX - 0x200000;
455
456
extendY1[0] = entityY - 0x80000;
457
extendY1[1] = entityY + 0x80000;
458
459
extendX2[0] = entityX + (self->extend << 16);
460
extendX2[1] = entityX + (self->extend << 16);
461
462
extendY2[1] = entityY + 0x80000;
463
extendY2[0] = entityY - 0x80000;
464
break;
465
466
case SIZELASER_ORIENTATION_LEFT:
467
extendX1[0] = entityX - 0x200000;
468
extendX1[1] = entityX;
469
470
extendY1[0] = entityY - 0x80000;
471
extendY1[1] = entityY + 0x80000;
472
473
extendX2[0] = entityX + 0x200000;
474
extendX2[1] = entityX - (self->extend << 16);
475
476
extendY2[0] = entityY + 0x80000;
477
extendY2[1] = entityY - 0x80000;
478
break;
479
}
480
481
foreach_active(Player, player)
482
{
483
int32 playerID = RSDK.GetEntitySlot(player);
484
if (MathHelpers_CheckPositionOverlap(SizeLaser->playerPositions[playerID].x, SizeLaser->playerPositions[playerID].y, player->position.x,
485
player->position.y, extendX1[0], extendY1[0], extendX2[0], extendY2[0])
486
|| MathHelpers_CheckPositionOverlap(SizeLaser->playerPositions[playerID].x, SizeLaser->playerPositions[playerID].y, player->position.x,
487
player->position.y, extendX1[1], extendY1[1], extendX2[1], extendY2[1])) {
488
489
if (self->type) {
490
if (player->state == SizeLaser_PlayerState_ShrinkChibi || player->state == SizeLaser_PlayerState_GrowNormal || !player->isChibi) {
491
if (player->state != SizeLaser_PlayerState_GrowGiant && player->scale.x > 0x400) {
492
player->onGround = false;
493
player->interaction = false;
494
player->velocity.y = -0x40000;
495
player->nextAirState = StateMachine_None;
496
player->nextGroundState = StateMachine_None;
497
player->velocity.x = player->direction ? 0x20000 : -0x20000;
498
player->drawFX |= FX_SCALE;
499
player->scale.x = 0x200;
500
player->scale.y = 0x200;
501
player->tileCollisions = TILECOLLISION_DOWN;
502
RSDK.SetSpriteAnimation(player->aniFrames, ANI_HURT, &player->animator, false, 0);
503
player->abilityPtrs[0] = Player_State_Hurt;
504
player->state = SizeLaser_PlayerState_GrowGiant;
505
}
506
}
507
else {
508
player->onGround = false;
509
player->interaction = false;
510
player->velocity.y = -0x40000;
511
player->nextAirState = StateMachine_None;
512
player->nextGroundState = StateMachine_None;
513
player->velocity.x = player->direction ? 0x20000 : -0x20000;
514
player->drawFX |= FX_SCALE;
515
player->scale.x = 0x140;
516
player->scale.y = 0x140;
517
switch (player->characterID) {
518
default:
519
case ID_SONIC:
520
if (player->superState == SUPERSTATE_SUPER)
521
player->aniFrames = Player->superFrames;
522
else
523
player->aniFrames = Player->sonicFrames;
524
player->tailFrames = -1;
525
break;
526
527
case ID_TAILS:
528
player->aniFrames = Player->tailsFrames;
529
player->tailFrames = Player->tailsTailsFrames;
530
break;
531
532
case ID_KNUCKLES:
533
player->aniFrames = Player->knuxFrames;
534
player->tailFrames = -1;
535
break;
536
537
#if MANIA_USE_PLUS
538
case ID_MIGHTY:
539
player->aniFrames = Player->mightyFrames;
540
player->tailFrames = -1;
541
break;
542
543
case ID_RAY:
544
player->aniFrames = Player->rayFrames;
545
player->tailFrames = -1;
546
break;
547
#endif
548
}
549
550
RSDK.SetSpriteAnimation(player->aniFrames, ANI_HURT, &player->animator, false, 0);
551
RSDK.PlaySfx(SizeLaser->sfxGrow2, false, 255);
552
player->tileCollisions = TILECOLLISION_DOWN;
553
player->abilityPtrs[0] = Player_State_Hurt;
554
player->state = SizeLaser_PlayerState_GrowNormal;
555
}
556
}
557
else if (player->state != SizeLaser_PlayerState_ShrinkChibi && player->state != SizeLaser_PlayerState_GrowNormal && !player->isChibi) {
558
player->onGround = false;
559
player->interaction = false;
560
player->velocity.y = -0x40000;
561
player->nextAirState = StateMachine_None;
562
player->nextGroundState = StateMachine_None;
563
player->velocity.x = player->direction ? 0x20000 : -0x20000;
564
player->drawFX |= FX_SCALE;
565
player->scale.x = 0x200;
566
player->scale.y = 0x200;
567
RSDK.SetSpriteAnimation(player->aniFrames, ANI_HURT, &player->animator, false, 0);
568
RSDK.PlaySfx(SizeLaser->sfxShrink2, false, 0xFF);
569
player->tileCollisions = TILECOLLISION_DOWN;
570
player->abilityPtrs[0] = Player_State_Hurt;
571
player->state = SizeLaser_PlayerState_ShrinkChibi;
572
}
573
}
574
}
575
}
576
577
void SizeLaser_State_Emitter(void)
578
{
579
RSDK_THIS(SizeLaser);
580
581
if (self->timer < 24 && !(self->timer & 1))
582
CREATE_ENTITY(SizeLaser, INT_TO_VOID(self->type + (self->orientation << 2) + 1), self->position.x, self->position.y);
583
SizeLaser_CheckPlayerCollisions();
584
585
self->timer = (self->timer + 1) & 0x1F;
586
}
587
588
void SizeLaser_State_Laser(void)
589
{
590
RSDK_THIS(SizeLaser);
591
592
self->position.x += self->velocity.x;
593
self->position.y += self->velocity.y;
594
595
bool32 collided = false;
596
switch (self->orientation) {
597
case SIZELASER_ORIENTATION_DOWN: collided = RSDK.ObjectTileCollision(self, Zone->collisionLayers, CMODE_FLOOR, 0, 0, 0x40000, false); break;
598
case SIZELASER_ORIENTATION_RIGHT: collided = RSDK.ObjectTileCollision(self, Zone->collisionLayers, CMODE_LWALL, 0, 0x40000, 0, false); break;
599
case SIZELASER_ORIENTATION_LEFT: collided = RSDK.ObjectTileCollision(self, Zone->collisionLayers, CMODE_RWALL, 0, -0x40000, 0, false); break;
600
}
601
602
if (collided) {
603
self->impactPos.x = self->position.x;
604
self->impactPos.y = self->position.y;
605
self->state = SizeLaser_State_Impact;
606
}
607
}
608
609
void SizeLaser_State_Impact(void)
610
{
611
RSDK_THIS(SizeLaser);
612
613
self->position.x += self->velocity.x;
614
self->position.y += self->velocity.y;
615
616
if (++self->timer == 4)
617
destroyEntity(self);
618
}
619
620
#if GAME_INCLUDE_EDITOR
621
void SizeLaser_EditorDraw(void)
622
{
623
RSDK_THIS(SizeLaser);
624
625
switch (self->orientation) {
626
case SIZELASER_ORIENTATION_DOWN:
627
self->direction = FLIP_NONE;
628
RSDK.SetSpriteAnimation(SizeLaser->aniFrames, 2 * self->type, &self->mainAnimator, true, 0);
629
break;
630
631
case SIZELASER_ORIENTATION_RIGHT:
632
case SIZELASER_ORIENTATION_LEFT:
633
self->direction = self->orientation == SIZELASER_ORIENTATION_LEFT ? FLIP_X : FLIP_NONE;
634
RSDK.SetSpriteAnimation(SizeLaser->aniFrames, 2 * self->type + 1, &self->mainAnimator, true, 0);
635
break;
636
}
637
638
RSDK.DrawSprite(&self->mainAnimator, NULL, false);
639
640
if (showGizmos()) {
641
RSDK_DRAWING_OVERLAY(true);
642
643
int32 extendX = 0, extendY = 0;
644
switch (self->orientation) {
645
case SIZELASER_ORIENTATION_DOWN: extendY = (self->extend << 16); break;
646
647
case SIZELASER_ORIENTATION_RIGHT: extendX = (self->extend << 16); break;
648
649
case SIZELASER_ORIENTATION_LEFT: extendX = -(self->extend << 16); break;
650
}
651
652
DrawHelpers_DrawArrow(self->position.x, self->position.y, self->position.x + extendX, self->position.y + extendY, 0x00FF00, INK_NONE, 0xFF);
653
654
RSDK_DRAWING_OVERLAY(false);
655
}
656
}
657
658
void SizeLaser_EditorLoad(void)
659
{
660
SizeLaser->aniFrames = RSDK.LoadSpriteAnimation("MMZ/SizeLaser.bin", SCOPE_STAGE);
661
662
RSDK_ACTIVE_VAR(SizeLaser, type);
663
RSDK_ENUM_VAR("Shrink", SIZELASER_SHRINK);
664
RSDK_ENUM_VAR("Grow", SIZELASER_GROW);
665
666
RSDK_ACTIVE_VAR(SizeLaser, orientation);
667
RSDK_ENUM_VAR("Down", SIZELASER_ORIENTATION_DOWN);
668
RSDK_ENUM_VAR("Right", SIZELASER_ORIENTATION_RIGHT);
669
RSDK_ENUM_VAR("Left", SIZELASER_ORIENTATION_LEFT);
670
}
671
#endif
672
673
void SizeLaser_Serialize(void)
674
{
675
RSDK_EDITABLE_VAR(SizeLaser, VAR_UINT8, type);
676
RSDK_EDITABLE_VAR(SizeLaser, VAR_UINT8, orientation);
677
RSDK_EDITABLE_VAR(SizeLaser, VAR_ENUM, extend);
678
}
679
680