#include "editor_scenes.hpp" #include "../../sdlpp/sdlpp.hpp" #include "../../sdlpp/sdlpp_mouse.hpp" #include "../global_vars.hpp" #include "../objectids.hpp" #include "../editor_visitor.hpp" #include #include "../sprites.hpp" bool __update_scenes_main_menu = false; bool __quit_scenes_main_menu = false; bool __restart_scenes_main_menu = false; bool __started_main_menu = false; bool __include_resume = false; uint64_t __cur_button_index_main_menu = -1; uint64_t __cur_button_index_main_menu_down = -1; std::vector> __buttons_main_menu{}; std::shared_ptr __mouse_main_menu{}; extern void loadLevel(const std::string &level); extern void loadLastLevel(); void quitMainMenu() { g_quit = true; } void resumeMainMenu() { __quit_scenes_main_menu = true; } void restartMainMenu() { __quit_scenes_main_menu = true; __restart_scenes_main_menu = true; } void quitMainMenuCallback(void * /*UNUSED*/, Button * /*UNUSED*/) { quitMainMenu(); } void resumeMainMenuCallback(void * /*UNUSED*/, Button * /*UNUSED*/) { resumeMainMenu(); } void restartMainMenuCallback(void * /*UNUSED*/, Button * /*UNUSED*/) { restartMainMenu(); } void resetGlobals() { __update_scenes_main_menu = false; __quit_scenes_main_menu = false; __restart_scenes_main_menu = false; __started_main_menu = false; __cur_button_index_main_menu_down = -1; __mouse_main_menu.reset(); __buttons_main_menu.clear(); } void showLoadMenu(void * /*UNUSED*/, Button * /*UNUSED*/) { auto loadMenu = createLoadScene(__buttons_main_menu.back()->getRenderer(), "levels", loadLevel, false, false); std::lock_guard lock(render_mutex); game_scenes.pop_back(); resetGlobals(); game_scenes.push_back(loadMenu); } void __updateSelectedButton_MainMenu(uint64_t new_index) { if (new_index != (uint64_t)-1) { __buttons_main_menu[new_index]->setHighlight(); if (__cur_button_index_main_menu != (uint64_t)-1 && new_index != __cur_button_index_main_menu) { __buttons_main_menu[__cur_button_index_main_menu]->unsetHighlight(); } __cur_button_index_main_menu = new_index; } } void handleKeyUpMainMenu(SDL_Keycode key, SDLPP::Scene & /*UNUSED*/) { switch (key) { case SDLK_ESCAPE: if (__include_resume) { resumeMainMenu(); } else { quitMainMenu(); } break; case SDLK_DOWN: case SDLK_s: if (__cur_button_index_main_menu == __buttons_main_menu.size() - 1) { __updateSelectedButton_MainMenu(0); } else { __updateSelectedButton_MainMenu(__cur_button_index_main_menu + 1); } break; case SDLK_UP: case SDLK_w: if (__cur_button_index_main_menu == 0) { __updateSelectedButton_MainMenu(__buttons_main_menu.size() - 1); } else { __updateSelectedButton_MainMenu(__cur_button_index_main_menu - 1); } break; case SDLK_RETURN: if (__cur_button_index_main_menu >= 0 && __cur_button_index_main_menu < __buttons_main_menu.size()) { __buttons_main_menu[__cur_button_index_main_menu] ->performFunction(); } break; default: break; } } std::shared_ptr createSceneMainMenu(std::shared_ptr &renderer, bool include_restart, bool include_resume, bool transparent_bg) { auto scene = std::make_shared(renderer); auto bg = std::make_shared( 0, 0, 10, 10, renderer, transparent_bg ? "#00000088" : MARIO_OVERWORLD_COLORKEY, true); bg->setPermanent(); bg->setId(1); scene->addObject(bg); __mouse_main_menu = std::make_shared(0.01, 0.01, 0, 0, renderer); __mouse_main_menu->setMinWidth(1); __mouse_main_menu->setMinHeight(1); __mouse_main_menu->setAlignment(SDLPP::OBJ_CENTER, SDLPP::OBJ_CENTER); __mouse_main_menu->setId(EDITOR_MOUSE_ID); __mouse_main_menu->setColiderColor("#00FF00"); __mouse_main_menu->addCollision(SDLPP::RectColider({ 0, 0 }, { 1, 1 })); scene->addObject(__mouse_main_menu); ButtonConfig default_button_theme{}; default_button_theme.bg_color = "#FFFFFF88"; default_button_theme.bg_color_highlight = "#FFFFFFBB"; default_button_theme.bg_color_disabled = "#AAAAAA88"; default_button_theme.font_color = "#000000"; default_button_theme.font_color_highlight = "#000000"; default_button_theme.font_color_disabled = "#555555"; default_button_theme.font_outline_color = "#FFFFFF88"; default_button_theme.font_outline_color_highlight = "#FFFFFFAA"; default_button_theme.font_outline_color_disabled = "#787878"; default_button_theme.outline = 0.1; // buttons if (include_resume) { __buttons_main_menu.emplace_back(std::make_shared