Path: blob/master/SonicMania/Objects/MSZ/MSZ2Cutscene.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: MSZ2Cutscene Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectMSZ2Cutscene *MSZ2Cutscene;1011void MSZ2Cutscene_Update(void)12{13RSDK_THIS(MSZ2Cutscene);1415if (!self->activated) {16MSZ2Cutscene_SetupCutscene();1718self->activated = true;19}20}2122void MSZ2Cutscene_LateUpdate(void) {}2324void MSZ2Cutscene_StaticUpdate(void) {}2526void MSZ2Cutscene_Draw(void) {}2728void MSZ2Cutscene_Create(void *data)29{30RSDK_THIS(MSZ2Cutscene);3132INIT_ENTITY(self);33CutsceneRules_SetupEntity(self, &self->size, &self->hitbox);34self->active = ACTIVE_NEVER;35}3637void MSZ2Cutscene_StageLoad(void)38{39foreach_all(ParallaxSprite, sprite)40{41if (sprite->aniID == MSZ_PARALLAXSPRITE_OOZPEEK) {42MSZ2Cutscene->oozPeek = sprite;43foreach_break;44}45}4647foreach_all(EggPrison, prison)48{49MSZ2Cutscene->prison = prison;50foreach_break;51}52}5354void MSZ2Cutscene_SetupCutscene(void)55{56RSDK_THIS(MSZ2Cutscene);5758CutsceneSeq_StartSequence(self, MSZ2Cutscene_Cutscene_GoToPistol, MSZ2Cutscene_Cutscene_EnterPistol, MSZ2Cutscene_Cutscene_PistolFired,59MSZ2Cutscene_Cutscene_AppearInBG, StateMachine_None);6061#if MANIA_USE_PLUS62CutsceneSeq_SetSkipType(SKIPTYPE_RELOADSCN);63#endif6465HUD_MoveOut();66}6768void MSZ2Cutscene_GetPistolPtr(void)69{70RSDK_THIS(MSZ2Cutscene);7172foreach_all(GiantPistol, pistol)73{74if (MathHelpers_PointInHitbox(self->position.x, self->position.y, pistol->position.x, pistol->position.y, self->direction, &self->hitbox)) {75MSZ2Cutscene->pistol = pistol;76foreach_break;77}78}79}8081bool32 MSZ2Cutscene_Cutscene_GoToPistol(EntityCutsceneSeq *host)82{83MANIA_GET_PLAYER(player1, player2, camera);84UNUSED(camera);8586EntityParallaxSprite *parallaxSprite = MSZ2Cutscene->oozPeek;87EntityEggPrison *prison = MSZ2Cutscene->prison;8889if (!host->timer) {90MSZ2Cutscene_GetPistolPtr();91parallaxSprite->visible = true;92parallaxSprite->drawFX = FX_SCALE;93parallaxSprite->scale.x = 0x100;94parallaxSprite->scale.y = 0x100;95prison->notSolid = true;9697Vector2 size;98RSDK.GetLayerSize(Zone->fgLayer[0], &size, true);99Zone->cameraBoundsT[0] = 0;100Zone->cameraBoundsT[1] = 0;101Zone->cameraBoundsR[0] = size.x;102Zone->cameraBoundsR[1] = size.x;103104player1->stateInput = StateMachine_None;105CutsceneSeq_LockAllPlayerControl();106player1->state = Player_State_Ground;107player1->groundVel = 0;108109if (player2->classID == Player->classID) {110#if GAME_VERSION != VER_100111Player->disableP2KeyCheck = true;112#endif113player2->state = Player_State_Ground;114player2->stateInput = Player_Input_P2_AI;115player2->groundVel = 0;116}117}118119EntityGiantPistol *pistol = MSZ2Cutscene->pistol;120121player1->right = player1->position.x < pistol->position.x - 0xD00000;122if (player1->position.x < pistol->position.x - 0xD00000) {123if (player2 && player2->jumpPress) {124player2->velocity.x = 0x44000;125player2->velocity.y = -0x80000;126}127}128else {129player1->position.x = pistol->position.x - 0xD00000;130Player_Action_Jump(player1);131player1->velocity.x = 0x44000;132player1->velocity.y = -0x80000;133player1->jumpPress = true;134player1->jumpHold = true;135return true;136}137138return false;139}140141bool32 MSZ2Cutscene_Cutscene_EnterPistol(EntityCutsceneSeq *host)142{143MANIA_GET_PLAYER(player1, player2, camera);144EntityGiantPistol *pistol = MSZ2Cutscene->pistol;145146if (player2->classID == Player->classID) {147if (player2->state == Player_State_Air && player2->animator.animationID == ANI_JUMP)148player2->position.x += (player1->position.x - player2->position.x) >> 4;149player2->position.y += (player1->position.y - player2->position.y) >> 4;150}151152if (!host->timer)153player1->jumpPress = false;154155if (pistol->state == GiantPistol_State_CloseChamber) {156player1->jumpHold = false;157if (player2->classID == Player->classID) {158player2->position.x = player1->position.x;159player2->position.y = player1->position.y;160player2->stateInput = StateMachine_None;161player2->state = Player_State_Static;162player2->nextAirState = StateMachine_None;163player2->nextGroundState = StateMachine_None;164player2->velocity.x = 0;165player2->velocity.y = 0;166pistol->activePlayers |= 1 << player2->playerID;167}168}169170if (pistol->rotation == 448) {171player1->jumpPress = true;172player1->camera = NULL;173camera->target = NULL;174return true;175}176177return false;178}179180bool32 MSZ2Cutscene_Cutscene_PistolFired(EntityCutsceneSeq *host)181{182MANIA_GET_PLAYER(player1, player2, camera);183184Entity *curEntity = host->activeEntity;185if (!host->timer) {186player1->jumpPress = false;187player1->jumpHold = false;188}189190if (player1->position.y < (curEntity->position.y - (ScreenInfo->center.y << 16) - 0x100000)) {191player1->state = Player_State_Static;192player1->velocity.x = 0;193player1->velocity.y = 0;194player1->position.y = 0;195}196197if (player2->classID == Player->classID && player2->position.y < (curEntity->position.y - (ScreenInfo->center.y << 16) - 0x100000)) {198player2->state = Player_State_Static;199player2->velocity.x = 0;200player2->velocity.y = 0;201player2->position.y = 0;202}203204if (host->timer == 30) {205host->storedValue = camera->position.x + 0x1000000;206host->storedTimer = camera->position.y - 0x4000000;207Camera_SetupLerp(CAMERA_LERP_NORMAL, 0, host->storedValue, host->storedTimer, 2);208}209210if (host->timer > 30 && camera->position.x == host->storedValue && camera->position.y == host->storedTimer) {211EntityShield *shield = RSDK_GET_ENTITY(player1->playerID + Player->playerCount, Shield);212if (shield->classID == Shield->classID) {213player1->shield = SHIELD_NONE;214destroyEntity(shield);215}216return true;217}218219return false;220}221222bool32 MSZ2Cutscene_Cutscene_AppearInBG(EntityCutsceneSeq *host)223{224MANIA_GET_PLAYER(player1, player2, camera);225226if (!host->timer) {227host->storedTimer = 0x4000;228RSDK.SetSpriteAnimation(player1->aniFrames, ANI_JUMP, &player1->animator, false, 0);229player1->drawFX |= FX_SCALE;230player1->animator.speed = 60;231player1->scale.x = 0x40;232player1->scale.y = 0x40;233player1->state = Player_State_Static;234player1->position.x = camera->position.x;235player1->position.y = camera->position.y - 0x700000;236237if (player2->classID == Player->classID) {238player2->drawFX |= FX_SCALE;239player2->scale.x = 0x40;240player2->scale.y = 0x40;241player2->state = Player_State_Static;242player2->position.x = player1->position.x - 0x63000;243player2->position.y = player1->position.y - 0x24000;244player2->velocity.x = 0;245player2->velocity.y = 0;246RSDK.SetSpriteAnimation(player2->aniFrames, ANI_JUMP, &player2->animator, false, 0);247player1->animator.speed = 60;248}249}250251if (host->timer > 0) {252player1->velocity.x = 0xB000;253player1->velocity.y = host->storedTimer;254255if (player2->classID == Player->classID) {256player2->state = Player_State_Static;257player2->velocity.x = 0xB000;258player2->velocity.y = player1->velocity.y;259}260261host->storedTimer += 144;262}263264if (host->timer == 120)265Zone_StartFadeOut(10, 0x000000);266267return false;268}269270#if GAME_INCLUDE_EDITOR271void MSZ2Cutscene_EditorDraw(void)272{273RSDK_THIS(MSZ2Cutscene);274275CutsceneRules_DrawCutsceneBounds(self, &self->size);276}277278void MSZ2Cutscene_EditorLoad(void) {}279#endif280281void MSZ2Cutscene_Serialize(void) { RSDK_EDITABLE_VAR(MSZ2Cutscene, VAR_VECTOR2, size); }282283284