Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/SPZ/LEDPanel.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: LEDPanel Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectLEDPanel *LEDPanel;
11
12
void LEDPanel_Update(void)
13
{
14
RSDK_THIS(LEDPanel);
15
16
for (self->row = 0; self->row < LEDPANEL_ROW_COUNT; ++self->row) {
17
StateMachine_Run(self->stateRow[self->row]);
18
}
19
}
20
21
void LEDPanel_LateUpdate(void) {}
22
23
void LEDPanel_StaticUpdate(void) {}
24
25
void LEDPanel_Draw(void)
26
{
27
RSDK_THIS(LEDPanel);
28
29
RSDK.DrawRect(self->position.x - (self->size.x >> 1) + 0x80000, self->position.y - (self->size.y >> 1), self->size.x - 0x100000, self->size.y,
30
LEDPanel->panelColor, 512, INK_NONE, false);
31
32
RSDKScreenInfo *screen = &ScreenInfo[SceneInfo->currentScreenID];
33
34
int32 clipX1 = screen->clipBound_X1;
35
int32 clipX2 = screen->clipBound_X2;
36
int32 clipY1 = screen->clipBound_Y1;
37
int32 clipY2 = screen->clipBound_Y2;
38
39
int32 clipBound_X1 = self->left - screen->position.x + (self->position.x >> 16) + 8;
40
int32 clipBound_X2 = self->right - screen->position.x + (self->position.x >> 16) - 8;
41
int32 clipBound_Y1 = (self->position.y >> 16) + self->top - screen->position.y;
42
int32 clipBound_Y2 = (self->position.y >> 16) + self->bottom - screen->position.y;
43
44
RSDK.SetClipBounds(SceneInfo->currentScreenID, clipBound_X1, clipBound_Y1, clipBound_X2, clipBound_Y2);
45
46
for (int32 r = 0; r < LEDPANEL_ROW_COUNT; ++r)
47
RSDK.DrawText(&self->animatorText, &self->textPos[r], &self->activeText[r], 0, self->activeText[r].length, ALIGN_CENTER, 0, 0, NULL, false);
48
49
screen->clipBound_X1 = clipX1;
50
screen->clipBound_X2 = clipX2;
51
screen->clipBound_Y1 = clipY1;
52
screen->clipBound_Y2 = clipY2;
53
RSDK.SetClipBounds(SceneInfo->currentScreenID, clipX1, clipY1, clipX2, clipY2);
54
}
55
56
void LEDPanel_Create(void *data)
57
{
58
RSDK_THIS(LEDPanel);
59
60
self->active = ACTIVE_BOUNDS;
61
self->visible = true;
62
self->drawGroup = Zone->objectDrawGroup[0];
63
self->updateRange = self->size;
64
RSDK.SetSpriteAnimation(LEDPanel->aniFrames, 0, &self->animatorText, true, 0);
65
66
if (!SceneInfo->inEditor) {
67
for (int32 i = 0; i < LEDPANEL_TEXT_COUNT; ++i) {
68
RSDK.SetSpriteString(LEDPanel->aniFrames, 0, &self->text[i]);
69
self->textPtrs[i] = &self->text[i];
70
}
71
72
self->left = -(self->size.x >> 17);
73
self->right = self->size.x >> 17;
74
self->top = -(self->size.y >> 17);
75
self->bottom = self->size.y >> 17;
76
77
self->curXBoundaryL = (self->size.x >> 1);
78
self->newXBoundaryL = (self->size.x >> 1);
79
self->curYBoundaryT = -(self->size.y >> 1);
80
self->newYBoundaryT = -(self->size.y >> 1);
81
self->curXBoundaryR = -(self->size.x >> 1);
82
self->newXBoundaryR = -(self->size.x >> 1);
83
self->curYBoundaryB = -(self->size.y >> 1);
84
self->newYBoundaryB = -(self->size.y >> 1);
85
86
self->boundsMoveSpeed.x = 0x10000;
87
self->boundsMoveSpeed.y = 0x10000;
88
89
int32 offset = 0;
90
for (int32 r = 0; r < LEDPANEL_ROW_COUNT; ++r) {
91
LEDPanel_SetupActiveText(r, self->textPtrs[r]);
92
93
self->seqPtrs[r] = &self->seq[r];
94
self->textMoveVel[r].x = 0x10000;
95
self->textMoveVel[r].y = 0x10000;
96
97
self->textPos[r].x = self->position.x;
98
self->textPos[r].y = self->position.y;
99
self->textPos[r].x += (self->activeText[r].length << 20) - (self->size.x >> 1) + 0x80000;
100
self->textPos[r].y += (0x100000 + offset) - (self->size.y >> 1);
101
102
self->textMovePos[r].x = 0;
103
self->textMovePos[r].y = offset;
104
105
self->textTargetPos[r].x = 0;
106
self->textTargetPos[r].y = offset;
107
108
self->stateRow[r] = StateMachine_None;
109
110
offset += 0x200000;
111
}
112
113
for (self->row = 0; self->row < LEDPANEL_ROW_COUNT; ++self->row) LEDPanel_HandleCharacters();
114
}
115
}
116
117
void LEDPanel_StageLoad(void)
118
{
119
if (RSDK.CheckSceneFolder("SPZ1"))
120
LEDPanel->aniFrames = RSDK.LoadSpriteAnimation("SPZ1/LED.bin", SCOPE_STAGE);
121
122
RSDK.InitString(&LEDPanel->text, " ", 0);
123
124
LEDPanel->panelColor = RSDK.GetPaletteEntry(0, 190);
125
}
126
127
void LEDPanel_SetupActiveText(int32 row, String *src)
128
{
129
RSDK_THIS(LEDPanel);
130
131
RSDK.CopyString(&self->activeText[row], src);
132
133
self->activeTextSize[row] = self->activeText[row].length;
134
for (int32 i = 0; i < self->activeText[row].length; ++i) {
135
if (self->activeText[row].chars[i] != 27) {
136
self->activeTextSize[row] = i;
137
break;
138
}
139
}
140
141
self->activeTextLen[row] = 0;
142
for (int32 i = self->activeText[row].length - 1; i >= 0; --i) {
143
if (self->activeText[row].chars[i] != 27) {
144
self->activeTextLen[row] = i;
145
break;
146
}
147
}
148
}
149
150
void LEDPanel_SetupTextPos(int32 row, int32 x, int32 y)
151
{
152
RSDK_THIS(LEDPanel);
153
154
self->textPos[row].x = self->position.x + ((self->activeText[row].length << 20) - (self->size.x >> 1) + x + 0x80000);
155
self->textPos[row].y = self->position.y + (y - (self->size.y >> 1) + 0x100000);
156
}
157
158
void LEDPanel_HandleCharacters(void)
159
{
160
RSDK_THIS(LEDPanel);
161
162
self->rowSignaled[self->row] = false;
163
bool32 finished = false;
164
165
while (!finished) {
166
int32 action = -1;
167
int32 subAction = -1;
168
169
if (self->rowSeqPos[self->row] < self->seqPtrs[self->row]->length)
170
action = self->seqPtrs[self->row]->chars[self->rowSeqPos[self->row]++];
171
172
switch (action) {
173
case 'A':
174
subAction = self->seqPtrs[self->row]->chars[self->rowSeqPos[self->row]++] - '0';
175
switch (subAction) {
176
case 0:
177
self->textMovePos[self->row].x = -0x100000 * self->activeText[self->row].length;
178
self->textTargetPos[self->row].x = self->textMovePos[self->row].x;
179
break;
180
181
case 1:
182
self->textMovePos[self->row].x = 0;
183
self->textTargetPos[self->row].x = 0;
184
break;
185
186
case 2:
187
self->textMovePos[self->row].x = (self->size.x >> 1) - (self->activeText[self->row].length << 19) - 0x80000;
188
self->textTargetPos[self->row].x = self->textMovePos[self->row].x;
189
break;
190
191
case 3:
192
self->textMovePos[self->row].x = self->size.x - (self->activeText[self->row].length << 20) - 0x100000;
193
self->textTargetPos[self->row].x = self->textMovePos[self->row].x;
194
break;
195
196
case 4:
197
self->textMovePos[self->row].x = self->size.x;
198
self->textTargetPos[self->row].x = self->textMovePos[self->row].x;
199
break;
200
201
default: break;
202
}
203
204
LEDPanel_SetupTextPos(self->row, self->textMovePos[self->row].x, self->textMovePos[self->row].y);
205
break;
206
207
case 'B':
208
subAction = self->seqPtrs[self->row]->chars[self->rowSeqPos[self->row]++] - '0';
209
switch (subAction) {
210
case 0:
211
self->textMovePos[self->row].y = -0x200000;
212
self->textTargetPos[self->row].y = -0x200000;
213
break;
214
215
case 1:
216
self->textMovePos[self->row].y = 0;
217
self->textTargetPos[self->row].y = 0;
218
break;
219
220
case 2:
221
self->textMovePos[self->row].y = (self->size.y >> 1) - 0x100000;
222
self->textTargetPos[self->row].y = self->textMovePos[self->row].y;
223
break;
224
225
case 3:
226
self->textMovePos[self->row].y = self->size.y - 0x200000;
227
self->textTargetPos[self->row].y = self->textMovePos[self->row].y;
228
break;
229
230
case 4:
231
self->textMovePos[self->row].y = self->size.y;
232
self->textTargetPos[self->row].y = self->textMovePos[self->row].y;
233
break;
234
235
default: break;
236
}
237
238
LEDPanel_SetupTextPos(self->row, self->textMovePos[self->row].x, self->textMovePos[self->row].y);
239
break;
240
241
case 'C':
242
subAction = self->seqPtrs[self->row]->chars[self->rowSeqPos[self->row]++] - '0';
243
switch (subAction) {
244
case 0: self->textTargetPos[self->row].x = -0x100000 * self->activeText[self->row].length; break;
245
case 1: self->textTargetPos[self->row].x = 0; break;
246
case 2: self->textTargetPos[self->row].x = (self->size.x >> 1) - (self->activeText[self->row].length << 19) - 0x80000; break;
247
case 3: self->textTargetPos[self->row].x = self->size.x - (self->activeText[self->row].length << 20) - 0x100000; break;
248
case 4: self->textTargetPos[self->row].x = self->size.x; break;
249
default: break;
250
}
251
break;
252
253
case 'D':
254
subAction = self->seqPtrs[self->row]->chars[self->rowSeqPos[self->row]++] - '0';
255
256
switch (subAction) {
257
case 0: self->textTargetPos[self->row].y = -0x200000; break;
258
case 1: self->textTargetPos[self->row].y = 0; break;
259
case 2: self->textTargetPos[self->row].y = (self->size.y >> 1) - 0x100000; break;
260
case 3: self->textTargetPos[self->row].y = self->size.y - 0x200000; break;
261
case 4: self->textTargetPos[self->row].y = self->size.y; break;
262
default: break;
263
}
264
break;
265
266
case 'E':
267
self->stateRow[self->row] = LEDPanel_StateText_Move;
268
LEDPanel_StateText_Move();
269
finished = true;
270
break;
271
272
case 'F':
273
subAction = self->seqPtrs[self->row]->chars[self->rowSeqPos[self->row]++] - '0';
274
275
switch (subAction) {
276
default: break;
277
278
case 0:
279
++self->activeTextLen[self->row];
280
LEDPanel->text.chars[0] = self->seqPtrs[self->row]->chars[self->rowSeqPos[self->row]++];
281
RSDK.SetSpriteString(LEDPanel->aniFrames, 0, &LEDPanel->text);
282
self->activeText[self->row].chars[self->activeTextLen[self->row]] = LEDPanel->text.chars[0];
283
break;
284
285
case 1:
286
--self->activeTextSize[self->row];
287
LEDPanel->text.chars[0] = self->seqPtrs[self->row]->chars[self->rowSeqPos[self->row]++];
288
RSDK.SetSpriteString(LEDPanel->aniFrames, 0, &LEDPanel->text);
289
self->activeText[self->row].chars[self->activeTextSize[self->row]] = LEDPanel->text.chars[0];
290
break;
291
}
292
break;
293
294
case 'G':
295
subAction = self->seqPtrs[self->row]->chars[self->rowSeqPos[self->row]++] - '0';
296
297
switch (subAction) {
298
default: break;
299
300
case 0: self->activeText[self->row].chars[self->activeTextLen[self->row]--] = 27; break;
301
302
case 1: self->activeText[self->row].chars[self->activeTextSize[self->row]++] = 27; break;
303
}
304
break;
305
306
case 'H':
307
self->stateRow[self->row] = LEDPanel_StateText_WaitForSignal;
308
LEDPanel_StateText_WaitForSignal();
309
finished = true;
310
break;
311
312
case 'I':
313
self->rowSignaled[self->row] = true;
314
self->stateRow[self->row] = LEDPanel_HandleCharacters;
315
finished = true;
316
break;
317
318
case 'J':
319
subAction = self->seqPtrs[self->row]->chars[self->rowSeqPos[self->row]++] - '0';
320
LEDPanel_SetupActiveText(self->row, self->textPtrs[subAction]);
321
break;
322
323
case 'K':
324
self->rowDelay[self->row] = 15;
325
self->stateRow[self->row] = LEDPanel_StateText_Delay;
326
finished = true;
327
break;
328
329
case 'L': self->textMoveVel[self->row].x = (self->seqPtrs[self->row]->chars[self->rowSeqPos[self->row]++] - '/') << 15; break;
330
case 'M': self->textMoveVel[self->row].y = (self->seqPtrs[self->row]->chars[self->rowSeqPos[self->row]++] - '/') << 15; break;
331
case 'N': self->boundsMoveSpeed.x = (self->seqPtrs[self->row]->chars[self->rowSeqPos[self->row]++] - '/') << 15; break;
332
case 'O': self->boundsMoveSpeed.y = (self->seqPtrs[self->row]->chars[self->rowSeqPos[self->row]++] - '/') << 15; break;
333
334
case 'P':
335
subAction = self->seqPtrs[self->row]->chars[self->rowSeqPos[self->row]++] - '0';
336
337
switch (subAction) {
338
default: break;
339
340
case 1:
341
self->newXBoundaryL = -(self->size.x >> 1);
342
self->curXBoundaryL = -(self->size.x >> 1);
343
self->left = self->curXBoundaryL >> 16;
344
break;
345
346
case 2:
347
self->curXBoundaryL = 0;
348
self->newXBoundaryL = 0;
349
self->left = 0;
350
break;
351
352
case 3:
353
self->newXBoundaryL = self->size.x >> 1;
354
self->curXBoundaryL = self->size.x >> 1;
355
self->left = self->curXBoundaryL >> 16;
356
break;
357
}
358
break;
359
360
case 'Q':
361
subAction = self->seqPtrs[self->row]->chars[self->rowSeqPos[self->row]++] - '0';
362
363
switch (subAction) {
364
default: break;
365
366
case 1:
367
self->newYBoundaryT = -(self->size.y >> 1);
368
self->curYBoundaryT = -(self->size.y >> 1);
369
self->top = self->curYBoundaryT >> 16;
370
break;
371
372
case 2:
373
self->curYBoundaryT = 0;
374
self->newYBoundaryT = 0;
375
self->top = 0;
376
break;
377
378
case 3:
379
self->newYBoundaryT = self->size.y >> 1;
380
self->curYBoundaryT = self->size.y >> 1;
381
self->top = self->curYBoundaryT >> 16;
382
break;
383
}
384
break;
385
386
case 'R':
387
subAction = self->seqPtrs[self->row]->chars[self->rowSeqPos[self->row]++] - '0';
388
389
switch (subAction) {
390
default: break;
391
392
case 1:
393
self->newXBoundaryR = -(self->size.x >> 1);
394
self->curXBoundaryR = -(self->size.x >> 1);
395
self->right = self->curXBoundaryR >> 16;
396
break;
397
398
case 2:
399
self->curXBoundaryR = 0;
400
self->newXBoundaryR = 0;
401
self->right = 0;
402
break;
403
404
case 3:
405
self->newXBoundaryR = self->size.x >> 1;
406
self->curXBoundaryR = self->size.x >> 1;
407
self->right = self->curXBoundaryR >> 16;
408
break;
409
}
410
break;
411
412
case 'S':
413
subAction = self->seqPtrs[self->row]->chars[self->rowSeqPos[self->row]++] - '0';
414
415
switch (subAction) {
416
default: break;
417
case 1:
418
self->newYBoundaryB = -(self->size.y >> 1);
419
self->curYBoundaryB = -(self->size.y >> 1);
420
self->bottom = self->curYBoundaryB >> 16;
421
break;
422
case 2:
423
self->curYBoundaryB = 0;
424
self->newYBoundaryB = 0;
425
self->bottom = 0;
426
break;
427
case 3:
428
self->newYBoundaryB = self->size.y >> 1;
429
self->curYBoundaryB = self->size.y >> 1;
430
self->bottom = self->curYBoundaryB >> 16;
431
break;
432
}
433
break;
434
435
case 'T':
436
subAction = self->seqPtrs[self->row]->chars[self->rowSeqPos[self->row]++] - '0';
437
438
switch (subAction) {
439
default: break;
440
case 1: self->newXBoundaryL = -(self->size.x >> 1); break;
441
case 2: self->newXBoundaryL = 0; break;
442
case 3: self->newXBoundaryL = self->size.x >> 1; break;
443
}
444
break;
445
446
case 'U':
447
subAction = self->seqPtrs[self->row]->chars[self->rowSeqPos[self->row]++] - '0';
448
449
switch (subAction) {
450
default: break;
451
case 1: self->newYBoundaryT = -(self->size.y >> 1); break;
452
case 2: self->newYBoundaryT = 0; break;
453
case 3: self->newYBoundaryT = self->size.y >> 1; break;
454
}
455
break;
456
457
case 'V':
458
subAction = self->seqPtrs[self->row]->chars[self->rowSeqPos[self->row]++] - '0';
459
460
switch (subAction) {
461
default: break;
462
case 1: self->newXBoundaryR = -(self->size.x >> 1); break;
463
case 2: self->newXBoundaryR = 0; break;
464
case 3: self->newXBoundaryR = self->size.x >> 1; break;
465
}
466
break;
467
468
case 'W':
469
subAction = self->seqPtrs[self->row]->chars[self->rowSeqPos[self->row]++] - '0';
470
471
switch (subAction) {
472
default: break;
473
case 1: self->newYBoundaryB = -(self->size.y >> 1); break;
474
case 2: self->newYBoundaryB = 0; break;
475
case 3: self->newYBoundaryB = self->size.y >> 1; break;
476
}
477
break;
478
479
case 'X':
480
self->stateRow[self->row] = LEDPanel_StateText_ChangeClipBounds;
481
LEDPanel_StateText_ChangeClipBounds();
482
finished = true;
483
break;
484
485
default: self->rowSeqPos[self->row] = 0; break;
486
}
487
}
488
}
489
490
void LEDPanel_StateText_Move(void)
491
{
492
RSDK_THIS(LEDPanel);
493
494
if (self->textMovePos[self->row].x != self->textTargetPos[self->row].x) {
495
if (self->textMovePos[self->row].x >= self->textTargetPos[self->row].x) {
496
self->textMovePos[self->row].x -= self->textMoveVel[self->row].x;
497
498
if (self->textMovePos[self->row].x < self->textTargetPos[self->row].x)
499
self->textMovePos[self->row].x = self->textTargetPos[self->row].x;
500
}
501
else {
502
self->textMovePos[self->row].x += self->textMoveVel[self->row].x;
503
504
if (self->textMovePos[self->row].x > self->textTargetPos[self->row].x)
505
self->textMovePos[self->row].x = self->textTargetPos[self->row].x;
506
}
507
}
508
509
if (self->textMovePos[self->row].y != self->textTargetPos[self->row].y) {
510
if (self->textMovePos[self->row].y >= self->textTargetPos[self->row].y) {
511
self->textMovePos[self->row].y -= self->textMoveVel[self->row].y;
512
513
if (self->textMovePos[self->row].y < self->textTargetPos[self->row].y)
514
self->textMovePos[self->row].y = self->textTargetPos[self->row].y;
515
}
516
else {
517
self->textMovePos[self->row].y += self->textMoveVel[self->row].y;
518
519
if (self->textMovePos[self->row].y > self->textTargetPos[self->row].y)
520
self->textMovePos[self->row].y = self->textTargetPos[self->row].y;
521
}
522
}
523
524
self->textPos[self->row].x = self->position.x;
525
self->textPos[self->row].y = self->position.y;
526
self->textPos[self->row].x += (self->activeText[self->row].length << 20) - (self->size.x >> 1) + self->textMovePos[self->row].x + 0x80000;
527
self->textPos[self->row].y += self->textMovePos[self->row].y - (self->size.y >> 1) + 0x100000;
528
529
if (self->textMovePos[self->row].x == self->textTargetPos[self->row].x && self->textMovePos[self->row].y == self->textTargetPos[self->row].y)
530
LEDPanel_HandleCharacters();
531
}
532
533
void LEDPanel_StateText_Delay(void)
534
{
535
RSDK_THIS(LEDPanel);
536
537
if (--self->rowDelay[self->row] <= 0)
538
LEDPanel_HandleCharacters();
539
}
540
541
void LEDPanel_StateText_ChangeClipBounds(void)
542
{
543
RSDK_THIS(LEDPanel);
544
545
int32 count = 0;
546
547
if (self->curXBoundaryL == self->newXBoundaryL) {
548
count = 1;
549
}
550
else if (self->curXBoundaryL >= self->newXBoundaryL) {
551
self->curXBoundaryL -= self->boundsMoveSpeed.x;
552
if (self->curXBoundaryL < self->newXBoundaryL)
553
self->curXBoundaryL = self->newXBoundaryL;
554
}
555
else {
556
self->curXBoundaryL += self->boundsMoveSpeed.x;
557
if (self->curXBoundaryL > self->newXBoundaryL)
558
self->curXBoundaryL = self->newXBoundaryL;
559
}
560
561
if (self->curXBoundaryR == self->newXBoundaryR) {
562
++count;
563
}
564
else {
565
if (self->curXBoundaryR < self->newXBoundaryR) {
566
self->curXBoundaryR += self->boundsMoveSpeed.x;
567
if (self->curXBoundaryR > self->newXBoundaryR)
568
self->curXBoundaryR = self->newXBoundaryR;
569
}
570
else {
571
self->curXBoundaryR -= self->boundsMoveSpeed.x;
572
if (self->curXBoundaryR < self->newXBoundaryR)
573
self->curXBoundaryR = self->newXBoundaryR;
574
}
575
}
576
577
if (self->curYBoundaryT == self->newYBoundaryT) {
578
++count;
579
}
580
else if (self->curYBoundaryT >= self->newYBoundaryT) {
581
self->curYBoundaryT -= self->boundsMoveSpeed.y;
582
if (self->curYBoundaryT < self->newYBoundaryT)
583
self->curYBoundaryT = self->newYBoundaryT;
584
}
585
else {
586
self->curYBoundaryT += self->boundsMoveSpeed.y;
587
if (self->curYBoundaryT > self->newYBoundaryT)
588
self->curYBoundaryT = self->newYBoundaryT;
589
}
590
591
if (self->curYBoundaryB == self->newYBoundaryB) {
592
++count;
593
}
594
else {
595
if (self->curYBoundaryB < self->newYBoundaryB) {
596
self->curYBoundaryB += self->boundsMoveSpeed.y;
597
if (self->curYBoundaryB > self->newYBoundaryB)
598
self->curYBoundaryB = self->newYBoundaryB;
599
}
600
else {
601
self->curYBoundaryB -= self->boundsMoveSpeed.y;
602
if (self->curYBoundaryB < self->newYBoundaryB)
603
self->curYBoundaryB = self->newYBoundaryB;
604
}
605
}
606
607
self->left = self->curXBoundaryL >> 16;
608
self->top = self->curYBoundaryT >> 16;
609
self->right = self->curXBoundaryR >> 16;
610
self->bottom = self->curYBoundaryB >> 16;
611
612
if (count == 4)
613
LEDPanel_HandleCharacters();
614
}
615
616
void LEDPanel_StateText_WaitForSignal(void)
617
{
618
RSDK_THIS(LEDPanel);
619
620
int32 row = self->row ^ 1;
621
if (self->rowSignaled[row]) {
622
self->rowSignaled[row] = false;
623
self->stateRow[self->row] = StateMachine_None;
624
LEDPanel_HandleCharacters();
625
}
626
}
627
628
#if GAME_INCLUDE_EDITOR
629
void LEDPanel_EditorDraw(void)
630
{
631
RSDK_THIS(LEDPanel);
632
Vector2 drawPos = self->position;
633
634
const char *text = "LEDPANEL";
635
636
drawPos.x -= 4 * 0x100000;
637
638
for (int32 i = 0; i < 8; ++i) {
639
self->animatorText.frameID = text[i] - 'A';
640
641
RSDK.DrawSprite(&self->animatorText, &drawPos, false);
642
643
drawPos.x += 0x100000;
644
}
645
646
if (showGizmos()) {
647
RSDK_DRAWING_OVERLAY(true);
648
649
Hitbox hitbox;
650
hitbox.left = -(self->size.x >> 17);
651
hitbox.right = self->size.x >> 17;
652
hitbox.top = -(self->size.y >> 17);
653
hitbox.bottom = self->size.y >> 17;
654
655
DrawHelpers_DrawHitboxOutline(self->position.x, self->position.y, &hitbox, FLIP_NONE, 0xFFFF00);
656
657
RSDK_DRAWING_OVERLAY(false);
658
}
659
}
660
661
void LEDPanel_EditorLoad(void) { LEDPanel->aniFrames = RSDK.LoadSpriteAnimation("SPZ1/LED.bin", SCOPE_STAGE); }
662
#endif
663
664
void LEDPanel_Serialize(void)
665
{
666
RSDK_EDITABLE_ARRAY(LEDPanel, VAR_STRING, text, LEDPANEL_TEXT_COUNT, String);
667
RSDK_EDITABLE_ARRAY(LEDPanel, VAR_STRING, seq, LEDPANEL_ROW_COUNT, String);
668
RSDK_EDITABLE_VAR(LEDPanel, VAR_VECTOR2, size);
669
}
670
671