Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/SPZ/EggJanken.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: EggJanken Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectEggJanken *EggJanken = NULL;
11
12
void EggJanken_Update(void)
13
{
14
RSDK_THIS(EggJanken);
15
16
self->moveOffset.x = self->position.x & 0xFFFF0000;
17
self->moveOffset.y = self->position.y & 0xFFFF0000;
18
self->solidPos.x = self->position.x & 0xFFFF0000;
19
self->solidPos.y = self->position.y & 0xFFFF0000;
20
21
if (self->invincibilityTimer) {
22
self->invincibilityTimer--;
23
if (!(self->invincibilityTimer & 1)) {
24
if (self->invincibilityTimer & 2)
25
RSDK.SetPaletteEntry(0, 128, 0xFFFFFF);
26
else
27
RSDK.SetPaletteEntry(0, 128, 0x000000);
28
}
29
}
30
31
#if RETRO_USE_MOD_LOADER
32
StateMachine_Run(self->state);
33
#else
34
// Direct call, no StateMachine for some reason
35
self->state();
36
#endif
37
38
self->rotation = self->fullRotation >> 8;
39
self->position.x = self->origin.x;
40
self->position.y = self->origin.y;
41
if (self->isMoving)
42
EggJanken_HandleMovement();
43
44
self->moveOffset.x -= self->position.x & 0xFFFF0000;
45
self->moveOffset.y -= self->position.y & 0xFFFF0000;
46
47
RSDK.ProcessAnimation(&self->bodyAnimator);
48
RSDK.ProcessAnimation(&self->propellorLAnimator);
49
RSDK.ProcessAnimation(&self->propellorRAnimator);
50
51
#if RETRO_USE_MOD_LOADER
52
StateMachine_Run(self->stateEyes);
53
#else
54
// Another direct call, no StateMachine for some reason
55
self->stateEyes();
56
#endif
57
58
for (self->armID = 0; self->armID < EGGJANKEN_ARM_COUNT; ++self->armID) {
59
for (self->armJointID = 0; self->armJointID < EGGJANKEN_SEGMENT_COUNT; ++self->armJointID) {
60
#if RETRO_USE_MOD_LOADER
61
StateMachine_Run(self->stateArm[self->armID]);
62
#else
63
// More direct calls, no StateMachine for some reason
64
self->stateArm[self->armID]();
65
#endif
66
}
67
}
68
69
if (self->stateDraw != EggJanken_Draw_Destroyed)
70
EggJanken_CheckPlayerCollisions();
71
}
72
73
void EggJanken_LateUpdate(void) {}
74
75
void EggJanken_StaticUpdate(void) {}
76
77
void EggJanken_Draw(void)
78
{
79
RSDK_THIS(EggJanken);
80
81
StateMachine_Run(self->stateDraw);
82
}
83
84
void EggJanken_Create(void *data)
85
{
86
RSDK_THIS(EggJanken);
87
88
RSDK.SetSpriteAnimation(EggJanken->aniFrames, 0, &self->eyeAnimator, true, 0);
89
RSDK.SetSpriteAnimation(EggJanken->aniFrames, 7, &self->bodyAnimator, true, 0);
90
RSDK.SetSpriteAnimation(EggJanken->aniFrames, 2, &self->buttonAnimator, true, 0);
91
RSDK.SetSpriteAnimation(EggJanken->aniFrames, 4, &self->propellorLAnimator, true, 0);
92
RSDK.SetSpriteAnimation(EggJanken->aniFrames, 5, &self->propellorRAnimator, true, 0);
93
94
self->active = ACTIVE_BOUNDS;
95
self->updateRange.x = 0x800000;
96
self->updateRange.y = 0x800000;
97
self->visible = false;
98
self->drawGroup = Zone->objectDrawGroup[0];
99
self->drawFX |= FX_ROTATE | FX_FLIP;
100
self->origin.x = self->position.x;
101
self->origin.y = self->position.y;
102
self->startY = self->position.y + 0x100000;
103
self->stateEyes = EggJanken_Eyes_None;
104
self->eyeFrames[0] = 3;
105
self->eyeFrames[1] = 4;
106
self->health = 3;
107
self->buttonAnimator.frameID = 1;
108
109
for (int32 a = 0; a < EGGJANKEN_ARM_COUNT; ++a) self->stateArm[a] = EggJanken_Arm_None;
110
self->state = EggJanken_State_SetupArena;
111
}
112
113
void EggJanken_StageLoad(void)
114
{
115
EggJanken->aniFrames = RSDK.LoadSpriteAnimation("SPZ2/EggJanken.bin", SCOPE_STAGE);
116
117
EggJanken->hitboxBody.left = -32;
118
EggJanken->hitboxBody.top = -35;
119
EggJanken->hitboxBody.right = 32;
120
EggJanken->hitboxBody.bottom = 29;
121
122
EggJanken->hitboxButtonSolid.left = -16;
123
EggJanken->hitboxButtonSolid.top = 29;
124
EggJanken->hitboxButtonSolid.right = 16;
125
EggJanken->hitboxButtonSolid.bottom = 37;
126
127
EggJanken->hitboxButton.left = -16;
128
EggJanken->hitboxButton.top = 29;
129
EggJanken->hitboxButton.right = 16;
130
EggJanken->hitboxButton.bottom = 41;
131
132
EggJanken->hitboxArm.left = -12;
133
EggJanken->hitboxArm.top = -12;
134
EggJanken->hitboxArm.right = 12;
135
EggJanken->hitboxArm.bottom = 12;
136
137
EggJanken->stateJankenResult[0] = EggJanken_Result_PlayerDraws;
138
EggJanken->stateJankenResult[1] = EggJanken_Result_PlayerWins;
139
EggJanken->stateJankenResult[2] = EggJanken_Result_PlayerLoses;
140
EggJanken->stateJankenResult[3] = EggJanken_Result_PlayerLoses;
141
EggJanken->stateJankenResult[4] = EggJanken_Result_PlayerDraws;
142
EggJanken->stateJankenResult[5] = EggJanken_Result_PlayerWins;
143
EggJanken->stateJankenResult[6] = EggJanken_Result_PlayerWins;
144
EggJanken->stateJankenResult[7] = EggJanken_Result_PlayerLoses;
145
EggJanken->stateJankenResult[8] = EggJanken_Result_PlayerDraws;
146
147
RSDK.SetSpriteAnimation(EggJanken->aniFrames, 3, &EggJanken->armAnimator, true, 0);
148
149
EggJanken->sfxBeep3 = RSDK.GetSfx("Stage/Beep3.wav");
150
EggJanken->sfxBeep4 = RSDK.GetSfx("Stage/Beep4.wav");
151
EggJanken->sfxFail = RSDK.GetSfx("Stage/Fail.wav");
152
EggJanken->sfxClick = RSDK.GetSfx("Stage/Click.wav");
153
EggJanken->sfxHit = RSDK.GetSfx("Stage/BossHit.wav");
154
EggJanken->sfxExplosion = RSDK.GetSfx("Stage/Explosion2.wav");
155
EggJanken->sfxDrop = RSDK.GetSfx("Stage/Drop.wav");
156
EggJanken->sfxImpact4 = RSDK.GetSfx("Stage/Impact4.wav");
157
EggJanken->sfxImpact3 = RSDK.GetSfx("Stage/Impact3.wav");
158
}
159
160
void EggJanken_CheckPlayerCollisions(void)
161
{
162
RSDK_THIS(EggJanken);
163
164
int32 storeX = self->position.x;
165
int32 storeY = self->position.y;
166
167
foreach_active(Player, player)
168
{
169
self->position.x = self->solidPos.x;
170
self->position.y = self->solidPos.y;
171
172
switch (Player_CheckCollisionBox(player, self, &EggJanken->hitboxBody)) {
173
default: break;
174
175
case C_TOP:
176
player->position.x -= self->moveOffset.x;
177
player->position.y -= self->moveOffset.y;
178
player->position.y &= 0xFFFF0000;
179
break;
180
181
case C_BOTTOM:
182
if (player->onGround)
183
player->deathType = PLAYER_DEATH_DIE_USESFX;
184
break;
185
}
186
187
self->position.x = storeX;
188
self->position.y = storeY;
189
190
if (Player_CheckValidState(player)) {
191
Player_CheckCollisionBox(player, self, &EggJanken->hitboxButtonSolid);
192
193
if (Player_CheckCollisionTouch(player, self, &EggJanken->hitboxButton)) {
194
if (player->velocity.y < 0 && !self->buttonAnimator.frameID) {
195
self->buttonAnimator.frameID = 1;
196
if (self->state != EggJanken_State_AwaitButtonPress) {
197
RSDK.StopSfx(EggJanken->sfxBeep3);
198
RSDK.PlaySfx(EggJanken->sfxClick, false, 255);
199
200
self->state = EggJanken_State_ButtonPressed;
201
for (int32 a = 0; a < EGGJANKEN_ARM_COUNT; ++a) self->stateArm[a] = EggJanken_Arm_RetractArm;
202
self->stateEyes = EggJanken_Eyes_None;
203
204
self->jankenResult2[0] = self->eyeFrames[0];
205
self->jankenResult2[1] = self->eyeFrames[1];
206
self->eyeFrames[0] = 11;
207
self->eyeFrames[1] = 11;
208
self->storedXVel = self->velocity.x;
209
self->velocity.x = 0;
210
self->timer = 0;
211
}
212
}
213
}
214
215
for (int32 i = 0; i < EGGJANKEN_ARM_COUNT; ++i) {
216
self->position.x = self->armPos[i].x;
217
self->position.y = self->armPos[i].y;
218
219
if (Player_CheckCollisionTouch(player, self, &EggJanken->hitboxArm)) {
220
// This object goes unused so it wasn't updated for plus, but if it was there'd likely be a Plaer_CheckMightyUnspin call here
221
Player_Hurt(player, self);
222
}
223
}
224
225
self->position.x = storeX;
226
self->position.y = storeY;
227
}
228
}
229
}
230
231
void EggJanken_HandleMovement(void)
232
{
233
RSDK_THIS(EggJanken);
234
235
if (self->velocity.x >= 0) {
236
if (self->origin.x >= (ScreenInfo->position.x + ScreenInfo->size.x - 48) << 16)
237
self->velocity.x = -self->velocity.x;
238
}
239
else if (self->origin.x <= (ScreenInfo->position.x + 48) << 16)
240
self->velocity.x = -self->velocity.x;
241
242
self->origin.x += self->velocity.x;
243
244
// this is not the same code as BadnikHelpers_Oscillate, maybe this is an older variant?
245
self->position.y += RSDK.Sin256(self->angle) << 10;
246
self->angle = (self->angle + 4) & 0xFF;
247
}
248
249
void EggJanken_Explode(void)
250
{
251
RSDK_THIS(EggJanken);
252
253
if (!(Zone->timer % 3)) {
254
RSDK.PlaySfx(EggJanken->sfxExplosion, false, 255);
255
if (Zone->timer & 4) {
256
int32 x = self->position.x + (RSDK.Rand(-24, 24) << 16);
257
int32 y = self->position.y + (RSDK.Rand(-24, 24) << 16);
258
CREATE_ENTITY(Explosion, INT_TO_VOID(EXPLOSION_ENEMY), x, y)->drawGroup = Zone->objectDrawGroup[1];
259
}
260
}
261
}
262
263
void EggJanken_ResetStates(void)
264
{
265
RSDK_THIS(EggJanken);
266
267
self->state = EggJanken_State_RaiseArms;
268
for (int32 a = 0; a < EGGJANKEN_ARM_COUNT; ++a) self->stateArm[a] = EggJanken_Arm_ExtendArm;
269
270
for (self->armID = 0; self->armID < EGGJANKEN_ARM_COUNT; ++self->armID) {
271
self->jointFlags[self->armID] = 0;
272
self->jointAngleVels[self->armID] = 4;
273
274
for (self->armJointID = 0; self->armJointID < EGGJANKEN_SEGMENT_COUNT; ++self->armJointID) {
275
self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 0;
276
self->jointTargetAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 0;
277
self->jointDirection[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 0;
278
self->jointDelays[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 4 * self->armJointID;
279
}
280
}
281
282
self->eyeFrames[0] = 3;
283
self->eyeFrames[1] = 4;
284
}
285
286
void EggJanken_SwapArmSwingDir(void)
287
{
288
RSDK_THIS(EggJanken);
289
290
int32 slot = self->armJointID + EGGJANKEN_SEGMENT_COUNT * self->armID;
291
292
self->jointAngleVels[self->armID] = 4;
293
self->jointDelays[slot] = 4 * self->armJointID;
294
self->jointDirection[slot] ^= 1;
295
self->jointTargetAngles[slot] = self->jointAngles[slot];
296
297
if (self->jointDirection[slot]) {
298
self->jointTargetAngles[slot] = 136 - (8 * self->armJointID);
299
300
if (self->armJointID == EGGJANKEN_JOINT_COUNT)
301
self->jointTargetAngles[slot] -= 8;
302
}
303
else {
304
self->jointTargetAngles[slot] = 224 - (8 * self->armJointID);
305
306
if (self->armJointID == EGGJANKEN_JOINT_COUNT)
307
self->jointTargetAngles[slot] -= 8;
308
}
309
310
if (self->armJointID == EGGJANKEN_JOINT_COUNT) {
311
self->jointFlags[self->armID] = 0;
312
}
313
}
314
315
void EggJanken_Result_PlayerWins(void)
316
{
317
RSDK_THIS(EggJanken);
318
319
RSDK.PlaySfx(EggJanken->sfxBeep4, false, 255);
320
self->state = EggJanken_State_ResultPlayerWinner;
321
}
322
323
void EggJanken_Result_PlayerLoses(void)
324
{
325
RSDK_THIS(EggJanken);
326
327
RSDK.PlaySfx(EggJanken->sfxFail, false, 255);
328
self->state = EggJanken_State_ResultPlayerLoser;
329
}
330
331
void EggJanken_Result_PlayerDraws(void)
332
{
333
RSDK_THIS(EggJanken);
334
335
RSDK.PlaySfx(EggJanken->sfxBeep3, false, 255);
336
self->state = EggJanken_State_ResultPlayerDraw;
337
}
338
339
void EggJanken_State_SetupArena(void)
340
{
341
RSDK_THIS(EggJanken);
342
343
if (++self->timer >= 2) {
344
self->timer = 0;
345
346
Zone->playerBoundActiveR[0] = true;
347
Zone->playerBoundActiveB[0] = true;
348
Zone->cameraBoundsR[0] = (self->position.x >> 16) + ScreenInfo->center.x;
349
Zone->cameraBoundsB[0] = (self->position.y >> 16) + 208;
350
351
self->origin.y -= 0x1000000;
352
self->active = ACTIVE_NORMAL;
353
self->state = EggJanken_State_StartFight;
354
}
355
}
356
357
void EggJanken_State_StartFight(void)
358
{
359
RSDK_THIS(EggJanken);
360
361
Zone->playerBoundActiveL[0] = true;
362
Zone->cameraBoundsL[0] = ScreenInfo->position.x;
363
364
if (RSDK_GET_ENTITY(SLOT_PLAYER1, Player)->position.x > self->position.x) {
365
self->visible = true;
366
Zone->playerBoundActiveL[0] = true;
367
Zone->cameraBoundsL[0] = (self->position.x >> 16) - ScreenInfo->center.x;
368
369
self->state = EggJanken_State_EnterJanken;
370
self->stateDraw = EggJanken_Draw_Closed;
371
self->timer = 272;
372
}
373
}
374
375
void EggJanken_State_EnterJanken(void)
376
{
377
RSDK_THIS(EggJanken);
378
379
if (!--self->timer) {
380
self->isMoving = true;
381
self->buttonAnimator.frameID = 0;
382
RSDK.PlaySfx(EggJanken->sfxClick, false, 255);
383
self->state = EggJanken_State_AwaitButtonPress;
384
}
385
else {
386
self->origin.y += 0x10000;
387
}
388
}
389
390
void EggJanken_State_AwaitButtonPress(void)
391
{
392
RSDK_THIS(EggJanken);
393
394
if (self->buttonAnimator.frameID == 1) {
395
RSDK.SetSpriteAnimation(EggJanken->aniFrames, 8, &self->bodyAnimator, true, 0);
396
self->state = EggJanken_State_Opened;
397
398
EntityEggJankenPart *part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_FACEPLATE_TL), self->position.x, self->position.y);
399
part->velocity.x = -0x20000;
400
part->velocity.y = -0x20000;
401
part->angle = -1;
402
403
part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_FACEPLATE_TR), self->position.x, self->position.y);
404
part->velocity.x = 0x20000;
405
part->velocity.y = -0x20000;
406
part->angle = 1;
407
408
part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_FACEPLATE_BL), self->position.x, self->position.y);
409
part->velocity.x = -0x10000;
410
part->velocity.y = -0x10000;
411
part->angle = -1;
412
413
part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_FACEPLATE_BR), self->position.x, self->position.y);
414
part->velocity.x = 0x10000;
415
part->velocity.y = -0x10000;
416
part->angle = 1;
417
418
CREATE_ENTITY(Explosion, INT_TO_VOID(EXPLOSION_ENEMY), self->position.x, self->position.y)->drawGroup = Zone->objectDrawGroup[1];
419
RSDK.PlaySfx(Explosion->sfxDestroy, false, 255);
420
Music_TransitionTrack(TRACK_MINIBOSS, 0.0125);
421
}
422
}
423
424
void EggJanken_State_Opened(void)
425
{
426
RSDK_THIS(EggJanken);
427
428
if (++self->timer >= 120) {
429
self->timer = 0;
430
RSDK.SetSpriteAnimation(EggJanken->aniFrames, 1, &self->bodyAnimator, true, 0);
431
self->state = EggJanken_State_InitialArmExtend;
432
self->stateDraw = EggJanken_Draw_Active;
433
434
for (self->armID = 0; self->armID < EGGJANKEN_ARM_COUNT; ++self->armID) {
435
self->armRadiusSpeed[self->armID] = 0x40000;
436
for (int32 s = 0; s < EGGJANKEN_SEGMENT_COUNT; ++s) self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + s] = 0xC0;
437
self->stateArm[self->armID] = EggJanken_Arm_StretchRetractArm;
438
}
439
440
EntityEggJankenPart *part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_SIDE_L), self->position.x, self->position.y);
441
part->velocity.x = -0x40000;
442
part->velocity.y = -0x20000;
443
part->angle = -3;
444
445
part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_SIDE_R), self->position.x, self->position.y);
446
part->velocity.x = -0x30000;
447
part->velocity.y = -0x10000;
448
part->angle = -3;
449
450
part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_SIDE_L), self->position.x, self->position.y);
451
part->direction = FLIP_X;
452
part->velocity.x = 0x40000;
453
part->velocity.y = -0x20000;
454
part->angle = 3;
455
456
part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_SIDE_R), self->position.x, self->position.y);
457
part->direction = FLIP_X;
458
part->velocity.x = 0x30000;
459
part->velocity.y = -0x10000;
460
part->angle = 3;
461
462
RSDK.PlaySfx(EggJanken->sfxHit, false, 0xFF);
463
}
464
}
465
466
void EggJanken_State_InitialArmExtend(void)
467
{
468
RSDK_THIS(EggJanken);
469
470
if (self->radius < 0x2300)
471
self->radius += 0x100;
472
473
if (self->stateArm[0] == EggJanken_Arm_Idle) {
474
for (self->armID = 0; self->armID < EGGJANKEN_ARM_COUNT; ++self->armID) {
475
self->jointFlags[self->armID] = 0;
476
self->jointAngleVels[self->armID] = 4;
477
for (self->armJointID = 0; self->armJointID < EGGJANKEN_SEGMENT_COUNT; ++self->armJointID) {
478
self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 0;
479
self->jointTargetAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 0;
480
self->jointDirection[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 0;
481
self->jointDelays[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 4 * self->armJointID;
482
}
483
}
484
485
for (int32 a = 0; a < EGGJANKEN_ARM_COUNT; ++a) self->stateArm[a] = EggJanken_Arm_ExtendArm;
486
self->state = EggJanken_State_InitialArmRaise;
487
}
488
}
489
490
void EggJanken_State_InitialArmRaise(void)
491
{
492
RSDK_THIS(EggJanken);
493
494
if (self->stateArm[0] == EggJanken_Arm_Idle) {
495
for (int32 a = 0; a < EGGJANKEN_ARM_COUNT; ++a) self->stateArm[a] = EggJanken_Arm_SwingArm;
496
}
497
498
if ((self->jointAngles[0] & 0xF8) == 0x88 && (self->jointAngles[1] & 0xF8) == 0x80) {
499
self->velocity.x = 0x10000;
500
self->state = EggJanken_State_None;
501
self->stateEyes = EggJanken_Eyes_Setup;
502
}
503
}
504
505
void EggJanken_State_None(void)
506
{
507
// we just chillin tbh
508
}
509
510
void EggJanken_State_Destroyed(void)
511
{
512
RSDK_THIS(EggJanken);
513
514
EggJanken_Explode();
515
516
EntityEggJankenPart *part = NULL;
517
switch (++self->timer) {
518
case 60:
519
part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_BUTTON), self->position.x, self->position.y);
520
self->buttonAnimator.frameID = 2;
521
break;
522
523
case 90:
524
self->stateDraw = EggJanken_Draw_Closed;
525
self->armID = 0;
526
527
for (self->armID = 0; self->armID < EGGJANKEN_ARM_COUNT; ++self->armID) {
528
part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_BALL_TL), self->armPos[self->armID].x, self->armPos[self->armID].y);
529
part->velocity.x = -0x20000;
530
part->velocity.y = -0x20000;
531
532
part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_BALL_TR), self->armPos[self->armID].x, self->armPos[self->armID].y);
533
part->velocity.x = 0x20000;
534
part->velocity.y = -0x20000;
535
536
part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_BALL_BL), self->armPos[self->armID].x, self->armPos[self->armID].y);
537
part->velocity.x = -0x10000;
538
part->velocity.y = -0x10000;
539
540
part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_BALL_BR), self->armPos[self->armID].x, self->armPos[self->armID].y);
541
part->velocity.x = 0x10000;
542
part->velocity.y = -0x10000;
543
544
self->armPos[self->armID].x = 0;
545
self->armPos[self->armID].y = 0;
546
}
547
break;
548
549
case 120:
550
self->stateDraw = EggJanken_Draw_Destroyed;
551
Music_TransitionTrack(TRACK_STAGE, 0.0125);
552
break;
553
554
case 180: {
555
RSDK.PlaySfx(SignPost->sfxTwinkle, false, 255);
556
557
EntitySignPost *signPost = RSDK_GET_ENTITY(SceneInfo->entitySlot + 1, SignPost);
558
signPost->position.x = self->position.x;
559
signPost->state = SignPost_State_Falling;
560
561
self->state = EggJanken_State_None;
562
break;
563
}
564
565
default: break;
566
}
567
568
if (self->timer > 120) {
569
self->origin.y += self->velocity.y;
570
self->position.y = self->origin.y;
571
self->velocity.y += 0x3800;
572
}
573
}
574
575
void EggJanken_State_ButtonPressed(void)
576
{
577
RSDK_THIS(EggJanken);
578
579
if (self->stateArm[0] == EggJanken_Arm_Idle && ++self->timer == 30) {
580
int32 choice1 = self->jankenResult2[0];
581
int32 choice2 = self->jankenResult2[1];
582
self->eyeFrames[0] = choice1;
583
self->eyeFrames[1] = choice2;
584
585
EggJanken->stateJankenResult[3 * choice1 + choice2]();
586
587
self->timer = 0;
588
}
589
}
590
591
void EggJanken_State_ResultPlayerWinner(void)
592
{
593
RSDK_THIS(EggJanken);
594
595
if (++self->timer == 60) {
596
self->eyeFrames[0] = 5;
597
self->eyeFrames[1] = 6;
598
}
599
600
if (self->timer == 90) {
601
for (self->armID = 0; self->armID < EGGJANKEN_ARM_COUNT; ++self->armID) {
602
self->armRadiusSpeed[self->armID] = 0x40000;
603
for (int32 s = 0; s < EGGJANKEN_SEGMENT_COUNT; ++s) self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + s] = 0xC0;
604
self->stateArm[self->armID] = EggJanken_Arm_StretchRetractArm;
605
}
606
607
self->state = EggJanken_State_HitShake;
608
self->timer = 0;
609
}
610
611
if (self->timer > 60 && (Zone->timer & 1)) {
612
if (self->fullRotation == 0x800)
613
self->fullRotation = 0x1F800;
614
else
615
self->fullRotation = 0x800;
616
}
617
}
618
619
void EggJanken_State_HitShake(void)
620
{
621
RSDK_THIS(EggJanken);
622
623
if (Zone->timer & 1) {
624
if (self->fullRotation == 0x800)
625
self->fullRotation = 0x1F800;
626
else
627
self->fullRotation = 0x800;
628
}
629
630
if (self->stateArm[0] == EggJanken_Arm_Idle) {
631
self->fullRotation = 0;
632
self->timer = 0;
633
634
if (!self->health) {
635
self->isMoving = false;
636
SceneInfo->timeEnabled = false;
637
self->state = EggJanken_State_Destroyed;
638
639
EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);
640
if (player1->superState == SUPERSTATE_SUPER)
641
player1->superState = SUPERSTATE_FADEOUT;
642
Player_GiveScore(player1, 1000);
643
644
self->invincibilityTimer = 0;
645
}
646
else {
647
self->state = EggJanken_State_FinishedBeingHit;
648
}
649
}
650
}
651
652
void EggJanken_State_FinishedBeingHit(void)
653
{
654
RSDK_THIS(EggJanken);
655
656
if (!self->invincibilityTimer && ++self->timer == 30) {
657
EggJanken_ResetStates();
658
self->timer = 0;
659
}
660
}
661
662
void EggJanken_State_RaiseArms(void)
663
{
664
RSDK_THIS(EggJanken);
665
666
if (self->stateArm[0] == EggJanken_Arm_Idle) {
667
self->state = EggJanken_State_SwingDropArms;
668
for (int32 a = 0; a < EGGJANKEN_ARM_COUNT; ++a) self->stateArm[a] = EggJanken_Arm_SwingArm;
669
}
670
}
671
672
void EggJanken_State_SwingDropArms(void)
673
{
674
RSDK_THIS(EggJanken);
675
676
if ((self->jointAngles[0] & 0xF8) == 0x88 && (self->jointAngles[1] & 0xF8) == 0x80) {
677
self->velocity.x = self->storedXVel;
678
self->state = EggJanken_State_None;
679
self->stateEyes = EggJanken_Eyes_Setup;
680
}
681
}
682
683
void EggJanken_State_ResultPlayerDraw(void)
684
{
685
RSDK_THIS(EggJanken);
686
687
if (++self->timer == 60) {
688
self->eyeFrames[0] = 10;
689
self->eyeFrames[1] = 10;
690
}
691
692
if (self->timer == 120) {
693
self->state = EggJanken_State_WaitForArmAttackExtend;
694
695
self->attackingArmID = RSDK_GET_ENTITY(SLOT_PLAYER1, Player)->position.x >= self->position.x;
696
self->armRadiusSpeed[self->attackingArmID] = 0x40000;
697
self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->attackingArmID + 3] = 0xC0;
698
self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->attackingArmID + 2] = 0xC0;
699
self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->attackingArmID + 1] = 0xC0;
700
self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->attackingArmID + 0] = 0xC0;
701
self->stateArm[self->attackingArmID] = EggJanken_Arm_ExtendArm;
702
703
self->timer = 0;
704
}
705
}
706
707
void EggJanken_State_WaitForArmAttackExtend(void)
708
{
709
RSDK_THIS(EggJanken);
710
711
if (self->stateArm[self->attackingArmID] == EggJanken_Arm_Idle) {
712
self->fullRotation = 0;
713
714
self->jointAngleVels[self->attackingArmID] = 8;
715
for (self->armJointID = 0; self->armJointID < EGGJANKEN_SEGMENT_COUNT; ++self->armJointID) {
716
int32 slot = EGGJANKEN_SEGMENT_COUNT * self->attackingArmID + self->armJointID;
717
self->jointDelays[slot] = 4 * self->armJointID;
718
self->jointTargetAngles[slot] = 240;
719
self->jointDirection[slot] = 0;
720
}
721
722
self->stateArm[self->attackingArmID] = EggJanken_Arm_ArmAttack;
723
self->state = EggJanken_State_PrepareArmAttack;
724
}
725
}
726
727
void EggJanken_State_PrepareArmAttack(void)
728
{
729
RSDK_THIS(EggJanken);
730
731
if (self->stateArm[self->attackingArmID] == EggJanken_Arm_Idle) {
732
EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);
733
734
self->jointAngleVels[self->attackingArmID] = 8;
735
for (self->armJointID = 0; self->armJointID < EGGJANKEN_SEGMENT_COUNT; ++self->armJointID) {
736
int32 slot = EGGJANKEN_SEGMENT_COUNT * self->attackingArmID + self->armJointID;
737
738
self->jointDelays[slot] = 4 * self->armJointID;
739
int32 distX = self->position.x - player1->position.x;
740
int32 distY = (self->position.y - player1->position.y) >> 16;
741
if (self->attackingArmID)
742
self->jointTargetAngles[slot] = (uint8)(0x40 - RSDK.ATan2((distX + 0x280000) >> 16, distY));
743
else
744
self->jointTargetAngles[slot] = (uint8)(RSDK.ATan2((distX - 0x280000) >> 16, distY) - 0x40);
745
746
self->jointDirection[slot] = FLIP_X;
747
}
748
749
self->stateArm[self->attackingArmID] = EggJanken_Arm_ArmAttack;
750
self->armRadiusSpeed[self->attackingArmID] = 0x38000;
751
752
if (self->attackingArmID) {
753
int32 distX = abs((self->position.x - player1->position.x + 0x280000) >> 16);
754
int32 distY = abs((self->position.y - player1->position.y) >> 16);
755
self->armRadiusSpeed[self->attackingArmID] += 0x180 * (distX + distY - 120);
756
}
757
else {
758
int32 distX = abs((self->position.x - player1->position.x - 0x280000) >> 16);
759
int32 distY = abs((self->position.y - player1->position.y) >> 16);
760
self->armRadiusSpeed[self->attackingArmID] += 0x180 * (distY + distX - 120);
761
}
762
763
self->state = EggJanken_State_ArmAttack;
764
}
765
else if (self->attackingArmID) {
766
self->fullRotation -= 0x200;
767
}
768
else {
769
self->fullRotation += 0x200;
770
}
771
}
772
773
void EggJanken_State_ArmAttack(void)
774
{
775
RSDK_THIS(EggJanken);
776
777
if (self->stateArm[self->attackingArmID] == EggJanken_Arm_Idle) {
778
self->state = EggJanken_State_FinishedArmAttack;
779
self->timer = 0;
780
}
781
else if (self->attackingArmID) {
782
self->fullRotation += 0x200;
783
if (self->fullRotation > 0)
784
self->fullRotation = 0;
785
}
786
else {
787
self->fullRotation -= 0x200;
788
if (self->fullRotation < 0)
789
self->fullRotation = 0;
790
}
791
}
792
793
void EggJanken_State_FinishedArmAttack(void)
794
{
795
RSDK_THIS(EggJanken);
796
797
if (++self->timer == 30) {
798
self->timer = 0;
799
EggJanken_ResetStates();
800
}
801
}
802
803
void EggJanken_State_ResultPlayerLoser(void)
804
{
805
RSDK_THIS(EggJanken);
806
807
if (++self->timer == 60) {
808
self->eyeFrames[0] = 3;
809
self->eyeFrames[1] = 4;
810
}
811
if (self->timer == 120) {
812
self->state = EggJanken_State_FlipOver;
813
self->isMoving = false;
814
self->timer = 0;
815
}
816
}
817
818
void EggJanken_State_FlipOver(void)
819
{
820
RSDK_THIS(EggJanken);
821
822
self->fullRotation += 0x800;
823
824
if ((self->fullRotation & 0x1FFFF) == 0x10000) {
825
for (self->armID = 0; self->armID < EGGJANKEN_ARM_COUNT; ++self->armID) {
826
self->armRadiusSpeed[self->armID] = 0x40000;
827
for (int32 s = 0; s < EGGJANKEN_SEGMENT_COUNT; ++s) self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + s] = 0xC0;
828
self->stateArm[self->armID] = EggJanken_Arm_ExtendArm;
829
}
830
831
self->state = EggJanken_State_ExtendDropArms;
832
}
833
}
834
835
void EggJanken_State_ExtendDropArms(void)
836
{
837
RSDK_THIS(EggJanken);
838
839
if (self->stateArm[0] == EggJanken_Arm_Idle)
840
self->state = EggJanken_State_DropTarget;
841
}
842
843
void EggJanken_State_DropTarget(void)
844
{
845
RSDK_THIS(EggJanken);
846
847
EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);
848
849
if (abs(self->position.x - player1->position.x) >= 0xC0000) {
850
if (self->position.x >= player1->position.x)
851
self->origin.x -= 0x10000;
852
else
853
self->origin.x += 0x10000;
854
}
855
else {
856
for (self->armID = 0; self->armID < EGGJANKEN_ARM_COUNT; ++self->armID) {
857
for (self->armJointID = 0; self->armJointID < EGGJANKEN_SEGMENT_COUNT; ++self->armJointID) {
858
self->jointAngleVels[self->armID] = 8;
859
self->jointDelays[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 4 * self->armJointID;
860
self->jointTargetAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 160;
861
self->jointDirection[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 1;
862
}
863
864
self->stateArm[self->armID] = EggJanken_Arm_Dropping;
865
}
866
867
RSDK.PlaySfx(EggJanken->sfxDrop, false, 0xFF);
868
self->state = EggJanken_State_Drop;
869
}
870
}
871
872
void EggJanken_State_Drop(void)
873
{
874
RSDK_THIS(EggJanken);
875
876
self->origin.y += self->velocity.y;
877
self->position.y = self->origin.y;
878
self->velocity.y += 0x7000;
879
880
if (RSDK.ObjectTileCollision(self, Zone->collisionLayers, CMODE_FLOOR, 0, 0, 0x200000, true)) {
881
for (self->armID = 0; self->armID < EGGJANKEN_ARM_COUNT; ++self->armID) {
882
for (self->armJointID = 0; self->armJointID < EGGJANKEN_SEGMENT_COUNT; ++self->armJointID) {
883
self->jointAngleVels[self->armID] = 8;
884
self->jointDelays[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 4 * self->armJointID;
885
self->jointTargetAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 200;
886
self->jointDirection[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 0;
887
}
888
889
self->stateArm[self->armID] = EggJanken_Arm_Dropping;
890
}
891
892
RSDK.PlaySfx(EggJanken->sfxImpact4, false, 255);
893
EntityCamera *camera = RSDK_GET_ENTITY(SLOT_CAMERA1, Camera);
894
camera->shakePos.y = 4;
895
self->velocity.y = 0;
896
self->state = EggJanken_State_DropArms;
897
}
898
}
899
900
void EggJanken_State_DropArms(void)
901
{
902
RSDK_THIS(EggJanken);
903
904
if (self->stateArm[0] == EggJanken_Arm_Idle) {
905
RSDK.PlaySfx(EggJanken->sfxImpact3, false, 255);
906
self->state = EggJanken_State_Dropped;
907
}
908
}
909
910
void EggJanken_State_Dropped(void)
911
{
912
RSDK_THIS(EggJanken);
913
914
if (++self->timer == 60) {
915
self->timer = 0;
916
for (int32 a = 0; a < EGGJANKEN_ARM_COUNT; ++a) self->stateArm[a] = EggJanken_Arm_RetractArm;
917
self->state = EggJanken_State_RetractDropArms;
918
}
919
}
920
921
void EggJanken_State_RetractDropArms(void)
922
{
923
RSDK_THIS(EggJanken);
924
925
if (self->stateArm[0] == EggJanken_Arm_Idle)
926
self->state = EggJanken_State_RiseUp;
927
}
928
929
void EggJanken_State_RiseUp(void)
930
{
931
RSDK_THIS(EggJanken);
932
933
self->origin.y -= 0x20000;
934
self->position.y = self->origin.y;
935
936
if (self->position.y < self->startY) {
937
self->origin.y = self->startY;
938
self->position.y = self->startY;
939
self->state = EggJanken_State_FlipBackOver;
940
}
941
}
942
943
void EggJanken_State_FlipBackOver(void)
944
{
945
RSDK_THIS(EggJanken);
946
947
self->fullRotation += 0x400;
948
949
if ((self->fullRotation & 0x1FFFF) == 0) {
950
self->angle = 0;
951
self->isMoving = true;
952
EggJanken_ResetStates();
953
}
954
}
955
956
void EggJanken_Eyes_Setup(void)
957
{
958
RSDK_THIS(EggJanken);
959
960
self->slotTimer = 0;
961
self->eyeFrames[0] = RSDK.Rand(0, 3);
962
self->eyeFrames[1] = RSDK.Rand(0, 3);
963
self->stateEyes = EggJanken_Eyes_ChangeSlots;
964
965
self->buttonAnimator.frameID = 0;
966
RSDK.PlaySfx(EggJanken->sfxClick, false, 255);
967
}
968
969
void EggJanken_Eyes_ChangeSlots(void)
970
{
971
RSDK_THIS(EggJanken);
972
973
++self->slotTimer;
974
975
switch (self->health) {
976
default: break;
977
978
case 1:
979
if (!(self->slotTimer & 0x3F)) {
980
self->eyeFrames[0] = RSDK.Rand(0, 3);
981
self->eyeFrames[1] = RSDK.Rand(0, 3);
982
RSDK.PlaySfx(EggJanken->sfxBeep3, false, 255);
983
}
984
break;
985
986
case 2:
987
if (!(self->slotTimer & 0x3F)) {
988
self->eyeFrames[0] = (self->eyeFrames[0] + 2) % 3;
989
RSDK.PlaySfx(EggJanken->sfxBeep3, false, 255);
990
}
991
992
if (!(self->slotTimer & 0x7F)) {
993
self->eyeFrames[1] = (self->eyeFrames[1] + 1) % 3;
994
RSDK.PlaySfx(EggJanken->sfxBeep3, false, 255);
995
}
996
break;
997
998
case 3:
999
if (self->health == 3) {
1000
if (!(self->slotTimer & 0x3F)) {
1001
self->eyeFrames[0] = (self->eyeFrames[0] + 1) % 3;
1002
RSDK.PlaySfx(EggJanken->sfxBeep3, false, 255);
1003
}
1004
1005
if (!(self->slotTimer & 0x7F)) {
1006
self->eyeFrames[1] = (self->eyeFrames[1] + 1) % 3;
1007
RSDK.PlaySfx(EggJanken->sfxBeep3, false, 255);
1008
}
1009
}
1010
break;
1011
}
1012
}
1013
1014
void EggJanken_Eyes_None(void)
1015
{
1016
// we are NOT playing Janken rn..
1017
}
1018
1019
void EggJanken_Arm_None(void)
1020
{
1021
// no arm movement
1022
}
1023
1024
void EggJanken_Arm_Idle(void)
1025
{
1026
// although this state is the same as EggJanken_Arm_None
1027
// its used to determine if the boss is done with its state rather than not active at all
1028
}
1029
1030
void EggJanken_Arm_RetractArm(void)
1031
{
1032
RSDK_THIS(EggJanken);
1033
1034
if (self->armRadius[self->armID])
1035
self->armRadius[self->armID] -= 0x8000;
1036
else
1037
self->stateArm[self->armID] = EggJanken_Arm_Idle;
1038
}
1039
1040
void EggJanken_Arm_ExtendArm(void)
1041
{
1042
RSDK_THIS(EggJanken);
1043
1044
if (self->armRadius[self->armID] != 0x800000) {
1045
self->armRadius[self->armID] += 0x10000;
1046
}
1047
else {
1048
self->armRadiusSpeed[self->armID] = 0x8000;
1049
self->stateArm[self->armID] = EggJanken_Arm_Idle;
1050
}
1051
}
1052
1053
void EggJanken_Arm_StretchRetractArm(void)
1054
{
1055
RSDK_THIS(EggJanken);
1056
1057
self->armRadius[self->armID] += self->armRadiusSpeed[self->armID];
1058
self->armRadiusSpeed[self->armID] -= 0x800;
1059
1060
if (self->armRadius[self->armID] <= 0) {
1061
if (self->state == EggJanken_State_HitShake && !self->armID) {
1062
RSDK.PlaySfx(EggJanken->sfxHit, false, 255);
1063
self->invincibilityTimer = 60;
1064
self->eyeFrames[0] = 8;
1065
self->eyeFrames[1] = 9;
1066
--self->health;
1067
}
1068
1069
self->armRadius[self->armID] = 0;
1070
self->stateArm[self->armID] = EggJanken_Arm_Idle;
1071
}
1072
}
1073
1074
void EggJanken_Arm_SwingArm(void)
1075
{
1076
RSDK_THIS(EggJanken);
1077
1078
if (self->jointFlags[self->armID] == ((1 << EGGJANKEN_SEGMENT_COUNT) - 1))
1079
EggJanken_SwapArmSwingDir();
1080
1081
int32 slot = self->armJointID + EGGJANKEN_SEGMENT_COUNT * self->armID;
1082
1083
if (self->jointDelays[slot]) {
1084
self->jointDelays[slot]--;
1085
}
1086
else {
1087
if (self->jointDirection[slot]) {
1088
if (self->jointAngles[slot] > self->jointTargetAngles[slot])
1089
self->jointAngles[slot] -= self->jointAngleVels[self->armID];
1090
else
1091
self->jointFlags[self->armID] |= 1 << self->armJointID;
1092
}
1093
else {
1094
if (self->jointAngles[slot] < self->jointTargetAngles[slot])
1095
self->jointAngles[slot] += self->jointAngleVels[self->armID];
1096
else
1097
self->jointFlags[self->armID] |= 1 << self->armJointID;
1098
}
1099
}
1100
}
1101
1102
void EggJanken_Arm_ArmAttack(void)
1103
{
1104
RSDK_THIS(EggJanken);
1105
1106
int32 slot = self->armJointID + EGGJANKEN_SEGMENT_COUNT * self->armID;
1107
1108
if (self->jointDelays[slot]) {
1109
self->jointDelays[slot]--;
1110
}
1111
else {
1112
if (self->jointDirection[slot]) {
1113
if (self->jointAngles[slot] > self->jointTargetAngles[slot]) {
1114
self->jointAngles[slot] -= self->jointAngleVels[self->armID];
1115
}
1116
else {
1117
self->jointFlags[self->armID] |= (1 << self->armJointID);
1118
self->jointAngles[slot] = self->jointTargetAngles[slot];
1119
}
1120
}
1121
else {
1122
if (self->jointAngles[slot] < self->jointTargetAngles[slot]) {
1123
self->jointAngles[slot] += self->jointAngleVels[self->armID];
1124
}
1125
else {
1126
self->jointFlags[self->armID] |= (1 << self->armJointID);
1127
self->jointAngles[slot] = self->jointTargetAngles[slot];
1128
}
1129
}
1130
}
1131
1132
self->armRadius[self->armID] += self->armRadiusSpeed[self->armID];
1133
self->armRadiusSpeed[self->armID] -= 0x800;
1134
1135
if (self->armRadius[self->armID] <= 0) {
1136
self->jointFlags[self->armID] = 0;
1137
self->armRadius[self->armID] = 0;
1138
self->stateArm[self->armID] = EggJanken_Arm_Idle;
1139
}
1140
}
1141
1142
void EggJanken_Arm_Dropping(void)
1143
{
1144
RSDK_THIS(EggJanken);
1145
1146
if (self->jointFlags[self->armID] == ((1 << EGGJANKEN_SEGMENT_COUNT) - 1)) {
1147
self->jointFlags[self->armID] = 0;
1148
self->stateArm[self->armID] = EggJanken_Arm_Idle;
1149
}
1150
1151
int32 slot = self->armJointID + EGGJANKEN_SEGMENT_COUNT * self->armID;
1152
1153
if (self->jointDelays[slot]) {
1154
self->jointDelays[slot]--;
1155
}
1156
else {
1157
if (self->jointDirection[slot]) {
1158
if (self->jointAngles[slot] > self->jointTargetAngles[slot]) {
1159
self->jointAngles[slot] -= self->jointAngleVels[self->armID];
1160
}
1161
else {
1162
self->jointFlags[self->armID] |= 1 << self->armJointID;
1163
self->jointAngles[slot] = self->jointTargetAngles[slot];
1164
}
1165
}
1166
else {
1167
if (self->jointAngles[slot] < self->jointTargetAngles[slot]) {
1168
self->jointAngles[slot] += self->jointAngleVels[self->armID];
1169
}
1170
else {
1171
self->jointFlags[self->armID] |= 1 << self->armJointID;
1172
self->jointAngles[slot] = self->jointTargetAngles[slot];
1173
}
1174
}
1175
}
1176
}
1177
1178
void EggJanken_Draw_Closed(void)
1179
{
1180
RSDK_THIS(EggJanken);
1181
1182
RSDK.DrawSprite(&self->buttonAnimator, NULL, false);
1183
RSDK.DrawSprite(&self->bodyAnimator, NULL, false);
1184
RSDK.DrawSprite(&self->propellorLAnimator, NULL, false);
1185
RSDK.DrawSprite(&self->propellorRAnimator, NULL, false);
1186
}
1187
1188
void EggJanken_Draw_Active(void)
1189
{
1190
RSDK_THIS(EggJanken);
1191
Vector2 drawPos;
1192
1193
self->armID = 0;
1194
drawPos.x = self->radius * RSDK.Sin256(0xC0 - (self->rotation >> 1));
1195
drawPos.y = self->radius * RSDK.Cos256(0xC0 - (self->rotation >> 1));
1196
drawPos.x += self->position.x;
1197
drawPos.y += self->position.y;
1198
EggJanken->armAnimator.frameID = 0;
1199
RSDK.DrawSprite(&EggJanken->armAnimator, &drawPos, false);
1200
1201
int32 radius = (self->armRadius[self->armID] >> 16);
1202
EggJanken->armAnimator.frameID = 1;
1203
self->armJointID = 0;
1204
for (self->armJointID = 0; self->armJointID < EGGJANKEN_JOINT_COUNT; ++self->armJointID) {
1205
drawPos.x += 32 * radius * RSDK.Sin256(self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] + (self->rotation >> 1));
1206
drawPos.y -= 32 * radius * RSDK.Cos256(self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] + (self->rotation >> 1));
1207
RSDK.DrawSprite(&EggJanken->armAnimator, &drawPos, false);
1208
}
1209
1210
EggJanken->armAnimator.frameID = 2;
1211
drawPos.x += (radius * RSDK.Sin256(self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] + (self->rotation >> 1))) << 6;
1212
drawPos.y -= (radius * RSDK.Cos256(self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] + (self->rotation >> 1))) << 6;
1213
RSDK.DrawSprite(&EggJanken->armAnimator, &drawPos, false);
1214
1215
self->armPos[0] = drawPos;
1216
self->armID = 1;
1217
drawPos.x = self->radius * RSDK.Sin256(0x40 - (self->rotation >> 1));
1218
drawPos.y = self->radius * RSDK.Cos256(0x40 - (self->rotation >> 1));
1219
drawPos.x += self->position.x;
1220
drawPos.y += self->position.y;
1221
EggJanken->armAnimator.frameID = 0;
1222
RSDK.DrawSprite(&EggJanken->armAnimator, &drawPos, false);
1223
1224
radius = (self->armRadius[self->armID] >> 16);
1225
EggJanken->armAnimator.frameID = 1;
1226
self->armJointID = 0;
1227
for (self->armJointID = 0; self->armJointID < EGGJANKEN_JOINT_COUNT; ++self->armJointID) {
1228
drawPos.x -= 32 * radius * RSDK.Sin256(self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] - (self->rotation >> 1));
1229
drawPos.y -= 32 * radius * RSDK.Cos256(self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] - (self->rotation >> 1));
1230
RSDK.DrawSprite(&EggJanken->armAnimator, &drawPos, false);
1231
}
1232
1233
EggJanken->armAnimator.frameID = 2;
1234
drawPos.x -= (radius * RSDK.Sin256(self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] - (self->rotation >> 1))) << 6;
1235
drawPos.y -= (radius * RSDK.Cos256(self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] - (self->rotation >> 1))) << 6;
1236
RSDK.DrawSprite(&EggJanken->armAnimator, &drawPos, false);
1237
1238
self->armPos[1] = drawPos;
1239
RSDK.DrawSprite(&self->buttonAnimator, NULL, false);
1240
RSDK.DrawSprite(&self->bodyAnimator, NULL, false);
1241
1242
if (Zone->timer & 1) {
1243
self->inkEffect = INK_ADD;
1244
self->alpha = 128;
1245
self->eyeAnimator.frameID = self->eyeFrames[0];
1246
RSDK.GetFrame(EggJanken->aniFrames, 0, self->eyeFrames[0])->pivotX = -24;
1247
RSDK.DrawSprite(&self->eyeAnimator, NULL, false);
1248
1249
self->eyeAnimator.frameID = self->eyeFrames[1];
1250
RSDK.GetFrame(EggJanken->aniFrames, 0, self->eyeFrames[1])->pivotX = 0;
1251
RSDK.DrawSprite(&self->eyeAnimator, NULL, false);
1252
1253
self->inkEffect = INK_NONE;
1254
self->alpha = 0x200;
1255
}
1256
1257
RSDK.DrawSprite(&self->propellorLAnimator, NULL, false);
1258
RSDK.DrawSprite(&self->propellorRAnimator, NULL, false);
1259
}
1260
1261
void EggJanken_Draw_Destroyed(void)
1262
{
1263
RSDK_THIS(EggJanken);
1264
1265
if (Zone->timer & 1) {
1266
RSDK.DrawSprite(&self->bodyAnimator, NULL, false);
1267
RSDK.DrawSprite(&self->propellorLAnimator, NULL, false);
1268
RSDK.DrawSprite(&self->propellorRAnimator, NULL, false);
1269
}
1270
}
1271
1272
#if GAME_INCLUDE_EDITOR
1273
void EggJanken_EditorDraw(void)
1274
{
1275
RSDK_THIS(EggJanken);
1276
1277
RSDK.SetSpriteAnimation(EggJanken->aniFrames, 0, &self->eyeAnimator, true, 0);
1278
RSDK.SetSpriteAnimation(EggJanken->aniFrames, 7, &self->bodyAnimator, true, 0);
1279
RSDK.SetSpriteAnimation(EggJanken->aniFrames, 2, &self->buttonAnimator, true, 0);
1280
RSDK.SetSpriteAnimation(EggJanken->aniFrames, 4, &self->propellorLAnimator, true, 0);
1281
RSDK.SetSpriteAnimation(EggJanken->aniFrames, 5, &self->propellorRAnimator, true, 0);
1282
1283
self->active = ACTIVE_BOUNDS;
1284
self->updateRange.x = 0x800000;
1285
self->updateRange.y = 0x800000;
1286
self->visible = false;
1287
self->drawFX |= FX_ROTATE | FX_FLIP;
1288
self->origin.x = self->position.x;
1289
self->origin.y = self->position.y;
1290
self->startY = self->position.y + 0x100000;
1291
self->eyeFrames[0] = 3;
1292
self->eyeFrames[1] = 4;
1293
self->health = 3;
1294
self->buttonAnimator.frameID = 1;
1295
1296
EggJanken_Draw_Closed();
1297
1298
if (showGizmos()) {
1299
RSDK_DRAWING_OVERLAY(true);
1300
1301
DrawHelpers_DrawArenaBounds(-WIDE_SCR_XCENTER, -SCREEN_YSIZE, WIDE_SCR_XCENTER, 208, 1 | 0 | 4 | 8, 0x00C0F0);
1302
1303
RSDK_DRAWING_OVERLAY(false);
1304
}
1305
}
1306
1307
void EggJanken_EditorLoad(void)
1308
{
1309
EggJanken->aniFrames = RSDK.LoadSpriteAnimation("SPZ2/EggJanken.bin", SCOPE_STAGE);
1310
RSDK.SetSpriteAnimation(EggJanken->aniFrames, 3, &EggJanken->armAnimator, true, 0);
1311
}
1312
#endif
1313
1314
void EggJanken_Serialize(void) {}
1315
1316