Commit 58b2311d authored by alistert's avatar alistert

Separated menu into three subclasses.

parent fcd9bfa7
...@@ -11,7 +11,7 @@ objects = src/bonus/bonus.o \ ...@@ -11,7 +11,7 @@ objects = src/bonus/bonus.o \
src/level/bullet.o src/level/demolevel.o src/level/level.o \ src/level/bullet.o src/level/demolevel.o src/level/level.o \
src/level/levelframe.o src/level/levelload.o \ src/level/levelframe.o src/level/levelload.o \
src/menu/gamemenu.o src/menu/mainmenu.o src/menu/menu.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/planet/planet.o \
src/player/bird.o src/player/player.o src/player/playerframe.o \ src/player/bird.o src/player/player.o src/player/playerframe.o \
src/scene/scene.o src/scene/sceneload.o \ src/scene/scene.o src/scene/sceneload.o \
......
...@@ -35,7 +35,7 @@ OBJS = src/bonus/bonus.o \ ...@@ -35,7 +35,7 @@ OBJS = src/bonus/bonus.o \
src/level/bullet.o src/level/demolevel.o src/level/level.o \ src/level/bullet.o src/level/demolevel.o src/level/level.o \
src/level/levelframe.o src/level/levelload.o \ src/level/levelframe.o src/level/levelload.o \
src/menu/gamemenu.o src/menu/mainmenu.o src/menu/menu.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/planet/planet.o \
src/player/bird.o src/player/player.o src/player/playerframe.o \ src/player/bird.o src/player/player.o src/player/playerframe.o \
src/scene/scene.o src/scene/sceneload.o \ src/scene/scene.o src/scene/sceneload.o \
......
...@@ -11,7 +11,7 @@ objects = src/bonus/bonus.o \ ...@@ -11,7 +11,7 @@ objects = src/bonus/bonus.o \
src/level/bullet.o src/level/demolevel.o src/level/level.o \ src/level/bullet.o src/level/demolevel.o src/level/level.o \
src/level/levelframe.o src/level/levelload.o \ src/level/levelframe.o src/level/levelload.o \
src/menu/gamemenu.o src/menu/mainmenu.o src/menu/menu.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/planet/planet.o \
src/player/bird.o src/player/player.o src/player/playerframe.o \ src/player/bird.o src/player/player.o src/player/playerframe.o \
src/scene/scene.o src/scene/sceneload.o \ src/scene/scene.o src/scene/sceneload.o \
......
...@@ -645,6 +645,7 @@ void Bonus::draw () { ...@@ -645,6 +645,7 @@ void Bonus::draw () {
int Bonus::play () { int Bonus::play () {
SetupMenu setupMenu;
const char *options[3] = {"continue game", "setup options", "quit game"}; const char *options[3] = {"continue game", "setup options", "quit game"};
bool pmenu, pmessage; bool pmenu, pmessage;
int stats, option; int stats, option;
...@@ -706,7 +707,7 @@ int Bonus::play () { ...@@ -706,7 +707,7 @@ int Bonus::play () {
if (!gameMode) { if (!gameMode) {
if (menu->setup() == E_QUIT) return E_QUIT; if (setupMenu.setup() == E_QUIT) return E_QUIT;
// Restore level palette // Restore level palette
video.setPalette(palette); video.setPalette(palette);
......
...@@ -248,7 +248,7 @@ int ClientGame::setLevel (char* fileName) { ...@@ -248,7 +248,7 @@ int ClientGame::setLevel (char* fileName) {
int ret; int ret;
video.setPalette(menu->palettes[1]); video.setPalette(menuPalette);
// Wait for level data to start arriving // Wait for level data to start arriving
while (!file && levelFile) { while (!file && levelFile) {
......
...@@ -518,6 +518,7 @@ int Level::play () { ...@@ -518,6 +518,7 @@ int Level::play () {
const char* options[5] = const char* options[5] =
{"continue game", "save game", "load game", "setup options", "quit game"}; {"continue game", "save game", "load game", "setup options", "quit game"};
char *string; char *string;
SetupMenu setupMenu;
bool pmessage, pmenu; bool pmessage, pmenu;
int stats, option; int stats, option;
unsigned int returnTime; unsigned int returnTime;
...@@ -592,7 +593,7 @@ int Level::play () { ...@@ -592,7 +593,7 @@ int Level::play () {
if (!gameMode) { if (!gameMode) {
if (menu->setup() == E_QUIT) return E_QUIT; if (setupMenu.setup() == E_QUIT) return E_QUIT;
// Restore level palette // Restore level palette
video.setPalette(palette); video.setPalette(palette);
......
...@@ -399,7 +399,7 @@ int Level::load (char *fileName, unsigned char diff, bool checkpoint) { ...@@ -399,7 +399,7 @@ int Level::load (char *fileName, unsigned char diff, bool checkpoint) {
} }
video.setPalette(menu->palettes[1]); video.setPalette(menuPalette);
clearScreen(0); clearScreen(0);
......
...@@ -676,9 +676,9 @@ int loop (LoopType type, PaletteEffect* paletteEffects) { ...@@ -676,9 +676,9 @@ int loop (LoopType type, PaletteEffect* paletteEffects) {
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
MainMenu *mainMenu = NULL;
Scene *scene = NULL; Scene *scene = NULL;
// Initialise SDL // Initialise SDL
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK | SDL_INIT_TIMER) < 0) { 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[]) { ...@@ -730,7 +730,7 @@ int main(int argc, char *argv[]) {
// Load the menu // Load the menu
try { try {
menu = new Menu(); mainMenu = new MainMenu();
} catch (int e) { } catch (int e) {
...@@ -741,7 +741,7 @@ int main(int argc, char *argv[]) { ...@@ -741,7 +741,7 @@ int main(int argc, char *argv[]) {
} }
// Run the main menu // Run the main menu
if (menu->main() == E_NONE) { if (mainMenu->main() == E_NONE) {
// Show the ending cutscene // Show the ending cutscene
...@@ -751,7 +751,7 @@ int main(int argc, char *argv[]) { ...@@ -751,7 +751,7 @@ int main(int argc, char *argv[]) {
} catch (int e) { } catch (int e) {
delete menu; delete mainMenu;
freeMain(); freeMain();
return e; return e;
...@@ -765,7 +765,7 @@ int main(int argc, char *argv[]) { ...@@ -765,7 +765,7 @@ int main(int argc, char *argv[]) {
} }
delete menu; delete mainMenu;
freeMain(); freeMain();
......
...@@ -38,14 +38,84 @@ ...@@ -38,14 +38,84 @@
#include "util.h" #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"}; const char *options[4] = {"easy", "medium", "hard", "turbo"};
char *firstLevel; char *firstLevel;
SDL_Rect src, dst; SDL_Rect src, dst;
int count; int count;
video.setPalette(palettes[1]); video.setPalette(menuPalette);
while (true) { while (true) {
...@@ -74,7 +144,7 @@ int Menu::newGameDifficulty (GameModeType mode, int levelNum, int worldNum) { ...@@ -74,7 +144,7 @@ int Menu::newGameDifficulty (GameModeType mode, int levelNum, int worldNum) {
src.h = 100; src.h = 100;
dst.x = (canvasW >> 1) - 40; dst.x = (canvasW >> 1) - 40;
dst.y = (canvasH >> 1) - 50; 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; if (controls.release(C_UP)) difficulty = (difficulty + 3) % 4;
...@@ -155,13 +225,13 @@ int Menu::newGameDifficulty (GameModeType mode, int levelNum, int worldNum) { ...@@ -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; int option, worldNum, levelNum;
worldNum = levelNum = option = 0; worldNum = levelNum = option = 0;
video.setPalette(palettes[1]); video.setPalette(menuPalette);
while (true) { while (true) {
...@@ -211,7 +281,7 @@ int Menu::newGameLevel (GameModeType mode) { ...@@ -211,7 +281,7 @@ int Menu::newGameLevel (GameModeType mode) {
if (newGameDifficulty(mode, levelNum, worldNum) == E_QUIT) if (newGameDifficulty(mode, levelNum, worldNum) == E_QUIT)
return E_QUIT; return E_QUIT;
video.setPalette(palettes[1]); video.setPalette(menuPalette);
} }
...@@ -222,7 +292,7 @@ int Menu::newGameLevel (GameModeType mode) { ...@@ -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", const char *options[12] = {"episode 1", "episode 2", "episode 3",
"episode 4", "episode 5", "episode 6", "episode a", "episode b", "episode 4", "episode 5", "episode 6", "episode a", "episode b",
...@@ -232,7 +302,7 @@ int Menu::newGameEpisode (GameModeType mode) { ...@@ -232,7 +302,7 @@ int Menu::newGameEpisode (GameModeType mode) {
SDL_Rect dst; SDL_Rect dst;
int episode, count, worldNum; int episode, count, worldNum;
video.setPalette(palettes[2]); video.setPalette(palette);
for (count = 0; count < 10; count++) { for (count = 0; count < 10; count++) {
...@@ -244,9 +314,8 @@ int Menu::newGameEpisode (GameModeType mode) { ...@@ -244,9 +314,8 @@ int Menu::newGameEpisode (GameModeType mode) {
exists[count] = fileExists(check); exists[count] = fileExists(check);
delete[] check; delete[] check;
if (exists[count]) video.restoreSurfacePalette(screens[count + 3]); if (exists[count]) video.restoreSurfacePalette(episodeScreens[count]);
else else SDL_SetPalette(episodeScreens[count], SDL_LOGPAL, greyPalette, 0, 256);
SDL_SetPalette(screens[count + 3], SDL_LOGPAL, palettes[3], 0, 256);
} }
...@@ -272,17 +341,16 @@ int Menu::newGameEpisode (GameModeType mode) { ...@@ -272,17 +341,16 @@ int Menu::newGameEpisode (GameModeType mode) {
clearScreen(0); clearScreen(0);
dst.x = canvasW - 144;
dst.y = (canvasH - 110) >> 1;
if ((episode < episodes - 1) || (episode < 6)) { if ((episode < episodes - 1) || (episode < 6)) {
dst.x = canvasW - 150; SDL_BlitSurface(episodeScreens[episode], NULL, canvas, &dst);
dst.y = (canvasH - 110) >> 1;
SDL_BlitSurface(screens[episode + 3], NULL, canvas, &dst);
} else if ((episode == 10) && (episodes > 6)) { } else if ((episode == 10) && (episodes > 6)) {
dst.x = canvasW - 160; SDL_BlitSurface(episodeScreens[episodes - 1], NULL, canvas, &dst);
dst.y = (canvasH - 110) >> 1;
SDL_BlitSurface(screens[episodes + 2], NULL, canvas, &dst);
} }
...@@ -333,7 +401,7 @@ int Menu::newGameEpisode (GameModeType mode) { ...@@ -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) { ...@@ -346,7 +414,7 @@ int Menu::newGameEpisode (GameModeType mode) {
} }
int Menu::joinGame () { int GameMenu::joinGame () {
int ret; int ret;
...@@ -441,7 +509,44 @@ int Menu::joinGame () { ...@@ -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 // TODO: Actual loading of saved games
...@@ -449,4 +554,3 @@ int Menu::loadGame () { ...@@ -449,4 +554,3 @@ int Menu::loadGame () {
} }
...@@ -38,22 +38,120 @@ ...@@ -38,22 +38,120 @@
#include "scene/scene.h" #include "scene/scene.h"
#include "loop.h" #include "loop.h"
#include <time.h>
int Menu::main () {
#if (defined USE_SOCKETS) || (defined USE_SDL_NET) MainMenu::MainMenu () {
const char *newGameOptions[6] = {"new single player game", "new co-op game",
"new battle", "new team battle", "new race", "join game"}; File *file;
int ret; time_t currentTime;
#endif
// 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; Scene *scene;
SetupMenu setupMenu;
SDL_Rect src, dst; SDL_Rect src, dst;
int option, suboption; int option;
unsigned int idleTime; unsigned int idleTime;
option = suboption = 0; option = 0;
video.setPalette(palettes[0]); video.setPalette(palette);
playMusic("menusng.psm");
// Demo timeout // Demo timeout
idleTime = globalTicks + T_DEMO; idleTime = globalTicks + T_DEMO;
...@@ -72,38 +170,17 @@ int Menu::main () { ...@@ -72,38 +170,17 @@ int Menu::main () {
playSound(S_ORB); playSound(S_ORB);
switch(option) { switch (option) {
case 0: // New game case 0: // New game
#if (defined USE_SOCKETS) || (defined USE_SDL_NET) if (gameMenu->newGame() == E_QUIT) return E_QUIT;
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
break; break;
case 1: // Load game case 1: // Load game
if (loadGame() == E_QUIT) return E_QUIT; if (gameMenu->loadGame() == E_QUIT) return E_QUIT;
break; break;
...@@ -135,7 +212,7 @@ int Menu::main () { ...@@ -135,7 +212,7 @@ int Menu::main () {
case 3: // Setup options case 3: // Setup options
if (setup() == E_QUIT) return E_QUIT; if (setupMenu.setup() == E_QUIT) return E_QUIT;
break; break;
...@@ -172,7 +249,7 @@ int Menu::main () { ...@@ -172,7 +249,7 @@ int Menu::main () {
} }
// Restore the main menu palette // Restore the main menu palette
video.setPalette(palettes[0]); video.setPalette(palette);
// New demo timeout // New demo timeout
idleTime = globalTicks + T_DEMO; idleTime = globalTicks + T_DEMO;
...@@ -223,7 +300,7 @@ int Menu::main () { ...@@ -223,7 +300,7 @@ int Menu::main () {
playMusic("menusng.psm"); playMusic("menusng.psm");
// Restore the main menu palette // Restore the main menu palette
video.setPalette(palettes[0]); video.setPalette(palette);
idleTime = globalTicks + T_DEMO; idleTime = globalTicks + T_DEMO;
...@@ -235,11 +312,11 @@ int Menu::main () { ...@@ -235,11 +312,11 @@ int Menu::main () {
dst.x = (canvasW >> 2) - 72; dst.x = (canvasW >> 2) - 72;
dst.y = canvasH - (canvasH >> 2); dst.y = canvasH - (canvasH >> 2);
SDL_BlitSurface(screens[14], NULL, canvas, &dst); SDL_BlitSurface(logo, NULL, canvas, &dst);
dst.x = (canvasW - SW) >> 1; dst.x = (canvasW - SW) >> 1;
dst.y = (canvasH - SH) >> 1; dst.y = (canvasH - SH) >> 1;
SDL_BlitSurface(screens[0], NULL, canvas, &dst); SDL_BlitSurface(background, NULL, canvas, &dst);
switch (option) { switch (option) {
...@@ -301,7 +378,7 @@ int Menu::main () { ...@@ -301,7 +378,7 @@ int Menu::main () {
dst.x = ((canvasW - SW) >> 1) + src.x; dst.x = ((canvasW - SW) >> 1) + src.x;
dst.y = ((canvasH - SH) >> 1) + src.y; dst.y = ((canvasH - SH) >> 1) + src.y;
SDL_BlitSurface(screens[1], &src, canvas, &dst); SDL_BlitSurface(highlight, &src, canvas, &dst);
} }
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
* 18th July 2009: Created menuutil.cpp from parts of menu.cpp * 18th July 2009: Created menuutil.cpp from parts of menu.cpp
* 18th July 2009: Created menusetup.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 * 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 * Part of the OpenJazz project
* *
...@@ -26,160 +27,218 @@ ...@@ -26,160 +27,218 @@
*/ */
/* /*
* Deals with the loading and freeing of the menu data. * Provides various generic menus.
* *
*/ */
#include "menu.h" #include "menu.h"
#include "game/game.h" #include "io/controls.h"
#include "io/file.h" #include "io/gfx/font.h"
#include "io/gfx/video.h" #include "io/gfx/video.h"
#include "io/sound.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; // Display a message to the user
unsigned char pixel;
time_t currentTime;
int count, col;
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 clearScreen(0);
file->loadPalette(palettes[0]);
screens[0] = file->loadSurface(SW, SH);
screens[1] = file->loadSurface(SW, SH);
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 (count == chosen) fontmn2->restorePalette();
if (localtime(&currentTime)->tm_mon == 11) {
SDL_FreeSurface(screens[0]); }
SDL_FreeSurface(screens[1]);
file->loadPalette(palettes[0]); if (controls.release(C_UP)) chosen = (chosen + options - 1) % options;
screens[0] = file->loadSurface(SW, SH);
screens[1] = file->loadSurface(SW, SH); if (controls.release(C_DOWN)) chosen = (chosen + 1) % options;
} else { if (controls.release(C_ENTER)) {
file->skipRLE(); playSound(S_ORB);
file->skipRLE();
file->skipRLE(); return E_NONE;
} }
} }
SDL_SetColorKey(screens[0], SDL_SRCCOLORKEY, 0); return E_NONE;
SDL_SetColorKey(screens[1], SDL_SRCCOLORKEY, 0);
}
// Load the difficulty graphics
file->loadPalette(palettes[1]);
screens[2] = file->loadSurface(SW, SH);
SDL_SetColorKey(screens[2], SDL_SRCCOLORKEY, 0);
// Default difficulty setting int Menu::textInput (const char* request, char*& text) {
difficulty = 1;
// 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 // Create input string
file->loadPalette(palettes[2]); input = createEditableString(text);
// Generate a greyscale mapping cursor = strlen(input);
for (count = 0; count < 256; count++) {
col = ((palettes[2][count].r >> 1) + (palettes[2][count].g << 1) + while (true) {
(palettes[2][count].b >> 1)) >> 3;
if (col > 79) col = 79; character = loop(TYPING_LOOP);
palettes[3][count].r = palettes[3][count].g = palettes[3][count].b = if (character == E_QUIT) {
col;
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; input[cursor] = character | 32;
screens[count + 3] = createSurface(&pixel, 1, 1); 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 @@ ...@@ -25,6 +25,7 @@
#include "game/gamemode.h" #include "game/gamemode.h"
#include "io/file.h"
#include "OpenJazz.h" #include "OpenJazz.h"
...@@ -36,23 +37,47 @@ ...@@ -36,23 +37,47 @@
// Demo timeout // Demo timeout
#define T_DEMO 20000 #define T_DEMO 20000
// Class
// Classes
class Menu { 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: private:
SDL_Surface* screens[15]; SDL_Surface* episodeScreens[11];
SDL_Surface* difficultyScreen;
SDL_Color palette[256];
SDL_Color greyPalette[256];
int episodes; int episodes;
unsigned char difficulty; 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 newGameDifficulty (GameModeType mode, int levelNum, int worldNum);
int newGameLevel (GameModeType mode); int newGameLevel (GameModeType mode);
int newGameEpisode (GameModeType mode); int newGameEpisode (GameModeType mode);
int joinGame (); int joinGame ();
public:
GameMenu (File* file);
~GameMenu ();
int newGame ();
int loadGame (); int loadGame ();
};
class SetupMenu : public Menu {
private:
int setupKeyboard (); int setupKeyboard ();
int setupJoystick (); int setupJoystick ();
int setupResolution (); int setupResolution ();
...@@ -62,12 +87,24 @@ class Menu { ...@@ -62,12 +87,24 @@ class Menu {
int setupSound (); int setupSound ();
public: 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 (); int main ();
}; };
...@@ -75,7 +112,7 @@ class Menu { ...@@ -75,7 +112,7 @@ class Menu {
// Variable // Variable
EXTERN Menu* menu; EXTERN SDL_Color menuPalette[256];
#endif #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 @@ ...@@ -36,7 +36,7 @@
#include "loop.h" #include "loop.h"
int Menu::setupKeyboard () { int SetupMenu::setupKeyboard () {
const char *options[PCONTROLS] = {"up", "down", "left", "right", "jump", "swim up", "fire", "weapon"}; const char *options[PCONTROLS] = {"up", "down", "left", "right", "jump", "swim up", "fire", "weapon"};
int progress, count, character; int progress, count, character;
...@@ -115,7 +115,7 @@ int Menu::setupKeyboard () { ...@@ -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"}; const char *options[PCONTROLS] = {"up", "down", "left", "right", "jump", "swim up", "fire", "weapon"};
int progress, count, control; int progress, count, control;
...@@ -254,7 +254,7 @@ int Menu::setupJoystick () { ...@@ -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, int widthOptions[] = {320, 400, 512, 640, 720, 768, 800, 960, 1024, 1152,
1280, 1440, 1600, 1920}; 1280, 1440, 1600, 1920};
...@@ -405,7 +405,7 @@ int Menu::setupResolution () { ...@@ -405,7 +405,7 @@ int Menu::setupResolution () {
#ifdef SCALE #ifdef SCALE
int Menu::setupScaling () { int SetupMenu::setupScaling () {
int scaleFactor; int scaleFactor;
...@@ -466,7 +466,7 @@ int Menu::setupScaling () { ...@@ -466,7 +466,7 @@ int Menu::setupScaling () {
#endif #endif
int Menu::setupSound () { int SetupMenu::setupSound () {
while (true) { while (true) {
...@@ -501,7 +501,7 @@ int Menu::setupSound () { ...@@ -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 *setupOptions[6] = {"character", "keyboard", "joystick", "resolution", "scaling", "sound"};
const char *setupCharacterOptions[5] = {"name", "fur", "bandana", "gun", "wristband"}; 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