Path: blob/master/SonicMania/Objects/LRZ/LRZ3OutroK.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: LRZ3OutroK Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectLRZ3OutroK *LRZ3OutroK;1011void LRZ3OutroK_Update(void)12{13RSDK_THIS(LRZ3OutroK);1415if (!self->activated) {16LRZ3OutroK_StartCutscene();1718self->activated = true;19}20}2122void LRZ3OutroK_LateUpdate(void) {}2324void LRZ3OutroK_StaticUpdate(void) {}2526void LRZ3OutroK_Draw(void) {}2728void LRZ3OutroK_Create(void *data)29{30RSDK_THIS(LRZ3OutroK);3132INIT_ENTITY(self);33CutsceneRules_SetupEntity(self, &self->size, &self->hitbox);34self->active = ACTIVE_NEVER;35}3637void LRZ3OutroK_StageLoad(void)38{39foreach_all(EggPrison, prison)40{41LRZ3OutroK->prison = prison;42foreach_break;43}4445foreach_all(SkyTeleporter, teleporter)46{47LRZ3OutroK->teleporter = teleporter;48foreach_break;49}5051foreach_all(FXRuby, fxRuby)52{53LRZ3OutroK->fxRuby = fxRuby;54foreach_break;55}5657LRZ3OutroK->sfxWarp = RSDK.GetSfx("LRZ/Warp.wav");58}5960void LRZ3OutroK_StartCutscene(void)61{62RSDK_THIS(MSZCutsceneK);6364CutsceneSeq_StartSequence(self, LRZ3OutroK_Cutscene_RunToTeleporter, LRZ3OutroK_Cutscene_LandOnTeleporter, LRZ3OutroK_Cutscene_UseTeleporter,65LRZ3OutroK_Cutscene_TeleporterActivated, StateMachine_None);6667#if MANIA_USE_PLUS68CutsceneSeq_SetSkipType(SKIPTYPE_RELOADSCN);69#endif7071HUD_MoveOut();72}7374bool32 LRZ3OutroK_Cutscene_RunToTeleporter(EntityCutsceneSeq *host)75{76RSDK_THIS(LRZ3OutroK);7778MANIA_GET_PLAYER(player1, player2, camera);79UNUSED(camera);8081EntitySkyTeleporter *teleporter = LRZ3OutroK->teleporter;8283Vector2 size;84RSDK.GetLayerSize(Zone->fgLayer[0], &size, true);85if (!host->timer) {86LRZ3OutroK->prison->notSolid = true;8788Zone->cameraBoundsT[0] = 0;89Zone->cameraBoundsT[1] = 0;90Zone->cameraBoundsR[0] = (self->position.x + self->size.x) >> 16;91Zone->cameraBoundsR[1] = (self->position.x + self->size.x) >> 16;9293Zone->playerBoundActiveR[0] = false;94Zone->playerBoundActiveR[1] = false;9596CutsceneSeq_LockAllPlayerControl();9798player1->stateInput = StateMachine_None;99player1->state = Player_State_Ground;100player1->groundVel = 0;101player1->right = true;102103if (player2->classID == Player->classID) {104player2->state = Player_State_Ground;105player2->stateInput = Player_Input_P2_AI;106player2->groundVel = 0;107}108}109110if (player1->jumpPress)111player1->jumpPress = false;112113if (player1->onGround && player1->position.x >= teleporter->position.x - 0x500000 && !host->values[0]) {114player1->jumpPress = true;115host->values[0] = true;116return true;117}118119return false;120}121122bool32 LRZ3OutroK_Cutscene_LandOnTeleporter(EntityCutsceneSeq *host)123{124MANIA_GET_PLAYER(player1, player2, camera);125UNUSED(camera);126127if (player1->jumpPress)128player1->jumpPress = false;129130if (player1->onGround) {131CutsceneSeq_LockPlayerControl(player1);132if (player2->classID == Player->classID && player2->onGround)133CutsceneSeq_LockPlayerControl(player2);134135return true;136}137138return false;139}140141bool32 LRZ3OutroK_Cutscene_UseTeleporter(EntityCutsceneSeq *host)142{143RSDK_THIS(LRZ3OutroK);144145EntitySkyTeleporter *teleporter = LRZ3OutroK->teleporter;146147if (host->timer == 30) {148foreach_active(Player, player)149{150player->state = Player_State_Static;151player->nextGroundState = StateMachine_None;152player->nextAirState = StateMachine_None;153154RSDK.SetSpriteAnimation(SkyTeleporter->aniFrames, 1, &teleporter->animator, true, 0);155156if (player->characterID == ID_KNUCKLES)157RSDK.SetSpriteAnimation(player->aniFrames, ANI_GLIDE_DROP, &player->animator, true, 3);158else159RSDK.SetSpriteAnimation(player->aniFrames, ANI_SPRING_DIAGONAL, &player->animator, false, 0);160161self->playerPos[player->playerID].x = player->position.x;162self->playerPos[player->playerID].y = player->position.y;163}164165RSDK.PlaySfx(LRZ3OutroK->sfxWarp, false, 255);166}167168if (host->timer == 60) {169foreach_active(Player, player) { RSDK.SetSpriteAnimation(player->aniFrames, ANI_SPRING_TWIRL, &player->animator, false, 3); }170}171172int32 x = teleporter->position.x;173int32 y = teleporter->position.y - 0x740000;174175if (host->timer >= 30) {176int32 angle = 255 * (host->timer - 30) / 60;177178foreach_active(Player, player)179{180if (angle <= 0) {181player->position.x = self->playerPos[player->playerID].x;182player->position.y = self->playerPos[player->playerID].y;183}184else {185if (angle < 0x100) {186player->position.x = self->playerPos[player->playerID].x;187player->position.y = self->playerPos[player->playerID].y;188player->position.x += ((RSDK.Sin512(angle + 0x180) >> 2) + 0x80) * ((x - self->playerPos[player->playerID].x) >> 8);189player->position.y += ((RSDK.Sin512(angle + 0x180) >> 2) + 0x80) * ((y - self->playerPos[player->playerID].y) >> 8);190}191else {192player->position.x = x;193player->position.y = y;194}195}196197player->position.x &= 0xFFFF0000;198player->position.y &= 0xFFFF0000;199}200201if (teleporter->timer < 64)202teleporter->timer += 2;203}204205if (host->timer == 90) {206foreach_active(Player, player)207{208player->position.x = x;209player->position.y = y;210}211212return true;213}214215return false;216}217218bool32 LRZ3OutroK_Cutscene_TeleporterActivated(EntityCutsceneSeq *host)219{220if (host->timer >= 60) {221if (host->timer == 60)222RSDK.PlaySfx(LRZ3OutroK->sfxWarp, false, 255);223224if (LRZ3OutroK->fxRuby->fadeWhite >= 512) {225if (LRZ3OutroK->fxRuby->fadeBlack < 512)226LRZ3OutroK->fxRuby->fadeBlack += 16;227}228else {229LRZ3OutroK->fxRuby->fadeWhite += 16;230}231232if (host->timer == 180) {233RSDK.LoadScene();234return true;235}236}237238return false;239}240241#if GAME_INCLUDE_EDITOR242void LRZ3OutroK_EditorDraw(void)243{244RSDK_THIS(LRZ3OutroK);245246CutsceneRules_DrawCutsceneBounds(self, &self->size);247}248249void LRZ3OutroK_EditorLoad(void) {}250#endif251252void LRZ3OutroK_Serialize(void) { RSDK_EDITABLE_VAR(LRZ3OutroK, VAR_VECTOR2, size); }253254255