Path: blob/master/SonicMania/Objects/TMZ/TMZ1Outro.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: TMZ1Outro Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectTMZ1Outro *TMZ1Outro;1011void TMZ1Outro_Update(void)12{13RSDK_THIS(TMZ1Outro);1415if (Zone->actID) {16CutsceneSeq_StartSequence(self, TMZ1Outro_CutsceneAct2_BeginAct2, StateMachine_None);17RSDK.SetLimitedFade(0, 5, 4, self->alpha, 128, 256);18}19else {20CutsceneSeq_StartSequence(self, TMZ1Outro_CutsceneAct1_SetupPlayers, TMZ1Outro_CutsceneAct1_ElevatorRide,21TMZ1Outro_CutsceneAct1_HeadForEntrance, TMZ1Outro_CutsceneAct1_EnterMonarch, StateMachine_None);22}2324#if MANIA_USE_PLUS25CutsceneSeq_SetSkipType(SKIPTYPE_RELOADSCN);26#endif2728self->active = ACTIVE_NEVER;29}3031void TMZ1Outro_LateUpdate(void) {}3233void TMZ1Outro_StaticUpdate(void) {}3435void TMZ1Outro_Draw(void) {}3637void TMZ1Outro_Create(void *data)38{39RSDK_THIS(TMZ1Outro);4041if (!SceneInfo->inEditor) {42self->active = ACTIVE_NORMAL;43self->visible = false;44}45}4647void TMZ1Outro_StageLoad(void) {}4849bool32 TMZ1Outro_CutsceneAct1_SetupPlayers(EntityCutsceneSeq *host)50{51CutsceneSeq_LockAllPlayerControl();5253foreach_active(Player, player)54{55player->state = Player_State_Ground;56player->stateInput = StateMachine_None;57}5859return true;60}6162bool32 TMZ1Outro_CutsceneAct1_ElevatorRide(EntityCutsceneSeq *host)63{64if (host->timer == 120) {65CrimsonEye_SetArrowDir(CE_ARROW_UP);66RSDK.PlaySfx(CrimsonEye->sfxBeep, false, 255);67}6869if (host->timer == 160) {70Camera_ShakeScreen(0, 0, 6);71CrimsonEye->targetElevatorSpeed = -0x10000;72TileLayer *moveLayer = RSDK.GetTileLayer(Zone->moveLayer);73moveLayer->drawGroup[0] = 0;74moveLayer->scrollPos = 0x5000000;75moveLayer->scrollInfo[0].scrollPos = -0x4D00000;76RSDK.PlaySfx(CrimsonEye->sfxHullClose, false, 255);77}7879if (host->timer > 160 && !(host->timer & 0x3F))80RSDK.PlaySfx(CrimsonEye->sfxElevator, false, 255);8182if (host->timer > 200) {83if (CrimsonEye->targetElevatorSpeed) {84if (RSDK.GetTileLayer(Zone->moveLayer)->scrollPos < 0x2300000)85CrimsonEye->targetElevatorSpeed = 0;86}87else if (!CrimsonEye->elevatorSpeed) {88Camera_ShakeScreen(0, 0, 6);89RSDK.PlaySfx(CrimsonEye->sfxHullClose, false, 0xFF);90return true;91}92}9394foreach_active(ItemBox, itembox)95{96// NOTE:97// broken monitors are carried up due to the differences how they work compared to unbroken ones98// unbroken monitors do not do any collision/gravity checks, so they're moved offscreen as expected99// however, unbroken monitors DO do gravity & collision, so the elevator collision overrides the code here and allows em to be carried into100// act 2101itembox->position.y -= CrimsonEye->targetElevatorSpeed;102}103104foreach_active(SignPost, signPost) { signPost->position.y -= CrimsonEye->targetElevatorSpeed; }105106return false;107}108109bool32 TMZ1Outro_CutsceneAct1_HeadForEntrance(EntityCutsceneSeq *host)110{111RSDK_THIS(TMZ1Outro);112113if (host->timer >= 30) {114bool32 finishedMoving = true;115116foreach_active(Player, player)117{118if (abs(self->position.x - player->position.x) >= 0x100000) {119if (player->position.x > self->position.x) {120player->left = true;121finishedMoving = false;122}123124if (player->position.x < self->position.x) {125player->right = true;126finishedMoving = false;127}128}129else {130player->left = false;131player->right = false;132player->groundVel -= player->groundVel >> 3;133player->velocity.x -= player->velocity.x >> 3;134player->direction = FLIP_NONE;135}136137player->jumpPress = false;138player->jumpHold = true;139140if (player->animator.animationID == ANI_PUSH)141player->jumpPress = true;142143if (!player->onGround || player->velocity.x)144finishedMoving = false;145}146147return finishedMoving;148}149return false;150}151152bool32 TMZ1Outro_CutsceneAct1_EnterMonarch(EntityCutsceneSeq *host)153{154RSDK_THIS(TMZ1Outro);155156self->alpha += 4;157RSDK.SetLimitedFade(0, 3, 5, self->alpha, 128, 256);158159EntityCamera *camera = RSDK_GET_ENTITY(SLOT_CAMERA1, Camera);160if (camera->offset.x > 0)161camera->offset.x -= 0x10000;162163if (self->alpha == 320) {164globals->suppressTitlecard = true;165globals->suppressAutoMusic = true;166167Zone_StoreEntities((ScreenInfo->position.x + ScreenInfo->center.x) << 16, (ScreenInfo->size.y + ScreenInfo->position.y) << 16);168RSDK.LoadScene();169170return true;171}172173return false;174}175176bool32 TMZ1Outro_CutsceneAct2_BeginAct2(EntityCutsceneSeq *host)177{178RSDK_THIS(TMZ1Outro);179180self->alpha += 4;181RSDK.SetLimitedFade(0, 5, 4, self->alpha, 128, 256);182183if (self->alpha >= 0x100) {184foreach_all(TitleCard, titleCard)185{186titleCard->active = ACTIVE_NORMAL;187titleCard->state = TitleCard_State_SetupBGElements;188titleCard->stateDraw = TitleCard_Draw_SlideIn;189190globals->suppressAutoMusic = false;191Music_PlayTrack(TRACK_STAGE);192foreach_break;193}194195return true;196}197198return false;199}200201#if GAME_INCLUDE_EDITOR202void TMZ1Outro_EditorDraw(void)203{204RSDK_THIS(TMZ1Outro);205206CutsceneRules_DrawCutsceneBounds(self, &self->size);207}208209void TMZ1Outro_EditorLoad(void) {}210#endif211212void TMZ1Outro_Serialize(void) { RSDK_EDITABLE_VAR(TMZ1Outro, VAR_VECTOR2, size); }213214215