Path: blob/master/SonicMania/Objects/PGZ/PSZ2Outro.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: PSZ2Outro Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectPSZ2Outro *PSZ2Outro;1011void PSZ2Outro_Update(void)12{13RSDK_THIS(PSZ2Outro);1415CutsceneSeq_StartSequence(self, PSZ2Outro_Cutscene_SetupCameraMove, PSZ2Outro_Cutscene_HandleCameraMovement, PSZ2Outro_Cutscene_WalkIntoPlace,16PSZ2Outro_Cutscene_EnterRuby, PSZ2Outro_Cutscene_RubyActivated, PSZ2Outro_Cutscene_RubyWarp,17PSZ2Outro_Cutscene_LoadSSZ1, StateMachine_None);1819#if MANIA_USE_PLUS20CutsceneSeq_SetSkipType(SKIPTYPE_RELOADSCN);21#endif2223HUD_MoveOut();24self->active = ACTIVE_NEVER;25}2627void PSZ2Outro_LateUpdate(void) {}2829void PSZ2Outro_StaticUpdate(void) {}3031void PSZ2Outro_Draw(void) {}3233void PSZ2Outro_Create(void *data)34{35RSDK_THIS(PSZ2Outro);3637if (!SceneInfo->inEditor) {38foreach_all(PSZEggman, eggman) { self->eggman = eggman; }3940self->active = ACTIVE_NORMAL;41self->visible = false;42}43}4445void PSZ2Outro_StageLoad(void) {}4647bool32 PSZ2Outro_Cutscene_SetupCameraMove(EntityCutsceneSeq *host)48{49RSDK_THIS(PSZ2Outro);5051EntityPSZEggman *eggman = self->eggman;5253foreach_active(Player, player)54{55if (!player->sidekick) {56player->stateInput = StateMachine_None;57CutsceneSeq_LockAllPlayerControl();58player->left = false;59player->right = false;60player->up = false;61player->down = false;62player->jumpPress = false;63}64}6566EntityCamera *camera = RSDK_GET_ENTITY(SLOT_CAMERA1, Camera);67camera->position.x = (camera->boundsR + camera->boundsL) << 15;68camera->boundsR += 512;69Zone->playerBoundActiveR[0] = false;70Zone->playerBoundActiveR[1] = false;7172FXRuby_SetupLayerDeformation();73Camera_SetupLerp(CAMERA_LERP_SIN512, 0, eggman->position.x - 0x600000, camera->position.y, 2);74Music_PlayTrack(TRACK_STAGE);7576return true;77}7879bool32 PSZ2Outro_Cutscene_HandleCameraMovement(EntityCutsceneSeq *host)80{81RSDK_THIS(PSZ2Outro);8283EntityPSZEggman *eggman = self->eggman;84EntityCamera *camera = RSDK_GET_ENTITY(SLOT_CAMERA1, Camera);8586if (host->timer == 180) {87foreach_active(Player, player)88{89player->position.x = camera->position.x - (ScreenInfo->center.x << 16) - 0x400000;90player->position.y = eggman->position.y;91player->state = Player_State_Ground;9293if (!player->sidekick)94player->right = true;95}9697return true;98}99100return false;101}102103bool32 PSZ2Outro_Cutscene_WalkIntoPlace(EntityCutsceneSeq *host)104{105RSDK_THIS(PSZ2Outro);106107EntityPSZEggman *eggman = self->eggman;108EntityCamera *camera = RSDK_GET_ENTITY(SLOT_CAMERA1, Camera);109110foreach_active(Player, player)111{112player->direction = FLIP_NONE;113114if (player->groundVel > 0x30000)115player->groundVel = 0x30000;116117if (!player->sidekick) {118if (camera->position.x - player->position.x >= 0x600000) {119player->left = false;120player->right = true;121}122else {123if (!player->skidding) {124RSDK.SetSpriteAnimation(PSZEggman->aniFrames, 1, &eggman->eggmanAnimator, false, 0);125eggman->state = PSZEggman_State_TurnRound;126player->skidding = 24;127}128129player->right = false;130}131}132}133134EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);135if (player1->skidding == 4) {136foreach_active(Player, playerPtr)137{138playerPtr->groundVel = 0;139playerPtr->skidding = false;140}141142return true;143}144145return false;146}147148bool32 PSZ2Outro_Cutscene_EnterRuby(EntityCutsceneSeq *host)149{150RSDK_THIS(PSZ2Outro);151EntityPlayer *player2 = RSDK_GET_ENTITY(SLOT_PLAYER2, Player);152153if (RSDK.GetEntityCount(PhantomRuby->classID, true) > 0) {154foreach_active(PhantomRuby, ruby) { self->ruby = ruby; }155}156157if (self->ruby && self->ruby->state == PhantomRuby_State_Oscillate) {158if (player2->classID == Player->classID) {159player2->state = Player_State_Static;160RSDK.SetSpriteAnimation(player2->aniFrames, ANI_SKID, &player2->animator, false, 0);161}162163return true;164}165166return false;167}168169bool32 PSZ2Outro_Cutscene_RubyActivated(EntityCutsceneSeq *host)170{171RSDK_THIS(PSZ2Outro);172173EntityPhantomRuby *ruby = self->ruby;174175if (!host->timer)176PhantomRuby_SetupFlash(ruby);177178if (ruby->flashFinished) {179PhantomRuby_PlaySfx(RUBYSFX_REDCUBE);180return true;181}182183return false;184}185186bool32 PSZ2Outro_Cutscene_RubyWarp(EntityCutsceneSeq *host)187{188RSDK_THIS(PSZ2Outro);189190EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player); \191EntityPlayer *player2 = RSDK_GET_ENTITY(SLOT_PLAYER2, Player); \192193EntityPhantomRuby *ruby = self->ruby;194EntityFXRuby *fxRuby = NULL;195if (host->timer) {196fxRuby = self->fxRuby;197}198else {199fxRuby = CREATE_ENTITY(FXRuby, NULL, ruby->position.x, ruby->position.y);200fxRuby->drawGroup = Zone->playerDrawGroup[1];201self->fxRuby = fxRuby;202Camera_ShakeScreen(0, 4, 4);203player1->drawGroup = Zone->playerDrawGroup[1] + 1;204if (player2->classID == Player->classID)205player2->drawGroup = Zone->playerDrawGroup[1] + 1;206}207208if (!host->values[0]) {209if (fxRuby->fullyExpanded) {210if (host->storedTimer) {211if (host->timer == host->storedTimer + 48) {212fxRuby->delay = 64;213fxRuby->state = FXRuby_State_IncreaseStageDeform;214PhantomRuby_PlaySfx(RUBYSFX_ATTACK4);215Camera_ShakeScreen(0, 4, 4);216}217else if (host->timer == host->storedTimer + 180) {218fxRuby->delay = 32;219fxRuby->state = FXRuby_State_IncreaseStageDeform;220PhantomRuby_PlaySfx(RUBYSFX_ATTACK1);221Camera_ShakeScreen(0, 4, 4);222Music_FadeOut(0.025);223host->storedTimer = host->timer;224host->values[0] = true;225}226}227else {228host->storedTimer = host->timer;229}230231if (host->timer >= host->storedTimer + 52) {232EntityPlayer *players[2] = {player1, player2};233for (int32 i = 0; i < 2; ++i) {234EntityPlayer *player = players[i];235if (player->classID == Player->classID) {236RSDK.SetSpriteAnimation(player->aniFrames, ANI_FAN, &player->animator, false, 0);237238int32 valX = (player->position.x - player->position.x) >> 3;239int32 valY =240(0xA00 * RSDK.Sin256(2 * ((i * 0x40) + host->timer - host->storedTimer)) + (ruby->position.y - 0x200000) - player->position.y)241>> 3;242243player->position.x += valX;244player->position.y += valY;245player->state = Player_State_Static;246player->tileCollisions = TILECOLLISION_NONE;247player->onGround = false;248}249}250}251}252}253else {254if (fxRuby->fadeWhite >= 512) {255if (fxRuby->fadeBlack >= 512) {256if (host->timer == host->storedTimer + 150)257return true;258}259else {260fxRuby->fadeBlack += 16;261}262}263else {264fxRuby->fadeWhite += 16;265}266}267268return false;269}270271bool32 PSZ2Outro_Cutscene_LoadSSZ1(EntityCutsceneSeq *host)272{273if (host->timer == 16) {274RSDK.LoadScene();275return true;276}277278return false;279}280281#if GAME_INCLUDE_EDITOR282void PSZ2Outro_EditorDraw(void)283{284RSDK_THIS(PSZ2Outro);285CutsceneRules_DrawCutsceneBounds(self, &self->size);286}287288void PSZ2Outro_EditorLoad(void) {}289#endif290291void PSZ2Outro_Serialize(void) { RSDK_EDITABLE_VAR(PSZ2Outro, VAR_VECTOR2, size); }292293294