Path: blob/master/SonicMania/Objects/SPZ/EggJanken.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: EggJanken Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectEggJanken *EggJanken = NULL;1011void EggJanken_Update(void)12{13RSDK_THIS(EggJanken);1415self->moveOffset.x = self->position.x & 0xFFFF0000;16self->moveOffset.y = self->position.y & 0xFFFF0000;17self->solidPos.x = self->position.x & 0xFFFF0000;18self->solidPos.y = self->position.y & 0xFFFF0000;1920if (self->invincibilityTimer) {21self->invincibilityTimer--;22if (!(self->invincibilityTimer & 1)) {23if (self->invincibilityTimer & 2)24RSDK.SetPaletteEntry(0, 128, 0xFFFFFF);25else26RSDK.SetPaletteEntry(0, 128, 0x000000);27}28}2930#if RETRO_USE_MOD_LOADER31StateMachine_Run(self->state);32#else33// Direct call, no StateMachine for some reason34self->state();35#endif3637self->rotation = self->fullRotation >> 8;38self->position.x = self->origin.x;39self->position.y = self->origin.y;40if (self->isMoving)41EggJanken_HandleMovement();4243self->moveOffset.x -= self->position.x & 0xFFFF0000;44self->moveOffset.y -= self->position.y & 0xFFFF0000;4546RSDK.ProcessAnimation(&self->bodyAnimator);47RSDK.ProcessAnimation(&self->propellorLAnimator);48RSDK.ProcessAnimation(&self->propellorRAnimator);4950#if RETRO_USE_MOD_LOADER51StateMachine_Run(self->stateEyes);52#else53// Another direct call, no StateMachine for some reason54self->stateEyes();55#endif5657for (self->armID = 0; self->armID < EGGJANKEN_ARM_COUNT; ++self->armID) {58for (self->armJointID = 0; self->armJointID < EGGJANKEN_SEGMENT_COUNT; ++self->armJointID) {59#if RETRO_USE_MOD_LOADER60StateMachine_Run(self->stateArm[self->armID]);61#else62// More direct calls, no StateMachine for some reason63self->stateArm[self->armID]();64#endif65}66}6768if (self->stateDraw != EggJanken_Draw_Destroyed)69EggJanken_CheckPlayerCollisions();70}7172void EggJanken_LateUpdate(void) {}7374void EggJanken_StaticUpdate(void) {}7576void EggJanken_Draw(void)77{78RSDK_THIS(EggJanken);7980StateMachine_Run(self->stateDraw);81}8283void EggJanken_Create(void *data)84{85RSDK_THIS(EggJanken);8687RSDK.SetSpriteAnimation(EggJanken->aniFrames, 0, &self->eyeAnimator, true, 0);88RSDK.SetSpriteAnimation(EggJanken->aniFrames, 7, &self->bodyAnimator, true, 0);89RSDK.SetSpriteAnimation(EggJanken->aniFrames, 2, &self->buttonAnimator, true, 0);90RSDK.SetSpriteAnimation(EggJanken->aniFrames, 4, &self->propellorLAnimator, true, 0);91RSDK.SetSpriteAnimation(EggJanken->aniFrames, 5, &self->propellorRAnimator, true, 0);9293self->active = ACTIVE_BOUNDS;94self->updateRange.x = 0x800000;95self->updateRange.y = 0x800000;96self->visible = false;97self->drawGroup = Zone->objectDrawGroup[0];98self->drawFX |= FX_ROTATE | FX_FLIP;99self->origin.x = self->position.x;100self->origin.y = self->position.y;101self->startY = self->position.y + 0x100000;102self->stateEyes = EggJanken_Eyes_None;103self->eyeFrames[0] = 3;104self->eyeFrames[1] = 4;105self->health = 3;106self->buttonAnimator.frameID = 1;107108for (int32 a = 0; a < EGGJANKEN_ARM_COUNT; ++a) self->stateArm[a] = EggJanken_Arm_None;109self->state = EggJanken_State_SetupArena;110}111112void EggJanken_StageLoad(void)113{114EggJanken->aniFrames = RSDK.LoadSpriteAnimation("SPZ2/EggJanken.bin", SCOPE_STAGE);115116EggJanken->hitboxBody.left = -32;117EggJanken->hitboxBody.top = -35;118EggJanken->hitboxBody.right = 32;119EggJanken->hitboxBody.bottom = 29;120121EggJanken->hitboxButtonSolid.left = -16;122EggJanken->hitboxButtonSolid.top = 29;123EggJanken->hitboxButtonSolid.right = 16;124EggJanken->hitboxButtonSolid.bottom = 37;125126EggJanken->hitboxButton.left = -16;127EggJanken->hitboxButton.top = 29;128EggJanken->hitboxButton.right = 16;129EggJanken->hitboxButton.bottom = 41;130131EggJanken->hitboxArm.left = -12;132EggJanken->hitboxArm.top = -12;133EggJanken->hitboxArm.right = 12;134EggJanken->hitboxArm.bottom = 12;135136EggJanken->stateJankenResult[0] = EggJanken_Result_PlayerDraws;137EggJanken->stateJankenResult[1] = EggJanken_Result_PlayerWins;138EggJanken->stateJankenResult[2] = EggJanken_Result_PlayerLoses;139EggJanken->stateJankenResult[3] = EggJanken_Result_PlayerLoses;140EggJanken->stateJankenResult[4] = EggJanken_Result_PlayerDraws;141EggJanken->stateJankenResult[5] = EggJanken_Result_PlayerWins;142EggJanken->stateJankenResult[6] = EggJanken_Result_PlayerWins;143EggJanken->stateJankenResult[7] = EggJanken_Result_PlayerLoses;144EggJanken->stateJankenResult[8] = EggJanken_Result_PlayerDraws;145146RSDK.SetSpriteAnimation(EggJanken->aniFrames, 3, &EggJanken->armAnimator, true, 0);147148EggJanken->sfxBeep3 = RSDK.GetSfx("Stage/Beep3.wav");149EggJanken->sfxBeep4 = RSDK.GetSfx("Stage/Beep4.wav");150EggJanken->sfxFail = RSDK.GetSfx("Stage/Fail.wav");151EggJanken->sfxClick = RSDK.GetSfx("Stage/Click.wav");152EggJanken->sfxHit = RSDK.GetSfx("Stage/BossHit.wav");153EggJanken->sfxExplosion = RSDK.GetSfx("Stage/Explosion2.wav");154EggJanken->sfxDrop = RSDK.GetSfx("Stage/Drop.wav");155EggJanken->sfxImpact4 = RSDK.GetSfx("Stage/Impact4.wav");156EggJanken->sfxImpact3 = RSDK.GetSfx("Stage/Impact3.wav");157}158159void EggJanken_CheckPlayerCollisions(void)160{161RSDK_THIS(EggJanken);162163int32 storeX = self->position.x;164int32 storeY = self->position.y;165166foreach_active(Player, player)167{168self->position.x = self->solidPos.x;169self->position.y = self->solidPos.y;170171switch (Player_CheckCollisionBox(player, self, &EggJanken->hitboxBody)) {172default: break;173174case C_TOP:175player->position.x -= self->moveOffset.x;176player->position.y -= self->moveOffset.y;177player->position.y &= 0xFFFF0000;178break;179180case C_BOTTOM:181if (player->onGround)182player->deathType = PLAYER_DEATH_DIE_USESFX;183break;184}185186self->position.x = storeX;187self->position.y = storeY;188189if (Player_CheckValidState(player)) {190Player_CheckCollisionBox(player, self, &EggJanken->hitboxButtonSolid);191192if (Player_CheckCollisionTouch(player, self, &EggJanken->hitboxButton)) {193if (player->velocity.y < 0 && !self->buttonAnimator.frameID) {194self->buttonAnimator.frameID = 1;195if (self->state != EggJanken_State_AwaitButtonPress) {196RSDK.StopSfx(EggJanken->sfxBeep3);197RSDK.PlaySfx(EggJanken->sfxClick, false, 255);198199self->state = EggJanken_State_ButtonPressed;200for (int32 a = 0; a < EGGJANKEN_ARM_COUNT; ++a) self->stateArm[a] = EggJanken_Arm_RetractArm;201self->stateEyes = EggJanken_Eyes_None;202203self->jankenResult2[0] = self->eyeFrames[0];204self->jankenResult2[1] = self->eyeFrames[1];205self->eyeFrames[0] = 11;206self->eyeFrames[1] = 11;207self->storedXVel = self->velocity.x;208self->velocity.x = 0;209self->timer = 0;210}211}212}213214for (int32 i = 0; i < EGGJANKEN_ARM_COUNT; ++i) {215self->position.x = self->armPos[i].x;216self->position.y = self->armPos[i].y;217218if (Player_CheckCollisionTouch(player, self, &EggJanken->hitboxArm)) {219// This object goes unused so it wasn't updated for plus, but if it was there'd likely be a Plaer_CheckMightyUnspin call here220Player_Hurt(player, self);221}222}223224self->position.x = storeX;225self->position.y = storeY;226}227}228}229230void EggJanken_HandleMovement(void)231{232RSDK_THIS(EggJanken);233234if (self->velocity.x >= 0) {235if (self->origin.x >= (ScreenInfo->position.x + ScreenInfo->size.x - 48) << 16)236self->velocity.x = -self->velocity.x;237}238else if (self->origin.x <= (ScreenInfo->position.x + 48) << 16)239self->velocity.x = -self->velocity.x;240241self->origin.x += self->velocity.x;242243// this is not the same code as BadnikHelpers_Oscillate, maybe this is an older variant?244self->position.y += RSDK.Sin256(self->angle) << 10;245self->angle = (self->angle + 4) & 0xFF;246}247248void EggJanken_Explode(void)249{250RSDK_THIS(EggJanken);251252if (!(Zone->timer % 3)) {253RSDK.PlaySfx(EggJanken->sfxExplosion, false, 255);254if (Zone->timer & 4) {255int32 x = self->position.x + (RSDK.Rand(-24, 24) << 16);256int32 y = self->position.y + (RSDK.Rand(-24, 24) << 16);257CREATE_ENTITY(Explosion, INT_TO_VOID(EXPLOSION_ENEMY), x, y)->drawGroup = Zone->objectDrawGroup[1];258}259}260}261262void EggJanken_ResetStates(void)263{264RSDK_THIS(EggJanken);265266self->state = EggJanken_State_RaiseArms;267for (int32 a = 0; a < EGGJANKEN_ARM_COUNT; ++a) self->stateArm[a] = EggJanken_Arm_ExtendArm;268269for (self->armID = 0; self->armID < EGGJANKEN_ARM_COUNT; ++self->armID) {270self->jointFlags[self->armID] = 0;271self->jointAngleVels[self->armID] = 4;272273for (self->armJointID = 0; self->armJointID < EGGJANKEN_SEGMENT_COUNT; ++self->armJointID) {274self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 0;275self->jointTargetAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 0;276self->jointDirection[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 0;277self->jointDelays[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 4 * self->armJointID;278}279}280281self->eyeFrames[0] = 3;282self->eyeFrames[1] = 4;283}284285void EggJanken_SwapArmSwingDir(void)286{287RSDK_THIS(EggJanken);288289int32 slot = self->armJointID + EGGJANKEN_SEGMENT_COUNT * self->armID;290291self->jointAngleVels[self->armID] = 4;292self->jointDelays[slot] = 4 * self->armJointID;293self->jointDirection[slot] ^= 1;294self->jointTargetAngles[slot] = self->jointAngles[slot];295296if (self->jointDirection[slot]) {297self->jointTargetAngles[slot] = 136 - (8 * self->armJointID);298299if (self->armJointID == EGGJANKEN_JOINT_COUNT)300self->jointTargetAngles[slot] -= 8;301}302else {303self->jointTargetAngles[slot] = 224 - (8 * self->armJointID);304305if (self->armJointID == EGGJANKEN_JOINT_COUNT)306self->jointTargetAngles[slot] -= 8;307}308309if (self->armJointID == EGGJANKEN_JOINT_COUNT) {310self->jointFlags[self->armID] = 0;311}312}313314void EggJanken_Result_PlayerWins(void)315{316RSDK_THIS(EggJanken);317318RSDK.PlaySfx(EggJanken->sfxBeep4, false, 255);319self->state = EggJanken_State_ResultPlayerWinner;320}321322void EggJanken_Result_PlayerLoses(void)323{324RSDK_THIS(EggJanken);325326RSDK.PlaySfx(EggJanken->sfxFail, false, 255);327self->state = EggJanken_State_ResultPlayerLoser;328}329330void EggJanken_Result_PlayerDraws(void)331{332RSDK_THIS(EggJanken);333334RSDK.PlaySfx(EggJanken->sfxBeep3, false, 255);335self->state = EggJanken_State_ResultPlayerDraw;336}337338void EggJanken_State_SetupArena(void)339{340RSDK_THIS(EggJanken);341342if (++self->timer >= 2) {343self->timer = 0;344345Zone->playerBoundActiveR[0] = true;346Zone->playerBoundActiveB[0] = true;347Zone->cameraBoundsR[0] = (self->position.x >> 16) + ScreenInfo->center.x;348Zone->cameraBoundsB[0] = (self->position.y >> 16) + 208;349350self->origin.y -= 0x1000000;351self->active = ACTIVE_NORMAL;352self->state = EggJanken_State_StartFight;353}354}355356void EggJanken_State_StartFight(void)357{358RSDK_THIS(EggJanken);359360Zone->playerBoundActiveL[0] = true;361Zone->cameraBoundsL[0] = ScreenInfo->position.x;362363if (RSDK_GET_ENTITY(SLOT_PLAYER1, Player)->position.x > self->position.x) {364self->visible = true;365Zone->playerBoundActiveL[0] = true;366Zone->cameraBoundsL[0] = (self->position.x >> 16) - ScreenInfo->center.x;367368self->state = EggJanken_State_EnterJanken;369self->stateDraw = EggJanken_Draw_Closed;370self->timer = 272;371}372}373374void EggJanken_State_EnterJanken(void)375{376RSDK_THIS(EggJanken);377378if (!--self->timer) {379self->isMoving = true;380self->buttonAnimator.frameID = 0;381RSDK.PlaySfx(EggJanken->sfxClick, false, 255);382self->state = EggJanken_State_AwaitButtonPress;383}384else {385self->origin.y += 0x10000;386}387}388389void EggJanken_State_AwaitButtonPress(void)390{391RSDK_THIS(EggJanken);392393if (self->buttonAnimator.frameID == 1) {394RSDK.SetSpriteAnimation(EggJanken->aniFrames, 8, &self->bodyAnimator, true, 0);395self->state = EggJanken_State_Opened;396397EntityEggJankenPart *part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_FACEPLATE_TL), self->position.x, self->position.y);398part->velocity.x = -0x20000;399part->velocity.y = -0x20000;400part->angle = -1;401402part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_FACEPLATE_TR), self->position.x, self->position.y);403part->velocity.x = 0x20000;404part->velocity.y = -0x20000;405part->angle = 1;406407part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_FACEPLATE_BL), self->position.x, self->position.y);408part->velocity.x = -0x10000;409part->velocity.y = -0x10000;410part->angle = -1;411412part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_FACEPLATE_BR), self->position.x, self->position.y);413part->velocity.x = 0x10000;414part->velocity.y = -0x10000;415part->angle = 1;416417CREATE_ENTITY(Explosion, INT_TO_VOID(EXPLOSION_ENEMY), self->position.x, self->position.y)->drawGroup = Zone->objectDrawGroup[1];418RSDK.PlaySfx(Explosion->sfxDestroy, false, 255);419Music_TransitionTrack(TRACK_MINIBOSS, 0.0125);420}421}422423void EggJanken_State_Opened(void)424{425RSDK_THIS(EggJanken);426427if (++self->timer >= 120) {428self->timer = 0;429RSDK.SetSpriteAnimation(EggJanken->aniFrames, 1, &self->bodyAnimator, true, 0);430self->state = EggJanken_State_InitialArmExtend;431self->stateDraw = EggJanken_Draw_Active;432433for (self->armID = 0; self->armID < EGGJANKEN_ARM_COUNT; ++self->armID) {434self->armRadiusSpeed[self->armID] = 0x40000;435for (int32 s = 0; s < EGGJANKEN_SEGMENT_COUNT; ++s) self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + s] = 0xC0;436self->stateArm[self->armID] = EggJanken_Arm_StretchRetractArm;437}438439EntityEggJankenPart *part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_SIDE_L), self->position.x, self->position.y);440part->velocity.x = -0x40000;441part->velocity.y = -0x20000;442part->angle = -3;443444part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_SIDE_R), self->position.x, self->position.y);445part->velocity.x = -0x30000;446part->velocity.y = -0x10000;447part->angle = -3;448449part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_SIDE_L), self->position.x, self->position.y);450part->direction = FLIP_X;451part->velocity.x = 0x40000;452part->velocity.y = -0x20000;453part->angle = 3;454455part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_SIDE_R), self->position.x, self->position.y);456part->direction = FLIP_X;457part->velocity.x = 0x30000;458part->velocity.y = -0x10000;459part->angle = 3;460461RSDK.PlaySfx(EggJanken->sfxHit, false, 0xFF);462}463}464465void EggJanken_State_InitialArmExtend(void)466{467RSDK_THIS(EggJanken);468469if (self->radius < 0x2300)470self->radius += 0x100;471472if (self->stateArm[0] == EggJanken_Arm_Idle) {473for (self->armID = 0; self->armID < EGGJANKEN_ARM_COUNT; ++self->armID) {474self->jointFlags[self->armID] = 0;475self->jointAngleVels[self->armID] = 4;476for (self->armJointID = 0; self->armJointID < EGGJANKEN_SEGMENT_COUNT; ++self->armJointID) {477self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 0;478self->jointTargetAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 0;479self->jointDirection[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 0;480self->jointDelays[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 4 * self->armJointID;481}482}483484for (int32 a = 0; a < EGGJANKEN_ARM_COUNT; ++a) self->stateArm[a] = EggJanken_Arm_ExtendArm;485self->state = EggJanken_State_InitialArmRaise;486}487}488489void EggJanken_State_InitialArmRaise(void)490{491RSDK_THIS(EggJanken);492493if (self->stateArm[0] == EggJanken_Arm_Idle) {494for (int32 a = 0; a < EGGJANKEN_ARM_COUNT; ++a) self->stateArm[a] = EggJanken_Arm_SwingArm;495}496497if ((self->jointAngles[0] & 0xF8) == 0x88 && (self->jointAngles[1] & 0xF8) == 0x80) {498self->velocity.x = 0x10000;499self->state = EggJanken_State_None;500self->stateEyes = EggJanken_Eyes_Setup;501}502}503504void EggJanken_State_None(void)505{506// we just chillin tbh507}508509void EggJanken_State_Destroyed(void)510{511RSDK_THIS(EggJanken);512513EggJanken_Explode();514515EntityEggJankenPart *part = NULL;516switch (++self->timer) {517case 60:518part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_BUTTON), self->position.x, self->position.y);519self->buttonAnimator.frameID = 2;520break;521522case 90:523self->stateDraw = EggJanken_Draw_Closed;524self->armID = 0;525526for (self->armID = 0; self->armID < EGGJANKEN_ARM_COUNT; ++self->armID) {527part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_BALL_TL), self->armPos[self->armID].x, self->armPos[self->armID].y);528part->velocity.x = -0x20000;529part->velocity.y = -0x20000;530531part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_BALL_TR), self->armPos[self->armID].x, self->armPos[self->armID].y);532part->velocity.x = 0x20000;533part->velocity.y = -0x20000;534535part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_BALL_BL), self->armPos[self->armID].x, self->armPos[self->armID].y);536part->velocity.x = -0x10000;537part->velocity.y = -0x10000;538539part = CREATE_ENTITY(EggJankenPart, INT_TO_VOID(EGGJANKENPART_BALL_BR), self->armPos[self->armID].x, self->armPos[self->armID].y);540part->velocity.x = 0x10000;541part->velocity.y = -0x10000;542543self->armPos[self->armID].x = 0;544self->armPos[self->armID].y = 0;545}546break;547548case 120:549self->stateDraw = EggJanken_Draw_Destroyed;550Music_TransitionTrack(TRACK_STAGE, 0.0125);551break;552553case 180: {554RSDK.PlaySfx(SignPost->sfxTwinkle, false, 255);555556EntitySignPost *signPost = RSDK_GET_ENTITY(SceneInfo->entitySlot + 1, SignPost);557signPost->position.x = self->position.x;558signPost->state = SignPost_State_Falling;559560self->state = EggJanken_State_None;561break;562}563564default: break;565}566567if (self->timer > 120) {568self->origin.y += self->velocity.y;569self->position.y = self->origin.y;570self->velocity.y += 0x3800;571}572}573574void EggJanken_State_ButtonPressed(void)575{576RSDK_THIS(EggJanken);577578if (self->stateArm[0] == EggJanken_Arm_Idle && ++self->timer == 30) {579int32 choice1 = self->jankenResult2[0];580int32 choice2 = self->jankenResult2[1];581self->eyeFrames[0] = choice1;582self->eyeFrames[1] = choice2;583584EggJanken->stateJankenResult[3 * choice1 + choice2]();585586self->timer = 0;587}588}589590void EggJanken_State_ResultPlayerWinner(void)591{592RSDK_THIS(EggJanken);593594if (++self->timer == 60) {595self->eyeFrames[0] = 5;596self->eyeFrames[1] = 6;597}598599if (self->timer == 90) {600for (self->armID = 0; self->armID < EGGJANKEN_ARM_COUNT; ++self->armID) {601self->armRadiusSpeed[self->armID] = 0x40000;602for (int32 s = 0; s < EGGJANKEN_SEGMENT_COUNT; ++s) self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + s] = 0xC0;603self->stateArm[self->armID] = EggJanken_Arm_StretchRetractArm;604}605606self->state = EggJanken_State_HitShake;607self->timer = 0;608}609610if (self->timer > 60 && (Zone->timer & 1)) {611if (self->fullRotation == 0x800)612self->fullRotation = 0x1F800;613else614self->fullRotation = 0x800;615}616}617618void EggJanken_State_HitShake(void)619{620RSDK_THIS(EggJanken);621622if (Zone->timer & 1) {623if (self->fullRotation == 0x800)624self->fullRotation = 0x1F800;625else626self->fullRotation = 0x800;627}628629if (self->stateArm[0] == EggJanken_Arm_Idle) {630self->fullRotation = 0;631self->timer = 0;632633if (!self->health) {634self->isMoving = false;635SceneInfo->timeEnabled = false;636self->state = EggJanken_State_Destroyed;637638EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);639if (player1->superState == SUPERSTATE_SUPER)640player1->superState = SUPERSTATE_FADEOUT;641Player_GiveScore(player1, 1000);642643self->invincibilityTimer = 0;644}645else {646self->state = EggJanken_State_FinishedBeingHit;647}648}649}650651void EggJanken_State_FinishedBeingHit(void)652{653RSDK_THIS(EggJanken);654655if (!self->invincibilityTimer && ++self->timer == 30) {656EggJanken_ResetStates();657self->timer = 0;658}659}660661void EggJanken_State_RaiseArms(void)662{663RSDK_THIS(EggJanken);664665if (self->stateArm[0] == EggJanken_Arm_Idle) {666self->state = EggJanken_State_SwingDropArms;667for (int32 a = 0; a < EGGJANKEN_ARM_COUNT; ++a) self->stateArm[a] = EggJanken_Arm_SwingArm;668}669}670671void EggJanken_State_SwingDropArms(void)672{673RSDK_THIS(EggJanken);674675if ((self->jointAngles[0] & 0xF8) == 0x88 && (self->jointAngles[1] & 0xF8) == 0x80) {676self->velocity.x = self->storedXVel;677self->state = EggJanken_State_None;678self->stateEyes = EggJanken_Eyes_Setup;679}680}681682void EggJanken_State_ResultPlayerDraw(void)683{684RSDK_THIS(EggJanken);685686if (++self->timer == 60) {687self->eyeFrames[0] = 10;688self->eyeFrames[1] = 10;689}690691if (self->timer == 120) {692self->state = EggJanken_State_WaitForArmAttackExtend;693694self->attackingArmID = RSDK_GET_ENTITY(SLOT_PLAYER1, Player)->position.x >= self->position.x;695self->armRadiusSpeed[self->attackingArmID] = 0x40000;696self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->attackingArmID + 3] = 0xC0;697self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->attackingArmID + 2] = 0xC0;698self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->attackingArmID + 1] = 0xC0;699self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->attackingArmID + 0] = 0xC0;700self->stateArm[self->attackingArmID] = EggJanken_Arm_ExtendArm;701702self->timer = 0;703}704}705706void EggJanken_State_WaitForArmAttackExtend(void)707{708RSDK_THIS(EggJanken);709710if (self->stateArm[self->attackingArmID] == EggJanken_Arm_Idle) {711self->fullRotation = 0;712713self->jointAngleVels[self->attackingArmID] = 8;714for (self->armJointID = 0; self->armJointID < EGGJANKEN_SEGMENT_COUNT; ++self->armJointID) {715int32 slot = EGGJANKEN_SEGMENT_COUNT * self->attackingArmID + self->armJointID;716self->jointDelays[slot] = 4 * self->armJointID;717self->jointTargetAngles[slot] = 240;718self->jointDirection[slot] = 0;719}720721self->stateArm[self->attackingArmID] = EggJanken_Arm_ArmAttack;722self->state = EggJanken_State_PrepareArmAttack;723}724}725726void EggJanken_State_PrepareArmAttack(void)727{728RSDK_THIS(EggJanken);729730if (self->stateArm[self->attackingArmID] == EggJanken_Arm_Idle) {731EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);732733self->jointAngleVels[self->attackingArmID] = 8;734for (self->armJointID = 0; self->armJointID < EGGJANKEN_SEGMENT_COUNT; ++self->armJointID) {735int32 slot = EGGJANKEN_SEGMENT_COUNT * self->attackingArmID + self->armJointID;736737self->jointDelays[slot] = 4 * self->armJointID;738int32 distX = self->position.x - player1->position.x;739int32 distY = (self->position.y - player1->position.y) >> 16;740if (self->attackingArmID)741self->jointTargetAngles[slot] = (uint8)(0x40 - RSDK.ATan2((distX + 0x280000) >> 16, distY));742else743self->jointTargetAngles[slot] = (uint8)(RSDK.ATan2((distX - 0x280000) >> 16, distY) - 0x40);744745self->jointDirection[slot] = FLIP_X;746}747748self->stateArm[self->attackingArmID] = EggJanken_Arm_ArmAttack;749self->armRadiusSpeed[self->attackingArmID] = 0x38000;750751if (self->attackingArmID) {752int32 distX = abs((self->position.x - player1->position.x + 0x280000) >> 16);753int32 distY = abs((self->position.y - player1->position.y) >> 16);754self->armRadiusSpeed[self->attackingArmID] += 0x180 * (distX + distY - 120);755}756else {757int32 distX = abs((self->position.x - player1->position.x - 0x280000) >> 16);758int32 distY = abs((self->position.y - player1->position.y) >> 16);759self->armRadiusSpeed[self->attackingArmID] += 0x180 * (distY + distX - 120);760}761762self->state = EggJanken_State_ArmAttack;763}764else if (self->attackingArmID) {765self->fullRotation -= 0x200;766}767else {768self->fullRotation += 0x200;769}770}771772void EggJanken_State_ArmAttack(void)773{774RSDK_THIS(EggJanken);775776if (self->stateArm[self->attackingArmID] == EggJanken_Arm_Idle) {777self->state = EggJanken_State_FinishedArmAttack;778self->timer = 0;779}780else if (self->attackingArmID) {781self->fullRotation += 0x200;782if (self->fullRotation > 0)783self->fullRotation = 0;784}785else {786self->fullRotation -= 0x200;787if (self->fullRotation < 0)788self->fullRotation = 0;789}790}791792void EggJanken_State_FinishedArmAttack(void)793{794RSDK_THIS(EggJanken);795796if (++self->timer == 30) {797self->timer = 0;798EggJanken_ResetStates();799}800}801802void EggJanken_State_ResultPlayerLoser(void)803{804RSDK_THIS(EggJanken);805806if (++self->timer == 60) {807self->eyeFrames[0] = 3;808self->eyeFrames[1] = 4;809}810if (self->timer == 120) {811self->state = EggJanken_State_FlipOver;812self->isMoving = false;813self->timer = 0;814}815}816817void EggJanken_State_FlipOver(void)818{819RSDK_THIS(EggJanken);820821self->fullRotation += 0x800;822823if ((self->fullRotation & 0x1FFFF) == 0x10000) {824for (self->armID = 0; self->armID < EGGJANKEN_ARM_COUNT; ++self->armID) {825self->armRadiusSpeed[self->armID] = 0x40000;826for (int32 s = 0; s < EGGJANKEN_SEGMENT_COUNT; ++s) self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + s] = 0xC0;827self->stateArm[self->armID] = EggJanken_Arm_ExtendArm;828}829830self->state = EggJanken_State_ExtendDropArms;831}832}833834void EggJanken_State_ExtendDropArms(void)835{836RSDK_THIS(EggJanken);837838if (self->stateArm[0] == EggJanken_Arm_Idle)839self->state = EggJanken_State_DropTarget;840}841842void EggJanken_State_DropTarget(void)843{844RSDK_THIS(EggJanken);845846EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);847848if (abs(self->position.x - player1->position.x) >= 0xC0000) {849if (self->position.x >= player1->position.x)850self->origin.x -= 0x10000;851else852self->origin.x += 0x10000;853}854else {855for (self->armID = 0; self->armID < EGGJANKEN_ARM_COUNT; ++self->armID) {856for (self->armJointID = 0; self->armJointID < EGGJANKEN_SEGMENT_COUNT; ++self->armJointID) {857self->jointAngleVels[self->armID] = 8;858self->jointDelays[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 4 * self->armJointID;859self->jointTargetAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 160;860self->jointDirection[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 1;861}862863self->stateArm[self->armID] = EggJanken_Arm_Dropping;864}865866RSDK.PlaySfx(EggJanken->sfxDrop, false, 0xFF);867self->state = EggJanken_State_Drop;868}869}870871void EggJanken_State_Drop(void)872{873RSDK_THIS(EggJanken);874875self->origin.y += self->velocity.y;876self->position.y = self->origin.y;877self->velocity.y += 0x7000;878879if (RSDK.ObjectTileCollision(self, Zone->collisionLayers, CMODE_FLOOR, 0, 0, 0x200000, true)) {880for (self->armID = 0; self->armID < EGGJANKEN_ARM_COUNT; ++self->armID) {881for (self->armJointID = 0; self->armJointID < EGGJANKEN_SEGMENT_COUNT; ++self->armJointID) {882self->jointAngleVels[self->armID] = 8;883self->jointDelays[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 4 * self->armJointID;884self->jointTargetAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 200;885self->jointDirection[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] = 0;886}887888self->stateArm[self->armID] = EggJanken_Arm_Dropping;889}890891RSDK.PlaySfx(EggJanken->sfxImpact4, false, 255);892EntityCamera *camera = RSDK_GET_ENTITY(SLOT_CAMERA1, Camera);893camera->shakePos.y = 4;894self->velocity.y = 0;895self->state = EggJanken_State_DropArms;896}897}898899void EggJanken_State_DropArms(void)900{901RSDK_THIS(EggJanken);902903if (self->stateArm[0] == EggJanken_Arm_Idle) {904RSDK.PlaySfx(EggJanken->sfxImpact3, false, 255);905self->state = EggJanken_State_Dropped;906}907}908909void EggJanken_State_Dropped(void)910{911RSDK_THIS(EggJanken);912913if (++self->timer == 60) {914self->timer = 0;915for (int32 a = 0; a < EGGJANKEN_ARM_COUNT; ++a) self->stateArm[a] = EggJanken_Arm_RetractArm;916self->state = EggJanken_State_RetractDropArms;917}918}919920void EggJanken_State_RetractDropArms(void)921{922RSDK_THIS(EggJanken);923924if (self->stateArm[0] == EggJanken_Arm_Idle)925self->state = EggJanken_State_RiseUp;926}927928void EggJanken_State_RiseUp(void)929{930RSDK_THIS(EggJanken);931932self->origin.y -= 0x20000;933self->position.y = self->origin.y;934935if (self->position.y < self->startY) {936self->origin.y = self->startY;937self->position.y = self->startY;938self->state = EggJanken_State_FlipBackOver;939}940}941942void EggJanken_State_FlipBackOver(void)943{944RSDK_THIS(EggJanken);945946self->fullRotation += 0x400;947948if ((self->fullRotation & 0x1FFFF) == 0) {949self->angle = 0;950self->isMoving = true;951EggJanken_ResetStates();952}953}954955void EggJanken_Eyes_Setup(void)956{957RSDK_THIS(EggJanken);958959self->slotTimer = 0;960self->eyeFrames[0] = RSDK.Rand(0, 3);961self->eyeFrames[1] = RSDK.Rand(0, 3);962self->stateEyes = EggJanken_Eyes_ChangeSlots;963964self->buttonAnimator.frameID = 0;965RSDK.PlaySfx(EggJanken->sfxClick, false, 255);966}967968void EggJanken_Eyes_ChangeSlots(void)969{970RSDK_THIS(EggJanken);971972++self->slotTimer;973974switch (self->health) {975default: break;976977case 1:978if (!(self->slotTimer & 0x3F)) {979self->eyeFrames[0] = RSDK.Rand(0, 3);980self->eyeFrames[1] = RSDK.Rand(0, 3);981RSDK.PlaySfx(EggJanken->sfxBeep3, false, 255);982}983break;984985case 2:986if (!(self->slotTimer & 0x3F)) {987self->eyeFrames[0] = (self->eyeFrames[0] + 2) % 3;988RSDK.PlaySfx(EggJanken->sfxBeep3, false, 255);989}990991if (!(self->slotTimer & 0x7F)) {992self->eyeFrames[1] = (self->eyeFrames[1] + 1) % 3;993RSDK.PlaySfx(EggJanken->sfxBeep3, false, 255);994}995break;996997case 3:998if (self->health == 3) {999if (!(self->slotTimer & 0x3F)) {1000self->eyeFrames[0] = (self->eyeFrames[0] + 1) % 3;1001RSDK.PlaySfx(EggJanken->sfxBeep3, false, 255);1002}10031004if (!(self->slotTimer & 0x7F)) {1005self->eyeFrames[1] = (self->eyeFrames[1] + 1) % 3;1006RSDK.PlaySfx(EggJanken->sfxBeep3, false, 255);1007}1008}1009break;1010}1011}10121013void EggJanken_Eyes_None(void)1014{1015// we are NOT playing Janken rn..1016}10171018void EggJanken_Arm_None(void)1019{1020// no arm movement1021}10221023void EggJanken_Arm_Idle(void)1024{1025// although this state is the same as EggJanken_Arm_None1026// its used to determine if the boss is done with its state rather than not active at all1027}10281029void EggJanken_Arm_RetractArm(void)1030{1031RSDK_THIS(EggJanken);10321033if (self->armRadius[self->armID])1034self->armRadius[self->armID] -= 0x8000;1035else1036self->stateArm[self->armID] = EggJanken_Arm_Idle;1037}10381039void EggJanken_Arm_ExtendArm(void)1040{1041RSDK_THIS(EggJanken);10421043if (self->armRadius[self->armID] != 0x800000) {1044self->armRadius[self->armID] += 0x10000;1045}1046else {1047self->armRadiusSpeed[self->armID] = 0x8000;1048self->stateArm[self->armID] = EggJanken_Arm_Idle;1049}1050}10511052void EggJanken_Arm_StretchRetractArm(void)1053{1054RSDK_THIS(EggJanken);10551056self->armRadius[self->armID] += self->armRadiusSpeed[self->armID];1057self->armRadiusSpeed[self->armID] -= 0x800;10581059if (self->armRadius[self->armID] <= 0) {1060if (self->state == EggJanken_State_HitShake && !self->armID) {1061RSDK.PlaySfx(EggJanken->sfxHit, false, 255);1062self->invincibilityTimer = 60;1063self->eyeFrames[0] = 8;1064self->eyeFrames[1] = 9;1065--self->health;1066}10671068self->armRadius[self->armID] = 0;1069self->stateArm[self->armID] = EggJanken_Arm_Idle;1070}1071}10721073void EggJanken_Arm_SwingArm(void)1074{1075RSDK_THIS(EggJanken);10761077if (self->jointFlags[self->armID] == ((1 << EGGJANKEN_SEGMENT_COUNT) - 1))1078EggJanken_SwapArmSwingDir();10791080int32 slot = self->armJointID + EGGJANKEN_SEGMENT_COUNT * self->armID;10811082if (self->jointDelays[slot]) {1083self->jointDelays[slot]--;1084}1085else {1086if (self->jointDirection[slot]) {1087if (self->jointAngles[slot] > self->jointTargetAngles[slot])1088self->jointAngles[slot] -= self->jointAngleVels[self->armID];1089else1090self->jointFlags[self->armID] |= 1 << self->armJointID;1091}1092else {1093if (self->jointAngles[slot] < self->jointTargetAngles[slot])1094self->jointAngles[slot] += self->jointAngleVels[self->armID];1095else1096self->jointFlags[self->armID] |= 1 << self->armJointID;1097}1098}1099}11001101void EggJanken_Arm_ArmAttack(void)1102{1103RSDK_THIS(EggJanken);11041105int32 slot = self->armJointID + EGGJANKEN_SEGMENT_COUNT * self->armID;11061107if (self->jointDelays[slot]) {1108self->jointDelays[slot]--;1109}1110else {1111if (self->jointDirection[slot]) {1112if (self->jointAngles[slot] > self->jointTargetAngles[slot]) {1113self->jointAngles[slot] -= self->jointAngleVels[self->armID];1114}1115else {1116self->jointFlags[self->armID] |= (1 << self->armJointID);1117self->jointAngles[slot] = self->jointTargetAngles[slot];1118}1119}1120else {1121if (self->jointAngles[slot] < self->jointTargetAngles[slot]) {1122self->jointAngles[slot] += self->jointAngleVels[self->armID];1123}1124else {1125self->jointFlags[self->armID] |= (1 << self->armJointID);1126self->jointAngles[slot] = self->jointTargetAngles[slot];1127}1128}1129}11301131self->armRadius[self->armID] += self->armRadiusSpeed[self->armID];1132self->armRadiusSpeed[self->armID] -= 0x800;11331134if (self->armRadius[self->armID] <= 0) {1135self->jointFlags[self->armID] = 0;1136self->armRadius[self->armID] = 0;1137self->stateArm[self->armID] = EggJanken_Arm_Idle;1138}1139}11401141void EggJanken_Arm_Dropping(void)1142{1143RSDK_THIS(EggJanken);11441145if (self->jointFlags[self->armID] == ((1 << EGGJANKEN_SEGMENT_COUNT) - 1)) {1146self->jointFlags[self->armID] = 0;1147self->stateArm[self->armID] = EggJanken_Arm_Idle;1148}11491150int32 slot = self->armJointID + EGGJANKEN_SEGMENT_COUNT * self->armID;11511152if (self->jointDelays[slot]) {1153self->jointDelays[slot]--;1154}1155else {1156if (self->jointDirection[slot]) {1157if (self->jointAngles[slot] > self->jointTargetAngles[slot]) {1158self->jointAngles[slot] -= self->jointAngleVels[self->armID];1159}1160else {1161self->jointFlags[self->armID] |= 1 << self->armJointID;1162self->jointAngles[slot] = self->jointTargetAngles[slot];1163}1164}1165else {1166if (self->jointAngles[slot] < self->jointTargetAngles[slot]) {1167self->jointAngles[slot] += self->jointAngleVels[self->armID];1168}1169else {1170self->jointFlags[self->armID] |= 1 << self->armJointID;1171self->jointAngles[slot] = self->jointTargetAngles[slot];1172}1173}1174}1175}11761177void EggJanken_Draw_Closed(void)1178{1179RSDK_THIS(EggJanken);11801181RSDK.DrawSprite(&self->buttonAnimator, NULL, false);1182RSDK.DrawSprite(&self->bodyAnimator, NULL, false);1183RSDK.DrawSprite(&self->propellorLAnimator, NULL, false);1184RSDK.DrawSprite(&self->propellorRAnimator, NULL, false);1185}11861187void EggJanken_Draw_Active(void)1188{1189RSDK_THIS(EggJanken);1190Vector2 drawPos;11911192self->armID = 0;1193drawPos.x = self->radius * RSDK.Sin256(0xC0 - (self->rotation >> 1));1194drawPos.y = self->radius * RSDK.Cos256(0xC0 - (self->rotation >> 1));1195drawPos.x += self->position.x;1196drawPos.y += self->position.y;1197EggJanken->armAnimator.frameID = 0;1198RSDK.DrawSprite(&EggJanken->armAnimator, &drawPos, false);11991200int32 radius = (self->armRadius[self->armID] >> 16);1201EggJanken->armAnimator.frameID = 1;1202self->armJointID = 0;1203for (self->armJointID = 0; self->armJointID < EGGJANKEN_JOINT_COUNT; ++self->armJointID) {1204drawPos.x += 32 * radius * RSDK.Sin256(self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] + (self->rotation >> 1));1205drawPos.y -= 32 * radius * RSDK.Cos256(self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] + (self->rotation >> 1));1206RSDK.DrawSprite(&EggJanken->armAnimator, &drawPos, false);1207}12081209EggJanken->armAnimator.frameID = 2;1210drawPos.x += (radius * RSDK.Sin256(self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] + (self->rotation >> 1))) << 6;1211drawPos.y -= (radius * RSDK.Cos256(self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] + (self->rotation >> 1))) << 6;1212RSDK.DrawSprite(&EggJanken->armAnimator, &drawPos, false);12131214self->armPos[0] = drawPos;1215self->armID = 1;1216drawPos.x = self->radius * RSDK.Sin256(0x40 - (self->rotation >> 1));1217drawPos.y = self->radius * RSDK.Cos256(0x40 - (self->rotation >> 1));1218drawPos.x += self->position.x;1219drawPos.y += self->position.y;1220EggJanken->armAnimator.frameID = 0;1221RSDK.DrawSprite(&EggJanken->armAnimator, &drawPos, false);12221223radius = (self->armRadius[self->armID] >> 16);1224EggJanken->armAnimator.frameID = 1;1225self->armJointID = 0;1226for (self->armJointID = 0; self->armJointID < EGGJANKEN_JOINT_COUNT; ++self->armJointID) {1227drawPos.x -= 32 * radius * RSDK.Sin256(self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] - (self->rotation >> 1));1228drawPos.y -= 32 * radius * RSDK.Cos256(self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] - (self->rotation >> 1));1229RSDK.DrawSprite(&EggJanken->armAnimator, &drawPos, false);1230}12311232EggJanken->armAnimator.frameID = 2;1233drawPos.x -= (radius * RSDK.Sin256(self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] - (self->rotation >> 1))) << 6;1234drawPos.y -= (radius * RSDK.Cos256(self->jointAngles[EGGJANKEN_SEGMENT_COUNT * self->armID + self->armJointID] - (self->rotation >> 1))) << 6;1235RSDK.DrawSprite(&EggJanken->armAnimator, &drawPos, false);12361237self->armPos[1] = drawPos;1238RSDK.DrawSprite(&self->buttonAnimator, NULL, false);1239RSDK.DrawSprite(&self->bodyAnimator, NULL, false);12401241if (Zone->timer & 1) {1242self->inkEffect = INK_ADD;1243self->alpha = 128;1244self->eyeAnimator.frameID = self->eyeFrames[0];1245RSDK.GetFrame(EggJanken->aniFrames, 0, self->eyeFrames[0])->pivotX = -24;1246RSDK.DrawSprite(&self->eyeAnimator, NULL, false);12471248self->eyeAnimator.frameID = self->eyeFrames[1];1249RSDK.GetFrame(EggJanken->aniFrames, 0, self->eyeFrames[1])->pivotX = 0;1250RSDK.DrawSprite(&self->eyeAnimator, NULL, false);12511252self->inkEffect = INK_NONE;1253self->alpha = 0x200;1254}12551256RSDK.DrawSprite(&self->propellorLAnimator, NULL, false);1257RSDK.DrawSprite(&self->propellorRAnimator, NULL, false);1258}12591260void EggJanken_Draw_Destroyed(void)1261{1262RSDK_THIS(EggJanken);12631264if (Zone->timer & 1) {1265RSDK.DrawSprite(&self->bodyAnimator, NULL, false);1266RSDK.DrawSprite(&self->propellorLAnimator, NULL, false);1267RSDK.DrawSprite(&self->propellorRAnimator, NULL, false);1268}1269}12701271#if GAME_INCLUDE_EDITOR1272void EggJanken_EditorDraw(void)1273{1274RSDK_THIS(EggJanken);12751276RSDK.SetSpriteAnimation(EggJanken->aniFrames, 0, &self->eyeAnimator, true, 0);1277RSDK.SetSpriteAnimation(EggJanken->aniFrames, 7, &self->bodyAnimator, true, 0);1278RSDK.SetSpriteAnimation(EggJanken->aniFrames, 2, &self->buttonAnimator, true, 0);1279RSDK.SetSpriteAnimation(EggJanken->aniFrames, 4, &self->propellorLAnimator, true, 0);1280RSDK.SetSpriteAnimation(EggJanken->aniFrames, 5, &self->propellorRAnimator, true, 0);12811282self->active = ACTIVE_BOUNDS;1283self->updateRange.x = 0x800000;1284self->updateRange.y = 0x800000;1285self->visible = false;1286self->drawFX |= FX_ROTATE | FX_FLIP;1287self->origin.x = self->position.x;1288self->origin.y = self->position.y;1289self->startY = self->position.y + 0x100000;1290self->eyeFrames[0] = 3;1291self->eyeFrames[1] = 4;1292self->health = 3;1293self->buttonAnimator.frameID = 1;12941295EggJanken_Draw_Closed();12961297if (showGizmos()) {1298RSDK_DRAWING_OVERLAY(true);12991300DrawHelpers_DrawArenaBounds(-WIDE_SCR_XCENTER, -SCREEN_YSIZE, WIDE_SCR_XCENTER, 208, 1 | 0 | 4 | 8, 0x00C0F0);13011302RSDK_DRAWING_OVERLAY(false);1303}1304}13051306void EggJanken_EditorLoad(void)1307{1308EggJanken->aniFrames = RSDK.LoadSpriteAnimation("SPZ2/EggJanken.bin", SCOPE_STAGE);1309RSDK.SetSpriteAnimation(EggJanken->aniFrames, 3, &EggJanken->armAnimator, true, 0);1310}1311#endif13121313void EggJanken_Serialize(void) {}131413151316