Path: blob/master/SonicMania/Objects/Global/PauseMenu.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: PauseMenu Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectPauseMenu *PauseMenu;1011void PauseMenu_Update(void)12{13RSDK_THIS(PauseMenu);1415StateMachine_Run(self->state);1617self->position.x = (ScreenInfo->position.x + ScreenInfo->center.x) << 16;18self->position.y = (ScreenInfo->position.y + ScreenInfo->center.y) << 16;1920if (self->manager) {21self->manager->position.x = self->position.x;22self->manager->position.y = self->position.y;23PauseMenu_HandleButtonPositions();24}25}2627void PauseMenu_LateUpdate(void)28{29RSDK_THIS(PauseMenu);3031if (self->state) {32if (Music_IsPlaying())33Music_Pause();34}35else {36StateMachine(state) = RSDK_GET_ENTITY(self->triggerPlayer, Player)->state;3738if (state == Player_State_Death || state == Player_State_Drown) {39destroyEntity(self);40}41else {42self->visible = true;43self->drawGroup = DRAWGROUP_COUNT - 1;44RSDK.SetEngineState(ENGINESTATE_FROZEN);45RSDK.SetSpriteAnimation(UIWidgets->textFrames, 10, &self->animator, true, 3);46PauseMenu_PauseSound();47#if !MANIA_USE_PLUS48PauseMenu_SetupTintTable();49#endif50self->state = PauseMenu_State_SetupButtons;51}52}53}5455void PauseMenu_StaticUpdate(void)56{57if (SceneInfo->state == ENGINESTATE_REGULAR) {58int32 cnt = 0;59if (TitleCard)60cnt = RSDK.GetEntityCount(TitleCard->classID, true);61if (ActClear)62cnt += RSDK.GetEntityCount(ActClear->classID, true);6364EntityPauseMenu *pauseMenu = RSDK_GET_ENTITY(SLOT_PAUSEMENU, PauseMenu);6566bool32 allowEvents = true;67if (Zone)68allowEvents = Zone->timer > 1;6970if (!cnt && pauseMenu->classID == TYPE_BLANK && allowEvents && !PauseMenu->disableEvents) {71if (API_GetUserAuthStatus() == STATUS_FORBIDDEN) {72PauseMenu->signOutDetected = true;73RSDK.ResetEntitySlot(SLOT_PAUSEMENU, PauseMenu->classID, NULL);74pauseMenu->triggerPlayer = 0;75}76#if MANIA_USE_PLUS77else if (API.CheckDLC(DLC_PLUS) != (bool32)globals->lastHasPlus) {78PauseMenu->plusChanged = true;79globals->lastHasPlus = API.CheckDLC(DLC_PLUS);80RSDK.ResetEntitySlot(SLOT_PAUSEMENU, PauseMenu->classID, NULL);81pauseMenu->triggerPlayer = 0;82}83#endif84else {85for (int32 i = 0; i < PauseMenu_GetPlayerCount(); ++i) {86#if MANIA_USE_PLUS87int32 id = API_GetInputDeviceID(CONT_P1 + i);88if (!RSDK.IsInputDeviceAssigned(id) && id != INPUT_AUTOASSIGN) {89PauseMenu->controllerDisconnect = true;90RSDK.ResetEntitySlot(SLOT_PAUSEMENU, PauseMenu->classID, NULL);91pauseMenu->triggerPlayer = i;92}93#else94if (!API_IsInputSlotAssigned(CONT_P1 + i)) {95PauseMenu->controllerDisconnect = true;96RSDK.ResetEntitySlot(SLOT_PAUSEMENU, PauseMenu->classID, NULL);97pauseMenu->triggerPlayer = i;98}99#endif100}101}102}103}104}105106void PauseMenu_Draw(void)107{108RSDK_THIS(PauseMenu);109110if (self->paused)111RSDK.FillScreen(0x000000, self->fadeTimer, self->fadeTimer - 128, self->fadeTimer - 256);112113if (RSDK.GetVideoSetting(VIDEOSETTING_SCREENCOUNT) <= 1) {114StateMachine_Run(self->stateDraw);115}116}117118void PauseMenu_Create(void *data)119{120RSDK_THIS(PauseMenu);121122if (!SceneInfo->inEditor) {123self->active = ACTIVE_ALWAYS;124125if (data == INT_TO_VOID(true)) {126self->visible = true;127self->drawGroup = DRAWGROUP_COUNT - 1;128self->state = PauseMenu_State_HandleFadeout;129}130else {131self->state = StateMachine_None;132self->stateDraw = StateMachine_None;133}134}135}136137void PauseMenu_StageLoad(void)138{139PauseMenu->active = ACTIVE_ALWAYS;140141PauseMenu->sfxBleep = RSDK.GetSfx("Global/MenuBleep.wav");142PauseMenu->sfxAccept = RSDK.GetSfx("Global/MenuAccept.wav");143144PauseMenu->disableEvents = false;145PauseMenu->controllerDisconnect = false;146PauseMenu->forcedDisconnect = false;147PauseMenu->signOutDetected = false;148#if MANIA_USE_PLUS149PauseMenu->plusChanged = false;150151if (!globals->hasPlusInitial) {152globals->lastHasPlus = API.CheckDLC(DLC_PLUS);153globals->hasPlusInitial = true;154}155#endif156157for (int32 i = 0; i < CHANNEL_COUNT; ++i) {158PauseMenu->activeChannels[i] = false;159}160161#if MANIA_USE_PLUS162PauseMenu_SetupTintTable();163#endif164}165166void PauseMenu_SetupMenu(void)167{168RSDK_THIS(PauseMenu);169170Vector2 size;171size.x = ScreenInfo->size.x << 16;172size.y = ScreenInfo->size.y << 16;173RSDK.ResetEntitySlot(SLOT_PAUSEMENU_UICONTROL, UIControl->classID, &size);174175EntityUIControl *control = RSDK_GET_ENTITY(SLOT_PAUSEMENU_UICONTROL, UIControl);176177control->position.x = (ScreenInfo->position.x + ScreenInfo->center.x) << 16;178control->position.y = (ScreenInfo->position.y + ScreenInfo->center.y) << 16;179180// Bug Details:181// control->rowCount is slightly bugged, if `pauseMenu->disableRestart` is enabled then wrapping by pressing down is broken and wont work182// this is due to rowCount being 3, while control->buttonCount is only 2183// Fix:184// set control->rowCount to control->buttonCount once it's been initialized, instead of using a constant value185control->rowCount = PAUSEMENU_BUTTON_COUNT;186control->columnCount = 1;187control->buttonID = 0;188self->manager = control;189190int32 i = 0;191for (; i < PAUSEMENU_BUTTON_COUNT; ++i) {192if (!self->buttonPtrs[i])193break;194EntityUIButton *button = self->buttonPtrs[i];195button->parent = (Entity *)control;196control->buttons[i] = button;197}198control->buttonCount = i;199}200201void PauseMenu_SetupTintTable(void)202{203#if MANIA_USE_PLUS204for (int32 i = 0; i < 0x10000; ++i) {205uint32 r = (0x20F * (i >> 11) + 23) >> 6;206uint32 g = (0x103 * ((i >> 5) & 0x3F) + 33) >> 6;207uint32 b = (0x20F * (i & 0x1F) + 23) >> 6;208209int32 brightness = MIN(((b + g + r) << 8) / 680, 0xFF);210211PauseMenu->tintLookupTable[i] = ColorHelpers_PackRGB(brightness, brightness, brightness);212}213#else214uint16 *tintLookupTable = RSDK.GetTintLookupTable();215for (int32 i = 0; i < 0x10000; ++i) {216uint32 r = (0x20F * (i >> 11) + 23) >> 6;217uint32 g = (0x103 * ((i >> 5) & 0x3F) + 33) >> 6;218uint32 b = (0x20F * (i & 0x1F) + 23) >> 7;219220uint32 hue = 0, saturation = 0, luminance = 0;221ColorHelpers_RGBToHSL(r, g, b, &hue, &saturation, &luminance);222ColorHelpers_HSLToRGB(hue, 0, MIN(13 * luminance / 16, 255), &r, &g, &b);223224tintLookupTable[i] = ColorHelpers_PackRGB(r, g, b);225}226#endif227}228229void PauseMenu_AddButton(uint8 id, void *action)230{231RSDK_THIS(PauseMenu);232233int32 buttonID = self->buttonCount;234if (buttonID < PAUSEMENU_BUTTON_COUNT) {235self->buttonIDs[buttonID] = id;236self->buttonActions[buttonID] = action;237238int32 buttonSlot = self->buttonCount + 18;239RSDK.ResetEntitySlot(buttonSlot, UIButton->classID, NULL);240EntityUIButton *button = RSDK_GET_ENTITY(buttonSlot, UIButton);241242button->position.x = (ScreenInfo->position.x + ScreenInfo->center.x) << 16;243button->position.y = (ScreenInfo->position.y + ScreenInfo->center.y) << 16;244RSDK.SetSpriteAnimation(UIWidgets->textFrames, 10, &button->animator, true, id);245button->actionCB = PauseMenu_ActionCB_Button;246button->size.x = 60 << 16;247button->size.y = 21 << 16;248button->bgEdgeSize = 21;249button->align = ALIGN_LEFT;250button->drawGroup = self->drawGroup;251button->active = ACTIVE_ALWAYS;252self->buttonPtrs[buttonID] = button;253++self->buttonCount;254}255}256257void PauseMenu_ClearButtons(EntityPauseMenu *entity)258{259if (entity->manager)260destroyEntity(entity->manager);261262for (int32 i = 0; i < PAUSEMENU_BUTTON_COUNT; ++i) {263if (entity->buttonPtrs[i])264destroyEntity(entity->buttonPtrs[i]);265}266267destroyEntity(entity);268}269270void PauseMenu_HandleButtonPositions(void)271{272RSDK_THIS(PauseMenu);273274Vector2 pos;275pos.x = TO_FIXED(ScreenInfo->center.x - 69) + self->position.x + self->yellowTrianglePos.x;276pos.y = (self->position.y + TO_FIXED(56)) + self->yellowTrianglePos.y - TO_FIXED(36);277if (self->buttonCount == (PAUSEMENU_BUTTON_COUNT - 1)) {278pos.x -= TO_FIXED(36);279pos.y += TO_FIXED(36);280}281282for (int32 i = 0; i < self->buttonCount; ++i) {283if (!self->buttonPtrs[i])284break;285286EntityUIButton *button = self->buttonPtrs[i];287button->startPos.x = pos.x;288button->startPos.y = pos.y;289button->position.x = pos.x;290button->position.y = pos.y;291pos.x -= TO_FIXED(36);292pos.y += TO_FIXED(36);293}294}295296void PauseMenu_PauseSound(void)297{298for (int32 i = 0; i < CHANNEL_COUNT; ++i) {299if (RSDK.ChannelActive(i)) {300RSDK.PauseChannel(i);301PauseMenu->activeChannels[i] = true;302}303}304}305306void PauseMenu_ResumeSound(void)307{308for (int32 i = 0; i < CHANNEL_COUNT; ++i) {309if (PauseMenu->activeChannels[i]) {310RSDK.ResumeChannel(i);311PauseMenu->activeChannels[i] = false;312}313}314}315316void PauseMenu_StopSound(void)317{318for (int32 i = 0; i < CHANNEL_COUNT; ++i) {319if (PauseMenu->activeChannels[i]) {320RSDK.StopChannel(i);321PauseMenu->activeChannels[i] = false;322}323}324}325326void PauseMenu_FocusCamera(void)327{328RSDK_THIS(PauseMenu);329330if (!Camera)331return;332333LogHelpers_Print("FocusCamera(): triggerPlayer = %d", self->triggerPlayer);334foreach_all(Camera, cameraPtr)335{336int32 id = RSDK.GetEntitySlot(cameraPtr);337int32 prevScreen = cameraPtr->screenID;338if (id - SLOT_CAMERA1 == self->triggerPlayer) {339cameraPtr->screenID = 0;340Camera_SetCameraBounds(cameraPtr);341}342else {343cameraPtr->screenID = 1;344}345LogHelpers_Print("cameraPtr->screenID %d => %d", prevScreen, cameraPtr->screenID);346}347}348349void PauseMenu_UpdateCameras(void)350{351if (!Camera)352return;353354foreach_all(Camera, camera)355{356camera->screenID = RSDK.GetEntitySlot(camera) - SLOT_CAMERA1;357Camera_SetCameraBounds(camera);358}359}360361void PauseMenu_CheckAndReassignControllers(void)362{363EntityPauseMenu *entity = RSDK_GET_ENTITY(SLOT_PAUSEMENU, PauseMenu);364365// prolly a leftover from pre-plus366int32 deviceID = API_GetInputDeviceID(CONT_P1 + (entity->triggerPlayer ^ 1));367368#if MANIA_USE_PLUS369UNUSED(deviceID); // be quiet compiler I know it aint used!!370371int32 id = API_GetFilteredInputDeviceID(true, true, 5);372#else373int32 id = API_GetFilteredInputDeviceID(deviceID);374#endif375376if (id)377API_AssignInputSlotToDevice(CONT_P1 + entity->triggerPlayer, id);378else379API_AssignInputSlotToDevice(CONT_P1 + entity->triggerPlayer, INPUT_AUTOASSIGN);380381if (globals->gameMode < MODE_TIMEATTACK && !API_GetInputDeviceID(CONT_P2))382API_AssignInputSlotToDevice(CONT_P2, INPUT_AUTOASSIGN);383384PauseMenu->forcedDisconnect = true;385}386387bool32 PauseMenu_IsDisconnected(void)388{389RSDK_THIS(PauseMenu);390391int32 id = API_GetInputDeviceID(CONT_P1 + self->triggerPlayer);392393#if MANIA_USE_PLUS394return API_IsInputDeviceAssigned(id) || PauseMenu->forcedDisconnect;395#else396return id != INPUT_NONE || PauseMenu->forcedDisconnect;397#endif398}399400uint8 PauseMenu_GetPlayerCount(void)401{402EntityMenuParam *param = MenuParam_GetParam();403EntityCompetitionSession *session = CompetitionSession_GetSession();404405if (RSDK.CheckSceneFolder("Puyo")) {406if (param->puyoSelection >= PUYO_SELECTION_VS_2P)407return 2;408}409else if (globals->gameMode == MODE_COMPETITION) {410return session->playerCount;411}412return 1;413}414415void PauseMenu_ResumeButtonCB(void)416{417EntityPauseMenu *pauseMenu = RSDK_GET_ENTITY(SLOT_PAUSEMENU, PauseMenu);418419if (globals->gameMode != MODE_COMPETITION || RSDK.CheckSceneFolder("Puyo"))420pauseMenu->state = PauseMenu_State_Resume;421else422pauseMenu->state = PauseMenu_State_ResumeCompetition;423}424425void PauseMenu_RestartButtonCB(void)426{427RSDK_GET_ENTITY(SLOT_PAUSEMENU, PauseMenu);428429String msg;430#if MANIA_USE_PLUS431int32 strID = STR_AREYOUSURE;432if (!ReplayRecorder || !ReplayRecorder->isReplaying)433strID = STR_RESTARTWARNING;434Localization_GetString(&msg, strID);435#else436Localization_GetString(&msg, STR_RESTARTWARNING);437#endif438439UIDialog_CreateDialogYesNo(&msg, PauseMenu_RestartDialog_YesCB, NULL, false, true);440}441442void PauseMenu_ExitButtonCB(void)443{444RSDK_GET_ENTITY(SLOT_PAUSEMENU, PauseMenu);445446String msg;447#if MANIA_USE_PLUS448int32 strID = STR_AREYOUSURE;449if (!ReplayRecorder || !ReplayRecorder->isReplaying)450strID = STR_QUITWARNINGLOSEPROGRESS;451Localization_GetString(&msg, strID);452#else453Localization_GetString(&msg, STR_QUITWARNINGLOSEPROGRESS);454#endif455456UIDialog_CreateDialogYesNo(&msg, PauseMenu_ExitDialog_YesCB, NULL, false, true);457}458459void PauseMenu_RestartDialog_YesCB(void)460{461RSDK_GET_ENTITY(SLOT_PAUSEMENU, PauseMenu);462463UIDialog->activeDialog->parent->state = NULL;464if (StarPost) {465StarPost->postIDs[0] = 0;466StarPost->postIDs[1] = 0;467StarPost->postIDs[2] = 0;468StarPost->postIDs[3] = 0;469}470Music_Stop();471472int32 x = (ScreenInfo->position.x + ScreenInfo->center.x) << 16;473int32 y = (ScreenInfo->position.y + ScreenInfo->center.y) << 16;474EntityPauseMenu *fadeout = CREATE_ENTITY(PauseMenu, INT_TO_VOID(true), x, y);475fadeout->fadeoutCB = PauseMenu_RestartFadeCB;476fadeout->state = PauseMenu_State_HandleFadeout;477}478479void PauseMenu_ExitDialog_YesCB(void)480{481RSDK_GET_ENTITY(SLOT_PAUSEMENU, PauseMenu);482483UIDialog->activeDialog->parent->state = NULL;484globals->recallEntities = false;485globals->initCoolBonus = false;486487if (StarPost) {488StarPost->postIDs[0] = 0;489StarPost->postIDs[1] = 0;490StarPost->postIDs[2] = 0;491StarPost->postIDs[3] = 0;492}493Music_Stop();494495int32 x = (ScreenInfo->position.x + ScreenInfo->center.x) << 16;496int32 y = (ScreenInfo->position.y + ScreenInfo->center.y) << 16;497EntityPauseMenu *fadeout = CREATE_ENTITY(PauseMenu, INT_TO_VOID(true), x, y);498fadeout->fadeoutCB = PauseMenu_ExitFadeCB;499fadeout->state = PauseMenu_State_HandleFadeout;500}501502void PauseMenu_RestartFadeCB(void)503{504globals->specialRingID = 0;505PauseMenu_StopSound();506RSDK.LoadScene();507}508509void PauseMenu_ExitFadeCB(void)510{511if (StarPost) {512StarPost->postIDs[0] = 0;513StarPost->postIDs[1] = 0;514StarPost->postIDs[2] = 0;515StarPost->postIDs[3] = 0;516}517globals->specialRingID = 0;518519if (globals->gameMode == MODE_COMPETITION) {520EntityCompetitionSession *session = CompetitionSession_GetSession();521EntityMenuParam *param = MenuParam_GetParam();522523sprintf_s(param->menuTag, (int32)sizeof(param->menuTag), "Competition Zones");524param->menuSelection = session->stageIndex;525}526527RSDK.SetScene("Presentation", "Menu");528PauseMenu_StopSound();529RSDK.LoadScene();530}531532void PauseMenu_ActionCB_Button(void)533{534EntityPauseMenu *pauseMenu = RSDK_GET_ENTITY(SLOT_PAUSEMENU, PauseMenu);535EntityUIControl *manager = pauseMenu->manager;536537if (manager->buttonID >= 0 && manager->buttonID < manager->buttonCount) {538StateMachine_Run(pauseMenu->buttonActions[manager->buttonID]);539}540}541542void PauseMenu_State_SetupButtons(void)543{544RSDK_THIS(PauseMenu);545546self->timer = 0;547PauseMenu->forcedDisconnect = false;548549#if MANIA_USE_PLUS550if (PauseMenu->controllerDisconnect || PauseMenu->signOutDetected || PauseMenu->plusChanged) {551#else552if (PauseMenu->controllerDisconnect || PauseMenu->signOutDetected) {553#endif554if (PauseMenu->controllerDisconnect)555self->disconnectCheck = PauseMenu_IsDisconnected;556557if (globals->gameMode != MODE_COMPETITION || RSDK.CheckSceneFolder("Puyo"))558self->state = PauseMenu_State_ForcedPause;559else560self->state = PauseMenu_State_ForcedPauseCompetition;561562self->stateDraw = PauseMenu_Draw_ForcePause;563}564else {565RSDK.PlaySfx(PauseMenu->sfxAccept, false, 255);566567PauseMenu_AddButton(0, PauseMenu_ResumeButtonCB);568569if (!self->disableRestart)570PauseMenu_AddButton(1, PauseMenu_RestartButtonCB);571572PauseMenu_AddButton(2, PauseMenu_ExitButtonCB);573574PauseMenu_HandleButtonPositions();575PauseMenu_SetupMenu();576577if (globals->gameMode != MODE_COMPETITION || RSDK.CheckSceneFolder("Puyo"))578self->state = PauseMenu_State_StartPause;579else580self->state = PauseMenu_State_StartPauseCompetition;581self->stateDraw = PauseMenu_Draw_RegularPause;582583#if MANIA_USE_PLUS584if (globals->gameMode < MODE_TIMEATTACK && API_GetInputDeviceID(CONT_P2) == (uint32)INPUT_AUTOASSIGN)585API_AssignInputSlotToDevice(CONT_P2, INPUT_NONE);586#endif587}588589StateMachine_Run(self->state);590}591592void PauseMenu_State_StartPause(void)593{594RSDK_THIS(PauseMenu);595596if (self->timer == 1) {597UIControl->inputLocked = false;598UIControl_SetMenuLostFocus(self->manager);599}600601if (self->timer >= 8) {602self->headerPos.x = 0;603self->headerPos.y = 0;604self->yellowTrianglePos.x = 0;605self->yellowTrianglePos.y = 0;606self->timer = 0;607self->state = PauseMenu_State_Paused;608}609else {610Vector2 pos;611612int32 alpha = 32 * self->timer;613MathHelpers_Lerp2Sin1024(&pos, MAX(0, alpha), -TO_FIXED(240), 0, 0, 0);614615self->headerPos.x = pos.x;616self->headerPos.y = pos.y;617MathHelpers_Lerp2Sin1024(&pos, MAX(0, alpha), TO_FIXED(232), 0, 0, 0);618619++self->timer;620self->yellowTrianglePos.x = pos.x;621self->yellowTrianglePos.y = pos.y;622self->tintAlpha = alpha;623}624}625626void PauseMenu_State_StartPauseCompetition(void)627{628RSDK_THIS(PauseMenu);629630if (self->timer == 1) {631UIControl->inputLocked = false;632UIControl_SetMenuLostFocus(self->manager);633}634635if (self->timer >= 8) {636self->headerPos.x = TO_FIXED(0);637self->headerPos.y = TO_FIXED(0);638self->yellowTrianglePos.x = TO_FIXED(0);639self->yellowTrianglePos.y = TO_FIXED(0);640if (self->timer >= 16) {641self->paused = false;642self->timer = 0;643self->state = PauseMenu_State_Paused;644}645else {646int32 t = self->timer - 8;647self->paused = true;648if (self->timer == 8) {649RSDK.SetVideoSetting(VIDEOSETTING_SCREENCOUNT, 1);650PauseMenu_FocusCamera();651}652++self->timer;653self->fadeTimer = (8 - t) << 6;654}655}656else {657self->headerPos.x = TO_FIXED(0xFFF);658self->headerPos.y = TO_FIXED(0xFFF);659self->yellowTrianglePos.x = TO_FIXED(0xFFF);660self->yellowTrianglePos.y = TO_FIXED(0xFFF);661self->paused = true;662self->fadeTimer = self->timer << 6;663self->timer = self->timer + 1;664}665}666667void PauseMenu_State_Paused(void)668{669RSDK_THIS(PauseMenu);670671self->tintAlpha = 0xFF;672self->headerPos.x = 0;673self->headerPos.y = 0;674self->yellowTrianglePos.x = 0;675self->yellowTrianglePos.y = 0;676677EntityUIControl *manager = self->manager;678if (Unknown_pausePress && !manager->dialogHasFocus) {679EntityPauseMenu *pauseMenu = RSDK_GET_ENTITY(SLOT_PAUSEMENU, PauseMenu);680if (globals->gameMode != MODE_COMPETITION || RSDK.CheckSceneFolder("Puyo"))681pauseMenu->state = PauseMenu_State_Resume;682else683pauseMenu->state = PauseMenu_State_ResumeCompetition;684}685}686687void PauseMenu_State_ForcedPause(void)688{689RSDK_THIS(PauseMenu);690String textBuffer;691692if (self->timer == 1) {693UIControl->inputLocked = false;694if (PauseMenu->controllerDisconnect) {695int32 strID = STR_RECONNECTWIRELESSCONTROLLER;696if (sku_platform == PLATFORM_SWITCH)697strID = STR_RECONNECTCONTROLLER;698Localization_GetString(&textBuffer, strID);699700EntityUIDialog *dialog = UIDialog_CreateActiveDialog(&textBuffer);701UIDialog_AddButton(DIALOG_CONTINUE, dialog, PauseMenu_CheckAndReassignControllers, 0);702UIDialog_Setup(dialog);703704if (globals->gameMode < MODE_TIMEATTACK && API_GetInputDeviceID(2) == (uint32)INPUT_AUTOASSIGN)705API_AssignInputSlotToDevice(CONT_P2, INPUT_NONE);706}707#if MANIA_USE_PLUS708else if (PauseMenu->signOutDetected || PauseMenu->plusChanged) {709int32 strID = STR_TESTSTR;710if (PauseMenu->signOutDetected)711strID = STR_SIGNOUTDETECTED;712else if (PauseMenu->plusChanged)713strID = STR_RETRURNINGTOTITLE;714715Localization_GetString(&textBuffer, strID);716717EntityUIDialog *dialog = UIDialog_CreateActiveDialog(&textBuffer);718UIDialog_AddButton(DIALOG_OK, dialog, PauseMenu_State_SetupTitleFade, 1);719UIDialog_Setup(dialog);720}721#else722else if (PauseMenu->signOutDetected) {723Localization_GetString(&textBuffer, STR_SIGNOUTDETECTED);724725EntityUIDialog *dialog = UIDialog_CreateActiveDialog(&textBuffer);726UIDialog_AddButton(DIALOG_OK, dialog, PauseMenu_State_SetupTitleFade, 1);727UIDialog_Setup(dialog);728}729#endif730}731732++self->timer;733if (!UIDialog->activeDialog) {734if (self->forcePaused) {735if (globals->gameMode != MODE_COMPETITION || RSDK.CheckSceneFolder("Puyo")) {736RSDK.SetEngineState(ENGINESTATE_REGULAR);737PauseMenu_ClearButtons(RSDK_GET_ENTITY(SLOT_PAUSEMENU, PauseMenu));738PauseMenu_ResumeSound();739}740else {741self->timer = 0;742self->state = PauseMenu_State_ForcedResumeCompetition;743}744}745}746747if (!self->forcePaused && self->disconnectCheck) {748if (self->disconnectCheck()) {749if (PauseMenu->controllerDisconnect)750PauseMenu->controllerDisconnect = false;751752EntityUIDialog *dialog = UIDialog->activeDialog;753if (dialog)754UIDialog_CloseOnSel_HandleSelection(dialog, StateMachine_None);755756self->forcePaused = true;757}758}759}760761void PauseMenu_State_ForcedPauseCompetition(void)762{763RSDK_THIS(PauseMenu);764765if (self->timer == 1)766UIControl->inputLocked = 0;767768if (self->timer >= 8) {769if (self->timer >= 16) {770self->paused = false;771self->fadeTimer = 0;772self->timer = 0;773self->state = PauseMenu_State_ForcedPause;774}775else {776int32 t = self->timer - 8;777self->paused = true;778779if (self->timer == 8) {780RSDK.SetVideoSetting(VIDEOSETTING_SCREENCOUNT, 1);781PauseMenu_FocusCamera();782}783784++self->timer;785self->fadeTimer = (8 - t) << 6;786}787}788else {789self->paused = true;790self->fadeTimer = self->timer << 6;791self->timer++;792}793}794795void PauseMenu_State_Resume(void)796{797RSDK_THIS(PauseMenu);798799if (!self->timer && globals->gameMode < MODE_TIMEATTACK && !API_GetInputDeviceID(CONT_P2))800API_AssignInputSlotToDevice(CONT_P2, INPUT_AUTOASSIGN);801802if (self->timer >= 8) {803self->headerPos.x = -TO_FIXED(240);804self->headerPos.y = 0;805self->yellowTrianglePos.x = TO_FIXED(232);806self->yellowTrianglePos.y = 0;807self->timer = 0;808RSDK.SetEngineState(ENGINESTATE_REGULAR);809PauseMenu_ClearButtons(RSDK_GET_ENTITY(SLOT_PAUSEMENU, PauseMenu));810PauseMenu_ResumeSound();811}812else {813Vector2 pos;814815int32 percent = 0x20 * self->timer;816MathHelpers_Lerp2Sin1024(&pos, MAX(0, percent), 0, 0, -TO_FIXED(240), 0);817818self->headerPos.x = pos.x;819self->headerPos.y = pos.y;820MathHelpers_Lerp2Sin1024(&pos, MAX(0, percent), 0, 0, TO_FIXED(232), 0);821822self->yellowTrianglePos.x = pos.x;823self->yellowTrianglePos.y = pos.y;824self->tintAlpha = ((0x100 - self->timer) << 8) / 8;825++self->timer;826}827}828829void PauseMenu_State_ResumeCompetition(void)830{831RSDK_THIS(PauseMenu);832833if (self->timer == 1) {834UIControl->inputLocked = 0;835UIControl_SetMenuLostFocus(self->manager);836}837838if (self->timer >= 8) {839if (self->timer >= 16) {840self->paused = false;841self->timer = 0;842RSDK.SetEngineState(ENGINESTATE_REGULAR);843PauseMenu_ClearButtons(RSDK_GET_ENTITY(SLOT_PAUSEMENU, PauseMenu));844PauseMenu_ResumeSound();845}846else {847int32 t = self->timer - 8;848849if (self->timer == 8) {850EntityCompetitionSession *session = CompetitionSession_GetSession();851RSDK.SetVideoSetting(VIDEOSETTING_SCREENCOUNT, session->playerCount);852PauseMenu_UpdateCameras();853}854855++self->timer;856self->fadeTimer = (8 - t) << 6;857}858}859else {860self->headerPos.x = 0;861self->headerPos.y = 0;862self->yellowTrianglePos.x = 0;863self->yellowTrianglePos.y = 0;864self->paused = true;865self->fadeTimer = self->timer << 6;866self->timer = self->timer + 1;867}868}869870void PauseMenu_State_ForcedResumeCompetition(void)871{872RSDK_THIS(PauseMenu);873874if (self->timer >= 8) {875if (self->timer >= 16) {876self->paused = false;877self->timer = 0;878RSDK.SetEngineState(ENGINESTATE_REGULAR);879PauseMenu_ClearButtons(RSDK_GET_ENTITY(SLOT_PAUSEMENU, PauseMenu));880PauseMenu_ResumeSound();881}882else {883int32 t = self->timer - 8;884self->paused = true;885886if (self->timer == 8) {887EntityCompetitionSession *session = CompetitionSession_GetSession();888RSDK.SetVideoSetting(VIDEOSETTING_SCREENCOUNT, session->playerCount);889PauseMenu_UpdateCameras();890}891892++self->timer;893self->fadeTimer = (8 - t) << 6;894}895}896else {897self->paused = true;898self->fadeTimer = self->timer << 6;899self->timer++;900}901}902903void PauseMenu_State_SetupTitleFade(void)904{905EntityPauseMenu *pauseMenu = RSDK_GET_ENTITY(SLOT_PAUSEMENU, PauseMenu);906pauseMenu->timer = 0;907pauseMenu->fadeTimer = 0;908pauseMenu->state = PauseMenu_State_FadeToTitle;909}910911void PauseMenu_State_FadeToTitle(void)912{913RSDK_THIS(PauseMenu);914915if (!UIDialog->activeDialog) {916if (!self->timer) {917self->paused = true;918Music_FadeOut(0.2);919}920921if (self->timer >= 60) {922self->fadeTimer = 512;923SaveGame_ClearRestartData();924RSDK.SetScene("Presentation", "Title Screen");925RSDK.LoadScene();926}927else {928self->fadeTimer = (self->timer << 9) / 60;929self->timer++;930}931}932}933934void PauseMenu_State_HandleFadeout(void)935{936RSDK_THIS(PauseMenu);937938self->fadeTimer += 12;939self->paused = true;940941if (self->fadeTimer >= 1024) {942StateMachine_Run(self->fadeoutCB);943}944}945946void PauseMenu_DrawPauseMenu(void)947{948RSDK_THIS(PauseMenu);949950Vector2 drawPos;951drawPos.x = self->position.x + TO_FIXED(100) + self->headerPos.x + -TO_FIXED(1) * ScreenInfo->center.x;952drawPos.y = self->position.y - TO_FIXED(96) + self->headerPos.y;953UIWidgets_DrawParallelogram(drawPos.x, drawPos.y, 200, 68, 68, 0xE8, 0x28, 0x58);954955drawPos.x += TO_FIXED(10);956drawPos.y += TO_FIXED(6);957UIWidgets_DrawParallelogram(drawPos.x, drawPos.y, 115, 24, 24, 0x00, 0x00, 0x00);958959// "PAUSED" text960RSDK.DrawSprite(&self->animator, &drawPos, false);961962UIWidgets_DrawRightTriangle(self->yellowTrianglePos.x + TO_FIXED(ScreenInfo->center.x) + self->position.x,963self->yellowTrianglePos.y + TO_FIXED(ScreenInfo->center.y) + self->position.y, -232, 0xF0, 0xD8, 0x08);964}965966void PauseMenu_Draw_RegularPause(void)967{968RSDK_THIS(PauseMenu);969970if (self->state != PauseMenu_State_HandleFadeout) {971#if MANIA_USE_PLUS972RSDK.SetTintLookupTable(PauseMenu->tintLookupTable);973#endif974RSDK.DrawRect(0, 0, ScreenInfo->size.x, ScreenInfo->size.y, 0, self->tintAlpha, INK_TINT, true);975976PauseMenu_DrawPauseMenu();977}978}979980void PauseMenu_Draw_ForcePause(void)981{982RSDK_THIS(PauseMenu);983984if (self->state != PauseMenu_State_HandleFadeout) {985#if MANIA_USE_PLUS986RSDK.SetTintLookupTable(PauseMenu->tintLookupTable);987#endif988RSDK.DrawRect(0, 0, ScreenInfo->size.x, ScreenInfo->size.y, 0, self->tintAlpha, INK_TINT, true);989}990}991992#if GAME_INCLUDE_EDITOR993void PauseMenu_EditorDraw(void) {}994995void PauseMenu_EditorLoad(void) {}996#endif997998void PauseMenu_Serialize(void) {}99910001001