Path: blob/master/SonicMania/Objects/ERZ/ERZStart.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: ERZStart Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectERZStart *ERZStart;1011void ERZStart_Update(void)12{13RSDK_THIS(ERZStart);1415if (!self->activated) {16foreach_active(Player, player)17{18if (!player->sidekick && Player_CheckCollisionTouch(player, self, &self->hitbox)) {19CutsceneSeq_StartSequence(self, ERZStart_Cutscene_FadeIn, ERZStart_Cutscene_ShrinkRubyWarpFX, ERZStart_Cutscene_EnterKing,20ERZStart_Cutscene_KingMovingRuby, ERZStart_Cutscene_KingAttachHornRuby,21ERZStart_Cutscene_SetupEggmanReveal, ERZStart_Cutscene_EnterEggman, ERZStart_Cutscene_EggmanKingWrestling,22ERZStart_Cutscene_PostWrestleFadeIn, ERZStart_Cutscene_ReturnCamToSonic,23ERZStart_Cutscene_PreparePlayerTransform, ERZStart_Cutscene_PlayerTransform, ERZStart_Cutscene_StartFight,24ERZStart_Cutscene_Fight, StateMachine_None);2526#if MANIA_USE_PLUS27CutsceneSeq_SetSkipType(SKIPTYPE_DISABLED);28#endif2930self->activated = true;31}32}33}3435// Have the timer go haywire36if (--self->timer <= 0) {37// update every 15, 30, 45 or 60 frames38self->timer = 15 * RSDK.Rand(0, 4);39SceneInfo->seconds = RSDK.Rand(0, 100);40SceneInfo->milliseconds = RSDK.Rand(0, 100);41SceneInfo->minutes = RSDK.Rand(0, 9);42}4344#if !MANIA_USE_PLUS45if (ERZStart->superDashCooldown > 0) {46RSDK_GET_ENTITY(SLOT_PLAYER1, Player);47HUD_EnableRingFlash();48--ERZStart->superDashCooldown;49}50#endif51}5253void ERZStart_LateUpdate(void) {}5455void ERZStart_StaticUpdate(void) {}5657void ERZStart_Draw(void) {}5859void ERZStart_Create(void *data)60{61RSDK_THIS(ERZStart);6263if (!SceneInfo->inEditor) {64INIT_ENTITY(self);65CutsceneRules_SetupEntity(self, &self->size, &self->hitbox);66self->active = ACTIVE_NORMAL;6768ERZStart_SetupObjects();69ERZStart->timer = 0;70}71}7273void ERZStart_StageLoad(void)74{75ERZStart->sfxClack = RSDK.GetSfx("Stage/Clack.wav");76ERZStart->sfxFlyIn = RSDK.GetSfx("ERZ/FlyIn.wav");77ERZStart->sfxHullClose = RSDK.GetSfx("Stage/HullClose.wav");78ERZStart->sfxRumble = RSDK.GetSfx("Stage/Rumble.wav");79}8081void ERZStart_SetupObjects(void)82{83foreach_all(PhantomRuby, ruby)84{85ERZStart->ruby = ruby;86foreach_break;87}8889foreach_all(FXRuby, fxRuby)90{91ERZStart->fxRuby = fxRuby;92fxRuby->state = StateMachine_None;93fxRuby->fadeBlack = 0x200;94fxRuby->fadeWhite = 0x200;95fxRuby->outerRadius = ScreenInfo->size.x;96fxRuby->timer = 64;97foreach_break;98}99100foreach_all(PhantomKing, king)101{102if (!king->type)103ERZStart->king = king;104}105106foreach_all(ChaosEmerald, emerald) { ERZStart->emeralds[emerald->type] = emerald; }107108foreach_all(KleptoMobile, eggman)109{110if (!eggman->type)111ERZStart->eggman = eggman;112}113}114115void ERZStart_HandlePlayerHover(EntityPlayer *player, EntityCutsceneSeq *seq, int32 posY)116{117RSDK.SetSpriteAnimation(player->aniFrames, ANI_FAN, &player->animator, false, 0);118player->position.x = 0x300000;119player->position.x += (player->position.x - player->position.x) >> 3;120player->position.y += (posY + 0xA00 * RSDK.Sin256(2 * (seq->timer - seq->storedTimer + 64)) - player->position.y) >> 3;121player->state = Player_State_Static;122123for (int32 e = 0; e < 7; ++e) {124EntityChaosEmerald *emerald = ERZStart->emeralds[e];125emerald->originPos = player->position;126emerald->active = ACTIVE_NORMAL;127}128}129130bool32 ERZStart_Cutscene_FadeIn(EntityCutsceneSeq *host)131{132MANIA_GET_PLAYER(player1, player2, camera);133UNUSED(player2);134UNUSED(camera);135136EntityPhantomRuby *ruby = ERZStart->ruby;137EntityFXRuby *fxRuby = ERZStart->fxRuby;138139if (!host->timer) {140player1->position.y = ruby->position.y;141player1->state = Player_State_Static;142player1->stateInput = StateMachine_None;143CutsceneSeq_LockAllPlayerControl();144camera->position.x = 0;145camera->position.y = 0;146147ScreenInfo->position.x = 0;148ScreenInfo->position.y = 0;149Zone->playerBoundsT[0] = 0;150Zone->cameraBoundsT[0] = 0;151camera->boundsT = 0;152Zone->playerBoundsB[0] = ScreenInfo->size.y;153Zone->cameraBoundsB[0] = Zone->playerBoundsB[0];154camera->boundsB = Zone->cameraBoundsB[0];155ruby->state = ERZStart_RubyHover;156157int32 angle = 0;158for (int32 i = 0; i < 7; ++i) {159EntityChaosEmerald *emerald = ERZStart->emeralds[i];160emerald->originPos.x = player1->position.x;161emerald->originPos.y = player1->position.y;162emerald->angle = angle;163emerald->radius = 0x2000;164emerald->groundVel = 512;165emerald->state = ChaosEmerald_State_Rotate;166167angle += 0x2492;168}169170Zone->playerBoundActiveR[0] = true;171Zone->playerBoundsR[0] = 1552;172Zone->cameraBoundsR[0] = 1552;173}174175if (host->timer >= 60) {176if (fxRuby->fadeBlack > 0) {177fxRuby->fadeBlack -= 16;178}179else {180if (fxRuby->fadeWhite > 0) {181fxRuby->fadeWhite -= 16;182}183else {184PhantomRuby_PlaySfx(RUBYSFX_ATTACK4);185return true;186}187}188}189190ERZStart_HandlePlayerHover(player1, host, ruby->startPos.y);191return false;192}193194bool32 ERZStart_Cutscene_ShrinkRubyWarpFX(EntityCutsceneSeq *host)195{196MANIA_GET_PLAYER(player1, player2, camera);197UNUSED(player2);198UNUSED(camera);199200EntityPhantomRuby *ruby = ERZStart->ruby;201EntityFXRuby *fxRuby = ERZStart->fxRuby;202203if (!host->timer)204fxRuby->state = FXRuby_State_Shrinking;205206EntityPhantomKing *king = ERZStart->king;207if (fxRuby->outerRadius <= 0) {208ERZStart_HandlePlayerHover(player1, host, ruby->startPos.y);209ruby->drawGroup = Zone->objectDrawGroup[0] + 1;210king->state = PhantomKing_State_SetupArms;211return true;212}213214ERZStart_HandlePlayerHover(player1, host, ruby->startPos.y);215return false;216}217218bool32 ERZStart_Cutscene_EnterKing(EntityCutsceneSeq *host)219{220MANIA_GET_PLAYER(player1, player2, camera);221UNUSED(player2);222UNUSED(camera);223224EntityPhantomRuby *ruby = ERZStart->ruby;225226ERZStart_HandlePlayerHover(player1, host, ruby->startPos.y);227228EntityPhantomKing *king = ERZStart->king;229if (king->state == PhantomKing_State_TakeRubyAway) {230ruby->state = ERZStart_RubyMove;231return true;232}233234return false;235}236237bool32 ERZStart_Cutscene_KingMovingRuby(EntityCutsceneSeq *host)238{239MANIA_GET_PLAYER(player1, player2, camera);240UNUSED(player2);241242EntityPhantomRuby *ruby = ERZStart->ruby;243244ERZStart_HandlePlayerHover(player1, host, ruby->startPos.y);245246EntityPhantomKing *king = ERZStart->king;247if (!host->timer) {248camera->target = NULL;249player1->camera = NULL;250Zone->playerBoundActiveL[0] = false;251Zone->playerBoundActiveR[0] = false;252Zone->playerBoundActiveT[0] = false;253host->storedTimer = camera->position.x;254}255256int32 pos = host->storedTimer;257if (king->position.x - 0x400000 > pos)258pos = king->position.x - 0x400000;259260camera->position.x = pos;261262if (king->finishedMovingRuby) {263ruby->state = StateMachine_None;264return true;265}266267return false;268}269270bool32 ERZStart_Cutscene_KingAttachHornRuby(EntityCutsceneSeq *host)271{272MANIA_GET_PLAYER(player1, player2, camera);273UNUSED(player2);274UNUSED(camera);275276EntityPhantomRuby *ruby = ERZStart->ruby;277278ERZStart_HandlePlayerHover(player1, host, ruby->startPos.y);279EntityPhantomKing *king = ERZStart->king;280281if (!host->timer) {282host->storedTimer = ruby->position.x;283host->storedValue = ruby->position.y;284}285286if (host->timer > 0) {287if (host->timer == 60) {288RSDK.PlaySfx(ERZStart->sfxClack, false, 255);289290king->drawRuby = true;291ruby->position.x = -0x400000;292ruby->state = StateMachine_None;293return true;294}295296int32 percent = 0x10000;297if (host->timer << 16 < 0x3C0000)298percent = (host->timer << 16) / 60;299300Vector2 pos = MathHelpers_GetBezierPoint(percent, host->storedTimer, host->storedValue, host->storedTimer, host->storedValue - 0x400000,301king->rubyPos.x, king->rubyPos.y - 0x400000, king->rubyPos.x, king->rubyPos.y);302303ruby->position.x += (pos.x - ruby->position.x) >> 2;304ruby->position.y += (pos.y - ruby->position.y) >> 2;305}306307return false;308}309310bool32 ERZStart_Cutscene_SetupEggmanReveal(EntityCutsceneSeq *host)311{312MANIA_GET_PLAYER(player1, player2, camera);313UNUSED(player2);314315EntityPhantomRuby *ruby = ERZStart->ruby;316317ERZStart_HandlePlayerHover(player1, host, ruby->startPos.y);318319if (host->timer == 30)320Camera_SetupLerp(CAMERA_LERP_NORMAL, 0, camera->position.x - (ScreenInfo->size.x << 16), camera->position.y, 3);321322if (host->timer == 45)323RSDK.PlaySfx(ERZStart->sfxFlyIn, false, 255);324325return host->timer == 120;326}327328bool32 ERZStart_Cutscene_EnterEggman(EntityCutsceneSeq *host)329{330MANIA_GET_PLAYER(player1, player2, camera);331UNUSED(player2);332333EntityPhantomRuby *ruby = ERZStart->ruby;334335ERZStart_HandlePlayerHover(player1, host, ruby->startPos.y);336337EntityKleptoMobile *eggman = ERZStart->eggman;338EntityPhantomKing *king = ERZStart->king;339340uint16 eggmanSlot = RSDK.GetEntitySlot(eggman);341EntityKleptoMobile *eggmanHand = RSDK_GET_ENTITY(eggmanSlot - 2, KleptoMobile);342EntityKleptoMobile *eggmanArmL = RSDK_GET_ENTITY(eggmanSlot - 1, KleptoMobile);343EntityKleptoMobile *eggmanArmR = RSDK_GET_ENTITY(eggmanSlot + 1, KleptoMobile);344345uint16 kingSlot = RSDK.GetEntitySlot(king);346EntityPhantomKing *kingArmL = RSDK_GET_ENTITY(kingSlot - 1, PhantomKing);347EntityPhantomKing *kingArmR = RSDK_GET_ENTITY(kingSlot + 1, PhantomKing);348349if (!host->timer) {350host->storedTimer = camera->position.x;351host->storedValue = camera->position.y;352king->originPos.y = king->position.y;353king->originPos.x = king->position.x;354king->state = PhantomKing_State_WrestleEggman;355king->rotation = -4;356king->rubyAnimator.frameID = 0;357king->drawGroup = eggman->drawGroup + 1;358king->rubyAnimator.speed = 0;359360eggman->state = KleptoMobile_State_CutsceneControlled;361RSDK.SetSpriteAnimation(KleptoMobile->aniFrames, 11, &eggmanHand->handAnimator, true, 0);362eggman->position.x = camera->position.x - (ScreenInfo->size.x << 16);363eggman->originPos.x = camera->position.x - (ScreenInfo->size.x << 16);364eggman->position.y = king->originPos.y + 0x100000;365eggman->originPos.y = king->originPos.y + 0x100000;366eggman->direction = FLIP_X;367eggman->velocity.x = 0xD0000;368eggman->velocity.y = 0;369}370371eggmanHand->state = KleptoMobile_StateHand_Boss;372eggmanArmL->state = KleptoMobile_StateArm_Idle;373eggmanArmR->state = KleptoMobile_StateArm_Idle;374375eggmanHand->position.x = eggman->originPos.x;376eggmanHand->position.y = eggman->originPos.y;377eggmanHand->position.x += 0x3C0000;378eggmanHand->position.y -= 0x3E0000;379eggmanHand->drawGroup = eggmanArmL->drawGroup + 1;380381eggmanArmL->position.x = eggman->originPos.x;382eggmanArmL->position.x -= 0x40000;383eggmanArmL->position.y = eggman->originPos.y;384eggmanArmL->position.y -= 0x360000;385eggmanArmL->armBezierPos.x = eggman->originPos.x - 0x600000;386eggmanArmL->armBezierPos.y = eggman->originPos.y - 0x280000;387eggmanArmL->finger1Animator.speed = 0;388eggmanArmL->finger2Animator.frameID = 0;389eggmanArmL->finger2Animator.speed = 0;390eggmanArmL->finger1Animator.frameID = 0;391392eggmanArmR->position.x = eggman->originPos.x;393eggmanArmR->position.x += 0x2E0000;394eggmanArmR->position.y = eggman->originPos.y;395eggmanArmR->position.y += 0x400000;396eggmanArmR->armBezierPos.x = eggman->originPos.x - 0x3A0000;397eggmanArmR->armBezierPos.y = eggman->originPos.y + 0x300000;398eggmanArmR->finger1Animator.speed = 0;399eggmanArmR->finger2Animator.frameID = 0;400eggmanArmR->finger2Animator.speed = 0;401eggmanArmR->finger1Animator.frameID = 0;402403camera->position.x = MAX(eggman->originPos.x + 0x200000, host->storedTimer);404405kingArmL->state = PhantomKing_StateArm_WrestleEggman;406kingArmR->state = PhantomKing_StateArm_WrestleEggman;407408kingArmL->position.x = king->originPos.x - 0x700000;409kingArmL->position.y = king->originPos.y - 0x1C0000;410kingArmL->armBezierPos.x = king->originPos.x + 0x100000;411kingArmL->armBezierPos.y = king->originPos.y - 0x2A0000;412kingArmL->handAnimator.frameID = 1;413kingArmL->drawGroup = eggmanArmL->drawGroup + 1;414kingArmL->handAnimator.speed = 0;415416kingArmR->position.x = king->originPos.x - 0x3E0000;417kingArmR->position.y = king->originPos.y + 0x520000;418kingArmR->armBezierPos.x = king->originPos.x + 0x380000;419kingArmR->armBezierPos.y = king->originPos.y + 0x380000;420kingArmR->handAnimator.frameID = 1;421kingArmR->drawGroup = eggmanArmR->drawGroup + 1;422kingArmR->handAnimator.speed = 0;423424if (eggman->position.x >= king->originPos.x - 0x580000) {425eggman->position.x = king->originPos.x - 0x580000;426eggman->velocity.x = 0;427eggman->velocity.y = 0;428429Camera_ShakeScreen(0, 5, 0);430RSDK.PlaySfx(ERZStart->sfxHullClose, false, 255);431return true;432}433434return false;435}436437bool32 ERZStart_Cutscene_EggmanKingWrestling(EntityCutsceneSeq *host)438{439MANIA_GET_PLAYER(player1, player2, camera);440UNUSED(player2);441UNUSED(camera);442443EntityPhantomRuby *ruby = ERZStart->ruby;444EntityFXRuby *fxRuby = ERZStart->fxRuby;445446EntityKleptoMobile *eggman = ERZStart->eggman;447EntityPhantomKing *king = ERZStart->king;448449uint16 eggmanSlot = RSDK.GetEntitySlot(eggman);450EntityKleptoMobile *eggmanHand1 = RSDK_GET_ENTITY(eggmanSlot - 1, KleptoMobile);451EntityKleptoMobile *eggmanHand2 = RSDK_GET_ENTITY(eggmanSlot + 1, KleptoMobile);452453uint16 kingSlot = RSDK.GetEntitySlot(king);454EntityPhantomKing *kingChild1 = RSDK_GET_ENTITY(kingSlot - 1, PhantomKing);455EntityPhantomKing *kingChild2 = RSDK_GET_ENTITY(kingSlot + 1, PhantomKing);456457ERZStart_HandlePlayerHover(player1, host, ruby->startPos.y);458459if (host->timer > 6 && !(host->timer % 6))460Camera_ShakeScreen(0, 1, 0);461462if (!(host->timer % 37))463RSDK.PlaySfx(ERZStart->sfxRumble, false, 255);464465if (host->timer == 120) {466RSDK.SetSpriteAnimation(PhantomKing->aniFrames, 8, &king->rubyAnimator, true, 1);467king->rubyAnimator.speed = 1;468}469470if (host->timer == 172) {471PhantomRuby_PlaySfx(RUBYSFX_ATTACK4);472fxRuby->position.x = king->position.x;473fxRuby->position.y = king->position.y;474fxRuby->fadeWhite = 0x300;475476RSDK.StopSfx(ERZStart->sfxRumble);477return true;478}479else {480eggmanHand1->position.x -= RSDK.Sin256(16 * host->timer) << 8;481kingChild1->position.x -= RSDK.Sin256(16 * host->timer) << 8;482eggmanHand2->position.x += RSDK.Sin256(16 * host->timer) << 8;483kingChild2->position.x += RSDK.Sin256(16 * host->timer) << 8;484}485486return false;487}488489bool32 ERZStart_Cutscene_PostWrestleFadeIn(EntityCutsceneSeq *host)490{491MANIA_GET_PLAYER(player1, player2, camera);492UNUSED(player2);493UNUSED(camera);494495EntityPhantomRuby *ruby = ERZStart->ruby;496EntityFXRuby *fxRuby = ERZStart->fxRuby;497498EntityKleptoMobile *eggman = ERZStart->eggman;499EntityPhantomKing *king = ERZStart->king;500501uint16 eggmanSlot = RSDK.GetEntitySlot(eggman);502EntityKleptoMobile *eggmanHand = RSDK_GET_ENTITY(eggmanSlot - 2, KleptoMobile);503EntityKleptoMobile *eggmanArmL = RSDK_GET_ENTITY(eggmanSlot - 1, KleptoMobile);504EntityKleptoMobile *eggmanArmR = RSDK_GET_ENTITY(eggmanSlot + 1, KleptoMobile);505506uint16 kingSlot = RSDK.GetEntitySlot(king);507EntityPhantomKing *kingArmL = RSDK_GET_ENTITY(kingSlot - 1, PhantomKing);508EntityPhantomKing *kingArmR = RSDK_GET_ENTITY(kingSlot + 1, PhantomKing);509510ERZStart_HandlePlayerHover(player1, host, ruby->startPos.y);511512if (!king->rubyAnimator.frameID)513king->rubyAnimator.speed = 0;514515if (!host->timer) {516eggman->position.x = 0x31C0000;517eggman->position.y = -0x3C0000;518eggman->state = StateMachine_None;519eggmanHand->state = KleptoMobile_StateHand_Cutscene;520eggmanArmL->state = KleptoMobile_StateArm_Cutscene;521eggmanArmR->state = KleptoMobile_StateArm_Cutscene;522523eggmanHand->drawGroup = Zone->objectDrawGroup[0];524RSDK.SetSpriteAnimation(KleptoMobile->aniFrames, 12, &eggmanHand->handAnimator, true, 5);525526kingArmL->state = PhantomKing_StateArm_Idle;527kingArmR->state = PhantomKing_StateArm_Idle;528king->drawGroup = Zone->objectDrawGroup[0];529kingArmL->drawGroup = Zone->objectDrawGroup[0];530kingArmR->drawGroup = Zone->objectDrawGroup[0];531}532533if (fxRuby->fadeWhite > 0)534fxRuby->fadeWhite -= 8;535536return fxRuby->fadeWhite == 0;537}538539bool32 ERZStart_Cutscene_ReturnCamToSonic(EntityCutsceneSeq *host)540{541MANIA_GET_PLAYER(player1, player2, camera);542UNUSED(player2);543544EntityPhantomRuby *ruby = ERZStart->ruby;545546ERZStart_HandlePlayerHover(player1, host, ruby->startPos.y);547548if (host->timer == 30)549Camera_SetupLerp(CAMERA_LERP_NORMAL, 0, ScreenInfo->center.x << 16, camera->position.y, 2);550551if (!host->values[0]) {552if (camera->position.x == ScreenInfo->center.x << 16) {553host->values[0] = 1;554host->storedTimer = host->timer;555}556}557else if (host->timer - host->storedTimer == 60) {558Music_TransitionTrack(TRACK_ERZBOSS, 0.0215);559return true;560}561562return false;563}564565bool32 ERZStart_Cutscene_PreparePlayerTransform(EntityCutsceneSeq *host)566{567MANIA_GET_PLAYER(player1, player2, camera);568UNUSED(player2);569UNUSED(camera);570571EntityPhantomRuby *ruby = ERZStart->ruby;572573ERZStart_HandlePlayerHover(player1, host, ruby->startPos.y);574575if (++ERZStart->timer >= 60) {576ERZStart->timer = 0;577578for (int32 i = 0; i < 7; ++i) {579EntityChaosEmerald *emerald = ERZStart->emeralds[i];580emerald->drawFX |= FX_SCALE;581emerald->scale.x = 0x200;582emerald->scale.y = 0x200;583}584585return true;586}587588return false;589}590591bool32 ERZStart_Cutscene_PlayerTransform(EntityCutsceneSeq *host)592{593MANIA_GET_PLAYER(player1, player2, camera);594UNUSED(player2);595UNUSED(camera);596597EntityPhantomRuby *ruby = ERZStart->ruby;598599if (++ERZStart->timer > 96) {600ERZStart->timer = 0;601return true;602}603else {604for (int32 i = 0; i < 7; ++i) {605EntityChaosEmerald *emerald = ERZStart->emeralds[i];606emerald->drawGroup = Zone->objectDrawGroup[0];607emerald->radius -= 0x60;608609if (emerald->radius <= 0)610emerald->visible = false;611612emerald->groundVel += 32;613emerald->scale.x -= 3;614emerald->scale.y -= 3;615}616617if (ERZStart->timer >= 32) {618if (ERZStart->timer == 32) {619Player_GiveRings(player1, 50, false);620Player_TryTransform(player1, 0x7F);621}622}623else {624ERZStart_HandlePlayerHover(player1, host, ruby->startPos.y);625}626}627628return false;629}630631bool32 ERZStart_Cutscene_StartFight(EntityCutsceneSeq *host)632{633RSDK_THIS(ERZStart);634MANIA_GET_PLAYER(player1, player2, camera);635UNUSED(player2);636637EntityPhantomKing *king = ERZStart->king;638639if (player1->animator.animationID != ANI_TRANSFORM) {640Zone->playerBoundActiveR[0] = true;641Zone->playerBoundActiveT[0] = true;642Zone->cameraBoundsR[0] = 0x610;643Zone->cameraBoundsT[0] = 0;644645player1->state = ERZStart_State_PlayerSuperFly;646player1->abilityValues[0] = 60;647player1->velocity.x = 0x160000;648player1->onGround = false;649player1->stateAbility = ERZStart_Player_StartSuperFly;650RSDK.PlaySfx(Player->sfxPeelRelease, false, 255);651652EntityFXFade *fxFade = CREATE_ENTITY(FXFade, INT_TO_VOID(0xF0F0F0), self->position.x, self->position.y);653fxFade->speedIn = 256;654fxFade->speedOut = 64;655player1->stateInput = Player_Input_P1;656657if (player1->characterID == ID_KNUCKLES) {658RSDK.SetSpriteAnimation(player1->aniFrames, ANI_GLIDE, &player1->animator, false, 6);659player1->animator.rotationStyle = ROTSTYLE_FULL;660}661else {662RSDK.SetSpriteAnimation(player1->aniFrames, ANI_RUN, &player1->animator, false, 0);663}664665Zone->playerBoundActiveL[0] = true;666Zone->playerBoundActiveR[0] = true;667Zone->playerBoundActiveT[0] = true;668669PhantomKing_SetupKing(king);670671Camera_SetTargetEntity(0, player1);672camera->target = (Entity *)player1;673camera->offset.x = 0;674camera->offset.y = 0;675camera->state = Camera_State_FollowXY;676player1->camera = camera;677678foreach_all(RingField, field) { field->running = true; }679680SceneInfo->timeEnabled = true;681return true;682}683684return false;685}686687bool32 ERZStart_Cutscene_Fight(EntityCutsceneSeq *host)688{689EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);690EntityKleptoMobile *eggman = ERZStart->eggman;691EntityPhantomKing *king = ERZStart->king;692693if (player1->superState == SUPERSTATE_SUPER) {694if (!king->health && !eggman->health)695return true;696}697else if (player1->deathType != PLAYER_DEATH_DIE_USESFX) {698player1->deathType = PLAYER_DEATH_DIE_USESFX;699}700701return false;702}703704void ERZStart_RubyHover(void)705{706EntityPhantomRuby *ruby = ERZStart->ruby;707EntityFXRuby *fxRuby = ERZStart->fxRuby;708709ruby->angle += 2;710ruby->position.y = (RSDK.Sin256(ruby->angle) << 10) + ruby->startPos.y;711712fxRuby->position.x = ruby->position.x;713fxRuby->position.y = ruby->position.y;714}715716void ERZStart_RubyMove(void)717{718RSDK_THIS(ERZStart);719EntityPhantomRuby *ruby = ERZStart->ruby;720721if (self->velocity.x < 0x40000)722self->velocity.x += 0x1800;723724ruby->angle += 2;725ruby->position.x += ruby->velocity.x;726ruby->position.y = (RSDK.Sin256(ruby->angle) << 10) + ruby->startPos.y;727}728729void ERZStart_Player_HandleSuperDash(EntityPlayer *player)730{731RSDK_THIS(Player);732733uint8 dashDir = 0;734if (player->up)735dashDir |= 1;736737if (player->down)738dashDir |= 2;739740if (player->left)741dashDir |= 4;742743if (player->right)744dashDir |= 8;745746int32 dashAngle = 0;747uint8 dashAngles[] = { 0x00, 0xC0, 0x40, 0x00, 0x80, 0xA0, 0x60, 0x00, 0x00, 0xE0, 0x20 };748749if (dashDir == 0 && player->direction)750dashAngle = 0x80;751else752dashAngle = dashAngles[dashDir];753754player->rings -= 5;755if (player->rings < 0)756player->rings = 0;757758player->velocity.x = 0x1600 * RSDK.Cos256(dashAngle);759player->velocity.y = 0x1600 * RSDK.Sin256(dashAngle);760761RSDK.PlaySfx(ItemBox->sfxHyperRing, false, 0xFF);762RSDK.PlaySfx(Player->sfxPeelRelease, false, 0xFF);763764if (player->characterID == ID_KNUCKLES) {765RSDK.SetSpriteAnimation(player->aniFrames, ANI_GLIDE, &player->animator, false, 6);766player->animator.rotationStyle = ROTSTYLE_FULL;767}768else {769RSDK.SetSpriteAnimation(player->aniFrames, ANI_RUN, &player->animator, false, 0);770}771772player->state = ERZStart_State_PlayerSuperFly;773player->abilityValues[0] = 60;774775if (FXFade) {776EntityFXFade *fxFade = CREATE_ENTITY(FXFade, INT_TO_VOID(0xF0F0F0), self->position.x, self->position.y);777fxFade->speedIn = 256;778fxFade->speedOut = 64;779}780781#if MANIA_USE_PLUS782Player->superDashCooldown = 30;783#else784ERZStart->superDashCooldown = 30;785#endif786}787788void ERZStart_State_PlayerSuperFly(void)789{790RSDK_THIS(Player);791792EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);793794if (player1->onGround) {795player1->state = Player_State_Ground;796RSDK.SetSpriteAnimation(player1->aniFrames, ANI_IDLE, &player1->animator, false, 0);797}798else {799if (player1->up) {800if (self->velocity.y > -player1->topSpeed) {801self->velocity.y -= player1->acceleration;802803if (player1->velocity.y > 0)804self->velocity.y -= player1->acceleration;805}806}807else if (player1->down) {808if (self->velocity.y < player1->topSpeed) {809self->velocity.y += player1->acceleration;810811if (player1->velocity.y < 0)812self->velocity.y += player1->acceleration;813}814}815else {816if (player1->velocity.y) {817if (player1->velocity.y < 0) {818player1->velocity.y += player1->deceleration;819820if (player1->velocity.y > 0)821player1->velocity.y = 0;822}823else {824player1->velocity.y -= player1->deceleration;825826if (player1->velocity.y < 0)827player1->velocity.y = 0;828}829}830}831832int32 velY = player1->velocity.y;833if (velY >= -player1->topSpeed) {834if (velY > player1->topSpeed)835player1->velocity.y = velY - (player1->acceleration >> 1) - player1->acceleration;836}837else {838player1->velocity.y = player1->acceleration + velY + (player1->acceleration >> 1);839}840841if (player1->left) {842if (player1->characterID == ID_KNUCKLES && self->direction == FLIP_NONE)843RSDK.SetSpriteAnimation(player1->aniFrames, ANI_GLIDE, &player1->animator, true, 0);844845if (self->velocity.x > -player1->topSpeed) {846self->velocity.x -= player1->acceleration;847848if (player1->velocity.x > 0)849self->velocity.x -= player1->acceleration;850}851852player1->direction = FLIP_X;853}854else if (player1->right) {855if (player1->characterID == ID_KNUCKLES && self->direction == FLIP_X)856RSDK.SetSpriteAnimation(player1->aniFrames, ANI_GLIDE, &player1->animator, true, 0);857858if (self->velocity.x < player1->topSpeed) {859self->velocity.x += player1->acceleration;860861if (player1->velocity.x < 0)862self->velocity.x += player1->acceleration;863}864865player1->direction = FLIP_NONE;866}867else {868if (player1->velocity.x) {869if (player1->velocity.x < 0) {870player1->velocity.x += player1->deceleration;871872if (player1->velocity.x > 0)873player1->velocity.x = 0;874}875else {876player1->velocity.x -= player1->deceleration;877878if (player1->velocity.x < 0)879player1->velocity.x = 0;880}881}882}883884int32 velX = player1->velocity.x;885if (velX >= -player1->topSpeed) {886if (velX > player1->topSpeed)887player1->velocity.x = velX - (player1->acceleration >> 1) - player1->acceleration;888}889else {890player1->velocity.x = player1->acceleration + velX + (player1->acceleration >> 1);891}892893if (player1->abilityValues[0]) {894player1->abilityValues[0]--;895}896else if (player1->jumpPress) {897if (player1->rings > 10)898ERZStart_Player_HandleSuperDash(player1);899}900}901}902903void ERZStart_Player_StartSuperFly(void)904{905RSDK_THIS(Player);906907if (self->jumpAbilityState == 1 && self->jumpPress) {908if (self->characterID == ID_KNUCKLES) {909RSDK.SetSpriteAnimation(self->aniFrames, ANI_GLIDE, &self->animator, false, 6);910self->animator.rotationStyle = ROTSTYLE_FULL;911}912else {913RSDK.SetSpriteAnimation(self->aniFrames, ANI_RUN, &self->animator, false, 0);914}915916self->state = ERZStart_State_PlayerSuperFly;917}918}919920void ERZStart_State_PlayerRebound(void)921{922EntityPlayer *entity = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);923924if (entity->characterID == ID_KNUCKLES) {925RSDK.SetSpriteAnimation(entity->aniFrames, ANI_GLIDE, &entity->animator, false, 6);926entity->animator.rotationStyle = ROTSTYLE_FULL;927}928else {929RSDK.SetSpriteAnimation(entity->aniFrames, ANI_RUN, &entity->animator, false, 0);930}931932entity->rotation += 0x20;933entity->onGround = false;934935if (entity->rotation == 0x600) {936entity->rotation = 0;937entity->state = ERZStart_State_PlayerSuperFly;938}939}940941#if GAME_INCLUDE_EDITOR942void ERZStart_EditorDraw(void)943{944RSDK_THIS(ERZStart);945946CutsceneRules_DrawCutsceneBounds(self, &self->size);947}948949void ERZStart_EditorLoad(void) {}950#endif951952void ERZStart_Serialize(void) { RSDK_EDITABLE_VAR(ERZOutro, VAR_VECTOR2, size); }953954955