1#include <Flow/GameStateMainMenu.hpp>
2#include <Flow/InputManager.hpp>
3#include <Interface/Ncurses.hpp>
4#include <Interface/Dialog.hpp>
5#include <Misc/Utils.hpp>
6#include <Config/Globals.hpp>
7#include <Game/BoardParser.hpp>
8#include <Game/ScoreFile.hpp>
10enum NamesToEasilyIdentifyTheMenuItemsInsteadOfRawNumbers
57GameStateMainMenu::GameStateMainMenu():
61 menuLevelsActivated(false),
62 menuGameSettings(NULL),
63 menuGameSettingsActivated(false),
65 menuGUIOptionsActivated(false),
67 menuControlsActivated(false),
79 createGameSettingsMenu();
80 createGUIOptionsMenu();
88 saveSettingsMenuGameSettings();
89 saveSettingsMenuGUIOptions();
91 SAFE_DELETE(this->layout);
92 SAFE_DELETE(this->menuLevels);
93 SAFE_DELETE(this->menuGameSettings);
94 SAFE_DELETE(this->menuGUIOptions);
95 SAFE_DELETE(this->menuControls);
96 SAFE_DELETE(this->menu);
103 if (InputManager::isPressed(
"quit"))
104 return GameState::QUIT;
106 if (this->menuLevelsActivated)
108 this->menuLevels->handleInput();
115 this->layout->menu->
setTitle(
"Main Menu");
116 this->menuLevelsActivated =
false;
123 Globals::Game::current_level = this->menuLevels->
current->
label;
124 return GameState::GAME_START;
130 Globals::Game::current_level = this->menuLevels->
current->
label;
131 return GameState::GAME_START;
134 this->menuLevels->
reset();
137 else if (this->menuGameSettingsActivated)
141 if (this->menuGameSettings->
willQuit())
143 saveSettingsMenuGameSettings();
146 switch (this->menuGameSettings->
currentID())
148 case ERASE_HIGH_SCORES:
161 this->layout->menu->
setTitle(
"Main Menu");
162 this->menuGameSettingsActivated =
false;
165 this->menuGameSettings->
reset();
168 else if (this->menuGUIOptionsActivated)
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)
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();
236 if ((tmp != KEY_ENTER) &&
240 InputManager::bind(key, tmp);
245 label->set(InputManager::keyToString(tmp));
248 this->menuControls->
reset();
262 Globals::Game::current_level =
"";
263 return GameState::GAME_START;
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 return GameState::QUIT;
317 return GameState::CONTINUE;
322 if (this->menuLevelsActivated)
323 this->layout->
draw(this->menuLevels);
325 else if (this->menuGameSettingsActivated)
326 this->layout->
draw(this->menuGameSettings);
328 else if (this->menuGUIOptionsActivated)
329 this->layout->
draw(this->menuGUIOptions);
331 else if (this->menuControlsActivated)
332 this->layout->
draw(this->menuControls);
335 this->layout->
draw(this->menu);
338void GameStateMainMenu::createMainMenu()
340 SAFE_DELETE(this->menu);
345 this->menu =
new Menu(1,
347 this->layout->menu->getW() - 2,
348 this->layout->menu->getH() - 2);
352 item =
new MenuItem(
"Arcade Mode", ARCADE);
355 item =
new MenuItem(
"Level Select", LEVELS);
358 item =
new MenuItem(
"Game Settings", GAME_SETTINGS);
361 item =
new MenuItem(
"GUI Options", GUI_OPTIONS);
364 item =
new MenuItem(
"Controls", CONTROLS);
370 item =
new MenuItem(
"Quit", QUIT_GAME);
373void GameStateMainMenu::createLevelsMenu()
375 SAFE_DELETE(this->menuLevels);
379 this->layout->menu->getW() - 2,
380 this->layout->menu->getH() - 2);
386 item =
new MenuItem(
"Back", GO_BACK);
387 menuLevels->add(item);
389 item =
new MenuItem(
"Random", RANDOM);
390 menuLevels->add(item);
392 menuLevels->addBlank();
394 for (
size_t i = 0; i < levels.size(); i++)
397 menuLevels->add(item);
400void GameStateMainMenu::createGameSettingsMenu()
402 SAFE_DELETE(this->menuGameSettings);
404 this->menuGameSettings =
new Menu(1,
406 this->layout->menu->getW() - 2,
407 this->layout->menu->getH() - 2);
411 item =
new MenuItem(
"Back", GO_BACK);
412 menuGameSettings->add(item);
414 menuGameSettings->addBlank();
418 number =
new MenuItemNumberbox(
"Starting Speed", STARTING_SPEED, 1, 10, Globals::Game::starting_speed);
419 menuGameSettings->add(number);
421 number =
new MenuItemNumberbox(
"Fruits", FRUITS, 1, 99, Globals::Game::fruits_at_once);
422 menuGameSettings->add(number);
426 check =
new MenuItemCheckbox(
"Teleport", TELEPORT, Globals::Game::teleport);
427 menuGameSettings->add(check);
429 check =
new MenuItemCheckbox(
"Random Walls", RANDOM_WALLS, Globals::Game::random_walls);
430 menuGameSettings->add(check);
433 std::vector<std::string> options;
434 options.push_back(
"Small");
435 options.push_back(
"Medium");
436 options.push_back(
"Large");
441 std::string defaullt;
443 switch (Globals::Game::board_size)
445 case Globals::Game::SMALL: defaullt =
"Small";
break;
446 case Globals::Game::MEDIUM: defaullt =
"Medium";
break;
447 default: defaullt =
"Large";
break;
455 menuGameSettings->add(list);
457 menuGameSettings->addBlank();
459 number =
new MenuItemNumberbox(
"Scroll Delay(ms)", SCROLL_DELAY, 100, 5000, Globals::Game::board_scroll_delay, 100);
460 menuGameSettings->add(number);
462 check =
new MenuItemCheckbox(
"Scroll Up", SCROLL_UP, Globals::Game::board_scroll_up);
463 menuGameSettings->add(check);
465 check =
new MenuItemCheckbox(
"Scroll Down", SCROLL_DOWN, Globals::Game::board_scroll_down);
466 menuGameSettings->add(check);
468 check =
new MenuItemCheckbox(
"Scroll Left", SCROLL_LEFT, Globals::Game::board_scroll_left);
469 menuGameSettings->add(check);
471 check =
new MenuItemCheckbox(
"Scroll Right", SCROLL_RIGHT, Globals::Game::board_scroll_right);
472 menuGameSettings->add(check);
474 menuGameSettings->addBlank();
476 item =
new MenuItem(
"Erase High Scores",
478 menuGameSettings->add(item);
480void GameStateMainMenu::createGUIOptionsMenu()
482 SAFE_DELETE(this->menuGUIOptions);
484 this->menuGUIOptions =
new Menu(1,
486 this->layout->menu->getW() - 2,
487 this->layout->menu->getH() - 2);
491 item =
new MenuItem(
"Back", GO_BACK);
492 menuGUIOptions->add(item);
494 menuGUIOptions->addBlank();
500 Globals::Screen::show_borders);
501 menuGUIOptions->add(check);
505 Globals::Screen::fancy_borders);
506 menuGUIOptions->add(check);
510 Globals::Screen::outer_border);
511 menuGUIOptions->add(check);
515 Globals::Screen::center_horizontally);
516 menuGUIOptions->add(check);
520 Globals::Screen::center_vertically);
521 menuGUIOptions->add(check);
523void GameStateMainMenu::createControlsMenu()
525 SAFE_DELETE(this->menuControls);
527 this->menuControls =
new Menu(1,
529 this->layout->menu->getW() - 2,
530 this->layout->menu->getH() - 2);
534 item =
new MenuItem(
"Back", GO_BACK);
535 menuControls->add(item);
537 menuControls->addBlank();
542 str = InputManager::keyToString(InputManager::getBind(
"up"));
544 menuControls->add(label);
546 str = InputManager::keyToString(InputManager::getBind(
"down"));
547 label =
new MenuItemLabel(
"Key down", CONTROLS_KEY_DOWN, str);
548 menuControls->add(label);
550 str = InputManager::keyToString(InputManager::getBind(
"left"));
551 label =
new MenuItemLabel(
"Key left", CONTROLS_KEY_LEFT, str);
552 menuControls->add(label);
554 str = InputManager::keyToString(InputManager::getBind(
"right"));
555 label =
new MenuItemLabel(
"Key right", CONTROLS_KEY_RIGHT, str);
556 menuControls->add(label);
558 str = InputManager::keyToString(InputManager::getBind(
"pause"));
559 label =
new MenuItemLabel(
"Key pause", CONTROLS_KEY_PAUSE, str);
560 menuControls->add(label);
562 str = InputManager::keyToString(InputManager::getBind(
"help"));
563 label =
new MenuItemLabel(
"Key help", CONTROLS_KEY_HELP, str);
564 menuControls->add(label);
566 str = InputManager::keyToString(InputManager::getBind(
"quit"));
567 label =
new MenuItemLabel(
"Key quit", CONTROLS_KEY_QUIT, str);
568 menuControls->add(label);
570 menuControls->addBlank();
572 item =
new MenuItem(
"Reset to Defaults", CONTROLS_DEFAULT);
573 menuControls->add(item);
575void GameStateMainMenu::saveSettingsMenuGUIOptions()
577 if (!this->menuGUIOptions)
582 Globals::Screen::show_borders = this->menuGUIOptions->
getBool(SHOW_BORDERS);
583 Globals::Screen::fancy_borders = this->menuGUIOptions->
getBool(FANCY_BORDERS);
584 Globals::Screen::outer_border = this->menuGUIOptions->
getBool(OUTER_BORDER);
585 Globals::Screen::center_horizontally = this->menuGUIOptions->
getBool(CENTER_HORIZONTAL);
586 Globals::Screen::center_vertically = this->menuGUIOptions->
getBool(CENTER_VERTICAL);
588void GameStateMainMenu::saveSettingsMenuGameSettings()
590 if (!this->menuGameSettings)
595 Globals::Game::starting_speed = (
unsigned int)this->menuGameSettings->
getInt(STARTING_SPEED);
596 Globals::Game::fruits_at_once = this->menuGameSettings->
getInt(FRUITS);
597 Globals::Game::random_walls = this->menuGameSettings->
getBool(RANDOM_WALLS);
598 Globals::Game::teleport = this->menuGameSettings->
getBool(TELEPORT);
600 std::string tmp = this->menuGameSettings->
getString(BOARD_SIZE);
602 Globals::Game::board_size = Globals::Game::SMALL;
604 else if (tmp ==
"Medium")
605 Globals::Game::board_size = Globals::Game::MEDIUM;
608 Globals::Game::board_size = Globals::Game::LARGE;
610 Globals::Game::board_scroll_delay = this->menuGameSettings->
getInt(SCROLL_DELAY);
612 Globals::Game::board_scroll_left = this->menuGameSettings->
getBool(SCROLL_LEFT);
613 Globals::Game::board_scroll_right = this->menuGameSettings->
getBool(SCROLL_RIGHT);
614 Globals::Game::board_scroll_up = this->menuGameSettings->
getBool(SCROLL_UP);
615 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.
GameState::StateCode update()
Called every frame, where states calculate everything that can change.
void load(int stack=0)
Where every state initializes it's resources.
void draw()
Called every frame, where states draw stuff on screen.
int unload()
Gets called when we're leaving this menu.
StateCode
All possible transitions between states.
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.
void setTitle(std::string title, WindowTitlePosition position=Window::TOP_LEFT)
Sets a text that will appear at the top of the Window.
bool askBool(std::string question, std::string title="", bool default_value=false)
Spawns a Dialog box asking for a yes-or-no #question.
void show(std::string message, bool pressAnyKey=false)
Shows a message on the screen.
int getInput(int delay_ms=-1)
Returns a pressed character within a timespan of delay_ms (milliseconds).