Commit 58b2311d authored by alistert's avatar alistert

Separated menu into three subclasses.

parent fcd9bfa7
......@@ -11,7 +11,7 @@ objects = src/bonus/bonus.o \
src/level/bullet.o src/level/demolevel.o src/level/level.o \
src/level/levelframe.o src/level/levelload.o \
src/menu/gamemenu.o src/menu/mainmenu.o src/menu/menu.o \
src/menu/menuutil.o src/menu/setupmenu.o \
src/menu/setupmenu.o \
src/planet/planet.o \
src/player/bird.o src/player/player.o src/player/playerframe.o \
src/scene/scene.o src/scene/sceneload.o \
......
......@@ -35,7 +35,7 @@ OBJS = src/bonus/bonus.o \
src/level/bullet.o src/level/demolevel.o src/level/level.o \
src/level/levelframe.o src/level/levelload.o \
src/menu/gamemenu.o src/menu/mainmenu.o src/menu/menu.o \
src/menu/menuutil.o src/menu/setupmenu.o \
src/menu/setupmenu.o \
src/planet/planet.o \
src/player/bird.o src/player/player.o src/player/playerframe.o \
src/scene/scene.o src/scene/sceneload.o \
......
......@@ -11,7 +11,7 @@ objects = src/bonus/bonus.o \
src/level/bullet.o src/level/demolevel.o src/level/level.o \
src/level/levelframe.o src/level/levelload.o \
src/menu/gamemenu.o src/menu/mainmenu.o src/menu/menu.o \
src/menu/menuutil.o src/menu/setupmenu.o \
src/menu/setupmenu.o \
src/planet/planet.o \
src/player/bird.o src/player/player.o src/player/playerframe.o \
src/scene/scene.o src/scene/sceneload.o \
......
......@@ -645,6 +645,7 @@ void Bonus::draw () {
int Bonus::play () {
SetupMenu setupMenu;
const char *options[3] = {"continue game", "setup options", "quit game"};
bool pmenu, pmessage;
int stats, option;
......@@ -706,7 +707,7 @@ int Bonus::play () {
if (!gameMode) {
if (menu->setup() == E_QUIT) return E_QUIT;
if (setupMenu.setup() == E_QUIT) return E_QUIT;
// Restore level palette
video.setPalette(palette);
......
......@@ -248,7 +248,7 @@ int ClientGame::setLevel (char* fileName) {
int ret;
video.setPalette(menu->palettes[1]);
video.setPalette(menuPalette);
// Wait for level data to start arriving
while (!file && levelFile) {
......
......@@ -518,6 +518,7 @@ int Level::play () {
const char* options[5] =
{"continue game", "save game", "load game", "setup options", "quit game"};
char *string;
SetupMenu setupMenu;
bool pmessage, pmenu;
int stats, option;
unsigned int returnTime;
......@@ -592,7 +593,7 @@ int Level::play () {
if (!gameMode) {
if (menu->setup() == E_QUIT) return E_QUIT;
if (setupMenu.setup() == E_QUIT) return E_QUIT;
// Restore level palette
video.setPalette(palette);
......
......@@ -399,7 +399,7 @@ int Level::load (char *fileName, unsigned char diff, bool checkpoint) {
}
video.setPalette(menu->palettes[1]);
video.setPalette(menuPalette);
clearScreen(0);
......
......@@ -676,9 +676,9 @@ int loop (LoopType type, PaletteEffect* paletteEffects) {
int main(int argc, char *argv[]) {
MainMenu *mainMenu = NULL;
Scene *scene = NULL;
// Initialise SDL
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK | SDL_INIT_TIMER) < 0) {
......@@ -730,7 +730,7 @@ int main(int argc, char *argv[]) {
// Load the menu
try {
menu = new Menu();
mainMenu = new MainMenu();
} catch (int e) {
......@@ -741,7 +741,7 @@ int main(int argc, char *argv[]) {
}
// Run the main menu
if (menu->main() == E_NONE) {
if (mainMenu->main() == E_NONE) {
// Show the ending cutscene
......@@ -751,7 +751,7 @@ int main(int argc, char *argv[]) {
} catch (int e) {
delete menu;
delete mainMenu;
freeMain();
return e;
......@@ -765,7 +765,7 @@ int main(int argc, char *argv[]) {
}
delete menu;
delete mainMenu;
freeMain();
......
......@@ -38,14 +38,84 @@
#include "util.h"
int Menu::newGameDifficulty (GameModeType mode, int levelNum, int worldNum) {
GameMenu::GameMenu (File *file) {
unsigned char pixel;
int count, col;
// Load the difficulty graphics
file->loadPalette(menuPalette);
difficultyScreen = file->loadSurface(SW, SH);
SDL_SetColorKey(difficultyScreen, SDL_SRCCOLORKEY, 0);
// Default difficulty setting
difficulty = 1;
// Load the episode pictures (max. 10 episodes + bonus level)
// Load their palette
file->loadPalette(palette);
// Generate a greyscale mapping
for (count = 0; count < 256; count++) {
col = ((palette[count].r >> 1) + (palette[count].g << 1) + (palette[count].b >> 1)) >> 3;
if (col > 79) col = 79;
greyPalette[count].r = greyPalette[count].g = greyPalette[count].b = col;
}
episodes = 11;
for (count = 0; count < 11; count++) {
episodeScreens[count] = file->loadSurface(134, 110);
if (file->tell() >= file->getSize()) {
episodes = ++count;
for (; count < 11; count++) {
pixel = 0;
episodeScreens[count] = createSurface(&pixel, 1, 1);
}
}
}
return;
}
GameMenu::~GameMenu () {
int count;
for (count = 0; count < 11; count++) SDL_FreeSurface(episodeScreens[count]);
SDL_FreeSurface(difficultyScreen);
return;
}
int GameMenu::newGameDifficulty (GameModeType mode, int levelNum, int worldNum) {
const char *options[4] = {"easy", "medium", "hard", "turbo"};
char *firstLevel;
SDL_Rect src, dst;
int count;
video.setPalette(palettes[1]);
video.setPalette(menuPalette);
while (true) {
......@@ -74,7 +144,7 @@ int Menu::newGameDifficulty (GameModeType mode, int levelNum, int worldNum) {
src.h = 100;
dst.x = (canvasW >> 1) - 40;
dst.y = (canvasH >> 1) - 50;
SDL_BlitSurface(screens[2], &src, canvas, &dst);
SDL_BlitSurface(difficultyScreen, &src, canvas, &dst);
if (controls.release(C_UP)) difficulty = (difficulty + 3) % 4;
......@@ -155,13 +225,13 @@ int Menu::newGameDifficulty (GameModeType mode, int levelNum, int worldNum) {
}
int Menu::newGameLevel (GameModeType mode) {
int GameMenu::newGameLevel (GameModeType mode) {
int option, worldNum, levelNum;
worldNum = levelNum = option = 0;
video.setPalette(palettes[1]);
video.setPalette(menuPalette);
while (true) {
......@@ -211,7 +281,7 @@ int Menu::newGameLevel (GameModeType mode) {
if (newGameDifficulty(mode, levelNum, worldNum) == E_QUIT)
return E_QUIT;
video.setPalette(palettes[1]);
video.setPalette(menuPalette);
}
......@@ -222,7 +292,7 @@ int Menu::newGameLevel (GameModeType mode) {
}
int Menu::newGameEpisode (GameModeType mode) {
int GameMenu::newGameEpisode (GameModeType mode) {
const char *options[12] = {"episode 1", "episode 2", "episode 3",
"episode 4", "episode 5", "episode 6", "episode a", "episode b",
......@@ -232,7 +302,7 @@ int Menu::newGameEpisode (GameModeType mode) {
SDL_Rect dst;
int episode, count, worldNum;
video.setPalette(palettes[2]);
video.setPalette(palette);
for (count = 0; count < 10; count++) {
......@@ -244,9 +314,8 @@ int Menu::newGameEpisode (GameModeType mode) {
exists[count] = fileExists(check);
delete[] check;
if (exists[count]) video.restoreSurfacePalette(screens[count + 3]);
else
SDL_SetPalette(screens[count + 3], SDL_LOGPAL, palettes[3], 0, 256);
if (exists[count]) video.restoreSurfacePalette(episodeScreens[count]);
else SDL_SetPalette(episodeScreens[count], SDL_LOGPAL, greyPalette, 0, 256);
}
......@@ -272,17 +341,16 @@ int Menu::newGameEpisode (GameModeType mode) {
clearScreen(0);
dst.x = canvasW - 144;
dst.y = (canvasH - 110) >> 1;
if ((episode < episodes - 1) || (episode < 6)) {
dst.x = canvasW - 150;
dst.y = (canvasH - 110) >> 1;
SDL_BlitSurface(screens[episode + 3], NULL, canvas, &dst);
SDL_BlitSurface(episodeScreens[episode], NULL, canvas, &dst);
} else if ((episode == 10) && (episodes > 6)) {
dst.x = canvasW - 160;
dst.y = (canvasH - 110) >> 1;
SDL_BlitSurface(screens[episodes + 2], NULL, canvas, &dst);
SDL_BlitSurface(episodeScreens[episodes - 1], NULL, canvas, &dst);
}
......@@ -333,7 +401,7 @@ int Menu::newGameEpisode (GameModeType mode) {
}
video.setPalette(palettes[2]);
video.setPalette(palette);
}
......@@ -346,7 +414,7 @@ int Menu::newGameEpisode (GameModeType mode) {
}
int Menu::joinGame () {
int GameMenu::joinGame () {
int ret;
......@@ -441,7 +509,44 @@ int Menu::joinGame () {
}
int Menu::loadGame () {
int GameMenu::newGame () {
#if (defined USE_SOCKETS) || (defined USE_SDL_NET)
const char *newGameOptions[6] = {"new single player game", "new co-op game",
"new battle", "new team battle", "new race", "join game"};
int ret;
int option;
option = 0;
while (true) {
ret = generic(newGameOptions, 6, option);
if (ret == E_QUIT) return E_QUIT;
if (ret < 0) return E_NONE;
if (option == 5) {
if (joinGame() == E_QUIT) return E_QUIT;
} else {
if (newGameEpisode(GameModeType(option)) == E_QUIT) return E_QUIT;
}
}
return E_NONE;
#else
return newGameEpisode(M_SINGLE);
#endif
}
int GameMenu::loadGame () {
// TODO: Actual loading of saved games
......@@ -449,4 +554,3 @@ int Menu::loadGame () {
}
......@@ -38,22 +38,120 @@
#include "scene/scene.h"
#include "loop.h"
#include <time.h>
int Menu::main () {
#if (defined USE_SOCKETS) || (defined USE_SDL_NET)
const char *newGameOptions[6] = {"new single player game", "new co-op game",
"new battle", "new team battle", "new race", "join game"};
int ret;
#endif
MainMenu::MainMenu () {
File *file;
time_t currentTime;
// Load the OpenJazz logo
try {
file = new File(LOGO_FILE, false);
} catch (int e) {
throw e;
}
logo = file->loadSurface(64, 40);
delete file;
// Load the menu graphics
try {
file = new File(F_MENU, false);
} catch (int e) {
SDL_FreeSurface(logo);
throw e;
}
if (file->getSize() > 200000) {
time(&currentTime);
// In December, load the Christmas menu graphics
if (localtime(&currentTime)->tm_mon == 11) {
file->skipRLE();
file->skipRLE();
file->skipRLE();
file->loadPalette(palette);
background = file->loadSurface(SW, SH);
highlight = file->loadSurface(SW, SH);
} else {
file->loadPalette(palette);
background = file->loadSurface(SW, SH);
highlight = file->loadSurface(SW, SH);
file->skipRLE();
file->skipRLE();
file->skipRLE();
}
} else {
file->loadPalette(palette);
background = file->loadSurface(SW, SH);
highlight = file->loadSurface(SW, SH);
}
SDL_SetColorKey(background, SDL_SRCCOLORKEY, 0);
SDL_SetColorKey(highlight, SDL_SRCCOLORKEY, 0);
gameMenu = new GameMenu(file);
delete file;
return;
}
MainMenu::~MainMenu () {
SDL_FreeSurface(background);
SDL_FreeSurface(highlight);
SDL_FreeSurface(logo);
delete gameMenu;
return;
}
int MainMenu::main () {
Scene *scene;
SetupMenu setupMenu;
SDL_Rect src, dst;
int option, suboption;
int option;
unsigned int idleTime;
option = suboption = 0;
option = 0;
video.setPalette(palettes[0]);
video.setPalette(palette);
playMusic("menusng.psm");
// Demo timeout
idleTime = globalTicks + T_DEMO;
......@@ -72,38 +170,17 @@ int Menu::main () {
playSound(S_ORB);
switch(option) {
switch (option) {
case 0: // New game
#if (defined USE_SOCKETS) || (defined USE_SDL_NET)
while (true) {
ret = generic(newGameOptions, 6, suboption);
if (ret == E_QUIT) return E_QUIT;
if (ret < 0) break;
if (suboption == 5) {
if (joinGame() == E_QUIT) return E_QUIT;
} else {
if (newGameEpisode(GameModeType(suboption)) == E_QUIT) return E_QUIT;
}
}
#else
if (newGameEpisode(suboption) == E_QUIT) return E_QUIT;
#endif
if (gameMenu->newGame() == E_QUIT) return E_QUIT;
break;
case 1: // Load game
if (loadGame() == E_QUIT) return E_QUIT;
if (gameMenu->loadGame() == E_QUIT) return E_QUIT;
break;
......@@ -135,7 +212,7 @@ int Menu::main () {
case 3: // Setup options
if (setup() == E_QUIT) return E_QUIT;
if (setupMenu.setup() == E_QUIT) return E_QUIT;
break;
......@@ -172,7 +249,7 @@ int Menu::main () {
}
// Restore the main menu palette
video.setPalette(palettes[0]);
video.setPalette(palette);
// New demo timeout
idleTime = globalTicks + T_DEMO;
......@@ -223,7 +300,7 @@ int Menu::main () {
playMusic("menusng.psm");
// Restore the main menu palette
video.setPalette(palettes[0]);
video.setPalette(palette);
idleTime = globalTicks + T_DEMO;
......@@ -235,11 +312,11 @@ int Menu::main () {
dst.x = (canvasW >> 2) - 72;
dst.y = canvasH - (canvasH >> 2);
SDL_BlitSurface(screens[14], NULL, canvas, &dst);
SDL_BlitSurface(logo, NULL, canvas, &dst);
dst.x = (canvasW - SW) >> 1;
dst.y = (canvasH - SH) >> 1;
SDL_BlitSurface(screens[0], NULL, canvas, &dst);
SDL_BlitSurface(background, NULL, canvas, &dst);
switch (option) {
......@@ -301,7 +378,7 @@ int Menu::main () {
dst.x = ((canvasW - SW) >> 1) + src.x;
dst.y = ((canvasH - SH) >> 1) + src.y;
SDL_BlitSurface(screens[1], &src, canvas, &dst);
SDL_BlitSurface(highlight, &src, canvas, &dst);
}
......
......@@ -10,6 +10,7 @@
* 18th July 2009: Created menuutil.cpp from parts of menu.cpp
* 18th July 2009: Created menusetup.cpp from parts of menu.cpp
* 19th July 2009: Created menumain.cpp from parts of menu.cpp
* 23rd June 2010: Merged menuutil.cpp into menu.cpp
*
* Part of the OpenJazz project
*
......@@ -26,160 +27,218 @@
*/
/*
* Deals with the loading and freeing of the menu data.
* Provides various generic menus.
*
*/
#include "menu.h"
#include "game/game.h"
#include "io/file.h"
#include "io/controls.h"
#include "io/gfx/font.h"
#include "io/gfx/video.h"
#include "io/sound.h"
#include "loop.h"
#include "util.h"
#include <time.h>
#include <string.h>
Menu::Menu () {
int Menu::message (const char* text) {
File *file;
unsigned char pixel;
time_t currentTime;
int count, col;
// Display a message to the user
video.setPalette(menuPalette);
// Load the OpenJazz logo
while (true) {
try {
if (loop(NORMAL_LOOP) == E_QUIT) return E_QUIT;
file = new File(LOGO_FILE, false);
if (controls.release(C_ENTER) || controls.release(C_ESCAPE))
return E_NONE;
} catch (int e) {
SDL_Delay(T_FRAME);
throw e;
clearScreen(15);
// Draw the message
fontmn2->showString(text, canvasW >> 2, (canvasH >> 1) - 16);
}
screens[14] = file->loadSurface(64, 40);
return E_NONE;
delete file;
}
// Load the menu graphics
int Menu::generic (const char** optionNames, int options, int& chosen) {
try {
// Let the user select from a menu of the given options
file = new File(F_MENU, false);
int count;
} catch (int e) {
video.setPalette(menuPalette);
SDL_FreeSurface(screens[14]);
if (chosen >= options) chosen = 0;
throw e;
while (true) {
}
if (loop(NORMAL_LOOP) == E_QUIT) return E_QUIT;
if (controls.release(C_ESCAPE)) return E_UNUSED;
file->seek(0, true);
SDL_Delay(T_FRAME);
// Load the main menu graphics
file->loadPalette(palettes[0]);
screens[0] = file->loadSurface(SW, SH);
screens[1] = file->loadSurface(SW, SH);
clearScreen(0);
for (count = 0; count < options; count++) {
if (file->getSize() > 200000) {
if (count == chosen) fontmn2->mapPalette(240, 8, 114, 16);
time(&currentTime);
fontmn2->showString(optionNames[count], canvasW >> 2,
(canvasH >> 1) + (count << 4) - (options << 3));
// In December, load the Christmas menu graphics
if (localtime(&currentTime)->tm_mon == 11) {
if (count == chosen) fontmn2->restorePalette();
SDL_FreeSurface(screens[0]);
SDL_FreeSurface(screens[1]);
file->loadPalette(palettes[0]);
screens[0] = file->loadSurface(SW, SH);
screens[1] = file->loadSurface(SW, SH);
}
if (controls.release(C_UP)) chosen = (chosen + options - 1) % options;
if (controls.release(C_DOWN)) chosen = (chosen + 1) % options;
} else {
if (controls.release(C_ENTER)) {
file->skipRLE();
file->skipRLE();
file->skipRLE();
playSound(S_ORB);
return E_NONE;
}
}
SDL_SetColorKey(screens[0], SDL_SRCCOLORKEY, 0);
SDL_SetColorKey(screens[1], SDL_SRCCOLORKEY, 0);
return E_NONE;
}
// Load the difficulty graphics
file->loadPalette(palettes[1]);
screens[2] = file->loadSurface(SW, SH);
SDL_SetColorKey(screens[2], SDL_SRCCOLORKEY, 0);
// Default difficulty setting
difficulty = 1;
int Menu::textInput (const char* request, char*& text) {
// Let the user to edit a text string
// Load the episode pictures (max. 10 episodes + bonus level)
char *input;
int count, terminate, character, x;
unsigned int cursor;
// Load their palette
file->loadPalette(palettes[2]);
// Create input string
input = createEditableString(text);
// Generate a greyscale mapping
for (count = 0; count < 256; count++) {
cursor = strlen(input);
col = ((palettes[2][count].r >> 1) + (palettes[2][count].g << 1) +
(palettes[2][count].b >> 1)) >> 3;
while (true) {
if (col > 79) col = 79;
character = loop(TYPING_LOOP);
palettes[3][count].r = palettes[3][count].g = palettes[3][count].b =
col;
if (character == E_QUIT) {
delete[] input;
return E_QUIT;
}
episodes = 11;
// Ensure there is space for another character
if (cursor < STRING_LENGTH) {
for (count = 0; count < 11; count++) {
terminate = (input[cursor] == 0);
screens[count + 3] = file->loadSurface(134, 110);
// If the character is valid, add it to the input string
if (file->tell() >= file->getSize()) {
if ((character == ' ') || (character == '.') ||
((character >= '0') && (character <= '9')) ||
((character >= 'a') && (character <= 'z'))) {
episodes = ++count;
input[cursor] = character;
cursor++;
if (terminate) input[cursor] = 0;
for (; count < 11; count++) {
} else if ((character >= 'A') && (character <= 'Z')) {
pixel = 0;
screens[count + 3] = createSurface(&pixel, 1, 1);
input[cursor] = character | 32;
cursor++;
if (terminate) input[cursor] = 0;
}
}
if ((character == SDLK_DELETE) && (cursor < strlen(input))) {
for (count = cursor; count < STRING_LENGTH; count++)
input[count] = input[count + 1];
}
delete file;
if ((character == SDLK_BACKSPACE) && (cursor > 0)) {
playMusic("menusng.psm");
for (count = cursor - 1; count < STRING_LENGTH; count++)
input[count] = input[count + 1];
return;
cursor--;
}
}
Menu::~Menu () {
if (controls.release(C_ESCAPE)) {
int count;
delete[] input;
for (count = 0; count < 15; count++) SDL_FreeSurface(screens[count]);
return E_UNUSED;
return;
}
}
SDL_Delay(T_FRAME);
clearScreen(15);
// Draw the prompt
fontmn2->showString(request, canvasW >> 2, (canvasH >> 1) - 16);
// Draw the section of the text before the cursor
fontmn2->mapPalette(240, 8, 114, 16);
terminate = input[cursor];
input[cursor] = 0;
x = fontmn2->showString(input, (canvasW >> 2) + 8, canvasH >> 1);
// Draw the cursor
drawRect(x, (canvasH >> 1) + 10, 8, 2, 79);
// Draw the section of text after the cursor
input[cursor] = terminate;
fontmn2->showString(input + cursor, x, canvasH >> 1);
fontmn2->restorePalette();
if (controls.release(C_LEFT) && (cursor > 0)) cursor--;
if (controls.release(C_RIGHT) && (cursor < strlen(input))) cursor++;
if (controls.release(C_ENTER)) {
playSound(S_ORB);
// Replace the original string with the input string
delete[] text;
text = input;
return E_NONE;
}
}
delete[] input;
return E_UNUSED;
}
......@@ -25,6 +25,7 @@
#include "game/gamemode.h"
#include "io/file.h"
#include "OpenJazz.h"
......@@ -36,23 +37,47 @@
// Demo timeout
#define T_DEMO 20000
// Class
// Classes
class Menu {
protected:
int message (const char* text);
int generic (const char** optionNames, int options, int& chosen);
int textInput (const char* request, char*& text);
};
class GameMenu : public Menu {
private:
SDL_Surface* screens[15];
SDL_Surface* episodeScreens[11];
SDL_Surface* difficultyScreen;
SDL_Color palette[256];
SDL_Color greyPalette[256];
int episodes;
unsigned char difficulty;
int message (const char* text);
int generic (const char** optionNames, int options, int& chosen);
int textInput (const char* request, char*& text);
int newGameDifficulty (GameModeType mode, int levelNum, int worldNum);
int newGameLevel (GameModeType mode);
int newGameEpisode (GameModeType mode);
int joinGame ();
public:
GameMenu (File* file);
~GameMenu ();
int newGame ();
int loadGame ();
};
class SetupMenu : public Menu {
private:
int setupKeyboard ();
int setupJoystick ();
int setupResolution ();
......@@ -62,12 +87,24 @@ class Menu {
int setupSound ();
public:
SDL_Color palettes[4][256];
int setup ();
Menu ();
~Menu ();
};
class MainMenu : public Menu {
private:
SDL_Surface* background;
SDL_Surface* highlight;
SDL_Surface* logo;
GameMenu* gameMenu;
SDL_Color palette[256];
public:
MainMenu ();
~MainMenu ();
int setup ();
int main ();
};
......@@ -75,7 +112,7 @@ class Menu {
// Variable
EXTERN Menu* menu;
EXTERN SDL_Color menuPalette[256];
#endif
/*
*
* menuutil.cpp
*
* 18th July 2009: Created menuutil.cpp from parts of menu.cpp
*
* Part of the OpenJazz project
*
*
* Copyright (c) 2005-2010 Alister Thomson
*
* OpenJazz is distributed under the terms of
* the GNU General Public License, version 2.0
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
/*
* Provides various generic menus.
*
*/
#include "menu.h"
#include "io/controls.h"
#include "io/gfx/font.h"
#include "io/gfx/video.h"
#include "io/sound.h"
#include "loop.h"
#include "util.h"
#include <string.h>
int Menu::message (const char* text) {
// Display a message to the user
video.setPalette(palettes[1]);
while (true) {
if (loop(NORMAL_LOOP) == E_QUIT) return E_QUIT;
if (controls.release(C_ENTER) || controls.release(C_ESCAPE))
return E_NONE;
SDL_Delay(T_FRAME);
clearScreen(15);
// Draw the message
fontmn2->showString(text, canvasW >> 2, (canvasH >> 1) - 16);
}
return E_NONE;
}
int Menu::generic (const char** optionNames, int options, int& chosen) {
// Let the user select from a menu of the given options
int count;
video.setPalette(palettes[1]);
if (chosen >= options) chosen = 0;
while (true) {
if (loop(NORMAL_LOOP) == E_QUIT) return E_QUIT;
if (controls.release(C_ESCAPE)) return E_UNUSED;
SDL_Delay(T_FRAME);
clearScreen(0);
for (count = 0; count < options; count++) {
if (count == chosen) fontmn2->mapPalette(240, 8, 114, 16);
fontmn2->showString(optionNames[count], canvasW >> 2,
(canvasH >> 1) + (count << 4) - (options << 3));
if (count == chosen) fontmn2->restorePalette();
}
if (controls.release(C_UP)) chosen = (chosen + options - 1) % options;
if (controls.release(C_DOWN)) chosen = (chosen + 1) % options;
if (controls.release(C_ENTER)) {
playSound(S_ORB);
return E_NONE;
}
}
return E_NONE;
}
int Menu::textInput (const char* request, char*& text) {
// Let the user to edit a text string
char *input;
int count, terminate, character, x;
unsigned int cursor;
// Create input string
input = createEditableString(text);
cursor = strlen(input);
while (true) {
character = loop(TYPING_LOOP);
if (character == E_QUIT) {
delete[] input;
return E_QUIT;
}
// Ensure there is space for another character
if (cursor < STRING_LENGTH) {
terminate = (input[cursor] == 0);
// If the character is valid, add it to the input string
if ((character == ' ') || (character == '.') ||
((character >= '0') && (character <= '9')) ||
((character >= 'a') && (character <= 'z'))) {
input[cursor] = character;
cursor++;
if (terminate) input[cursor] = 0;
} else if ((character >= 'A') && (character <= 'Z')) {
input[cursor] = character | 32;
cursor++;
if (terminate) input[cursor] = 0;
}
}
if ((character == SDLK_DELETE) && (cursor < strlen(input))) {
for (count = cursor; count < STRING_LENGTH; count++)
input[count] = input[count + 1];
}
if ((character == SDLK_BACKSPACE) && (cursor > 0)) {
for (count = cursor - 1; count < STRING_LENGTH; count++)
input[count] = input[count + 1];
cursor--;
}
if (controls.release(C_ESCAPE)) {
delete[] input;
return E_UNUSED;
}
SDL_Delay(T_FRAME);
clearScreen(15);
// Draw the prompt
fontmn2->showString(request, canvasW >> 2, (canvasH >> 1) - 16);
// Draw the section of the text before the cursor
fontmn2->mapPalette(240, 8, 114, 16);
terminate = input[cursor];
input[cursor] = 0;
x = fontmn2->showString(input, (canvasW >> 2) + 8, canvasH >> 1);
// Draw the cursor
drawRect(x, (canvasH >> 1) + 10, 8, 2, 79);
// Draw the section of text after the cursor
input[cursor] = terminate;
fontmn2->showString(input + cursor, x, canvasH >> 1);
fontmn2->restorePalette();
if (controls.release(C_LEFT) && (cursor > 0)) cursor--;
if (controls.release(C_RIGHT) && (cursor < strlen(input))) cursor++;
if (controls.release(C_ENTER)) {
playSound(S_ORB);
// Replace the original string with the input string
delete[] text;
text = input;
return E_NONE;
}
}
delete[] input;
return E_UNUSED;
}
......@@ -36,7 +36,7 @@
#include "loop.h"
int Menu::setupKeyboard () {
int SetupMenu::setupKeyboard () {
const char *options[PCONTROLS] = {"up", "down", "left", "right", "jump", "swim up", "fire", "weapon"};
int progress, count, character;
......@@ -115,7 +115,7 @@ int Menu::setupKeyboard () {
}
int Menu::setupJoystick () {
int SetupMenu::setupJoystick () {
const char *options[PCONTROLS] = {"up", "down", "left", "right", "jump", "swim up", "fire", "weapon"};
int progress, count, control;
......@@ -254,7 +254,7 @@ int Menu::setupJoystick () {
}
int Menu::setupResolution () {
int SetupMenu::setupResolution () {
int widthOptions[] = {320, 400, 512, 640, 720, 768, 800, 960, 1024, 1152,
1280, 1440, 1600, 1920};
......@@ -405,7 +405,7 @@ int Menu::setupResolution () {
#ifdef SCALE
int Menu::setupScaling () {
int SetupMenu::setupScaling () {
int scaleFactor;
......@@ -466,7 +466,7 @@ int Menu::setupScaling () {
#endif
int Menu::setupSound () {
int SetupMenu::setupSound () {
while (true) {
......@@ -501,7 +501,7 @@ int Menu::setupSound () {
}
int Menu::setup () {
int SetupMenu::setup () {
const char *setupOptions[6] = {"character", "keyboard", "joystick", "resolution", "scaling", "sound"};
const char *setupCharacterOptions[5] = {"name", "fur", "bandana", "gun", "wristband"};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment