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> 10 enum NamesToEasilyIdentifyTheMenuItemsInsteadOfRawNumbers
57 GameStateMainMenu::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();
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;
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)
139 this->menuGameSettings->handleInput();
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)
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();
236 if ((tmp != KEY_ENTER) &&
240 InputManager::bind(key, tmp);
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 =
"";
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);
338 void 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);
373 void 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);
400 void 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);
480 void 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);
523 void 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);
575 void 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);
588 void 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);
void load(int stack=0)
Where every state initializes it's resources.
Specific Window that shows Help and other info during Game.
static std::vector< std::string > listLevels()
Lists all levels found by the game.
int unload()
Gets called when we're leaving this menu.
static std::string directory
Default directory where the level files are.
GameState::StateCode update()
Called every frame, where states calculate everything that can change.
int getInput(int delay_ms=-1)
Returns a pressed character within a timespan of delay_ms (milliseconds).
static void eraseAll()
Erases all high score files.
void draw()
Called every frame, where states draw stuff on screen.
How we show the screen at GameStateMainMenu.
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.
StateCode
All possible transitions between states.