Path: blob/master/SonicMania/Objects/GHZ/GHZ2Outro.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: GHZ2Outro Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectGHZ2Outro *GHZ2Outro;1011void GHZ2Outro_Update(void)12{13RSDK_THIS(GHZ2Outro);1415if (!self->activated) {16CutsceneSeq_StartSequence(self, GHZ2Outro_Cutscene_HoleSceneFadeIn, GHZ2Outro_Cutscene_SpyOnEggman, GHZ2Outro_Cutscene_BreakupGroup,17GHZ2Outro_Cutscene_RubyHover, GHZ2Outro_Cutscene_StartRubyWarp, GHZ2Outro_Cutscene_HandleRubyWarp,18GHZ2Outro_Cutscene_LoadCPZ1, StateMachine_None);1920#if MANIA_USE_PLUS21CutsceneSeq_SetSkipTypeCallback(GHZ2Outro_Cutscene_SkipCB);22#endif2324self->active = ACTIVE_NEVER;25}26else {27CutsceneSeq_StartSequence(self, GHZ2Outro_Cutscene_FinishActClear, GHZ2Outro_Cutscene_JumpIntoHole, StateMachine_None);2829#if MANIA_USE_PLUS30CutsceneSeq_SetSkipType(SKIPTYPE_RELOADSCN);31#endif3233HUD_MoveOut();34self->active = ACTIVE_NEVER;35}36}3738void GHZ2Outro_LateUpdate(void) {}3940void GHZ2Outro_StaticUpdate(void) {}4142void GHZ2Outro_Draw(void) {}4344void GHZ2Outro_Create(void *data)45{46RSDK_THIS(GHZ2Outro);4748if (!SceneInfo->inEditor) {49self->activated = data != NULL;5051foreach_all(DERobot, robot) { self->DERobot = robot; }52foreach_all(Eggman, eggman) { self->eggman = eggman; }5354self->active = ACTIVE_NORMAL;55self->visible = false;56}57}5859void GHZ2Outro_StageLoad(void)60{61GHZ2Outro->sfxRocketJet = RSDK.GetSfx("Stage/RocketJet.wav");62GHZ2Outro->sfxShinobiJump = RSDK.GetSfx("PSZ/ShinobiJump.wav");63GHZ2Outro->sfxHeliWoosh = RSDK.GetSfx("SPZ1/HeliWooshIn.wav");64}6566bool32 GHZ2Outro_Cutscene_FinishActClear(EntityCutsceneSeq *host)67{68RSDK_THIS(GHZ2Outro);6970EntityDERobot *robot = self->DERobot;71robot->state = StateMachine_None;72robot->active = ACTIVE_NEVER;7374CutsceneSeq_LockAllPlayerControl();7576foreach_active(Player, player)77{78player->state = Player_State_Ground;79if (!player->sidekick) {80player->stateInput = StateMachine_None;81player->left = true;82player->right = false;83player->up = false;84player->down = false;85player->jumpPress = false;86}87}8889Zone->deathBoundary[0] += 0x4000 << 16;90Zone->deathBoundary[1] += 0x4000 << 16;91Music_PlayTrack(TRACK_STAGE);9293foreach_active(EggPrison, prison) { prison->state = EggPrison_State_FlyOffScreen; }9495return true;96}97bool32 GHZ2Outro_Cutscene_JumpIntoHole(EntityCutsceneSeq *host)98{99RSDK_THIS(GHZ2Outro);100101EntityDERobot *robot = self->DERobot;102103foreach_active(Player, player)104{105player->jumpPress = false;106107if (player->onGround) {108if (player->angle > 8 && player->angle < 64 && player->groundVel > -0x20000)109player->groundVel = -0x20000;110111if (player->position.x - robot->position.x < 0x600000) {112player->jumpPress = true;113player->jumpHold = true;114}115}116117if (player->position.x < robot->position.x + 0x200000)118player->velocity.x -= player->velocity.x >> 4;119120if (player->position.x < robot->position.x - 0x200000)121player->position.x = robot->position.x - 0x200000;122}123124if (player->position.y > (ScreenInfo->position.y + 0x200) << 16) {125foreach_active(Player, playerPtr) { playerPtr->active = ACTIVE_NEVER; }126RSDK.SetScene("Cutscenes", "Green Hill Zone 2");127128Zone_StartFadeOut(0x10, 0x000000);129return true;130}131132return false;133}134135bool32 GHZ2Outro_Cutscene_HoleSceneFadeIn(EntityCutsceneSeq *host)136{137RSDK_THIS(GHZ2Outro);138139if (host->timer >= 8) {140CutsceneSeq_LockAllPlayerControl();141142foreach_active(Player, player)143{144player->stateInput = StateMachine_None;145RSDK.SetSpriteAnimation(player->aniFrames, ANI_JUMP, &player->animator, false, 0);146}147148foreach_all(CutsceneHBH, cutsceneHBH) { cutsceneHBH->drawGroup = Zone->objectDrawGroup[0]; }149150foreach_all(DERobot, robot)151{152robot->state = StateMachine_None;153robot->active = ACTIVE_NORMAL;154robot->visible = true;155}156157EntityDERobot *deRobot = self->DERobot;158deRobot->state = DERobot_State_CutsceneExplode;159160CutsceneHBH_ShinobiBounceSetup();161CutsceneHBH_KingSetup();162CutsceneHBH_RiderSetup();163164EntityEggman *eggman = self->eggman;165RSDK.SetSpriteAnimation(Eggman->aniFrames, 9, &eggman->animator, true, 0);166eggman->direction = FLIP_NONE;167eggman->state = Eggman_State_ProcessAnimation;168169foreach_all(PhantomRuby, ruby)170{171self->phantomRuby = ruby;172ruby->state = PhantomRuby_State_MoveRotateGravity;173ruby->drawFX = FX_ROTATE;174}175176FXRuby_SetupLayerDeformation();177return true;178}179180return false;181}182bool32 GHZ2Outro_Cutscene_SpyOnEggman(EntityCutsceneSeq *host)183{184RSDK_THIS(GHZ2Outro);185186foreach_active(Player, player)187{188if (player->sidekick) {189if (host->timer >= 60) {190if (host->timer == 60) {191player->state = Player_State_Ground;192player->right = true;193}194}195else {196player->groundVel = 0;197if (player->onGround && player->groundedStore) {198player->state = Player_State_Static;199if (player->characterID == ID_TAILS)200RSDK.SetSpriteAnimation(player->aniFrames, ANI_BALANCE_2, &player->animator, false, 0);201else202RSDK.SetSpriteAnimation(player->aniFrames, ANI_IDLE, &player->animator, false, 0);203}204}205}206else if (player->onGround && player->groundedStore) {207player->right = true;208}209210if (player->position.x > self->position.x - 0x180000 * player->playerID - 0xE00000) {211player->right = FLIP_NONE;212player->direction = FLIP_NONE;213if (!player->skidding && player->groundVel > 0) {214player->skidding = 12;215}216217player->groundVel -= player->groundVel >> 4;218if (player->groundVel < 0x10000)219player->skidding = 0;220}221}222223if (host->timer == 90)224Music_TransitionTrack(TRACK_HBHMISCHIEF, 0.0125);225226if (host->timer == 120)227Camera_SetupLerp(CAMERA_LERP_SIN512, 0, self->position.x, self->position.y, 4);228229if (host->timer >= 208) {230foreach_active(Player, playerPtr)231{232playerPtr->down = true;233playerPtr->camera = NULL;234}235return true;236}237return false;238}239bool32 GHZ2Outro_Cutscene_BreakupGroup(EntityCutsceneSeq *host)240{241RSDK_THIS(GHZ2Outro);242243EntityEggman *eggman = self->eggman;244245switch (host->timer) {246default: break;247248case 90:249RSDK.SetSpriteAnimation(Eggman->aniFrames, 5, &eggman->animator, true, 2);250eggman->timer = 30;251eggman->velocity.x = 0;252eggman->velocity.y = -0x30000;253eggman->nextState = Eggman_State_ProcessUntilEnd;254eggman->state = Eggman_State_FallUntilTimerReset;255eggman->animID = 3;256break;257258case 160: {259foreach_active(DERobot, robot)260{261if (robot->aniID == DEROBOT_ARM && robot->frameID == 2) {262robot->state = DERobot_Cutscene_ActivateArm;263}264}265266RSDK.PlaySfx(DERobot->sfxButton2, false, 255);267break;268}269270case 240:271eggman->state = Eggman_State_ProcessThenSet;272eggman->animID = 2;273Music_SetMusicTrack("RubyPresence.ogg", TRACK_RUBYPRESENCE, 198457);274Music_TransitionTrack(TRACK_EGGMAN1, 0.025);275break;276277case 272: {278EntityCutsceneHBH *mystic = CutsceneHBH_GetEntity(HBH_MYSTIC);279if (mystic)280mystic->state = CutsceneHBH_State_MysticExit;281282Camera_SetupLerp(CAMERA_LERP_NORMAL, 0, self->position.x, self->position.y - 0x400000, 1);283RSDK.PlaySfx(GHZ2Outro->sfxRocketJet, false, 0xFF);284break;285}286287case 288: {288EntityCutsceneHBH *rider = CutsceneHBH_GetEntity(HBH_RIDER);289if (rider) {290if (rider->direction == FLIP_X) {291rider->timer = 0;292RSDK.SetSpriteAnimation(rider->aniFrames, 2, &rider->mainAnimator, true, 0);293}294rider->state = CutsceneHBH_State_RiderExit;295}296297RSDK.PlaySfx(GHZ2Outro->sfxHeliWoosh, false, 255);298break;299}300301case 304: {302CutsceneHBH_ShinobiJumpSetup();303304RSDK.PlaySfx(GHZ2Outro->sfxShinobiJump, false, 255);305break;306}307308case 320: {309EntityCutsceneHBH *gunner = CutsceneHBH_GetEntity(HBH_GUNNER);310if (gunner) {311RSDK.SetSpriteAnimation(gunner->aniFrames, 4, &gunner->mainAnimator, true, 0);312gunner->state = CutsceneHBH_State_GunnerExit;313}314315EntityCutsceneHBH *king = CutsceneHBH_GetEntity(HBH_KING);316if (king) {317king->direction ^= FLIP_X;318king->state = CutsceneHBH_State_KingExit;319}320321RSDK.PlaySfx(GHZ2Outro->sfxRocketJet, false, 0xFF);322foreach_active(Player, player) { player->down = false; }323EntityPhantomRuby *ruby = self->phantomRuby;324ruby->startPos.x = ruby->position.x;325ruby->startPos.y = ruby->position.y;326ruby->state = PhantomRuby_State_Oscillate;327return true;328}329}330331return false;332}333bool32 GHZ2Outro_Cutscene_RubyHover(EntityCutsceneSeq *host)334{335RSDK_THIS(GHZ2Outro);336EntityPlayer *player2 = RSDK_GET_ENTITY(SLOT_PLAYER2, Player);337EntityPhantomRuby *ruby = self->phantomRuby;338339if (ruby) {340if (ruby->state == PhantomRuby_State_Oscillate) {341if (player2->classID == Player->classID && player2->characterID == ID_TAILS) {342player2->state = Player_State_Static;343RSDK.SetSpriteAnimation(player2->aniFrames, ANI_SKID, &player2->animator, false, 0);344}345return true;346}347}348349return false;350}351bool32 GHZ2Outro_Cutscene_StartRubyWarp(EntityCutsceneSeq *host)352{353RSDK_THIS(GHZ2Outro);354355EntityPhantomRuby *ruby = self->phantomRuby;356if (!host->timer)357PhantomRuby_SetupFlash(ruby);358359if (ruby->flashFinished) {360PhantomRuby_PlaySfx(RUBYSFX_REDCUBE);361return true;362}363364return false;365}366bool32 GHZ2Outro_Cutscene_HandleRubyWarp(EntityCutsceneSeq *host)367{368RSDK_THIS(GHZ2Outro);369370EntityPhantomRuby *ruby = self->phantomRuby;371EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);372EntityPlayer *player2 = RSDK_GET_ENTITY(SLOT_PLAYER2, Player);373374EntityFXRuby *fxRuby = NULL;375if (host->timer) {376fxRuby = self->fxRuby;377}378else {379fxRuby = CREATE_ENTITY(FXRuby, NULL, ruby->position.x, ruby->position.y);380fxRuby->drawGroup = Zone->playerDrawGroup[1];381self->fxRuby = fxRuby;382Camera_ShakeScreen(0, 4, 4);383player1->drawGroup = Zone->playerDrawGroup[1] + 1;384if (player2->classID == Player->classID)385player2->drawGroup = Zone->playerDrawGroup[1] + 1;386}387388if (!host->values[0]) {389if (fxRuby->fullyExpanded) {390if (host->storedTimer) {391if (host->timer == host->storedTimer + 48) {392fxRuby->delay = 64;393fxRuby->state = FXRuby_State_IncreaseStageDeform;394PhantomRuby_PlaySfx(RUBYSFX_ATTACK4);395Camera_ShakeScreen(0, 4, 4);396}397else if (host->timer == host->storedTimer + 180) {398fxRuby->delay = 32;399fxRuby->state = FXRuby_State_IncreaseStageDeform;400PhantomRuby_PlaySfx(RUBYSFX_ATTACK1);401Camera_ShakeScreen(0, 4, 4);402Music_FadeOut(0.025);403host->storedTimer = host->timer;404host->values[0] = true;405}406}407else {408host->storedTimer = host->timer;409}410411if (host->timer >= host->storedTimer + 52) {412int32 id = 0;413for (int32 angle = 0; angle < 0x80; angle += 0x10) {414EntityPlayer *player = RSDK_GET_ENTITY(id++, Player);415if (!player || player->classID == TYPE_BLANK)416break;417RSDK.SetSpriteAnimation(player->aniFrames, ANI_FAN, &player->animator, false, 0);418419int32 valX = (ruby->position.x - 0x400000) - player->position.x;420int32 valY = (ruby->position.y - (0xA00000 + 944)) - player->position.y;421422player->position.x += ((RSDK.Cos256(2 * (angle + host->timer - host->storedTimer)) << 12) + valX) >> 5;423player->position.y += ((RSDK.Sin256(2 * (angle + host->timer - host->storedTimer)) << 12) + valY) >> 5;424player->state = Player_State_Static;425player->tileCollisions = TILECOLLISION_NONE;426player->onGround = false;427}428}429}430}431else {432if (fxRuby->fadeWhite >= 0x200) {433if (fxRuby->fadeBlack >= 0x200) {434if (host->timer == host->storedTimer + 150)435return true;436}437else {438fxRuby->fadeBlack += 0x10;439}440}441else {442fxRuby->fadeWhite += 0x10;443}444}445446return false;447}448449bool32 GHZ2Outro_Cutscene_LoadCPZ1(EntityCutsceneSeq *host)450{451if (host->timer == 16) {452globals->enableIntro = true;453454#if MANIA_USE_PLUS455if (globals->gameMode == MODE_ENCORE)456RSDK.SetScene("Encore Mode", "Chemical Plant Zone+ 1");457else458#endif459RSDK.SetScene("Mania Mode", "Chemical Plant Zone 1");460461RSDK.LoadScene();462return true;463}464return false;465}466467#if MANIA_USE_PLUS468void GHZ2Outro_Cutscene_SkipCB(void)469{470#if MANIA_USE_PLUS471if (globals->gameMode == MODE_ENCORE)472RSDK.SetScene("Encore Mode", "Chemical Plant Zone+ 1");473else474#endif475RSDK.SetScene("Mania Mode", "Chemical Plant Zone 1");476}477#endif478479#if GAME_INCLUDE_EDITOR480void GHZ2Outro_EditorDraw(void)481{482RSDK_THIS(GHZ2Outro);483CutsceneRules_DrawCutsceneBounds(self, &self->size);484}485486void GHZ2Outro_EditorLoad(void) {}487#endif488489void GHZ2Outro_Serialize(void) { RSDK_EDITABLE_VAR(GHZ2Outro, VAR_VECTOR2, size); }490491492