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>
14enum NamesToEasilyIdentifyTheMenuItemsInsteadOfRawNumbers
61GameStateMainMenu::GameStateMainMenu():
65 menuLevelsActivated(false),
66 menuGameSettings(NULL),
67 menuGameSettingsActivated(false),
69 menuGUIOptionsActivated(false),
71 menuControlsActivated(false),
75void GameStateMainMenu::load()
81 createGameSettingsMenu();
82 createGUIOptionsMenu();
88void 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);
101void 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();
317void 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);
335void 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);
370void 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);
397void 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);
477void 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);
520void 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);
572void 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);
585void 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);
static std::string directory
Default directory where the level files are.
static std::vector< std::string > listLevels()
Lists all levels found by the game.
This represents the actual game taking place.
How we show the screen at GameStateMainMenu.
void draw(Menu *menu)
Shows the Main Menu screen, along with drawing menu.
static void eraseAll()
Erases all high score files.
Specific Window that shows Help and other info during Game.
void run()
Updates and draws all tabs.