Path: blob/master/SonicMania/Objects/Cutscene/CutsceneSeq.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: CutsceneSeq Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectCutsceneSeq *CutsceneSeq;1011void CutsceneSeq_Update(void)12{13#if MANIA_USE_PLUS14RSDK_THIS(CutsceneSeq);1516CutsceneSeq_CheckSkip(self->skipType, self, self->skipCallback);17#endif18}1920void CutsceneSeq_LateUpdate(void)21{22RSDK_THIS(CutsceneSeq);2324self->currentState = self->cutsceneStates[self->stateID];25if (self->currentState) {26SceneInfo->entity = self->activeEntity;27bool32 finishedState = self->currentState(self);28SceneInfo->entity = (Entity *)self;2930++self->timer;31if (finishedState) {32LogHelpers_Print("State completed");33CutsceneSeq_NewState(self->stateID + 1, self);34}3536if (!self->cutsceneStates[self->stateID]) {37LogHelpers_Print("Sequence completed");38destroyEntity(self);39}40}4142self->visible = false;43for (int32 p = 0; p < CUTSCENESEQ_POINT_COUNT; ++p) {44if (self->points[p].x && self->points[p].y)45self->visible = true;46}4748if (self->fadeWhite > 0 || self->fadeBlack > 0)49self->visible = true;50}5152void CutsceneSeq_StaticUpdate(void) {}5354void CutsceneSeq_Draw(void)55{56RSDK_THIS(CutsceneSeq);5758color colors[CUTSCENESEQ_POINT_COUNT];59colors[0] = 0x00FF00;60colors[1] = 0xFF0000;61colors[2] = 0x0000FF;62colors[3] = 0xFF00FF;63colors[4] = 0xFFFF00;64colors[5] = 0x00FFFF;65colors[6] = 0x9933FF;66colors[7] = 0xFF9900;6768for (int32 p = 0; p < CUTSCENESEQ_POINT_COUNT; ++p) {69Vector2 *point = &self->points[p];70if (point->x || point->y) {71#if MANIA_USE_PLUS72LogHelpers_PrintVector2("Draw poi ", *point);73#endif74DrawHelpers_DrawCross(point->x, point->y, TO_FIXED(32), TO_FIXED(32), colors[p]);75}76}7778if (self->fadeWhite > 0)79RSDK.FillScreen(0xFFF0F0, self->fadeWhite, self->fadeWhite - 256, self->fadeWhite - 256);8081if (self->fadeBlack > 0)82RSDK.FillScreen(0x000000, self->fadeBlack, self->fadeBlack - 128, self->fadeBlack - 256);83}8485void CutsceneSeq_Create(void *data)86{87RSDK_THIS(CutsceneSeq);8889self->active = ACTIVE_NORMAL;90self->visible = false;91self->fadeWhite = 0;92self->fadeBlack = 0;93self->drawGroup = Zone->hudDrawGroup + 1;9495#if MANIA_USE_PLUS96CutsceneSeq_CheckSkip(self->skipType, self, self->skipCallback);97#endif98}99100void CutsceneSeq_StageLoad(void) {}101102void CutsceneSeq_NewState(int32 nextState, EntityCutsceneSeq *seq)103{104seq->stateID = nextState;105seq->timer = 0;106seq->storedTimer = 0;107108for (int32 p = 0; p < CUTSCENESEQ_POINT_COUNT; ++p) {109seq->values[p] = 0;110seq->points[p].x = 0;111seq->points[p].y = 0;112}113}114#if MANIA_USE_PLUS115void CutsceneSeq_SetSkipType(uint8 type)116{117EntityCutsceneSeq *seq = RSDK_GET_ENTITY(SLOT_CUTSCENESEQ, CutsceneSeq);118if (seq->classID) {119seq->skipType = type;120}121}122123void CutsceneSeq_SetSkipTypeCallback(void (*callback)(void))124{125EntityCutsceneSeq *seq = RSDK_GET_ENTITY(SLOT_CUTSCENESEQ, CutsceneSeq);126if (seq->classID) {127seq->skipType = SKIPTYPE_CALLBACK;128seq->skipCallback = callback;129}130}131132void CutsceneSeq_CheckSkip(uint8 skipType, EntityCutsceneSeq *seq, void (*skipCallback)(void))133{134bool32 skipPress = ControllerInfo->keyStart.press;135136if (skipType && skipPress && (SceneInfo->state & ENGINESTATE_REGULAR)) {137bool32 loadNewScene = false;138139if (skipType == SKIPTYPE_NEXTSCENE) {140++SceneInfo->listPos;141loadNewScene = true;142}143else {144if (skipType == SKIPTYPE_CALLBACK) {145StateMachine_Run(skipCallback);146}147148loadNewScene = seq && (seq->skipType == SKIPTYPE_CALLBACK || seq->skipType == SKIPTYPE_RELOADSCN);149}150151if (loadNewScene) {152globals->suppressTitlecard = false;153globals->suppressAutoMusic = false;154globals->enableIntro = false;155156RSDK.SetEngineState(ENGINESTATE_FROZEN);157158Zone_StartFadeOut(20, 0x000000);159Music_FadeOut(0.03);160}161}162}163#endif164165Entity *CutsceneSeq_GetEntity(int32 type)166{167foreach_all_type(type, entity) { foreach_return entity; }168169return NULL;170}171172void CutsceneSeq_LockPlayerControl(EntityPlayer *player)173{174player->up = false;175player->down = false;176player->left = false;177player->right = false;178player->jumpHold = false;179player->jumpPress = false;180181Player->upState = 0;182Player->downState = 0;183Player->leftState = 0;184Player->rightState = 0;185Player->jumpPressState = 0;186Player->jumpHoldState = 0;187}188189void CutsceneSeq_LockAllPlayerControl(void)190{191for (int32 p = 0; p < Player->playerCount; ++p) {192CutsceneSeq_LockPlayerControl(RSDK_GET_ENTITY(p, Player));193}194}195void CutsceneSeq_StartSequence(void *manager, ...)196{197if (RSDK_GET_ENTITY(SLOT_CUTSCENESEQ, CutsceneSeq)->classID)198return;199200RSDK.ResetEntitySlot(SLOT_CUTSCENESEQ, CutsceneSeq->classID, NULL);201EntityCutsceneSeq *cutsceneSeq = RSDK_GET_ENTITY(SLOT_CUTSCENESEQ, CutsceneSeq);202203cutsceneSeq->position.x = 0;204cutsceneSeq->position.y = 0;205cutsceneSeq->activeEntity = SceneInfo->entity;206cutsceneSeq->managerEntity = manager;207208va_list list;209va_start(list, manager);210211int32 count = 0;212for (count = 0;; ++count) {213void *state = va_arg(list, void *);214if (!state)215break;216217LogHelpers_Print("state = %x", state);218cutsceneSeq->cutsceneStates[count] = (bool32(*)(EntityCutsceneSeq *))state;219}220va_end(list);221222LogHelpers_Print("Starting sequence with %d states", count);223}224225#if GAME_INCLUDE_EDITOR226void CutsceneSeq_EditorDraw(void) {}227228void CutsceneSeq_EditorLoad(void) {}229#endif230231void CutsceneSeq_Serialize(void) {}232233234