Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/SPZ/LoveTester.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: LoveTester Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectLoveTester *LoveTester;
11
12
void LoveTester_Update(void)
13
{
14
RSDK_THIS(LoveTester);
15
16
StateMachine_Run(self->state);
17
StateMachine_Run(self->stateLights);
18
19
for (int32 i = 0; i < 10; ++i) RSDK.ProcessAnimation(&self->lightAnimator[i]);
20
}
21
22
void LoveTester_LateUpdate(void) {}
23
24
void LoveTester_StaticUpdate(void)
25
{
26
foreach_active(LoveTester, loveTester) { RSDK.AddDrawListRef(Zone->objectDrawGroup[1], RSDK.GetEntitySlot(loveTester)); }
27
}
28
29
void LoveTester_Draw(void)
30
{
31
RSDK_THIS(LoveTester);
32
33
if (self->state == LoveTester_State_HeartParticles)
34
RSDK.DrawSprite(&self->mainAnimator, NULL, false);
35
else
36
LoveTester_DrawSprites();
37
}
38
39
void LoveTester_Create(void *data)
40
{
41
RSDK_THIS(LoveTester);
42
43
self->active = ACTIVE_BOUNDS;
44
self->drawGroup = Zone->objectDrawGroup[0];
45
self->startPos = self->position;
46
self->visible = true;
47
self->drawFX = FX_FLIP;
48
self->updateRange.x = 0x800000;
49
self->updateRange.y = 0x800000;
50
51
LoveTester_SetupHitboxes();
52
53
if (data) {
54
self->updateRange.x = 0x100000;
55
self->updateRange.y = 0x100000;
56
self->active = ACTIVE_NORMAL;
57
self->drawGroup = Zone->objectDrawGroup[1];
58
self->state = LoveTester_State_HeartParticles;
59
}
60
else {
61
self->state = LoveTester_State_Init;
62
}
63
}
64
65
void LoveTester_StageLoad(void)
66
{
67
LoveTester->aniFrames = RSDK.LoadSpriteAnimation("SPZ2/LoveTester.bin", SCOPE_STAGE);
68
69
LoveTester_SetupHitboxes();
70
LoveTester_SetupLightOffsets();
71
72
LoveTester->tvOffsetTop.x = 0;
73
LoveTester->tvOffsetTop.y = -0x300000;
74
LoveTester->tvOffsetBottom.x = 0;
75
LoveTester->tvOffsetBottom.y = 0x320000;
76
77
LoveTester->active = ACTIVE_ALWAYS;
78
LoveTester->sfxScore = RSDK.GetSfx("SPZ/Score.wav");
79
}
80
81
void LoveTester_SetupHitboxes(void)
82
{
83
LoveTester->hitboxEntry.left = -16;
84
LoveTester->hitboxEntry.top = -16;
85
LoveTester->hitboxEntry.right = 16;
86
LoveTester->hitboxEntry.bottom = 16;
87
88
LoveTester->hitboxL.left = -24;
89
LoveTester->hitboxL.top = -20;
90
LoveTester->hitboxL.right = -18;
91
LoveTester->hitboxL.bottom = 20;
92
93
LoveTester->hitboxR.left = 18;
94
LoveTester->hitboxR.top = -20;
95
LoveTester->hitboxR.right = 24;
96
LoveTester->hitboxR.bottom = 20;
97
}
98
99
void LoveTester_SetupLightOffsets(void)
100
{
101
LoveTester->lightOffset[0].x = -0x1C0000;
102
LoveTester->lightOffset[0].y = -0x1F0000;
103
LoveTester->lightOffset[1].x = 0x1C0000;
104
LoveTester->lightOffset[1].y = -0x1F0000;
105
LoveTester->lightOffset[2].x = -0x1C0000;
106
LoveTester->lightOffset[2].y = -0xF0000;
107
LoveTester->lightOffset[3].x = 0x1C0000;
108
LoveTester->lightOffset[3].y = -0xF0000;
109
LoveTester->lightOffset[4].x = -0x1C0000;
110
LoveTester->lightOffset[4].y = 0x10000;
111
LoveTester->lightOffset[5].x = 0x1C0000;
112
LoveTester->lightOffset[5].y = 0x10000;
113
LoveTester->lightOffset[6].x = -0x1C0000;
114
LoveTester->lightOffset[6].y = 0x110000;
115
LoveTester->lightOffset[7].x = 0x1C0000;
116
LoveTester->lightOffset[7].y = 0x110000;
117
LoveTester->lightOffset[8].x = -0x1C0000;
118
LoveTester->lightOffset[8].y = 0x210000;
119
LoveTester->lightOffset[9].x = 0x1C0000;
120
LoveTester->lightOffset[9].y = 0x210000;
121
}
122
123
void LoveTester_DrawSprites(void)
124
{
125
RSDK_THIS(LoveTester);
126
127
int32 storeX = self->position.x;
128
int32 storeY = self->position.y;
129
130
if (SceneInfo->currentDrawGroup != Zone->objectDrawGroup[1] || SceneInfo->inEditor) {
131
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 1, &self->mainAnimator, true, 0);
132
RSDK.DrawSprite(&self->mainAnimator, NULL, false);
133
134
for (int32 i = 0; i < 10; ++i) {
135
self->position.x = storeX + LoveTester->lightOffset[i].x;
136
self->position.y = storeY + LoveTester->lightOffset[i].y;
137
RSDK.DrawSprite(&self->lightAnimator[i], NULL, false);
138
}
139
140
self->position.x = storeX + LoveTester->tvOffsetTop.x;
141
self->position.y = storeY + LoveTester->tvOffsetTop.y;
142
LoveTester_DrawTVDisplay(self->tvDisplayTop, self->tvFrameTop, self->isTVActiveTop);
143
144
self->position.x = storeX + LoveTester->tvOffsetBottom.x;
145
self->position.y = storeY + LoveTester->tvOffsetBottom.y;
146
LoveTester_DrawTVDisplay(self->tvDisplayBottom, self->tvFrameBottom, self->isTVActiveBottom);
147
148
self->position.x = storeX;
149
self->position.y = storeY;
150
}
151
152
if (SceneInfo->currentDrawGroup == Zone->objectDrawGroup[1] || SceneInfo->inEditor) {
153
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 0, &self->mainAnimator, true, 0);
154
RSDK.DrawSprite(&self->mainAnimator, NULL, false);
155
}
156
}
157
158
void LoveTester_DrawTVDisplay(uint8 displayList, uint8 frame, bool32 isTVActive)
159
{
160
RSDK_THIS(LoveTester);
161
162
// Draw TV (off)
163
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 3, &self->mainAnimator, true, 0);
164
RSDK.DrawSprite(&self->mainAnimator, NULL, false);
165
166
if (isTVActive) {
167
// Draw TV (on)
168
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 3, &self->mainAnimator, true, 1);
169
RSDK.DrawSprite(&self->mainAnimator, NULL, false);
170
}
171
172
// Draw Extras
173
switch (displayList) {
174
case LOVETESTER_LIST_SONIC:
175
case LOVETESTER_LIST_TAILS:
176
case LOVETESTER_LIST_KNUX:
177
case LOVETESTER_LIST_EGGMAN:
178
case LOVETESTER_LIST_AMY:
179
case LOVETESTER_LIST_HEART:
180
case LOVETESTER_LIST_HEARTBROKEN:
181
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 4 + displayList, &self->mainAnimator, true, frame);
182
RSDK.DrawSprite(&self->mainAnimator, NULL, false);
183
break;
184
185
default: break;
186
}
187
}
188
189
void LoveTester_CheckPlayerCollisions_Solid(void)
190
{
191
RSDK_THIS(LoveTester);
192
193
foreach_active(Player, player)
194
{
195
int32 storeX = player->position.x;
196
int32 storeY = player->position.y;
197
int32 velX = player->velocity.x;
198
int32 velY = player->velocity.y;
199
int32 sideL = Player_CheckCollisionBox(player, self, &LoveTester->hitboxL);
200
int32 sideR = Player_CheckCollisionBox(player, self, &LoveTester->hitboxR);
201
202
if (sideL == C_TOP || sideL == C_BOTTOM || sideR == C_TOP || sideR == C_BOTTOM) {
203
player->onGround = false;
204
player->velocity.x = velX;
205
player->velocity.y = velY;
206
player->position.x = storeX;
207
player->position.y = storeY;
208
}
209
}
210
}
211
212
void LoveTester_CheckPlayerCollisions_Entry(bool32 allowSidekick)
213
{
214
RSDK_THIS(LoveTester);
215
216
foreach_active(Player, player)
217
{
218
int32 playerID = RSDK.GetEntitySlot(player);
219
if (allowSidekick || !player->sidekick) {
220
if (!((1 << playerID) & self->activePlayers)) {
221
if (Player_CheckBadnikTouch(player, self, &LoveTester->hitboxEntry)) {
222
self->activePlayers |= 1 << playerID;
223
RSDK.SetSpriteAnimation(player->aniFrames, ANI_JUMP, &player->animator, true, 0);
224
225
player->nextGroundState = StateMachine_None;
226
player->nextAirState = StateMachine_None;
227
player->velocity.x >>= 15;
228
player->velocity.y >>= 15;
229
player->onGround = false;
230
player->state = Player_State_Static;
231
232
if (!self->playerPtr) {
233
self->playerPtr = player;
234
if (player->camera) {
235
player->camera->target = (Entity *)self;
236
player->camera->disableYOffset = false;
237
}
238
}
239
}
240
}
241
242
if ((1 << playerID) & self->activePlayers) {
243
RSDK.SetSpriteAnimation(player->aniFrames, ANI_JUMP, &player->animator, false, 0);
244
player->position.x += (self->position.x - player->position.x) >> 1;
245
player->position.y += (self->position.y + 0x10000 - player->position.y) >> 1;
246
player->state = Player_State_Static;
247
248
if (self->matchingFinished) {
249
self->activePlayers &= ~(1 << playerID);
250
player->state = Player_State_Air;
251
player->tileCollisions = TILECOLLISION_DOWN;
252
player->onGround = false;
253
player->velocity.x = 0;
254
player->velocity.y = 0;
255
if (player->camera && self->playerPtr == player) {
256
player->camera->target = (Entity *)player;
257
player->camera->disableYOffset = true;
258
}
259
}
260
}
261
}
262
}
263
}
264
265
void LoveTester_GiveScore(EntityPlayer *player)
266
{
267
EntityScoreBonus *bonus = CREATE_ENTITY(ScoreBonus, NULL, player->position.x, player->position.y);
268
bonus->drawGroup = Zone->objectDrawGroup[1];
269
bonus->animator.frameID = 0;
270
271
Player_GiveScore(player, 100);
272
RSDK.PlaySfx(LoveTester->sfxScore, false, 255);
273
}
274
275
void LoveTester_CreateHeartParticles(void)
276
{
277
RSDK_THIS(LoveTester);
278
279
for (int32 velX = 0, frame = 0; velX < 0x10000; velX += 0x4000, ++frame) {
280
EntityLoveTester *child = CREATE_ENTITY(LoveTester, INT_TO_VOID(true), self->position.x, self->position.y);
281
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 4, &child->mainAnimator, true, frame & 1);
282
child->velocity.x = velX - 0x6000;
283
}
284
}
285
286
void LoveTester_State_Init(void)
287
{
288
RSDK_THIS(LoveTester);
289
290
for (int32 i = 0; i < 10; ++i) RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[i], true, 5);
291
292
self->playerPtr = NULL;
293
self->matchingFinished = false;
294
self->activePlayers = 0;
295
296
self->state = LoveTester_State_WaitForActivated;
297
LoveTester_State_WaitForActivated();
298
}
299
300
void LoveTester_State_WaitForActivated(void)
301
{
302
RSDK_THIS(LoveTester);
303
304
LoveTester_CheckPlayerCollisions_Solid();
305
LoveTester_CheckPlayerCollisions_Entry(false);
306
307
if (self->playerPtr) {
308
self->timer = 0;
309
self->isTVActiveTop = true;
310
self->isTVActiveBottom = true;
311
self->tvDisplayTop = LOVETESTER_LIST_NONE;
312
self->tvFrameTop = 0;
313
self->tvDisplayBottom = LOVETESTER_LIST_NONE;
314
self->tvFrameBottom = 0;
315
self->state = LoveTester_State_SetupTopDisplay;
316
}
317
}
318
319
void LoveTester_State_SetupTopDisplay(void)
320
{
321
RSDK_THIS(LoveTester);
322
323
LoveTester_CheckPlayerCollisions_Solid();
324
LoveTester_CheckPlayerCollisions_Entry(true);
325
326
if (self->timer >= 8) {
327
EntityPlayer *player = self->playerPtr;
328
self->timer = 0;
329
self->isTVActiveTop = true;
330
self->isTVActiveBottom = true;
331
332
switch (player->characterID) {
333
case ID_SONIC: self->tvDisplayTop = LOVETESTER_LIST_SONIC; break;
334
case ID_TAILS: self->tvDisplayTop = LOVETESTER_LIST_TAILS; break;
335
case ID_KNUCKLES: self->tvDisplayTop = LOVETESTER_LIST_KNUX; break;
336
}
337
338
self->nextDisplayBottom = self->tvDisplayTop;
339
while (self->nextDisplayBottom == self->tvDisplayTop) {
340
self->nextDisplayBottom = RSDK.Rand(LOVETESTER_LIST_SONIC, LOVETESTER_LIST_HEART);
341
}
342
343
self->state = LoveTester_State_SetupMatching;
344
}
345
else {
346
self->isTVActiveTop = !(self->timer & 2);
347
self->isTVActiveBottom = !(self->timer & 2);
348
self->timer++;
349
}
350
}
351
352
void LoveTester_State_SetupMatching(void)
353
{
354
RSDK_THIS(LoveTester);
355
356
LoveTester_CheckPlayerCollisions_Solid();
357
LoveTester_CheckPlayerCollisions_Entry(true);
358
359
if (self->timer < 168) {
360
int32 timer = self->timer & 0b10000000000000000000000000000011;
361
362
bool32 shouldChangeDisplay = !timer;
363
if (timer < 0)
364
shouldChangeDisplay = (int32)((timer - 1) | 0xFFFFFFFC) == -1;
365
366
if (shouldChangeDisplay) {
367
int32 displayBottom = self->tvDisplayBottom;
368
int32 displayTop = self->tvDisplayTop;
369
370
while (true) {
371
self->tvDisplayBottom = displayTop;
372
if (displayTop != self->tvDisplayTop && displayTop != displayBottom)
373
break;
374
displayTop = RSDK.Rand(LOVETESTER_LIST_SONIC, LOVETESTER_LIST_HEART);
375
}
376
}
377
378
if (self->timer >= 128)
379
self->tvDisplayBottom = LOVETESTER_LIST_NONE;
380
381
switch (self->timer++) {
382
default: break;
383
384
case 0:
385
self->lightsID = 0;
386
self->stateLights = LoveTester_StateLights_FlashSlow;
387
break;
388
389
case 80:
390
self->lightsID = 0;
391
self->stateLights = LoveTester_StateLights_FlashMed;
392
break;
393
394
case 128:
395
self->lightsID = 0;
396
self->stateLights = LoveTester_StateLights_FlashFast;
397
break;
398
}
399
}
400
else {
401
EntityPlayer *player = self->playerPtr;
402
self->lightsID = 0;
403
self->stateLights = StateMachine_None;
404
405
switch (player->characterID) {
406
case ID_SONIC:
407
if (self->nextDisplayBottom == LOVETESTER_LIST_EGGMAN)
408
self->state = LoveTester_State_BadMatch;
409
else if (self->nextDisplayBottom == LOVETESTER_LIST_AMY)
410
self->state = LoveTester_State_UnluckyMatch;
411
else
412
self->state = LoveTester_State_GoodMatch;
413
break;
414
415
case ID_TAILS:
416
if (self->nextDisplayBottom == LOVETESTER_LIST_SONIC)
417
self->state = LoveTester_State_UnluckyMatch;
418
else if (self->nextDisplayBottom == LOVETESTER_LIST_EGGMAN)
419
self->state = LoveTester_State_UnluckyMatch;
420
else
421
self->state = LoveTester_State_GoodMatch;
422
break;
423
424
case ID_KNUCKLES:
425
if (self->nextDisplayBottom == LOVETESTER_LIST_SONIC)
426
self->state = LoveTester_State_BadMatch;
427
else if (self->nextDisplayBottom == LOVETESTER_LIST_EGGMAN)
428
self->state = LoveTester_State_UnluckyMatch;
429
else
430
self->state = LoveTester_State_GoodMatch;
431
break;
432
}
433
434
if (self->state == LoveTester_State_UnluckyMatch) {
435
self->tvFrameTop = 1;
436
LoveTester_CreateHeartParticles();
437
}
438
else if (self->state == LoveTester_State_BadMatch) {
439
self->tvFrameTop = 2;
440
}
441
442
self->tvDisplayBottom = self->nextDisplayBottom;
443
self->timer = 0;
444
}
445
}
446
447
void LoveTester_State_UnluckyMatch(void)
448
{
449
RSDK_THIS(LoveTester);
450
EntityPlayer *player = self->playerPtr;
451
452
if (self->timer >= 64) {
453
self->timer = 0;
454
self->tvDisplayBottom = self->nextDisplayBottom;
455
self->matchingFinished = true;
456
self->state = LoveTester_State_ReleasePlayers;
457
}
458
else {
459
switch (self->timer++ % 32) {
460
default: break;
461
462
case 0:
463
self->tvDisplayBottom = self->nextDisplayBottom;
464
LoveTester_GiveScore(player);
465
break;
466
467
case 16:
468
self->tvDisplayBottom = 6;
469
LoveTester_GiveScore(player);
470
break;
471
}
472
}
473
474
LoveTester_CheckPlayerCollisions_Solid();
475
LoveTester_CheckPlayerCollisions_Entry(true);
476
}
477
478
void LoveTester_State_GoodMatch(void)
479
{
480
RSDK_THIS(LoveTester);
481
482
if (self->timer >= 24) {
483
self->timer = 0;
484
self->matchingFinished = true;
485
self->state = LoveTester_State_ReleasePlayers;
486
}
487
else {
488
if (!self->timer)
489
LoveTester_GiveScore(self->playerPtr);
490
++self->timer;
491
}
492
493
LoveTester_CheckPlayerCollisions_Solid();
494
LoveTester_CheckPlayerCollisions_Entry(true);
495
}
496
497
void LoveTester_State_BadMatch(void)
498
{
499
RSDK_THIS(LoveTester);
500
501
if (self->timer >= 64) {
502
self->timer = 0;
503
self->tvDisplayBottom = self->nextDisplayBottom;
504
self->matchingFinished = true;
505
self->state = LoveTester_State_ReleasePlayers;
506
}
507
else {
508
switch (self->timer++ % 32) {
509
default: break;
510
case 0: self->tvDisplayBottom = self->nextDisplayBottom; break;
511
case 16: self->tvDisplayBottom = 7; break;
512
}
513
}
514
515
LoveTester_CheckPlayerCollisions_Solid();
516
LoveTester_CheckPlayerCollisions_Entry(true);
517
}
518
519
void LoveTester_State_ReleasePlayers(void)
520
{
521
RSDK_THIS(LoveTester);
522
523
LoveTester_CheckPlayerCollisions_Solid();
524
525
foreach_active(Player, player)
526
{
527
if (player == self->playerPtr) {
528
if (!Player_CheckCollisionTouch(player, self, &LoveTester->hitboxEntry)) {
529
self->activePlayers = 0;
530
self->state = LoveTester_State_Init;
531
}
532
}
533
}
534
}
535
536
void LoveTester_State_HeartParticles(void)
537
{
538
RSDK_THIS(LoveTester);
539
540
self->velocity.y -= 0x700;
541
self->position.x += self->velocity.x;
542
self->position.y += self->velocity.y;
543
544
if (!RSDK.CheckOnScreen(self, &self->updateRange))
545
destroyEntity(self);
546
}
547
548
void LoveTester_StateLights_FlashSlow(void)
549
{
550
RSDK_THIS(LoveTester);
551
552
switch (self->lightsID % 40) {
553
case 0:
554
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[1], true, 0);
555
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[8], true, 0);
556
break;
557
558
case 8:
559
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[3], true, 0);
560
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[6], true, 0);
561
break;
562
563
case 16:
564
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[5], true, 0);
565
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[4], true, 0);
566
break;
567
568
case 24:
569
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[7], true, 0);
570
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[2], true, 0);
571
break;
572
573
case 32:
574
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[9], true, 0);
575
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[0], true, 0);
576
break;
577
}
578
579
++self->lightsID;
580
}
581
582
void LoveTester_StateLights_FlashMed(void)
583
{
584
RSDK_THIS(LoveTester);
585
586
switch (self->lightsID % 24) {
587
case 0:
588
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[0], true, 0);
589
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[1], true, 0);
590
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[8], true, 0);
591
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[9], true, 0);
592
break;
593
594
case 8:
595
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[2], true, 0);
596
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[3], true, 0);
597
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[6], true, 0);
598
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[7], true, 0);
599
break;
600
601
case 16:
602
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[4], true, 0);
603
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[5], true, 0);
604
break;
605
}
606
607
++self->lightsID;
608
}
609
610
void LoveTester_StateLights_FlashFast(void)
611
{
612
RSDK_THIS(LoveTester);
613
614
switch (self->lightsID % 20) {
615
case 0:
616
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[0], true, 0);
617
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[1], true, 0);
618
break;
619
620
case 2:
621
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[2], true, 0);
622
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[3], true, 0);
623
break;
624
625
case 4:
626
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[4], true, 0);
627
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[5], true, 0);
628
break;
629
630
case 6:
631
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[6], true, 0);
632
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[7], true, 0);
633
break;
634
635
case 8:
636
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[8], true, 0);
637
RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[9], true, 0);
638
break;
639
}
640
641
++self->lightsID;
642
}
643
644
#if GAME_INCLUDE_EDITOR
645
void LoveTester_EditorDraw(void)
646
{
647
RSDK_THIS(LoveTester);
648
649
for (int32 i = 0; i < 10; ++i) RSDK.SetSpriteAnimation(LoveTester->aniFrames, 2, &self->lightAnimator[i], true, 5);
650
651
LoveTester_Draw();
652
}
653
654
void LoveTester_EditorLoad(void)
655
{
656
LoveTester->aniFrames = RSDK.LoadSpriteAnimation("SPZ2/LoveTester.bin", SCOPE_STAGE);
657
658
LoveTester_SetupHitboxes();
659
LoveTester_SetupLightOffsets();
660
}
661
#endif
662
663
void LoveTester_Serialize(void) {}
664
665