Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/LRZ/HeavyKing.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: HeavyKing Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectHeavyKing *HeavyKing;
11
12
void HeavyKing_Update(void)
13
{
14
RSDK_THIS(HeavyKing);
15
16
RSDK.ProcessAnimation(&self->bodyAnimator);
17
RSDK.ProcessAnimation(&self->scepterAnimator);
18
19
if (self->invincibilityTimer > 0)
20
self->invincibilityTimer--;
21
22
StateMachine_Run(self->state);
23
}
24
25
void HeavyKing_LateUpdate(void) {}
26
27
void HeavyKing_StaticUpdate(void) {}
28
29
void HeavyKing_Draw(void)
30
{
31
RSDK_THIS(HeavyKing);
32
33
if (self->invincibilityTimer & 1) {
34
RSDK.CopyPalette(2, 16, 0, 16, 16);
35
RSDK.CopyPalette(2, 192, 0, 192, 16);
36
37
RSDK.DrawSprite(&self->bodyAnimator, NULL, false);
38
RSDK.DrawSprite(&self->scepterAnimator, NULL, false);
39
RSDK.DrawSprite(&self->electricityAnimator, NULL, false);
40
41
RSDK.CopyPalette(1, 16, 0, 16, 16);
42
RSDK.CopyPalette(1, 192, 0, 192, 16);
43
}
44
else {
45
RSDK.DrawSprite(&self->bodyAnimator, NULL, false);
46
RSDK.DrawSprite(&self->scepterAnimator, NULL, false);
47
RSDK.DrawSprite(&self->electricityAnimator, NULL, false);
48
}
49
}
50
51
void HeavyKing_Create(void *data)
52
{
53
RSDK_THIS(HeavyKing);
54
55
if (!SceneInfo->inEditor) {
56
if (globals->gameMode == MODE_TIMEATTACK) {
57
destroyEntity(self);
58
}
59
else {
60
self->drawGroup = Zone->objectDrawGroup[0];
61
self->drawFX = FX_FLIP;
62
self->active = ACTIVE_BOUNDS;
63
self->updateRange.x = 0xC00000;
64
self->updateRange.y = 0x800000;
65
self->health = 8;
66
self->state = HeavyKing_State_SetupArena;
67
68
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 7, &self->bodyAnimator, true, 0);
69
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 16, &self->scepterAnimator, true, 0);
70
}
71
}
72
}
73
74
void HeavyKing_StageLoad(void)
75
{
76
HeavyKing->aniFrames = RSDK.LoadSpriteAnimation("LRZ3/HeavyKing.bin", SCOPE_STAGE);
77
HeavyKing->cutsceneFrames = RSDK.LoadSpriteAnimation("Players/KnuxCutsceneHPZ.bin", SCOPE_STAGE);
78
79
HeavyKing->attackPatternPos = 0;
80
81
HeavyKing->sfxHit = RSDK.GetSfx("Stage/BossHit.wav");
82
HeavyKing->sfxImpact2 = RSDK.GetSfx("Stage/Impact2.wav");
83
HeavyKing->sfxImpact5 = RSDK.GetSfx("Stage/Impact5.wav");
84
HeavyKing->sfxExplosion = RSDK.GetSfx("Stage/Explosion2.wav");
85
HeavyKing->sfxFreeze = RSDK.GetSfx("PSZ/Freeze.wav");
86
HeavyKing->sfxCharge = RSDK.GetSfx("LRZ/KingCharge.wav");
87
HeavyKing->sfxImpact6 = RSDK.GetSfx("Stage/Impact6.wav");
88
HeavyKing->sfxRodPlant = RSDK.GetSfx("LRZ/RodPlant.wav");
89
HeavyKing->sfxRodShine = RSDK.GetSfx("LRZ/RodShine.wav");
90
HeavyKing->sfxElecOn = RSDK.GetSfx("LRZ/ElecOn.wav");
91
HeavyKing->sfxTwinCharge = RSDK.GetSfx("LRZ/TwinCharge.wav");
92
93
HeavyKing->hitboxBody.left = -24;
94
HeavyKing->hitboxBody.top = 40;
95
HeavyKing->hitboxBody.right = 24;
96
HeavyKing->hitboxBody.bottom = 44;
97
98
HeavyKing->hitboxBoss.left = -20;
99
HeavyKing->hitboxBoss.top = 20;
100
HeavyKing->hitboxBoss.right = 20;
101
HeavyKing->hitboxBoss.bottom = 16;
102
103
HeavyKing->hitboxCharging.left = -32;
104
HeavyKing->hitboxCharging.top = -40;
105
HeavyKing->hitboxCharging.right = 32;
106
HeavyKing->hitboxCharging.bottom = 40;
107
}
108
109
void HeavyKing_CheckPlayerCollisions(void)
110
{
111
RSDK_THIS(HeavyKing);
112
113
foreach_active(Player, player)
114
{
115
if (!self->invincibilityTimer && Player_CheckBadnikTouch(player, self, &HeavyKing->hitboxBoss) && Player_CheckBossHit(player, self)) {
116
HeavyKing_Hit();
117
}
118
}
119
}
120
121
void HeavyKing_CheckPlayerCollisions_Charging(void)
122
{
123
RSDK_THIS(HeavyKing);
124
125
foreach_active(Player, player)
126
{
127
if (!self->invincibilityTimer && Player_CheckCollisionTouch(player, self, &HeavyKing->hitboxCharging)) {
128
Player_ElementHurt(player, self, SHIELD_LIGHTNING);
129
}
130
}
131
}
132
133
void HeavyKing_Hit(void)
134
{
135
RSDK_THIS(HeavyKing);
136
137
if (--self->health <= 0) {
138
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 6, &self->bodyAnimator, false, 0);
139
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 15, &self->scepterAnimator, false, 0);
140
141
self->state = HeavyKing_State_Destroyed;
142
self->velocity.y = -0x40000;
143
self->onGround = false;
144
self->timer = 0;
145
RSDK.StopSfx(HeavyKing->sfxTwinCharge);
146
147
foreach_active(KingAttack, attack) { destroyEntity(attack); }
148
149
SceneInfo->timeEnabled = false;
150
Player_GiveScore(RSDK_GET_ENTITY(SLOT_PLAYER1, Player), 1000);
151
}
152
else {
153
if (self->bodyAnimator.animationID == 5) {
154
self->invincibilityTimer = 48;
155
}
156
else {
157
self->invincibilityTimer = 96;
158
self->stateStore = self->state;
159
self->storedBodyAnimator = self->bodyAnimator;
160
self->storedScepterAnimator = self->scepterAnimator;
161
162
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 6, &self->bodyAnimator, false, 0);
163
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 15, &self->scepterAnimator, false, 0);
164
self->state = HeavyKing_State_HitRecoil;
165
}
166
167
RSDK.PlaySfx(HeavyKing->sfxHit, false, 255);
168
}
169
}
170
171
void HeavyKing_Explode(void)
172
{
173
RSDK_THIS(HeavyKing);
174
175
if (!(Zone->timer & 7)) {
176
RSDK.PlaySfx(HeavyKing->sfxExplosion, false, 255);
177
178
if (!(Zone->timer & 0xF)) {
179
int32 x = self->position.x + RSDK.Rand(-0x180000, 0x180000);
180
int32 y = self->position.y + RSDK.Rand(-0x180000, 0x180000);
181
CREATE_ENTITY(Explosion, INT_TO_VOID((RSDK.Rand(0, 256) > 192) + EXPLOSION_BOSS), x, y)->drawGroup = Zone->objectDrawGroup[1];
182
}
183
}
184
}
185
186
void HeavyKing_HandleClawMovement(void)
187
{
188
RSDK_THIS(HeavyKing);
189
190
EntityKingClaw *claw = self->claw;
191
192
if (claw) {
193
self->position = claw->position;
194
195
if (self->direction == FLIP_NONE)
196
self->position.x += 0x300000;
197
else
198
self->position.x -= 0x300000;
199
self->position.y += 0x9C0000;
200
}
201
}
202
203
void HeavyKing_HandleAnimators(void)
204
{
205
RSDK_THIS(HeavyKing);
206
207
self->bodyAnimator.speed = 0;
208
self->scepterAnimator.speed = 0;
209
210
if (self->velocity.y >= 0) {
211
if (self->velocity.y <= 0x10000) {
212
self->bodyAnimator.frameID = 7;
213
self->scepterAnimator.frameID = 7;
214
}
215
else {
216
self->bodyAnimator.frameID = 8;
217
self->scepterAnimator.frameID = 8;
218
}
219
}
220
else if (self->velocity.y >= -0x10000) {
221
self->bodyAnimator.frameID = 6;
222
self->scepterAnimator.frameID = 6;
223
}
224
else {
225
self->bodyAnimator.frameID = 5;
226
self->scepterAnimator.frameID = 5;
227
}
228
}
229
230
void HeavyKing_HandleHoverMovement(void)
231
{
232
RSDK_THIS(HeavyKing);
233
234
EntityPlayer *player = Player_GetNearestPlayerX();
235
236
int32 bounds = HeavyKing->boundsL;
237
if (player->position.x >= bounds) {
238
bounds = player->position.x;
239
if (player->position.x > HeavyKing->boundsR)
240
bounds = HeavyKing->boundsR;
241
}
242
243
int32 angle = RSDK.ATan2((bounds - self->position.x) >> 16, (player->position.y - self->position.y) >> 16);
244
int32 rot = 2 * angle;
245
246
if (abs(rot) >= abs(rot - 0x200)) {
247
if (abs(rot - 0x200) < abs(rot + 0x200))
248
self->rotation += ((rot - 0x200) >> 5);
249
else
250
self->rotation += ((rot + 0x200) >> 5);
251
}
252
else {
253
if (abs(rot) < abs(rot + 0x200))
254
self->rotation += (rot >> 5);
255
else
256
self->rotation += ((rot + 0x200) >> 5);
257
}
258
259
self->rotation &= 0x1FF;
260
261
int32 rx = (self->position.x - HeavyKing->boundsM) >> 16;
262
self->velocity.x = CLAMP(self->velocity.x + (8 * RSDK.Cos512(self->rotation)), -0x20000, 0x20000);
263
self->position.x += self->velocity.x;
264
self->originPos.y = HeavyKing->startY + 96 * abs(rx * rx);
265
self->direction = self->position.x <= player->position.x;
266
}
267
268
void HeavyKing_FindTargetEmerald(void)
269
{
270
RSDK_THIS(HeavyKing);
271
272
EntityHPZEmerald *targetEmerald = NULL;
273
int32 emeraldDist = 0x7FFFFFFF;
274
275
if (self->onGround) {
276
if (self->direction == FLIP_X) {
277
foreach_active(HPZEmerald, emerald)
278
{
279
if (emerald->type != HPZEMERALD_MASTER) {
280
int32 dist = emerald->position.x - self->position.x;
281
if (dist < emeraldDist && dist >= 0 && self->targetEmerald != emerald) {
282
emeraldDist = dist;
283
targetEmerald = emerald;
284
}
285
}
286
}
287
}
288
else {
289
foreach_active(HPZEmerald, emerald)
290
{
291
if (emerald->type != HPZEMERALD_MASTER) {
292
int32 dist = self->position.x - emerald->position.x;
293
if (dist < emeraldDist && dist >= 0 && self->targetEmerald != emerald) {
294
emeraldDist = dist;
295
targetEmerald = emerald;
296
}
297
}
298
}
299
}
300
301
if (targetEmerald)
302
self->targetEmerald = targetEmerald;
303
else
304
self->direction ^= FLIP_X;
305
}
306
else {
307
foreach_active(HPZEmerald, emerald)
308
{
309
if (emerald->type != HPZEMERALD_MASTER) {
310
int32 dist = abs(self->position.x - emerald->position.x);
311
if (dist < emeraldDist) {
312
emeraldDist = dist;
313
targetEmerald = emerald;
314
}
315
}
316
}
317
318
if (targetEmerald)
319
self->targetEmerald = targetEmerald;
320
}
321
}
322
323
void HeavyKing_StartLeap(int32 startFrame)
324
{
325
RSDK_THIS(HeavyKing);
326
327
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 3, &self->bodyAnimator, true, startFrame);
328
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 12, &self->scepterAnimator, true, startFrame);
329
330
if (RSDK.GetEntityCount(KingAttack->classID, true)) {
331
HeavyKing_FindTargetEmerald();
332
self->velocity.x = (self->targetEmerald->position.x - self->position.x) / 40;
333
EntityPlayer *player = Player_GetNearestPlayer();
334
335
foreach_active(KingAttack, attack)
336
{
337
if (attack->state == KingAttack_State_Orbiting) {
338
int32 angle = RSDK.ATan2((player->position.x - attack->position.x) >> 16, (player->position.y - attack->position.y) >> 16);
339
attack->targetVelocity.x = 0x600 * RSDK.Cos256(angle);
340
attack->targetVelocity.y = 0x600 * RSDK.Sin256(angle);
341
attack->drawGroup = Zone->objectDrawGroup[0];
342
attack->state = KingAttack_State_OrbitLaunched;
343
RSDK.PlaySfx(KingAttack->sfxElecPulse, false, 255);
344
foreach_break;
345
}
346
}
347
}
348
else {
349
self->attacksRemaining = 0;
350
if (self->position.x - HeavyKing->boundsM > 0)
351
self->velocity.x = -0x30000;
352
else
353
self->velocity.x = 0x30000;
354
}
355
356
self->velocity.y = -0x60000;
357
self->onGround = false;
358
self->state = HeavyKing_State_Leaping;
359
}
360
361
void HeavyKing_HandleAttackFinish(void)
362
{
363
RSDK_THIS(HeavyKing);
364
365
HeavyKing_FindTargetEmerald();
366
367
self->velocity.x = 0;
368
self->velocity.y = 0;
369
self->onGround = false;
370
self->state = HeavyKing_State_JumpToTargetEmerald;
371
372
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 3, &self->bodyAnimator, false, 6);
373
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 12, &self->scepterAnimator, false, 6);
374
}
375
376
void HeavyKing_CreateSpinRayFX(void)
377
{
378
RSDK_THIS(HeavyKing);
379
380
EntityFXSpinRay *ray = NULL;
381
if (self->direction) {
382
ray = CREATE_ENTITY(FXSpinRay, NULL, self->position.x - 0x240000, self->position.y - 0x300000);
383
ray->offsetPos.x = -0x240000;
384
}
385
else {
386
ray = CREATE_ENTITY(FXSpinRay, NULL, self->position.x + 0x240000, self->position.y - 0x300000);
387
ray->offsetPos.x = 0x240000;
388
}
389
390
ray->parent = (Entity *)self;
391
ray->offsetPos.y = -0x300000;
392
}
393
394
void HeavyKing_CreateExpandRingFX(void)
395
{
396
RSDK_THIS(HeavyKing);
397
398
EntityFXExpandRing *expandRing = CREATE_ENTITY(FXExpandRing, NULL, self->position.x + 0x240000, self->position.y - 0x300000);
399
expandRing->parent = (Entity *)self;
400
expandRing->drawFX = FX_FLIP;
401
expandRing->posOffset.x = 0x240000;
402
expandRing->posOffset.y = -0x300000;
403
}
404
405
void HeavyKing_CreateLaser(void)
406
{
407
RSDK_THIS(HeavyKing);
408
409
EntityKingAttack *attack = CREATE_ENTITY(KingAttack, INT_TO_VOID(KINGATTACK_LASER), self->position.x, HeavyKing->spinRaySpawnPos);
410
attack->parent = (Entity *)self;
411
412
if (self->direction) {
413
attack->position.x -= 0xC00000;
414
attack->velocity.x = 0x100000;
415
}
416
else {
417
attack->position.x += 0xC00000;
418
attack->velocity.x = -0x100000;
419
}
420
}
421
422
void HeavyKing_CreateExpandRing(void)
423
{
424
RSDK_THIS(HeavyKing);
425
426
for (int32 angle = 0; angle < 1020; angle += 170) {
427
EntityKingAttack *attack = CREATE_ENTITY(KingAttack, INT_TO_VOID(KINGATTACK_ORBIT), self->position.x, self->position.y);
428
attack->angle = angle;
429
attack->parent = (Entity *)self;
430
}
431
}
432
433
void HeavyKing_State_SetupArena(void)
434
{
435
RSDK_THIS(HeavyKing);
436
437
if (++self->timer >= 8) {
438
self->timer = 0;
439
440
foreach_active(KingClaw, claw) { self->claw = claw; }
441
442
EntityKingClaw *kingClaw = self->claw;
443
if (kingClaw) {
444
HeavyKing->boundsL = kingClaw->position.x - 0xA00000;
445
HeavyKing->boundsM = kingClaw->position.x;
446
HeavyKing->boundsR = kingClaw->position.x + 0x600000;
447
448
Zone->playerBoundActiveL[0] = true;
449
Zone->playerBoundActiveR[0] = true;
450
Zone->cameraBoundsL[0] = (kingClaw->position.x >> 16) - 320;
451
Zone->cameraBoundsR[0] = (kingClaw->position.x >> 16) + 320;
452
Zone->cameraBoundsT[0] = (kingClaw->position.y >> 16);
453
454
HeavyKing->spinRaySpawnPos = kingClaw->position.y + 0x2400000;
455
self->active = ACTIVE_NORMAL;
456
HeavyKing_HandleClawMovement();
457
self->state = HeavyKing_State_HandleCutsceneSetup;
458
}
459
}
460
}
461
462
void HeavyKing_State_HandleCutsceneSetup(void)
463
{
464
RSDK_THIS(HeavyKing);
465
466
EntityKingClaw *claw = self->claw;
467
468
EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);
469
if (player1->position.x > self->position.x - 0x1800000) {
470
CutsceneSeq_LockPlayerControl(player1);
471
472
player1->stateInput = StateMachine_None;
473
player1->jumpPress = false;
474
player1->jumpHold = false;
475
player1->right = true;
476
player1->pushing = false;
477
player1->state = Player_State_Ground;
478
479
#if GAME_VERSION != VER_100
480
Player->disableP2KeyCheck = true;
481
#endif
482
483
if (player1->velocity.x > 0x20000) {
484
player1->groundVel = 0x20000;
485
player1->velocity.x = 0x20000;
486
}
487
}
488
489
if (player1->position.x > self->position.x - 0xE00000) {
490
player1->groundVel = 0;
491
player1->velocity.x = 0;
492
player1->right = false;
493
player1->state = Player_State_Static;
494
495
RSDK.SetSpriteAnimation(player1->aniFrames, ANI_LOOK_UP, &player1->animator, false, 0);
496
497
EntityPlayer *player2 = RSDK_GET_ENTITY(SLOT_PLAYER2, Player);
498
if (player2->classID == Player->classID) {
499
player2->groundVel = 0;
500
player2->velocity.x = 0;
501
player2->direction = FLIP_NONE;
502
CutsceneSeq_LockPlayerControl(player2);
503
player2->stateInput = StateMachine_None;
504
player2->up = true;
505
}
506
507
Music_TransitionTrack(TRACK_HBHMISCHIEF, 0.0125);
508
claw->state = KingClaw_State_EnterClaw;
509
self->visible = true;
510
self->state = HeavyKing_StateCutscene_PlayerLookUp;
511
512
Camera_ShakeScreen(0, 6, 6);
513
RSDK.PlaySfx(HeavyKing->sfxImpact6, false, 255);
514
}
515
}
516
517
void HeavyKing_StateCutscene_PlayerLookUp(void)
518
{
519
RSDK_THIS(HeavyKing);
520
521
EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);
522
523
++self->timer;
524
if (player1->animator.frameID == 5)
525
player1->animator.speed = 0;
526
527
if (self->timer == 30) {
528
self->timer = 0;
529
foreach_all(HPZEmerald, emerald)
530
{
531
emerald->active = ACTIVE_NORMAL;
532
if (emerald->type == HPZEMERALD_MASTER) {
533
self->masterEmerald = emerald;
534
Camera_SetupLerp(CAMERA_LERP_SIN1024_2, 0, emerald->position.x - 0x500000, emerald->position.y - 0x800000, 3);
535
}
536
}
537
538
self->state = HeavyKing_StateCutscene_EnterKing;
539
}
540
541
HeavyKing_HandleClawMovement();
542
}
543
544
void HeavyKing_StateCutscene_EnterKing(void)
545
{
546
RSDK_THIS(HeavyKing);
547
548
if (++self->timer == 180) {
549
self->timer = 0;
550
EntityCamera *camera = RSDK_GET_ENTITY(SLOT_CAMERA1, Camera);
551
Camera_SetupLerp(CAMERA_LERP_SIN512, 0, camera->position.x, camera->startLerpPos.y, 4);
552
self->state = HeavyKing_StateCutscene_ReturnCamToPlayer;
553
554
EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);
555
#if MANIA_USE_PLUS
556
if (player1->characterID == ID_KNUCKLES)
557
#endif
558
RSDK.SetSpriteAnimation(player1->aniFrames, ANI_IDLE, &player1->animator, false, 0);
559
}
560
561
HeavyKing_HandleClawMovement();
562
}
563
564
void HeavyKing_StateCutscene_ReturnCamToPlayer(void)
565
{
566
RSDK_THIS(HeavyKing);
567
568
if (!RSDK_GET_ENTITY(SLOT_CAMERA1, Camera)->state) {
569
EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);
570
571
#if MANIA_USE_PLUS
572
if (player1->characterID == ID_KNUCKLES) {
573
#endif
574
RSDK.SetSpriteAnimation(HeavyKing->cutsceneFrames, 0, &player1->animator, false, 0);
575
CREATE_ENTITY(ThoughtBubble, NULL, player1->position.x - 0x300000, player1->position.y - 0x500000);
576
#if MANIA_USE_PLUS
577
}
578
#endif
579
580
self->state = HeavyKing_StateCutscene_GrabMasterEmerald;
581
}
582
583
HeavyKing_HandleClawMovement();
584
}
585
586
void HeavyKing_StateCutscene_GrabMasterEmerald(void)
587
{
588
RSDK_THIS(HeavyKing);
589
590
EntityKingClaw *claw = self->claw;
591
592
HeavyKing_HandleClawMovement();
593
594
if (++self->timer == 180)
595
claw->state = KingClaw_State_Grab;
596
597
if (self->timer == 240) {
598
self->timer = 0;
599
Camera_ShakeScreen(0, 6, 6);
600
RSDK.PlaySfx(HeavyKing->sfxImpact6, false, 255);
601
602
EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);
603
#if MANIA_USE_PLUS
604
if (player1->characterID == ID_KNUCKLES)
605
#endif
606
RSDK.SetSpriteAnimation(HeavyKing->cutsceneFrames, 1, &player1->animator, false, 0);
607
608
self->state = HeavyKing_StateCutscene_FinishThinking;
609
}
610
}
611
612
void HeavyKing_StateCutscene_FinishThinking(void)
613
{
614
RSDK_THIS(HeavyKing);
615
616
HeavyKing_HandleClawMovement();
617
618
EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);
619
620
#if MANIA_USE_PLUS
621
if (player1->characterID == ID_KNUCKLES) {
622
#endif
623
if (player1->animator.frameID == player1->animator.frameCount - 1) {
624
RSDK.SetSpriteAnimation(HeavyKing->cutsceneFrames, 2, &player1->animator, false, 0);
625
self->state = HeavyKing_StateCutscene_GetHigherGround;
626
}
627
#if MANIA_USE_PLUS
628
}
629
else {
630
self->state = HeavyKing_StateCutscene_GetHigherGround;
631
}
632
#endif
633
}
634
635
void HeavyKing_StateCutscene_GetHigherGround(void)
636
{
637
RSDK_THIS(HeavyKing);
638
639
EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);
640
EntityCamera *camera = RSDK_GET_ENTITY(SLOT_CAMERA1, Camera);
641
642
HeavyKing_HandleClawMovement();
643
644
if (player1->onGround)
645
player1->groundVel = 0;
646
647
switch (++self->timer) {
648
case 30:
649
#if MANIA_USE_PLUS
650
if (player1->characterID == ID_KNUCKLES)
651
#endif
652
RSDK.SetSpriteAnimation(HeavyKing->cutsceneFrames, 4, &player1->animator, false, 0);
653
break;
654
655
case 90:
656
RSDK.PlaySfx(Player->sfxJump, false, 255);
657
RSDK.SetSpriteAnimation(player1->aniFrames, ANI_JUMP, &player1->animator, false, 0);
658
player1->velocity.x = 0x2C000;
659
player1->velocity.y = -0x50000;
660
player1->applyJumpCap = false;
661
player1->onGround = false;
662
player1->state = Player_State_Air;
663
break;
664
665
case 124:
666
RSDK.PlaySfx(Player->sfxJump, false, 255);
667
RSDK.SetSpriteAnimation(player1->aniFrames, ANI_JUMP, &player1->animator, false, 0);
668
669
player1->velocity.x = -0x1C000;
670
player1->velocity.y = -0x66000;
671
player1->applyJumpCap = false;
672
player1->onGround = false;
673
player1->state = Player_State_Air;
674
675
Camera_SetupLerp(CAMERA_LERP_SIN512, 0, camera->startLerpPos.x, camera->startLerpPos.y + 0x200000, 4);
676
break;
677
678
default:
679
if (self->timer > 144 && player1->onGround) {
680
#if MANIA_USE_PLUS
681
if (player1->characterID == ID_KNUCKLES)
682
#endif
683
RSDK.SetSpriteAnimation(HeavyKing->cutsceneFrames, 3, &player1->animator, false, 0);
684
#if MANIA_USE_PLUS
685
else
686
RSDK.SetSpriteAnimation(player1->aniFrames, ANI_IDLE, &player1->animator, false, 0);
687
#endif
688
player1->position.y -= player1->jumpOffset;
689
player1->state = Player_State_Static;
690
player1->nextGroundState = StateMachine_None;
691
self->timer = 0;
692
self->state = HeavyKing_StateCutscene_Complaining;
693
}
694
break;
695
}
696
}
697
698
void HeavyKing_StateCutscene_Complaining(void)
699
{
700
RSDK_THIS(HeavyKing);
701
702
EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);
703
704
HeavyKing_HandleClawMovement();
705
706
if (++self->timer == 90) {
707
self->timer = 0;
708
player1->down = true;
709
player1->state = Player_State_Ground;
710
self->state = HeavyKing_StateCutscene_ChargeSpindash;
711
}
712
}
713
714
void HeavyKing_StateCutscene_ChargeSpindash(void)
715
{
716
RSDK_THIS(HeavyKing);
717
718
EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);
719
720
HeavyKing_HandleClawMovement();
721
722
self->timer++;
723
player1->jumpPress = self->timer > 24 && !(self->timer & 7);
724
725
if (self->timer == 56) {
726
self->timer = 0;
727
player1->down = false;
728
self->state = HeavyKing_StateCutscene_AttackClaw;
729
Music_TransitionTrack(TRACK_EGGMAN2, 0.0125);
730
}
731
}
732
733
void HeavyKing_StateCutscene_AttackClaw(void)
734
{
735
RSDK_THIS(HeavyKing);
736
737
EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);
738
739
HeavyKing_HandleClawMovement();
740
741
if (++self->timer == 2) {
742
player1->jumpPress = true;
743
player1->jumpHold = true;
744
player1->scrollDelay = 160;
745
746
if (self->masterEmerald)
747
Camera_SetupLerp(CAMERA_LERP_SIN1024_2, 0, self->masterEmerald->position.x, self->masterEmerald->position.y + 0x300000, 4);
748
}
749
else {
750
player1->jumpPress = false;
751
}
752
753
if (self->timer == 14) {
754
self->timer = 0;
755
self->velocity.y = -0x20000;
756
self->velocity.x = 0x10000;
757
self->state = HeavyKing_StateCutscene_AttackRebound;
758
759
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 6, &self->bodyAnimator, false, 0);
760
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 15, &self->scepterAnimator, false, 0);
761
762
player1->velocity.x = -0x24000;
763
player1->velocity.y = -0x20000;
764
765
EntityKingClaw *claw = self->claw;
766
claw->state = KingClaw_State_Swinging;
767
claw->timer = 128;
768
if (claw->masterEmerald)
769
claw->masterEmerald->onGround = false;
770
771
RSDK.PlaySfx(HeavyKing->sfxImpact5, false, 255);
772
}
773
}
774
775
void HeavyKing_StateCutscene_AttackRebound(void)
776
{
777
RSDK_THIS(HeavyKing);
778
779
self->velocity.y += 0x3800;
780
self->position.x += self->velocity.x;
781
self->position.y += self->velocity.y;
782
783
EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);
784
if (player1->onGround)
785
player1->groundVel = 0;
786
787
if (++self->timer == 24) {
788
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 3, &self->bodyAnimator, false, 6);
789
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 12, &self->scepterAnimator, false, 6);
790
}
791
792
if (self->onGround) {
793
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 4, &self->bodyAnimator, false, 0);
794
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 13, &self->scepterAnimator, false, 0);
795
HeavyKing_StartLeap(0);
796
797
#if GAME_VERSION != VER_100
798
Player->disableP2KeyCheck = false;
799
#endif
800
player1->stateInput = Player_Input_P1;
801
802
EntityPlayer *player2 = RSDK_GET_ENTITY(SLOT_PLAYER2, Player);
803
if (player2->classID == Player->classID) {
804
CutsceneSeq_LockPlayerControl(player2);
805
player2->stateInput = Player_Input_P2_AI;
806
}
807
}
808
}
809
810
void HeavyKing_State_JumpToTargetEmerald(void)
811
{
812
RSDK_THIS(HeavyKing);
813
814
HeavyKing_HandleAnimators();
815
816
if (self->onGround) {
817
HeavyKing_StartLeap(4);
818
819
if (!self->attacksRemaining) {
820
EntityHPZEmerald *masterEmerald = self->masterEmerald;
821
if (abs(self->position.x - HeavyKing->boundsM) < 0x100000) {
822
masterEmerald->solid = true;
823
self->state = HeavyKing_State_LeapToMasterEmerald;
824
}
825
}
826
}
827
else {
828
EntityHPZEmerald *targetEmerald = self->targetEmerald;
829
if (targetEmerald)
830
self->position.x += (targetEmerald->position.x - self->position.x) >> 3;
831
832
self->velocity.y += 0x3800;
833
self->position.y += self->velocity.y;
834
}
835
836
HeavyKing_CheckPlayerCollisions();
837
}
838
839
void HeavyKing_State_Leaping(void)
840
{
841
RSDK_THIS(HeavyKing);
842
843
if (self->bodyAnimator.frameID >= 5) {
844
HeavyKing_HandleAnimators();
845
846
RSDK.ObjectTileCollision(self, Zone->collisionLayers, CMODE_FLOOR, 0, 0, HeavyKing->hitboxBody.bottom >> 15, true);
847
848
if (!self->onGround) {
849
int32 vel = self->velocity.y;
850
self->velocity.y += 0x3800;
851
if (self->velocity.y >= 0 && vel < 0)
852
HeavyKing_FindTargetEmerald();
853
854
self->position.x += self->velocity.x;
855
856
EntityHPZEmerald *targetEmerald = self->targetEmerald;
857
if (self->velocity.y > 0) {
858
if (self->velocity.x <= 0) {
859
if (self->velocity.x < 0) {
860
if (self->position.x < targetEmerald->position.x) {
861
self->velocity.x = 0;
862
self->position.x = targetEmerald->position.x;
863
}
864
}
865
}
866
else {
867
if (self->position.x > targetEmerald->position.x) {
868
self->velocity.x = 0;
869
self->position.x = targetEmerald->position.x;
870
}
871
}
872
}
873
874
self->position.y += self->velocity.y;
875
}
876
else {
877
HeavyKing_StartLeap(4);
878
879
if (!self->attacksRemaining) {
880
EntityHPZEmerald *masterEmerald = self->masterEmerald;
881
if (abs(self->position.x - HeavyKing->boundsM) >= 0x200000) {
882
self->direction = self->position.x < masterEmerald->position.x;
883
}
884
else {
885
masterEmerald->solid = true;
886
self->state = HeavyKing_State_LeapToMasterEmerald;
887
}
888
}
889
}
890
}
891
892
HeavyKing_CheckPlayerCollisions();
893
}
894
895
void HeavyKing_State_LeapToMasterEmerald(void)
896
{
897
RSDK_THIS(HeavyKing);
898
899
if (self->bodyAnimator.frameID >= 5) {
900
HeavyKing_HandleAnimators();
901
902
EntityHPZEmerald *masterEmerald = self->masterEmerald;
903
904
if (!self->onGround) {
905
self->velocity.y += 0x3800;
906
self->position.y += self->velocity.y;
907
self->position.x += (masterEmerald->position.x - self->position.x) >> 2;
908
}
909
else {
910
masterEmerald->solid = false;
911
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 4, &self->bodyAnimator, false, 0);
912
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 13, &self->scepterAnimator, false, 0);
913
914
foreach_active(KingAttack, attack)
915
{
916
if (attack->state == KingAttack_State_Orbiting)
917
destroyEntity(attack);
918
}
919
920
self->state = HeavyKing_State_LandedOnMasterEmerald;
921
}
922
}
923
924
HeavyKing_CheckPlayerCollisions();
925
}
926
927
void HeavyKing_State_LandedOnMasterEmerald(void)
928
{
929
RSDK_THIS(HeavyKing);
930
931
if (self->bodyAnimator.frameID == self->bodyAnimator.frameCount - 1) {
932
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 1, &self->bodyAnimator, false, 0);
933
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 10, &self->scepterAnimator, false, 0);
934
self->state = HeavyKing_State_ChargeStart;
935
}
936
937
HeavyKing_CheckPlayerCollisions();
938
}
939
940
void HeavyKing_State_ChargeStart(void)
941
{
942
RSDK_THIS(HeavyKing);
943
944
if (self->scepterAnimator.frameID == 7 && self->scepterAnimator.timer == 1)
945
RSDK.PlaySfx(HeavyKing->sfxRodPlant, false, 255);
946
947
if (self->bodyAnimator.frameID == 12) {
948
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 18, &self->electricityAnimator, false, 0);
949
self->state = HeavyKing_State_Charging;
950
self->attacksRemaining = (self->health >= 2) + 1;
951
}
952
953
HeavyKing_CheckPlayerCollisions();
954
}
955
956
void HeavyKing_State_Charging(void)
957
{
958
RSDK_THIS(HeavyKing);
959
960
RSDK.ProcessAnimation(&self->electricityAnimator);
961
++self->timer;
962
963
EntityHPZEmerald *masterEmerald = self->masterEmerald;
964
masterEmerald->alpha = 0x80 + (RSDK.Sin256(8 * self->timer) >> 1);
965
966
if (self->timer == 176) {
967
self->timer = 0;
968
masterEmerald->alpha = 0;
969
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 2, &self->bodyAnimator, false, 0);
970
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 11, &self->scepterAnimator, false, 0);
971
RSDK.SetSpriteAnimation(-1, 0, &self->electricityAnimator, false, 0);
972
self->state = HeavyKing_State_ChargeStop;
973
}
974
975
if (!(self->timer & 7))
976
RSDK.PlaySfx(HeavyKing->sfxCharge, false, 0xFF);
977
978
HeavyKing_CheckPlayerCollisions_Charging();
979
}
980
981
void HeavyKing_State_ChargeStop(void)
982
{
983
RSDK_THIS(HeavyKing);
984
985
if (self->bodyAnimator.frameID == self->bodyAnimator.frameCount - 1) {
986
RSDK.Rand(0, 3);
987
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 3, &self->bodyAnimator, false, 0);
988
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 12, &self->scepterAnimator, false, 0);
989
self->state = HeavyKing_State_PrepareHover;
990
}
991
992
HeavyKing_CheckPlayerCollisions();
993
}
994
995
void HeavyKing_State_PrepareHover(void)
996
{
997
RSDK_THIS(HeavyKing);
998
999
if (self->bodyAnimator.frameID == 5) {
1000
self->position.y -= 0x60000;
1001
self->originPos = self->position;
1002
self->velocity.x = 0;
1003
self->velocity.y = -0x10000;
1004
1005
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 5, &self->bodyAnimator, false, 0);
1006
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 14, &self->scepterAnimator, false, 0);
1007
1008
self->targetEmerald = NULL;
1009
self->onGround = false;
1010
self->state = HeavyKing_State_StartHovering;
1011
}
1012
1013
HeavyKing_CheckPlayerCollisions();
1014
}
1015
1016
void HeavyKing_State_StartHovering(void)
1017
{
1018
RSDK_THIS(HeavyKing);
1019
1020
self->velocity.y -= 0x800;
1021
self->originPos.y += self->velocity.y;
1022
BadnikHelpers_Oscillate(self->originPos.y, 2, 11);
1023
1024
if (++self->timer == 24) {
1025
HeavyKing->startY = self->originPos.y;
1026
self->timer = 0;
1027
self->timer = 0;
1028
self->state = HeavyKing_State_Hovering;
1029
}
1030
1031
HeavyKing_CheckPlayerCollisions();
1032
}
1033
1034
void HeavyKing_State_Hovering(void)
1035
{
1036
RSDK_THIS(HeavyKing);
1037
1038
HeavyKing_HandleHoverMovement();
1039
BadnikHelpers_Oscillate(self->originPos.y, 2, 11);
1040
1041
if (++self->timer == 120) {
1042
self->timer = 0;
1043
1044
self->curAttack = HeavyKing->attackPattern[HeavyKing->attackPatternPos++];
1045
HeavyKing->attackPatternPos &= 0x1F;
1046
1047
if (self->attacksRemaining > 0)
1048
self->attacksRemaining--;
1049
1050
switch (self->curAttack) {
1051
case 0:
1052
HeavyKing_CreateSpinRayFX();
1053
RSDK.PlaySfx(HeavyKing->sfxRodShine, false, 255);
1054
self->state = HeavyKing_State_LaserAttack;
1055
break;
1056
1057
case 1:
1058
HeavyKing_CreateExpandRingFX();
1059
RSDK.PlaySfx(HeavyKing->sfxElecOn, false, 255);
1060
self->state = HeavyKing_State_ExpandRingAttack;
1061
break;
1062
1063
case 2:
1064
--self->attacksRemaining;
1065
CREATE_ENTITY(KingAttack, INT_TO_VOID(KINGATTACK_LARGEBULLET), self->position.x, self->position.y)->parent = (Entity *)self;
1066
RSDK.PlaySfx(HeavyKing->sfxTwinCharge, false, 255);
1067
self->state = HeavyKing_State_TwinChargeAttack;
1068
break;
1069
}
1070
}
1071
1072
HeavyKing_CheckPlayerCollisions();
1073
}
1074
1075
void HeavyKing_State_LaserAttack(void)
1076
{
1077
RSDK_THIS(HeavyKing);
1078
1079
BadnikHelpers_Oscillate(self->originPos.y, 2, 11);
1080
1081
if (++self->timer == 60)
1082
HeavyKing_CreateLaser();
1083
1084
if (self->timer == 120) {
1085
self->timer = 0;
1086
if (self->attacksRemaining <= 0)
1087
HeavyKing_HandleAttackFinish();
1088
else
1089
self->state = HeavyKing_State_Hovering;
1090
}
1091
1092
HeavyKing_CheckPlayerCollisions();
1093
}
1094
1095
void HeavyKing_State_ExpandRingAttack(void)
1096
{
1097
RSDK_THIS(HeavyKing);
1098
1099
HeavyKing_HandleHoverMovement();
1100
1101
BadnikHelpers_Oscillate(self->originPos.y, 2, 11);
1102
1103
if (++self->timer == 16)
1104
HeavyKing_CreateExpandRing();
1105
1106
if (self->timer == 128) {
1107
self->timer = 0;
1108
HeavyKing_HandleAttackFinish();
1109
}
1110
1111
HeavyKing_CheckPlayerCollisions();
1112
}
1113
1114
void HeavyKing_State_TwinChargeAttack(void)
1115
{
1116
RSDK_THIS(HeavyKing);
1117
1118
BadnikHelpers_Oscillate(self->originPos.y, 2, 11);
1119
1120
if (!RSDK.GetEntityCount(KingAttack->classID, true))
1121
HeavyKing_HandleAttackFinish();
1122
1123
HeavyKing_CheckPlayerCollisions();
1124
}
1125
1126
void HeavyKing_State_HitRecoil(void)
1127
{
1128
RSDK_THIS(HeavyKing);
1129
1130
if (self->invincibilityTimer == 48) {
1131
self->bodyAnimator = self->storedBodyAnimator;
1132
self->scepterAnimator = self->storedScepterAnimator;
1133
self->state = self->stateStore;
1134
}
1135
}
1136
1137
void HeavyKing_State_Destroyed(void)
1138
{
1139
RSDK_THIS(HeavyKing);
1140
1141
HeavyKing_Explode();
1142
1143
RSDK.ObjectTileCollision(self, Zone->collisionLayers, CMODE_FLOOR, 0, 0, HeavyKing->hitboxBody.bottom >> 15, true);
1144
1145
if (!self->onGround) {
1146
self->velocity.y += 0x3800;
1147
self->position.y += self->velocity.y;
1148
}
1149
1150
if (++self->timer == 60)
1151
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 17, &self->scepterAnimator, false, 0);
1152
1153
if (self->timer == 72) {
1154
RSDK.PlaySfx(HeavyKing->sfxFreeze, false, 255);
1155
int32 centerX = self->position.x - 0x280000;
1156
if (self->direction == FLIP_NONE)
1157
centerX = self->position.x + 0x280000;
1158
1159
for (int32 i = 0; i < 6; ++i) {
1160
int32 y = (self->position.y - 0x300000) + RSDK.Rand(-0x40000, 0x40000);
1161
int32 x = centerX + RSDK.Rand(-0x40000, 0x40000);
1162
EntityDebris *debris = CREATE_ENTITY(Debris, NULL, x, y);
1163
1164
debris->state = Debris_State_Fall;
1165
debris->gravityStrength = 0x3800;
1166
debris->velocity.x = RSDK.Rand(0, 0x20000);
1167
if (debris->position.x < centerX)
1168
debris->velocity.x = -debris->velocity.x;
1169
1170
debris->velocity.y = RSDK.Rand(-0x40000, -0x10000);
1171
debris->drawFX = FX_FLIP;
1172
debris->direction = i & 3;
1173
debris->drawGroup = Zone->objectDrawGroup[1];
1174
debris->timer = 120;
1175
1176
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 19, &debris->animator, true, RSDK.Rand(0, 3));
1177
}
1178
}
1179
1180
if (self->timer == 120) {
1181
EntityKingClaw *claw = self->claw;
1182
self->bodyAnimator.speed = 0;
1183
self->scepterAnimator.speed = 0;
1184
self->timer = 0;
1185
self->state = HeavyKing_State_Escape;
1186
if (self->direction == FLIP_NONE)
1187
claw->position.x = self->position.x - 0x300000;
1188
else
1189
claw->position.x = self->position.x + 0x300000;
1190
1191
claw->state = KingClaw_State_LowerClaw;
1192
claw->velocity.y = 0x10000;
1193
claw->forceHighdrawGroup = true;
1194
claw->targetY = self->position.y - 0xA00000;
1195
claw->position.y = claw->targetY - 0xE00000;
1196
claw->drawGroup = Zone->objectDrawGroup[1];
1197
self->drawGroup = Zone->objectDrawGroup[1];
1198
KingClaw->active = ACTIVE_NEVER;
1199
}
1200
}
1201
1202
void HeavyKing_State_Escape(void)
1203
{
1204
RSDK_THIS(HeavyKing);
1205
1206
if (!(Zone->timer & 0x1F)) {
1207
int32 x = self->position.x + RSDK.Rand(-0x180000, 0x180000);
1208
int32 y = self->position.y + RSDK.Rand(-0x180000, 0x180000);
1209
CREATE_ENTITY(Explosion, INT_TO_VOID(EXPLOSION_BOSSPUFF), x, y)->drawGroup = Zone->objectDrawGroup[1];
1210
}
1211
1212
if ((Zone->timer & 0xF) == 4) {
1213
int32 x = self->position.x - 0x2C0000;
1214
if (self->direction == FLIP_NONE)
1215
x = self->position.x + 0x2C0000;
1216
1217
CREATE_ENTITY(Explosion, INT_TO_VOID(EXPLOSION_BOSSPUFF), x, self->position.y - 0x300000)->drawGroup = Zone->objectDrawGroup[1];
1218
}
1219
1220
EntityKingClaw *claw = self->claw;
1221
if (!claw->state) {
1222
claw->state = KingClaw_State_RaiseClaw;
1223
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 7, &self->bodyAnimator, true, 0);
1224
RSDK.SetSpriteAnimation(-1, 0, &self->scepterAnimator, true, 0);
1225
self->state = HeavyKing_State_Finish;
1226
}
1227
}
1228
1229
void HeavyKing_State_Finish(void)
1230
{
1231
RSDK_THIS(HeavyKing);
1232
1233
HeavyKing_HandleClawMovement();
1234
1235
if (!RSDK.CheckOnScreen(self, &self->updateRange)) {
1236
Music_TransitionTrack(TRACK_STAGE, 0.0125);
1237
Zone->cameraBoundsR[0] += 1024;
1238
destroyEntity(self->claw);
1239
destroyEntity(self);
1240
}
1241
}
1242
1243
#if GAME_INCLUDE_EDITOR
1244
void HeavyKing_EditorDraw(void)
1245
{
1246
RSDK_THIS(HeavyKing);
1247
1248
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 7, &self->bodyAnimator, true, 0);
1249
RSDK.SetSpriteAnimation(HeavyKing->aniFrames, 16, &self->scepterAnimator, true, 0);
1250
1251
HeavyKing_Draw();
1252
1253
if (showGizmos()) {
1254
RSDK_DRAWING_OVERLAY(true);
1255
1256
DrawHelpers_DrawArenaBounds(-320, -SCREEN_YSIZE, 320, SCREEN_YCENTER, 1 | 2 | 4 | 0, 0x00C0F0);
1257
1258
RSDK_DRAWING_OVERLAY(false);
1259
}
1260
}
1261
1262
void HeavyKing_EditorLoad(void) { HeavyKing->aniFrames = RSDK.LoadSpriteAnimation("LRZ3/HeavyKing.bin", SCOPE_STAGE); }
1263
#endif
1264
1265
void HeavyKing_Serialize(void) {}
1266
1267