Path: blob/master/SonicMania/Objects/OOZ/OOZ2Outro.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: OOZ2Outro Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89#if MANIA_USE_PLUS10ObjectOOZ2Outro *OOZ2Outro;1112void OOZ2Outro_Update(void)13{14RSDK_THIS(OOZ2Outro);1516EntityMegaOctus *boss = MegaOctus->bossEntity;17if (globals->gameMode < MODE_TIMEATTACK && boss && !boss->classID) {18self->scrollOffset.x = self->moveOffset.x & 0xFFFF0000;19self->scrollOffset.y = self->moveOffset.y & 0xFFFF0000;2021StateMachine_Run(self->state);2223foreach_active(Player, player)24{25TileLayer *layer = self->moveLayer;26if (!player->sidekick) {27layer->scrollPos = -self->scrollOffset.y;28layer->scrollInfo[0].scrollPos = -self->scrollOffset.x;29}3031player->collisionLayers |= Zone->moveLayerMask;32player->moveLayerPosition.x = -(int32)(self->moveOffset.x & 0xFFFF0000);33player->moveLayerPosition.y = -(int32)(self->moveOffset.y & 0xFFFF0000);34}3536if (self->prisonPtr) {37self->prisonPtr->position.x = self->scrollOffset.x + self->prisonPos.x;38self->prisonPtr->position.y = self->scrollOffset.y + self->prisonPos.y;39}40}41}4243void OOZ2Outro_LateUpdate(void) {}4445void OOZ2Outro_StaticUpdate(void) {}4647void OOZ2Outro_Draw(void) {}4849void OOZ2Outro_Create(void *data)50{51RSDK_THIS(OOZ2Outro);5253if (!SceneInfo->inEditor) {54if (globals->gameMode < MODE_TIMEATTACK) {55self->active = ACTIVE_BOUNDS;56self->visible = false;5758if (!self->size.x)59self->size.x = WIDE_SCR_XSIZE << 16;60if (!self->size.y)61self->size.y = SCREEN_YSIZE << 16;6263self->moveLayer = RSDK.GetTileLayer(Zone->moveLayer);64self->updateRange = self->size;65foreach_all(EggPrison, prison)66{67self->prisonPtr = prison;68self->prisonPos = prison->position;69}7071self->state = OOZ2Outro_State_SubFloat;72}73else {74destroyEntity(self);75}76}77}7879void OOZ2Outro_StageLoad(void)80{81OOZ2Outro->sfxGlug = RSDK.GetSfx("OOZ/Glug.wav");82OOZ2Outro->sfxSubLaunch = RSDK.GetSfx("OOZ/SubLaunch.wav");83}8485void OOZ2Outro_StageFinish_EndAct2(void)86{87Zone->cameraBoundsR[0] = 0x4000;88foreach_active(Player, player)89{90player->state = Player_State_Air;91player->stateInput = StateMachine_None;9293player->left = false;94player->right = true;95player->up = false;96player->down = false;97player->jumpPress = false;98player->jumpHold = false;99}100101foreach_active(OOZ2Outro, outro) { outro->state = OOZ2Outro_State_BoardSub; }102103HUD_MoveOut();104}105106void OOZ2Outro_State_SubFloat(void)107{108RSDK_THIS(OOZ2Outro);109110self->moveOffset.y = RSDK.Sin256(Zone->timer) << 10;111}112113void OOZ2Outro_CheckSkip(void)114{115if (ControllerInfo->keyStart.press && (SceneInfo->state & ENGINESTATE_REGULAR)) {116globals->suppressTitlecard = false;117globals->suppressAutoMusic = false;118globals->enableIntro = false;119120RSDK.SetEngineState(ENGINESTATE_FROZEN);121122Zone_StartFadeOut(20, 0x000000);123Music_FadeOut(0.03);124}125}126127void OOZ2Outro_State_BoardSub(void)128{129RSDK_THIS(OOZ2Outro);130131OOZ2Outro_CheckSkip();132133self->moveOffset.y = RSDK.Sin256(Zone->timer) << 10;134135bool32 keepMoving = false;136foreach_active(Player, player)137{138player->jumpPress = false;139140if (player->animator.animationID == ANI_PUSH) {141player->jumpPress = true;142player->jumpHold = true;143}144else if (player->velocity.y > -0x20000) {145player->jumpHold = false;146}147148if (player->position.x > self->position.x - 0x100000 && player->velocity.x > 0x20000)149player->right = false;150151if (player->position.x < self->position.x + 0x400000) {152if (!player->right) {153if (player->groundVel < 0x20000)154player->groundVel = 0x20000;155if (player->velocity.x < 0x20000)156player->velocity.x = 0x20000;157}158keepMoving |= true;159}160else {161player->groundVel = 0;162player->velocity.x = 0;163player->right = false;164}165}166167if (!keepMoving)168++self->timer;169170if (self->timer > 60) {171self->timer = 0;172self->state = OOZ2Outro_State_SubActivate;173174foreach_active(Player, playerPtr)175{176playerPtr->groundVel = 0;177playerPtr->velocity.x = 0;178playerPtr->right = false;179playerPtr->state = Player_State_Static;180181RSDK.SetSpriteAnimation(playerPtr->aniFrames, ANI_BALANCE_1, &playerPtr->animator, false, 0);182Zone->playerBoundActiveR[playerPtr->playerID] = 0;183184EntityCamera *camera = playerPtr->camera;185if (camera)186camera->state = StateMachine_None;187}188}189}190191void OOZ2Outro_State_SubActivate(void)192{193RSDK_THIS(OOZ2Outro);194195OOZ2Outro_CheckSkip();196197self->moveOffset.y -= 0x6000;198199if (!(Zone->timer & 0xF)) {200Camera_ShakeScreen(0, 0, 4);201RSDK.PlaySfx(OOZ2Outro->sfxGlug, false, 255);202}203204if (++self->timer == 140)205RSDK.PlaySfx(OOZ2Outro->sfxSubLaunch, false, 255);206207if (self->timer > 180) {208self->timer = 0;209self->velocity.y = -0x30000;210self->state = OOZ2Outro_State_SubLaunch;211foreach_active(Player, player) { RSDK.SetSpriteAnimation(player->aniFrames, ANI_BALANCE_2, &player->animator, false, 0); }212}213}214215void OOZ2Outro_State_SubLaunch(void)216{217RSDK_THIS(OOZ2Outro);218219if (self->velocity.y < -0x8000)220self->velocity.y += 0x3800;221222self->velocity.x += 0x1800;223224self->moveOffset.x += self->velocity.x;225self->moveOffset.y += self->velocity.y;226227foreach_active(Player, player) { player->position.x += self->velocity.x; }228229if (++self->timer > 140) {230self->timer = 0;231self->state = 0;232Zone_StartFadeOut(10, 0x000000);233foreach_active(Player, playerPtr) { playerPtr->active = ACTIVE_NEVER; }234}235}236237#if GAME_INCLUDE_EDITOR238void OOZ2Outro_EditorDraw(void)239{240RSDK_THIS(OOZ2Outro);241242CutsceneRules_DrawCutsceneBounds(self, &self->size);243}244245void OOZ2Outro_EditorLoad(void) {}246#endif247248void OOZ2Outro_Serialize(void) { RSDK_EDITABLE_VAR(OOZ2Outro, VAR_VECTOR2, size); }249#endif250251252