Path: blob/main/RSDKv4/NativeObjects/OptionsMenu.cpp
817 views
#include "RetroEngine.hpp"12void OptionsMenu_Create(void *objPtr)3{4RSDK_THIS(OptionsMenu);5self->menuControl = (NativeEntity_MenuControl *)GetNativeObject(0);6self->labelPtr = CREATE_ENTITY(TextLabel);7self->labelPtr->fontID = FONT_HEADING;8if (Engine.language == RETRO_RU)9self->labelPtr->scale = 0.125;10else11self->labelPtr->scale = 0.2;12self->labelPtr->alpha = 0;13self->labelPtr->z = 0;14self->labelPtr->state = TEXTLABEL_STATE_IDLE;15SetStringToFont(self->labelPtr->text, strHelpAndOptions, FONT_HEADING);16self->labelPtr->alignOffset = 512.0;17self->labelRotateY = DegreesToRad(22.5);18MatrixRotateYF(&self->labelPtr->renderMatrix, self->labelRotateY);19MatrixTranslateXYZF(&self->matrix1, -128.0, 80.0, 160.0);20MatrixMultiplyF(&self->labelPtr->renderMatrix, &self->matrix1);21self->labelPtr->useRenderMatrix = true;2223float y = 48.0;24for (int i = 0; i < OPTIONSMENU_BUTTON_COUNT; ++i) {25self->buttons[i] = CREATE_ENTITY(SubMenuButton);2627self->buttons[i]->matXOff = 512.0;28self->buttons[i]->textY = -4.0;29self->buttons[i]->matZ = 0.0;30self->buttons[i]->scale = 0.1;31self->buttonRotateY[i] = DegreesToRad(16.0);32MatrixRotateYF(&self->buttons[i]->matrix, self->buttonRotateY[i]);33MatrixTranslateXYZF(&self->matrix1, -128.0, y, 160.0);34MatrixMultiplyF(&self->buttons[i]->matrix, &self->matrix1);35self->buttons[i]->useMatrix = true;36y -= 30.0;37}38#if !RETRO_USE_ORIGINAL_CODE39if (!Engine.devMenu)40SetStringToFont(self->buttons[OPTIONSMENU_BUTTON_INSTRUCTIONS]->text, strInstructions, FONT_LABEL);41else42SetStringToFont(self->buttons[OPTIONSMENU_BUTTON_INSTRUCTIONS]->text, strDevMenu, FONT_LABEL);43#else44SetStringToFont(self->buttons[OPTIONSMENU_BUTTON_INSTRUCTIONS]->text, strInstructions, FONT_LABEL);45#endif46SetStringToFont(self->buttons[OPTIONSMENU_BUTTON_SETTINGS]->text, strSettings, FONT_LABEL);47SetStringToFont(self->buttons[OPTIONSMENU_BUTTON_ABOUT]->text, strAbout, FONT_LABEL);48SetStringToFont(self->buttons[OPTIONSMENU_BUTTON_CREDITS]->text, strStaffCredits, FONT_LABEL);49}50void OptionsMenu_Main(void *objPtr)51{52RSDK_THIS(OptionsMenu);53switch (self->state) {54case OPTIONSMENU_STATE_SETUP: {55self->timer += Engine.deltaTime;56if (self->timer > 1.0) {57self->timer = 0.0;58self->state = OPTIONSMENU_STATE_ENTER;59}60break;61}62case OPTIONSMENU_STATE_ENTER: {63self->labelPtr->alignOffset /= (1.125 * (60.0 * Engine.deltaTime));6465float div = (60.0 * Engine.deltaTime) * 16.0;66for (int i = 0; i < OPTIONSMENU_BUTTON_COUNT; ++i) self->buttons[i]->matXOff += ((-176.0 - self->buttons[i]->matXOff) / div);6768self->timer += (Engine.deltaTime + Engine.deltaTime);69self->labelPtr->alpha = (256.0 * self->timer);70if (self->timer > 1.0) {71self->timer = 0.0;72self->state = OPTIONSMENU_STATE_MAIN;73keyPress.start = false;74keyPress.A = false;75}76break;77}78case OPTIONSMENU_STATE_MAIN: {79if (self->menuControl->state == MENUCONTROL_STATE_EXITSUBMENU) {80self->state = OPTIONSMENU_STATE_EXIT;81}82else if (usePhysicalControls) {83if (touches > 0) {84usePhysicalControls = false;85}86else {87if (keyPress.up) {88PlaySfxByName("Menu Move", false);89self->selectedButton--;90if (self->selectedButton < 0)91self->selectedButton = OPTIONSMENU_BUTTON_COUNT - 1;92}93else if (keyPress.down) {94PlaySfxByName("Menu Move", false);95self->selectedButton++;96if (self->selectedButton >= OPTIONSMENU_BUTTON_COUNT)97self->selectedButton = 0;98}99for (int i = 0; i < OPTIONSMENU_BUTTON_COUNT; ++i) self->buttons[i]->b = 0xFF;100self->buttons[self->selectedButton]->b = 0x00;101102if (self->buttons[self->selectedButton]->g > 0x80 && (keyPress.start || keyPress.A)) {103PlaySfxByName("Menu Select", false);104self->buttons[self->selectedButton]->state = SUBMENUBUTTON_STATE_FLASHING2;105self->buttons[self->selectedButton]->b = 0xFF;106self->state = OPTIONSMENU_STATE_ACTION;107#if !RETRO_USE_ORIGINAL_CODE108self->unused1 = Engine.devMenu && self->selectedButton == OPTIONSMENU_BUTTON_INSTRUCTIONS && !keyDown.X;109if (self->unused1)110StopMusic(true);111#endif112}113}114}115else {116float y = 48.0;117for (int i = 0; i < OPTIONSMENU_BUTTON_COUNT; ++i) {118if (touches > 0) {119if (CheckTouchRect(-64.0, y, 96.0, 12.0) >= 0)120self->buttons[i]->b = 0x00;121else122self->buttons[i]->b = 0xFF;123}124else if (!self->buttons[i]->b) {125self->selectedButton = i;126PlaySfxByName("Menu Select", false);127self->buttons[i]->state = SUBMENUBUTTON_STATE_FLASHING2;128self->buttons[i]->b = 0xFF;129self->state = OPTIONSMENU_STATE_ACTION;130#if !RETRO_USE_ORIGINAL_CODE131self->unused1 = Engine.devMenu && self->selectedButton == OPTIONSMENU_BUTTON_INSTRUCTIONS;132if (self->unused1)133StopMusic(true);134#endif135break;136}137y -= 30.0;138}139140if (self->state == OPTIONSMENU_STATE_MAIN && (keyDown.up || keyDown.down)) {141self->selectedButton = 0;142usePhysicalControls = true;143}144}145break;146}147case OPTIONSMENU_STATE_EXIT: {148self->labelPtr->alignOffset = (10.0 * (60.0 * Engine.deltaTime)) + self->labelPtr->alignOffset;149self->timer += (Engine.deltaTime + Engine.deltaTime);150151for (int i = 0; i < OPTIONSMENU_BUTTON_COUNT; ++i) self->buttons[i]->matXOff += (12.0 * (60.0 * Engine.deltaTime));152153if (self->timer > 1.0) {154self->timer = 0.0;155RemoveNativeObject(self->labelPtr);156for (int i = 0; i < OPTIONSMENU_BUTTON_COUNT; ++i) RemoveNativeObject(self->buttons[i]);157RemoveNativeObject(self);158}159break;160}161case OPTIONSMENU_STATE_ACTION: {162self->menuControl->state = MENUCONTROL_STATE_NONE;163if (!self->buttons[self->selectedButton]->state) {164#if !RETRO_USE_ORIGINAL_CODE165if (!self->unused1) {166#endif167self->state = OPTIONSMENU_STATE_ENTERSUBMENU;168169self->labelRotateYVelocity = 0.0;170self->targetLabelRotateY = DegreesToRad(-90.0);171for (int i = 0; i < OPTIONSMENU_BUTTON_COUNT; ++i) self->targetButtonRotateY[i] = DegreesToRad(-90.0);172float val = 0.02;173for (int i = 0; i < OPTIONSMENU_BUTTON_COUNT; ++i) {174self->buttonRotateYVelocity[i] = val;175val += 0.02;176}177#if !RETRO_USE_ORIGINAL_CODE178}179else {180self->state = OPTIONSMENU_STATE_SUBMENU;181CREATE_ENTITY(FadeScreen);182Engine.gameMode = ENGINE_INITDEVMENU;183}184#endif185}186break;187}188case OPTIONSMENU_STATE_ENTERSUBMENU: {189if (self->labelRotateY > self->targetLabelRotateY) {190self->labelRotateYVelocity -= 0.0025 * (Engine.deltaTime * 60.0);191self->labelRotateY += (Engine.deltaTime * 60.0) * self->labelRotateYVelocity;192self->labelRotateYVelocity -= 0.0025 * (Engine.deltaTime * 60.0);193MatrixRotateYF(&self->labelPtr->renderMatrix, self->labelRotateY);194MatrixTranslateXYZF(&self->matrix1, -128.0, 80.0, 160.0);195MatrixMultiplyF(&self->labelPtr->renderMatrix, &self->matrix1);196}197198float y = 48.0;199for (int i = 0; i < OPTIONSMENU_BUTTON_COUNT; ++i) {200if (self->buttonRotateY[i] > self->targetButtonRotateY[i]) {201self->buttonRotateYVelocity[i] -= 0.0025 * (60.0 * Engine.deltaTime);202if (self->buttonRotateYVelocity[i] < 0.0)203self->buttonRotateY[i] += ((60.0 * Engine.deltaTime) * self->buttonRotateYVelocity[i]);204self->buttonRotateYVelocity[i] -= 0.0025 * (60.0 * Engine.deltaTime);205MatrixRotateYF(&self->buttons[i]->matrix, self->buttonRotateY[i]);206MatrixTranslateXYZF(&self->matrix1, -128.0, y, 160.0);207MatrixMultiplyF(&self->buttons[i]->matrix, &self->matrix1);208}209y -= 30.0;210}211212if (self->targetButtonRotateY[OPTIONSMENU_BUTTON_COUNT - 1] >= self->buttonRotateY[OPTIONSMENU_BUTTON_COUNT - 1]) {213self->state = OPTIONSMENU_STATE_SUBMENU;214self->labelRotateYVelocity = 0.0;215self->targetLabelRotateY = DegreesToRad(22.5);216for (int i = 0; i < OPTIONSMENU_BUTTON_COUNT; ++i) self->targetButtonRotateY[i] = DegreesToRad(16.0);217float val = -0.02;218for (int i = 0; i < OPTIONSMENU_BUTTON_COUNT; ++i) {219self->buttonRotateYVelocity[i] = val;220val -= 0.02;221}222223switch (self->selectedButton) {224default: break;225case OPTIONSMENU_BUTTON_INSTRUCTIONS:226self->instructionsScreen = CREATE_ENTITY(InstructionsScreen);227self->instructionsScreen->optionsMenu = self;228break;229case OPTIONSMENU_BUTTON_SETTINGS:230self->settingsScreen = CREATE_ENTITY(SettingsScreen);231self->settingsScreen->optionsMenu = self;232break;233case OPTIONSMENU_BUTTON_ABOUT:234self->aboutScreen = CREATE_ENTITY(AboutScreen);235self->aboutScreen->optionsMenu = self;236break;237case OPTIONSMENU_BUTTON_CREDITS:238self->staffCredits = CREATE_ENTITY(StaffCredits);239self->staffCredits->optionsMenu = self;240break;241}242}243244float div = (60.0 * Engine.deltaTime) * 16.0;245NativeEntity_AchievementsButton *button = self->menuControl->buttons[self->menuControl->buttonID];246NativeEntity_BackButton *backButton = self->menuControl->backButton;247button->x += ((512.0 - button->x) / div);248backButton->x += ((1024.0 - backButton->x) / div);249break;250}251case OPTIONSMENU_STATE_SUBMENU: // sub menu idle252break;253case OPTIONSMENU_STATE_EXITSUBMENU: {254if (self->targetLabelRotateY > self->labelRotateY) {255self->labelRotateYVelocity += 0.0025 * (Engine.deltaTime * 60.0);256self->labelRotateY += (Engine.deltaTime * 60.0) * self->labelRotateYVelocity;257self->labelRotateYVelocity += 0.0025 * (Engine.deltaTime * 60.0);258if (self->labelRotateY > self->targetLabelRotateY)259self->labelRotateY = self->targetLabelRotateY;260MatrixRotateYF(&self->labelPtr->renderMatrix, self->labelRotateY);261MatrixTranslateXYZF(&self->matrix1, -128.0, 80.0, 160.0);262MatrixMultiplyF(&self->labelPtr->renderMatrix, &self->matrix1);263}264265float y = 48.0;266for (int i = 0; i < OPTIONSMENU_BUTTON_COUNT; ++i) {267if (self->targetButtonRotateY[i] > self->buttonRotateY[i]) {268self->buttonRotateYVelocity[i] += 0.0025 * (60.0 * Engine.deltaTime);269if (self->buttonRotateYVelocity[i] > 0.0)270self->buttonRotateY[i] += ((60.0 * Engine.deltaTime) * self->buttonRotateYVelocity[i]);271self->buttonRotateYVelocity[i] += 0.0025 * (60.0 * Engine.deltaTime);272if (self->buttonRotateY[i] > self->targetButtonRotateY[i])273self->buttonRotateY[i] = self->targetButtonRotateY[i];274MatrixRotateYF(&self->buttons[i]->matrix, self->buttonRotateY[i]);275MatrixTranslateXYZF(&self->matrix1, -128.0, y, 160.0);276MatrixMultiplyF(&self->buttons[i]->matrix, &self->matrix1);277}278y -= 30.0;279}280281float div = (60.0 * Engine.deltaTime) * 16.0;282NativeEntity_AchievementsButton *button = self->menuControl->buttons[self->menuControl->buttonID];283NativeEntity_BackButton *backButton = self->menuControl->backButton;284button->x += ((112.0 - button->x) / div);285backButton->x += ((230.0 - backButton->x) / div);286287if (backButton->x < SCREEN_YSIZE) {288backButton->x = SCREEN_YSIZE;289self->state = OPTIONSMENU_STATE_MAIN;290self->menuControl->state = MENUCONTROL_STATE_SUBMENU;291}292break;293}294default: break;295}296}297298299