1 #include <States/GameStateMainMenu.hpp> 2 #include <Engine/InputManager.hpp> 3 #include <Engine/Graphics/Ncurses.hpp> 4 #include <Engine/Graphics/Widgets/Dialog.hpp> 5 #include <Engine/Helpers/Utils.hpp> 6 #include <Engine/EngineGlobals.hpp> 7 #include <Config/Globals.hpp> 8 #include <Entities/BoardParser.hpp> 9 #include <Entities/ScoreFile.hpp> 11 #include <Engine/Flow/StateManager.hpp> 12 #include <States/GameStateGame.hpp> 14 enum NamesToEasilyIdentifyTheMenuItemsInsteadOfRawNumbers
61 GameStateMainMenu::GameStateMainMenu():
65 menuLevelsActivated(false),
66 menuGameSettings(NULL),
67 menuGameSettingsActivated(false),
69 menuGUIOptionsActivated(false),
71 menuControlsActivated(false),
75 void GameStateMainMenu::load()
81 createGameSettingsMenu();
82 createGUIOptionsMenu();
88 void GameStateMainMenu::unload()
90 saveSettingsMenuGameSettings();
91 saveSettingsMenuGUIOptions();
93 SAFE_DELETE(this->layout);
94 SAFE_DELETE(this->menuLevels);
95 SAFE_DELETE(this->menuGameSettings);
96 SAFE_DELETE(this->menuGUIOptions);
97 SAFE_DELETE(this->menuControls);
98 SAFE_DELETE(this->menu);
101 void GameStateMainMenu::update()
103 if (InputManager::isPressed(
"quit"))
104 StateManager::quit();
106 if (this->menuLevelsActivated)
108 this->menuLevels->handleInput();
110 if (this->menuLevels->willQuit())
112 switch (this->menuLevels->currentID())
115 this->layout->menu->setTitle(
"Main Menu");
116 this->menuLevelsActivated =
false;
121 this->menuLevels->goRandom();
123 Globals::Game::current_level = this->menuLevels->current->label;
130 Globals::Game::current_level = this->menuLevels->current->label;
134 this->menuLevels->reset();
137 else if (this->menuGameSettingsActivated)
139 this->menuGameSettings->handleInput();
141 if (this->menuGameSettings->willQuit())
143 saveSettingsMenuGameSettings();
146 switch (this->menuGameSettings->currentID())
148 case ERASE_HIGH_SCORES:
150 bool answer = Dialog::askBool(
"Are you sure?");
155 Dialog::show(
"All high scores erased!",
true);
161 this->layout->menu->setTitle(
"Main Menu");
162 this->menuGameSettingsActivated =
false;
165 this->menuGameSettings->reset();
168 else if (this->menuGUIOptionsActivated)
170 this->menuGUIOptions->handleInput();
172 if (this->menuGUIOptions->willQuit())
174 switch(this->menuGUIOptions->currentID())
177 this->layout->menu->setTitle(
"Main Menu");
178 this->menuGUIOptionsActivated =
false;
181 saveSettingsMenuGUIOptions();
182 this->layout->windowsExit();
183 this->layout->windowsInit();
186 this->menuGUIOptions->reset();
189 else if (this->menuControlsActivated)
191 this->menuControls->handleInput();
193 if (this->menuControls->willQuit())
197 switch(this->menuControls->currentID())
200 this->layout->menu->setTitle(
"Main Menu");
201 this->menuControlsActivated =
false;
204 case CONTROLS_KEY_LEFT: key =
"left";
break;
205 case CONTROLS_KEY_RIGHT: key =
"right";
break;
206 case CONTROLS_KEY_UP: key =
"up";
break;
207 case CONTROLS_KEY_DOWN: key =
"down";
break;
208 case CONTROLS_KEY_PAUSE: key =
"pause";
break;
209 case CONTROLS_KEY_HELP: key =
"help";
break;
210 case CONTROLS_KEY_QUIT: key =
"quit";
break;
212 case CONTROLS_DEFAULT:
215 InputManager::bind(
"left", KEY_LEFT);
216 InputManager::bind(
"right", KEY_RIGHT);
217 InputManager::bind(
"up", KEY_UP);
218 InputManager::bind(
"down", KEY_DOWN);
219 InputManager::bind(
"pause",
'p');
220 InputManager::bind(
"help",
'h');
221 InputManager::bind(
"quit",
'q');
224 createControlsMenu();
225 menuControls->goLast();
233 Dialog::show(
"Press any key, Enter to Cancel");
234 int tmp = Ncurses::getInput(-1);
236 if ((tmp != KEY_ENTER) &&
240 InputManager::bind(key, tmp);
242 MenuItemLabel* label;
243 label = (MenuItemLabel*)menuControls->current;
245 label->set(InputManager::keyToString(tmp));
248 this->menuControls->reset();
254 this->menu->handleInput();
256 if (this->menu->willQuit())
258 switch(this->menu->currentID())
262 Globals::Game::current_level =
"";
272 Dialog::show(
"Sorry, it seems you have no levels.\n" 274 "Please copy the default level files from\n" 275 "`" SYSTEM_LEVEL_DIR
"/`\n" 279 "You can also download more levels from the website:\n" 280 "http://nsnake.alexdantas.net/",
true);
284 this->layout->menu->setTitle(
"Level Select");
285 this->menuLevelsActivated =
true;
290 this->layout->menu->setTitle(
"Game Settings");
291 this->menuGameSettingsActivated =
true;
295 this->layout->menu->setTitle(
"GUI Options");
296 this->menuGUIOptionsActivated =
true;
300 this->layout->menu->setTitle(
"Controls");
301 this->menuControlsActivated =
true;
305 this->helpWindows->
run();
309 StateManager::quit();
317 void GameStateMainMenu::draw()
319 if (this->menuLevelsActivated)
320 this->layout->
draw(this->menuLevels);
322 else if (this->menuGameSettingsActivated)
323 this->layout->
draw(this->menuGameSettings);
325 else if (this->menuGUIOptionsActivated)
326 this->layout->
draw(this->menuGUIOptions);
328 else if (this->menuControlsActivated)
329 this->layout->
draw(this->menuControls);
332 this->layout->
draw(this->menu);
335 void GameStateMainMenu::createMainMenu()
337 SAFE_DELETE(this->menu);
342 this->menu =
new Menu(1,
344 this->layout->menu->getW() - 2,
345 this->layout->menu->getH() - 2);
349 item =
new MenuItem(
"Arcade Mode", ARCADE);
352 item =
new MenuItem(
"Level Select", LEVELS);
355 item =
new MenuItem(
"Game Settings", GAME_SETTINGS);
358 item =
new MenuItem(
"GUI Options", GUI_OPTIONS);
361 item =
new MenuItem(
"Controls", CONTROLS);
364 item =
new MenuItem(
"Help", HELP);
367 item =
new MenuItem(
"Quit", QUIT_GAME);
370 void GameStateMainMenu::createLevelsMenu()
372 SAFE_DELETE(this->menuLevels);
374 this->menuLevels =
new MenuAlphabetic(1,
376 this->layout->menu->getW() - 2,
377 this->layout->menu->getH() - 2);
383 item =
new MenuItem(
"Back", GO_BACK);
384 menuLevels->add(item);
386 item =
new MenuItem(
"Random", RANDOM);
387 menuLevels->add(item);
389 menuLevels->addBlank();
391 for (
size_t i = 0; i < levels.size(); i++)
393 item =
new MenuItem(levels[i], i);
394 menuLevels->add(item);
397 void GameStateMainMenu::createGameSettingsMenu()
399 SAFE_DELETE(this->menuGameSettings);
401 this->menuGameSettings =
new Menu(1,
403 this->layout->menu->getW() - 2,
404 this->layout->menu->getH() - 2);
408 item =
new MenuItem(
"Back", GO_BACK);
409 menuGameSettings->add(item);
411 menuGameSettings->addBlank();
413 MenuItemNumberbox* number;
415 number =
new MenuItemNumberbox(
"Starting Speed", STARTING_SPEED, 1, 10, Globals::Game::starting_speed);
416 menuGameSettings->add(number);
418 number =
new MenuItemNumberbox(
"Fruits", FRUITS, 1, 99, Globals::Game::fruits_at_once);
419 menuGameSettings->add(number);
421 MenuItemCheckbox* check;
423 check =
new MenuItemCheckbox(
"Teleport", TELEPORT, Globals::Game::teleport);
424 menuGameSettings->add(check);
426 check =
new MenuItemCheckbox(
"Random Walls", RANDOM_WALLS, Globals::Game::random_walls);
427 menuGameSettings->add(check);
430 std::vector<std::string> options;
431 options.push_back(
"Small");
432 options.push_back(
"Medium");
433 options.push_back(
"Large");
435 MenuItemTextlist* list;
438 std::string defaullt;
440 switch (Globals::Game::board_size)
442 case Globals::Game::SMALL: defaullt =
"Small";
break;
443 case Globals::Game::MEDIUM: defaullt =
"Medium";
break;
444 default: defaullt =
"Large";
break;
447 list =
new MenuItemTextlist(
"Maze size",
452 menuGameSettings->add(list);
454 menuGameSettings->addBlank();
456 number =
new MenuItemNumberbox(
"Scroll Delay(ms)", SCROLL_DELAY, 100, 5000, Globals::Game::board_scroll_delay, 100);
457 menuGameSettings->add(number);
459 check =
new MenuItemCheckbox(
"Scroll Up", SCROLL_UP, Globals::Game::board_scroll_up);
460 menuGameSettings->add(check);
462 check =
new MenuItemCheckbox(
"Scroll Down", SCROLL_DOWN, Globals::Game::board_scroll_down);
463 menuGameSettings->add(check);
465 check =
new MenuItemCheckbox(
"Scroll Left", SCROLL_LEFT, Globals::Game::board_scroll_left);
466 menuGameSettings->add(check);
468 check =
new MenuItemCheckbox(
"Scroll Right", SCROLL_RIGHT, Globals::Game::board_scroll_right);
469 menuGameSettings->add(check);
471 menuGameSettings->addBlank();
473 item =
new MenuItem(
"Erase High Scores",
475 menuGameSettings->add(item);
477 void GameStateMainMenu::createGUIOptionsMenu()
479 SAFE_DELETE(this->menuGUIOptions);
481 this->menuGUIOptions =
new Menu(1,
483 this->layout->menu->getW() - 2,
484 this->layout->menu->getH() - 2);
488 item =
new MenuItem(
"Back", GO_BACK);
489 menuGUIOptions->add(item);
491 menuGUIOptions->addBlank();
493 MenuItemCheckbox* check;
495 check =
new MenuItemCheckbox(
"Show Borders",
497 EngineGlobals::Screen::show_borders);
498 menuGUIOptions->add(check);
500 check =
new MenuItemCheckbox(
"Fancy Borders",
502 EngineGlobals::Screen::fancy_borders);
503 menuGUIOptions->add(check);
505 check =
new MenuItemCheckbox(
"Outer Border",
507 EngineGlobals::Screen::outer_border);
508 menuGUIOptions->add(check);
510 check =
new MenuItemCheckbox(
"Center Horizontal",
512 EngineGlobals::Screen::center_horizontally);
513 menuGUIOptions->add(check);
515 check =
new MenuItemCheckbox(
"Center Vertical",
517 EngineGlobals::Screen::center_vertically);
518 menuGUIOptions->add(check);
520 void GameStateMainMenu::createControlsMenu()
522 SAFE_DELETE(this->menuControls);
524 this->menuControls =
new Menu(1,
526 this->layout->menu->getW() - 2,
527 this->layout->menu->getH() - 2);
531 item =
new MenuItem(
"Back", GO_BACK);
532 menuControls->add(item);
534 menuControls->addBlank();
536 MenuItemLabel* label;
539 str = InputManager::keyToString(InputManager::getBind(
"up"));
540 label =
new MenuItemLabel(
"Key up", CONTROLS_KEY_UP, str);
541 menuControls->add(label);
543 str = InputManager::keyToString(InputManager::getBind(
"down"));
544 label =
new MenuItemLabel(
"Key down", CONTROLS_KEY_DOWN, str);
545 menuControls->add(label);
547 str = InputManager::keyToString(InputManager::getBind(
"left"));
548 label =
new MenuItemLabel(
"Key left", CONTROLS_KEY_LEFT, str);
549 menuControls->add(label);
551 str = InputManager::keyToString(InputManager::getBind(
"right"));
552 label =
new MenuItemLabel(
"Key right", CONTROLS_KEY_RIGHT, str);
553 menuControls->add(label);
555 str = InputManager::keyToString(InputManager::getBind(
"pause"));
556 label =
new MenuItemLabel(
"Key pause", CONTROLS_KEY_PAUSE, str);
557 menuControls->add(label);
559 str = InputManager::keyToString(InputManager::getBind(
"help"));
560 label =
new MenuItemLabel(
"Key help", CONTROLS_KEY_HELP, str);
561 menuControls->add(label);
563 str = InputManager::keyToString(InputManager::getBind(
"quit"));
564 label =
new MenuItemLabel(
"Key quit", CONTROLS_KEY_QUIT, str);
565 menuControls->add(label);
567 menuControls->addBlank();
569 item =
new MenuItem(
"Reset to Defaults", CONTROLS_DEFAULT);
570 menuControls->add(item);
572 void GameStateMainMenu::saveSettingsMenuGUIOptions()
574 if (!this->menuGUIOptions)
579 EngineGlobals::Screen::show_borders = this->menuGUIOptions->getBool(SHOW_BORDERS);
580 EngineGlobals::Screen::fancy_borders = this->menuGUIOptions->getBool(FANCY_BORDERS);
581 EngineGlobals::Screen::outer_border = this->menuGUIOptions->getBool(OUTER_BORDER);
582 EngineGlobals::Screen::center_horizontally = this->menuGUIOptions->getBool(CENTER_HORIZONTAL);
583 EngineGlobals::Screen::center_vertically = this->menuGUIOptions->getBool(CENTER_VERTICAL);
585 void GameStateMainMenu::saveSettingsMenuGameSettings()
587 if (!this->menuGameSettings)
592 Globals::Game::starting_speed = (
unsigned int)this->menuGameSettings->getInt(STARTING_SPEED);
593 Globals::Game::fruits_at_once = this->menuGameSettings->getInt(FRUITS);
594 Globals::Game::random_walls = this->menuGameSettings->getBool(RANDOM_WALLS);
595 Globals::Game::teleport = this->menuGameSettings->getBool(TELEPORT);
597 std::string tmp = this->menuGameSettings->getString(BOARD_SIZE);
599 Globals::Game::board_size = Globals::Game::SMALL;
601 else if (tmp ==
"Medium")
602 Globals::Game::board_size = Globals::Game::MEDIUM;
605 Globals::Game::board_size = Globals::Game::LARGE;
607 Globals::Game::board_scroll_delay = this->menuGameSettings->getInt(SCROLL_DELAY);
609 Globals::Game::board_scroll_left = this->menuGameSettings->getBool(SCROLL_LEFT);
610 Globals::Game::board_scroll_right = this->menuGameSettings->getBool(SCROLL_RIGHT);
611 Globals::Game::board_scroll_up = this->menuGameSettings->getBool(SCROLL_UP);
612 Globals::Game::board_scroll_down = this->menuGameSettings->getBool(SCROLL_DOWN);
This represents the actual game taking place.
Specific Window that shows Help and other info during Game.
static std::vector< std::string > listLevels()
Lists all levels found by the game.
static std::string directory
Default directory where the level files are.
static void eraseAll()
Erases all high score files.
How we show the screen at GameStateMainMenu.
void draw(Menu *menu)
Shows the Main Menu screen, along with drawing #menu.
void run()
Updates and draws all tabs.