Path: blob/master/SonicMania/Objects/OOZ/OOZ1Outro.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: OOZ1Outro Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectOOZ1Outro *OOZ1Outro;1011void OOZ1Outro_Update(void)12{13RSDK_THIS(OOZ1Outro);1415if (isMainGameMode() && globals->enableIntro && !CutsceneRules_CheckStageReload()) {16self->activated = true;17CutsceneSeq_StartSequence(self, OOZ1Outro_Cutscene_FadeIn, OOZ1Outro_Cutscene_PostActClearSetup, OOZ1Outro_Cutscene_FallIntoAct2,18OOZ1Outro_Cutscene_BeginAct, StateMachine_None);1920#if MANIA_USE_PLUS21CutsceneSeq_SetSkipType(SKIPTYPE_DISABLED);22#endif23}2425self->active = ACTIVE_NEVER;26}2728void OOZ1Outro_LateUpdate(void) {}2930void OOZ1Outro_StaticUpdate(void) {}3132void OOZ1Outro_Draw(void) {}3334void OOZ1Outro_Create(void *data)35{36RSDK_THIS(OOZ1Outro);3738if (!SceneInfo->inEditor) {39self->active = ACTIVE_NORMAL;40self->visible = false;41int32 rangeX = self->updateRange.x + self->size.x;42int32 rangeY = self->updateRange.y + self->size.y;4344CutsceneRules_SetupEntity(self, &self->size, &self->hitbox);4546// This one's slightly weird, it doesn't set updateRange the same way for some reason, so lets keep that behaviour47self->updateRange.x = rangeX;48self->updateRange.y = rangeY;49}50}5152void OOZ1Outro_StageLoad(void) { OOZ1Outro->sfxDrop = RSDK.GetSfx("Stage/Drop.wav"); }5354bool32 OOZ1Outro_Cutscene_FadeIn(EntityCutsceneSeq *host)55{56RSDK_THIS(OOZ1Outro);5758if (host->timer) {59if (host->fadeWhite > 0)60host->fadeWhite -= 4;61}62else {63host->fadeWhite = 512;64}6566if (host->timer == 1) {67foreach_all(Player, player)68{69player->position.x = self->position.x;70player->position.y = self->position.y;71player->position.y += (self->size.y >> 1) - 0x400000;72}7374self->boundsR = Zone->cameraBoundsR[0];75self->boundsT = Zone->cameraBoundsT[0];76self->boundsB = Zone->cameraBoundsB[0];77Zone->cameraBoundsL[0] = (self->position.x >> 16) - ScreenInfo->center.x;78Zone->cameraBoundsR[0] = (self->position.x >> 16) + ScreenInfo->center.x;79Zone->cameraBoundsT[0] = (self->position.y >> 16) - ScreenInfo->center.y;80Zone->cameraBoundsB[0] = (self->position.y >> 16) + ScreenInfo->center.y;81EntityCamera *camera = RSDK_GET_ENTITY(SLOT_CAMERA1, Camera);82camera->boundsL = Zone->cameraBoundsL[0];83camera->boundsR = Zone->cameraBoundsR[0];84camera->boundsT = Zone->cameraBoundsT[0];85camera->boundsB = Zone->cameraBoundsB[0];86Smog->forceEnabled = true;87}8889if (host->timer == 30) {90ActClear->displayedActID = 1;9192foreach_active(SignPost, signpost)93{94signpost->state = SignPost_State_Falling;95signpost->active = ACTIVE_NORMAL;96}9798RSDK.PlaySfx(SignPost->sfxTwinkle, false, 0xFF);99return true;100}101return false;102}103104bool32 OOZ1Outro_Cutscene_PostActClearSetup(EntityCutsceneSeq *host)105{106RSDK_THIS(OOZ1Outro);107108if (host->fadeWhite > 0)109host->fadeWhite -= 4;110111CutsceneSeq_LockAllPlayerControl();112113if (ActClear->finished) {114foreach_active(Player, player)115{116player->state = Player_State_Air;117player->onGround = false;118player->collisionPlane = 1;119player->interaction = false;120player->velocity.y = -0x20000;121player->stateInput = StateMachine_None;122RSDK.SetSpriteAnimation(player->aniFrames, ANI_HURT, &player->animator, false, 0);123}124125Zone->cameraBoundsL[0] = self->boundsL;126Zone->cameraBoundsR[0] = self->boundsR;127Zone->cameraBoundsT[0] = self->boundsT;128Zone->cameraBoundsB[0] = self->boundsB;129130#if MANIA_USE_PLUS131CutsceneSeq_SetSkipType(SKIPTYPE_RELOADSCN);132#endif133return true;134}135136return false;137}138139bool32 OOZ1Outro_Cutscene_FallIntoAct2(EntityCutsceneSeq *host)140{141EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);142EntityPlayer *player2 = RSDK_GET_ENTITY(SLOT_PLAYER2, Player);143144if (host->timer == 48) {145player1->interaction = true;146if (player2->classID == Player->classID)147player2->interaction = true;148}149150if (Smog->forceEnabled && player1->animator.animationID)151return false;152153player1->direction = FLIP_NONE;154player1->stateInput = Player_Input_P1;155156if (player2->classID == Player->classID)157player2->stateInput = Player_Input_P2_AI;158159return true;160}161162bool32 OOZ1Outro_Cutscene_BeginAct(EntityCutsceneSeq *host)163{164if (host->timer == 120) {165globals->suppressTitlecard = true;166167foreach_all(TitleCard, titlecard)168{169titlecard->active = ACTIVE_NORMAL;170titlecard->state = TitleCard_State_SetupBGElements;171titlecard->stateDraw = TitleCard_Draw_SlideIn;172foreach_break;173}174175Music_PlayTrack(TRACK_STAGE);176return true;177}178179return false;180}181182#if GAME_INCLUDE_EDITOR183void OOZ1Outro_EditorDraw(void)184{185RSDK_THIS(OOZ1Outro);186187CutsceneRules_DrawCutsceneBounds(self, &self->size);188}189190void OOZ1Outro_EditorLoad(void) {}191#endif192193void OOZ1Outro_Serialize(void) { RSDK_EDITABLE_VAR(OOZ1Outro, VAR_VECTOR2, size); }194195196