Path: blob/master/SonicMania/Objects/Menu/MainMenu.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: MainMenu Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89#if MANIA_USE_PLUS10ObjectMainMenu *MainMenu;1112void MainMenu_Update(void) {}1314void MainMenu_LateUpdate(void) {}1516void MainMenu_StaticUpdate(void)17{18EntityUIControl *control = MainMenu->menuControl;1920if (control && control->active) {21EntityUIDiorama *diorama = MainMenu->diorama;22MainMenu->confirmPrompt->visible = ((int32)(control->shifter->shiftOffset.y & 0xFFFF0000)) > -0x700000;23EntityUIButton *button = control->buttons[control->lastButtonID];2425if (button) {26switch (button->frameID) {27case 0: diorama->dioramaID = UIDIORAMA_MANIAMODE; break;28case 1: diorama->dioramaID = UIDIORAMA_TIMEATTACK; break;29case 2: diorama->dioramaID = UIDIORAMA_COMPETITION; break;30case 3: diorama->dioramaID = UIDIORAMA_OPTIONS; break;31case 4: diorama->dioramaID = UIDIORAMA_EXTRAS; break;32case 5: diorama->dioramaID = UIDIORAMA_ENCOREMODE; break;33case 6: diorama->dioramaID = UIDIORAMA_PLUSUPSELL; break;34case 7: diorama->dioramaID = UIDIORAMA_EXIT; break;35default: break;36}3738if (button->disabled)39diorama->timer = 12;40}41}42}4344void MainMenu_Draw(void) {}4546void MainMenu_Create(void *data) {}4748void MainMenu_StageLoad(void) {}4950void MainMenu_Initialize(void)51{52String tag;53INIT_STRING(tag);54RSDK.SetString(&tag, "Main Menu");5556foreach_all(UIControl, control)57{58if (RSDK.CompareStrings(&tag, &control->tag, false)) {59MainMenu->menuControl = control;60control->backPressCB = MainMenu_BackPressCB_ReturnToTitle;61}62}6364EntityUIControl *menuControl = MainMenu->menuControl;6566foreach_all(UIButtonPrompt, prompt)67{68if (UIControl_ContainsPos(menuControl, &prompt->position) && prompt->buttonID == 0)69MainMenu->confirmPrompt = prompt;70}7172foreach_all(UIDiorama, diorama)73{74if (UIControl_ContainsPos(menuControl, &diorama->position)) {75MainMenu->diorama = diorama;76diorama->parent = menuControl;77}78}7980#if MANIA_USE_PLUS81int32 button1Frame = 1; // Time Attack82int32 button2Frame = 2; // Competition83int32 button3Frame = 3; // Options84int32 button4Frame = 4; // Extras85int32 button5Frame = 6; // Buy Plus8687bool32 button3StopMus = false; // Options button does NOT stop music88bool32 button5Transition = false; // Buy Plus Does NOT do a transition8990if (API.CheckDLC(DLC_PLUS)) {91button1Frame = 5; // Encore Mode92button2Frame = 1; // Time Attack93button3Frame = 2; // Competition94button4Frame = 3; // Options95button5Frame = 4; // Extras9697button3StopMus = true; // Competition button stops music98button5Transition = true; // Extras Does a transition99}100101EntityUIButton *buttonManiaMode = menuControl->buttons[0];102buttonManiaMode->frameID = 0;103buttonManiaMode->transition = true;104buttonManiaMode->stopMusic = true;105106EntityUIButton *buttonEncoreMode = menuControl->buttons[1];107buttonEncoreMode->frameID = button1Frame;108buttonEncoreMode->transition = true;109buttonEncoreMode->stopMusic = true;110111EntityUIButton *buttonTimeAttack = menuControl->buttons[2];112buttonTimeAttack->frameID = button2Frame;113buttonTimeAttack->transition = true;114buttonTimeAttack->stopMusic = true;115116EntityUIButton *buttonCompetition = menuControl->buttons[3];117buttonCompetition->frameID = button3Frame;118buttonCompetition->transition = true;119buttonCompetition->stopMusic = button3StopMus;120121EntityUIButton *buttonOptions = menuControl->buttons[4];122buttonOptions->frameID = button4Frame;123buttonOptions->transition = true;124buttonOptions->stopMusic = false;125126EntityUIButton *buttonExtras = menuControl->buttons[5];127buttonExtras->frameID = button5Frame;128buttonExtras->transition = button5Transition;129buttonExtras->stopMusic = false;130131EntityUIButton *buttonExit = menuControl->buttons[6];132buttonExit->frameID = 7;133buttonExit->transition = false;134buttonExit->stopMusic = false;135#endif136}137138bool32 MainMenu_BackPressCB_ReturnToTitle(void)139{140ManiaModeMenu_StartReturnToTitle();141142return true;143}144145void MainMenu_ExitGame(void) { API.ExitGame(); }146147void MainMenu_ExitButton_ActionCB(void)148{149String msg;150Localization_GetString(&msg, STR_QUITWARNING);151152UIDialog_CreateDialogYesNo(&msg, MainMenu_StartExitGame, StateMachine_None, true, true);153}154155void MainMenu_StartExitGame(void)156{157if (UIControl_GetUIControl())158UIControl_GetUIControl()->state = StateMachine_None;159160Music_FadeOut(0.02);161162MenuSetup_StartTransition(MainMenu_ExitGame, 64);163}164165void MainMenu_MenuButton_ActionCB(void)166{167RSDK_THIS(UIButton);168169switch (self->frameID) {170case 0: // Mania Mode171if (API_GetNoSave()) {172UIControl_MatchMenuTag("No Save Mode");173}174else {175EntityUIControl *saveSelect = ManiaModeMenu->saveSelectMenu;176saveSelect->buttonID = 7;177#if MANIA_USE_PLUS178saveSelect->menuWasSetup = false;179ManiaModeMenu->saveSelLastButtonID = -1;180181for (int32 i = 0; i < saveSelect->buttonCount; ++i) {182Entity *store = SceneInfo->entity;183SceneInfo->entity = (Entity *)saveSelect->buttons[i];184UISaveSlot_HandleSaveIconChange();185SceneInfo->entity = store;186}187#endif188UIControl_MatchMenuTag("Save Select");189}190break;191192case 1: // Time Attack193if (API.CheckDLC(DLC_PLUS)) {194EntityUIControl *control = TimeAttackMenu->timeAttackControl;195control->buttonID = 0;196control->menuWasSetup = false;197UIControl_MatchMenuTag("Time Attack");198}199else {200EntityUIControl *control = TimeAttackMenu->timeAttackControl_Legacy;201control->buttonID = 0;202control->menuWasSetup = false;203UIControl_MatchMenuTag("Time Attack Legacy");204}205break;206207case 2: // Competition208if (API.CheckDLC(DLC_PLUS))209UIControl_MatchMenuTag("Competition");210else211UIControl_MatchMenuTag("Competition Legacy");212break;213214case 3: // Options215UIControl_MatchMenuTag("Options");216break;217218case 4: // Extras219UIControl_MatchMenuTag("Extras");220break;221222case 5: // Encore223if (API_GetNoSave()) {224UIControl_MatchMenuTag("No Save Encore");225}226else {227EntityUIControl *encoreSaveSel = ManiaModeMenu->encoreSaveSelect;228encoreSaveSel->buttonID = 1;229encoreSaveSel->menuWasSetup = false;230for (int32 i = 0; i < encoreSaveSel->buttonCount; ++i) {231Entity *store = SceneInfo->entity;232SceneInfo->entity = (Entity *)encoreSaveSel->buttons[i];233UISaveSlot_HandleSaveIconChange();234SceneInfo->entity = store;235}236UIControl_MatchMenuTag("Encore Mode");237}238break;239240case 6: // Buy Plus DLC241#if MANIA_USE_EGS242API.SetupExtensionOverlay();243244if (!API.CheckDLC(DLC_PLUS)) {245if (!API.CanShowExtensionOverlay(0) || !API.ShowExtensionOverlay(0)) {246if (API.CanShowAltExtensionOverlay(0)) {247int32 connectingMessage = API.GetConnectingStringID();248if (connectingMessage >= 0) {249String message;250INIT_STRING(message);251Localization_GetString(&message, connectingMessage);252253UIDialog_CreateDialogOkCancel(&message, MainMenu_BuyPlusDialogCB, StateMachine_None, true, true);254}255else {256API.ShowAltExtensionOverlay(0);257}258}259}260}261#else262API.ShowExtensionOverlay(0);263#endif264break;265266default: break;267}268}269270#if MANIA_USE_EGS271void MainMenu_BuyPlusDialogCB(void) { API.ShowAltExtensionOverlay(0); }272#endif273274void MainMenu_HandleUnlocks(void)275{276EntityUIControl *control = MainMenu->menuControl;277278EntityUIButton *taButton = API.CheckDLC(DLC_PLUS) ? control->buttons[2] : control->buttons[1];279taButton->disabled = !GameProgress_CheckUnlock(GAMEPROGRESS_UNLOCK_TIMEATTACK);280281EntityUIButton *compButton = API.CheckDLC(DLC_PLUS) ? control->buttons[3] : control->buttons[2];282compButton->disabled = !GameProgress_CheckUnlock(GAMEPROGRESS_UNLOCK_COMPETITION);283}284285void MainMenu_SetupActions(void)286{287foreach_all(UIButton, button)288{289if (button->listID == 1) {290if (button->frameID == 7) {291if (sku_platform != PLATFORM_PC && sku_platform != PLATFORM_DEV) {292EntityUIControl *control = MainMenu->menuControl;293294// Remove "Exit" Button if not on PC or DEV platform295destroyEntity(button);296--control->buttonCount;297--control->rowCount;298control->buttons[6] = NULL;299}300else {301button->actionCB = MainMenu_ExitButton_ActionCB;302}303}304else {305button->actionCB = MainMenu_MenuButton_ActionCB;306}307}308}309310MainMenu->menuControl->menuSetupCB = MainMenu_MenuSetupCB;311}312313void MainMenu_MenuSetupCB(void) { MainMenu->diorama->lastDioramaID = -1; }314315#if GAME_INCLUDE_EDITOR316void MainMenu_EditorDraw(void) {}317318void MainMenu_EditorLoad(void) {}319#endif320321void MainMenu_Serialize(void) {}322#endif323324325