/* ************************************************************************* *
SDL-Ball - DX-Ball/Breakout remake with openGL and SDL for Linux
Copyright (C) 2008 Jimmy Christensen ( dusted at dusted dot dk )
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
* ************************************************************************* */
struct score {
int score;
string level;
string name;
};
struct score *sortScores(int *rl)
{
ifstream hsList;
string line;
int i=0,t;
int delim[2];
struct score *final=NULL, *temp=NULL;
final = new struct score[1];
hsList.open(privFile.highScoreFile.data());
if(hsList.is_open())
{
while(!hsList.eof())
{
getline(hsList,line);
if(line != "")
{
if(line[0]=='[')
{
delim[0] = line.find(']');
delim[1] = line.find('|', delim[0]+1);
final[i].level=line.substr(0, delim[0]+1);
final[i].level+=" ";
final[i].score = atoi(line.substr(delim[0]+1, delim[1]).data());
final[i].name = line.substr(delim[1]+1);
} else {
final[i].level.clear();
final[i].score = atoi(line.substr(0, line.find('|')).data());
final[i].name = line.substr(line.find('|')+1);
}
temp = new struct score[i+1];
for(t = 0; t < i+1; t++)
{
temp[t] = final[t];
}
delete[] final;
final = new struct score[i+2];
for(t = 0; t < i+1; t++)
{
final[t] = temp[t];
}
delete[] temp;
i++;
}
}
hsList.close();
}
if(i > 20)
*rl=20;
else
*rl=i;
int k;
bool done=0;
bool swaps=0;
temp = new struct score[1];
while(!done)
{
for(k=0; k < i; k++)
{
for(t=0; t < i; t++)
{
if(final[k].score > final[t].score)
{
swaps=1;
temp[0] = final[t];
final[t] = final[k];
final[k] = temp[0];
} else {
swaps=0;
}
}
}
if(swaps == 0)
{
done=1;
}
}
delete[] temp;
return(final);
}
class menuClass {
private:
string saveGameName[6]; //The name of saveGames
int saveGameSlot; //Where player choose to save/load to/from
textureClass tex[5];
GLuint dl;
bool themeChanged; //If the theme has changed change the banner.
vector tI; //Vector of theme info
public:
char highScores[20][255];
menuClass()
{
refreshHighScoreList(); //load the highscore file (if exists)
textureManager texMgr;
dl = glGenLists(4); //Generate displaylists (+0 = background, +1,2 = but
texMgr.load(useTheme("/gfx/menu/menu0.png",setting.gfxTheme), tex[0]);
texMgr.load(useTheme("/gfx/menu/but0.png",setting.gfxTheme), tex[1]);
texMgr.load(useTheme("/gfx/menu/but1.png",setting.gfxTheme), tex[2]);
texMgr.load(useTheme("/gfx/menu/but2.png",setting.gfxTheme), tex[3]);
texMgr.load(useTheme("/gfx/menu/highscorebg.png",setting.gfxTheme), tex[4]);
tI = getThemes(); //Read themes and put them in the vector tI
listSaveGames(saveGameName);
//Baggrund
glNewList(dl, GL_COMPILE);
glBindTexture(GL_TEXTURE_2D, tex[0].prop.texture);
glBegin( GL_QUADS );
glTexCoord2f(0.0f,0.0f);glVertex3f( -1.0, 1.0, 0.0 );
glTexCoord2f(1.0f,0.0f);glVertex3f( 1.0, 1.0, 0.0 );
glTexCoord2f(1.0f,1.0f);glVertex3f( 1.0,-1.0, 0.0 );
glTexCoord2f(0.0f,1.0f);glVertex3f( -1.0,-1.0, 0.0 );
glEnd( );
glEndList( );
//Hvide
glNewList(dl+1, GL_COMPILE);
glBindTexture(GL_TEXTURE_2D, tex[1].prop.texture);
glBegin( GL_QUADS );
glTexCoord2f(0.132f,0.3f); glVertex3f( -0.5, 0.07, 0.0 );
glTexCoord2f(0.87f, 0.3f); glVertex3f( 0.5, 0.07, 0.0 );
glTexCoord2f(0.87f, 0.7f); glVertex3f( 0.5,-0.07, 0.0 );
glTexCoord2f(0.132f,0.7f); glVertex3f( -0.5,-0.07, 0.0 );
glEnd( );
glEndList( );
//Røde
glNewList(dl+2, GL_COMPILE);
glBindTexture(GL_TEXTURE_2D, tex[2].prop.texture);
glBegin( GL_QUADS );
glTexCoord2f(0.132f,0.3f); glVertex3f( -0.5, 0.07, 0.0 );
glTexCoord2f(0.87f, 0.3f); glVertex3f( 0.5, 0.07, 0.0 );
glTexCoord2f(0.87f, 0.7f); glVertex3f( 0.5,-0.07, 0.0 );
glTexCoord2f(0.132f,0.7f); glVertex3f( -0.5,-0.07, 0.0 );
glEnd( );
glEndList( );
//Grøn
glNewList(dl+3, GL_COMPILE);
glBindTexture(GL_TEXTURE_2D, tex[3].prop.texture);
glBegin( GL_QUADS );
glTexCoord2f(0.132f,0.3f); glVertex3f( -0.5, 0.07, 0.0 );
glTexCoord2f(0.87f, 0.3f); glVertex3f( 0.5, 0.07, 0.0 );
glTexCoord2f(0.87f, 0.7f); glVertex3f( 0.5,-0.07, 0.0 );
glTexCoord2f(0.132f,0.7f); glVertex3f( -0.5,-0.07, 0.0 );
glEnd( );
glEndList( );
}
void refreshHighScoreList()
{
struct score *final;
int lines;
final = sortScores(&lines);
//Fill out remaining highscore slots (if any)
for(int t=lines; t < 20; t++)
{
switch(t)
{
case 0:
sprintf(highScores[t], "SDL-BALL v "VERSION );
break;
case 1:
sprintf(highScores[t], "-----------------------");
break;
case 2:
sprintf(highScores[t], "Copyleft GPLv3 2008 Jimmy Christensen");
break;
case 3:
sprintf(highScores[t], "Based on Dx-Ball by Michael P. Welch");
break;
case 4:
sprintf(highScores[t], "Based on Megaball by Ed and Al Mackey");
break;
case 5:
sprintf(highScores[t], "-----------------------");
break;
case 6:
sprintf(highScores[t], "Greetings to everyone!");
break;
default:
sprintf(highScores[t], "SDL-Ball - %i", (t*-1)+20 );
break;
}
}
//Highscores list
for(int t=0; t < lines; t++)
{
sprintf(highScores[t], "%s%i - %s", final[t].level.data(), final[t].score, final[t].name.data());
}
if(lines>0)
delete[] final;
}
void enterSaveGameName(SDL_Event e)
{
if(e.key.keysym.sym != SDLK_RETURN && e.key.keysym.sym != SDLK_ESCAPE)
{
if ( (e.key.keysym.unicode & 0xFF80) == 0 && e.key.keysym.unicode != 0) {
if(e.key.keysym.sym == SDLK_BACKSPACE)
{
if(saveGameName[saveGameSlot].length() > 0)
saveGameName[saveGameSlot].erase(saveGameName[saveGameSlot].length()-1);
} else {
saveGameName[saveGameSlot] += e.key.keysym.unicode;
}
}
} else {
if(e.key.keysym.sym == SDLK_RETURN)
{
//player saved
saveGame(saveGameSlot, saveGameName[saveGameSlot]);
}
var.enterSaveGameName=0;
}
}
void doMenu()
{
int i=0;
glColor4f(1.0, 1.0, 1.0, 1.0);
glLoadIdentity();
glTranslatef(0.0,0.0,-3.0f);
glCallList(dl); //baggrunden
glTranslatef(0.0,-1.0,0.0f);
if(var.menu==1)
{
//Exit
glTranslatef(0.0,0.22,0.0f);
if(var.menuItem==1)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
glText->write("Quit SDL-Ball", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
//Settings
glTranslatef(0.0,0.22,0.0f);
if(var.menuItem==2)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
glText->write("Settings", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
//highscores
glTranslatef(0.0,0.22,0.0f);
if(var.menuItem==3)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
glText->write("Highscores", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
//Save
glTranslatef(0.0,0.22,0.0f);
if(player.level > 0)// && !var.startedPlaying)
{
if(var.menuItem==4)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
glText->write("Save Game", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
} else {
glColor4f(1,1,1,1);
if(var.menuItem==4)
{
glCallList(dl+2);
glColor4f(0.5,0.5,0.5,1);
glText->write("Not in Level 1", FONT_MENU, 1, 1.0, 0.0, -0.005);
} else {
glCallList(dl+1);
glColor4f(0.5,0.5,0.5,1);
glText->write("Save Game", FONT_MENU, 1, 1.0, 0.0, -0.005);
}
glColor4f(1,1,1,1);
}
//Load
glTranslatef(0.0,0.22,0.0f);
if(var.menuItem==5)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
glText->write("Load Game", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
//Continue
glTranslatef(0.0,0.22,0.0f);
if(var.menuItem==6)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
glText->write("Continue", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
//new game
glTranslatef(0.0,0.22,0.0f);
if(var.menuItem==7)
glCallList(dl+2);
else
glCallList(dl+3);
glColor4f(0,0,0,1);
glText->write("New Game", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
if(var.menuPressed)
{
switch(var.menuItem)
{
case 1: //quit
var.menu=6;
break;
case 2: //settings
var.menu=2;
break;
case 3: //highscores
var.menu=7;
break;
case 4: //Save Game
if(player.level > 0)// && !var.startedPlaying)
var.menu=9;
break;
case 5: //Load game
var.menu=8;
break;
case 6: //resume
resumeGame();
break;
case 7: //new game
var.menu=5;
}
var.menuPressed=0;
}
var.menuNumItems=7;
} else if(var.menu==2)
{
//Settings
//Back
glTranslatef(0.0,0.22,0.0f);
if(var.menuItem==1)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
glText->write("Back", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
//settings
glLoadIdentity();
glTranslatef(0.0, 0.54,-3.0f);
glCallList(dl+3);
glColor4f(1,1,1,1);
glText->write("Settings", FONT_MENU, 1, 1.0, 0.0, -0.005);
//Video
glTranslatef(0.0,-0.22,0.0f);
if(var.menuItem==6)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
glText->write("Video", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
//sound
glTranslatef(0.0,-0.22,0.0f);
#ifndef NOSOUND
if(var.menuItem==5)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
glText->write("Sound", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
#endif
//Calibrate
glTranslatef(0.0,-0.22,0.0f);
if(SDL_JoystickOpened(0))
{
if(var.menuItem==4)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
glText->write("Calibrate Joystick", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
}
glTranslatef(0.0,-0.22,0.0f);
#ifdef WITH_WIIUSE
if(!var.wiiConnect)
{
if(var.menuItem==3)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
glText->write("Connect WiiMote", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
}
#endif
glTranslatef(0.0,-0.22,0.0f);
if(var.menuItem==2)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
glText->write("Themes", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
if(var.menuPressed)
{
switch(var.menuItem)
{
case 1:
var.menu=1;
break;
case 6:
var.menu=3;
break;
case 5:
var.menu=4;
break;
case 4:
if(SDL_JoystickOpened(0))
{
var.menuJoyCalStage=0;
var.menu=10;
}
break;
#ifdef WITH_WIIUSE
case 3:
if(!var.wiiConnect)
{
var.menuJoyCalStage=-1;
var.menu=11;
}
break;
#endif
case 2:
var.menu=12;
break;
}
var.menuPressed=0;
}
var.menuNumItems=6;
} else if(var.menu==3)
{
//Video options
glLoadIdentity();
glTranslatef(0.0, 0.54,-3.0f);
glCallList(dl+3);
glColor4f(1,1,1,1);
glText->write("Video Options", FONT_MENU, 1, 1.0, 0.0, -0.005);
//Toggle full
glTranslatef(0.0,-0.22,0.0f);
if(var.menuItem==6)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
if(setting.fullscreen)
glText->write("Fullscreen:On", FONT_MENU, 1, 1.0, 0.0, -0.005);
else
glText->write("Fullscreen:Off", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
//Eyecandy
glTranslatef(0.0,-0.22,0.0f);
if(var.menuItem==5)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
if(setting.eyeCandy)
glText->write("Eyecandy:On", FONT_MENU, 1, 1.0, 0.0, -0.005);
else
glText->write("Eyecandy:Off", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
//1600
glTranslatef(0.0,-0.22,0.0f);
if(var.menuItem==4)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
glText->write("1600x1200", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
//1024
glTranslatef(0.0,-0.22,0.0f);
if(var.menuItem==3)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
glText->write("1024x768", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
//background
glTranslatef(0.0,-0.22,0.0f);
if(var.menuItem==2)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
if(setting.showBg)
glText->write("Background:On", FONT_MENU, 1, 1.0, 0.0, -0.005);
else
glText->write("Background:Off", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
//Back
glTranslatef(0.0,-0.22,0.0f);
if(var.menuItem==1)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
glText->write("Back", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
if(var.menuPressed)
{
switch(var.menuItem)
{
case 1:
var.menu=2;
break;
case 2:
if(!setting.showBg)
setting.showBg=1;
else
setting.showBg=0;
writeSettings();
break;
case 3:
setting.resx = 1024;
setting.resy = 768;
#ifndef WIN32
if(initScreen())
#endif
writeSettings();
break;
case 4:
setting.resx = 1600;
setting.resy = 1200;
#ifndef WIN32
if(initScreen())
#endif
writeSettings();
break;
case 5:
if(setting.eyeCandy)
setting.eyeCandy=0;
else
setting.eyeCandy=1;
writeSettings();
break;
case 6:
if(setting.fullscreen)
setting.fullscreen=0;
else
setting.fullscreen=1;
#ifndef WIN32
if(initScreen())
#endif
writeSettings();
break;
}
var.menuPressed=0;
}
var.menuNumItems=6;
} else if(var.menu==4)
{
//Audio
glLoadIdentity();
glTranslatef(0.0, 0.54,-3.0f);
glCallList(dl+3);
glColor4f(1,1,1,1);
glText->write("Audio", FONT_MENU, 1, 1.0, 0.0, -0.005);
//Sound on/off
glTranslatef(0.0,-0.22,0.0f);
if(var.menuItem==6)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
if(setting.sound)
glText->write("Sound:On", FONT_MENU, 1, 1.0, 0.0, -0.005);
else
glText->write("Sound:Off", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
//Stereo
glTranslatef(0.0,-0.22,0.0f);
if(var.menuItem==5)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
if(setting.stereo)
glText->write("Stereo:On", FONT_MENU, 1, 1.0, 0.0, -0.005);
else
glText->write("Stereo:Off", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
//Back
glTranslatef(0.0,-0.88,0.0f);
if(var.menuItem==1)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
glText->write("Back", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
if(var.menuPressed)
{
switch(var.menuItem)
{
case 1:
var.menu=2;
break;
case 5:
if(setting.stereo)
setting.stereo=0;
else
setting.stereo=1;
writeSettings();
break;
case 6:
if(setting.sound)
setting.sound=0;
else
setting.sound=1;
soundMan.loadsounds();
writeSettings();
break;
}
var.menuPressed=0;
}
var.menuNumItems=7;
} else if(var.menu==5)
{
//New game?
glLoadIdentity();
glTranslatef(0.0, 0.54,-3.0f);
glCallList(dl+3);
glColor4f(0,0,0,1);
glText->write("New Game", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
// glBindTexture(GL_TEXTURE_2D, tex[28].prop.texture);
// glCallList(dl+3);
//Easy
glTranslatef(0.0,-0.22,0.0f);
if(var.menuItem==6)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,1,0,1);
glText->write("Easy", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
// glBindTexture(GL_TEXTURE_2D, tex[29].prop.texture);
// glCallList(dl+3);
//Normal
glTranslatef(0.0,-0.22,0.0f);
if(var.menuItem==5)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,1,1);
glText->write("Normal", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
// glBindTexture(GL_TEXTURE_2D, tex[30].prop.texture);
// glCallList(dl+3);
//Hard
glTranslatef(0.0,-0.22,0.0f);
if(var.menuItem==4)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(1,0,0,1);
glText->write("Hard", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
// glBindTexture(GL_TEXTURE_2D, tex[31].prop.texture);
// glCallList(dl+3);
//Back
glTranslatef(0.0,-0.66,0.0f);
if(var.menuItem==1)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
glText->write("Back", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
// glBindTexture(GL_TEXTURE_2D, tex[32].prop.texture);
// glCallList(dl+3);
if(var.menuPressed)
{
switch(var.menuItem)
{
case 1:
var.menu=1;
break;
case 4: //New game, hard
player.difficulty=HARD;
writeSettings();
resumeGame();
initNewGame();
break;
case 5: //New Game, Normal
player.difficulty=NORMAL;
writeSettings();
resumeGame();
initNewGame();
break;
case 6: //New game, easy
player.difficulty=EASY;
writeSettings();
resumeGame();
initNewGame();
break;
}
var.menuPressed=0;
}
var.menuNumItems=7;
} else if(var.menu==6)
{
//Exit
glLoadIdentity();
glTranslatef(0.0, 0.54,-3.0f);
glCallList(dl+2);
glColor4f(0,0,0,1);
glText->write("Exit Game?", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
//Yes
glTranslatef(0.0,-0.44,0.0f);
if(var.menuItem==5)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(1,0,0,1);
glText->write("Yes.", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
//Noes!
glTranslatef(0.0,-0.22,0.0f);
if(var.menuItem==4)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,1,0,1);
glText->write("No way!", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
if(var.menuPressed)
{
switch(var.menuItem)
{
case 4: //no
var.menu=1;
break;
case 5: //Yes
var.quit=1;
break;
}
var.menuPressed=0;
}
var.menuNumItems=5;
} else if(var.menu==7) // highscores
{
//Highscores
glLoadIdentity();
glTranslatef(0.0, 0.54,-3.0f);
if(var.menuItem==7)
glCallList(dl+2);
else
glCallList(dl+3);
glColor4f(1,1,1,1);
glText->write("Highscores", FONT_MENU, 1, 1.0, 0.0, -0.005);
glTranslatef(0.0, -0.75, 0.0f);
glBindTexture(GL_TEXTURE_2D, tex[4].prop.texture);
glEnable(GL_TEXTURE_2D);
glColor4f(1.0,1.0,1.0,1.0);
glBegin( GL_QUADS );
glTexCoord2f( 0.0, 0.0 ); glVertex3f( -0.8, 0.63, 0.0 );
glTexCoord2f( 1.0, 0.0 ); glVertex3f( 0.8, 0.63, 0.0 );
glTexCoord2f( 1.0, 1.0 ); glVertex3f( 0.8,-0.63, 0.0 );
glTexCoord2f( 0.0, 1.0 ); glVertex3f( -0.8,-0.63, 0.0 );
glEnd( );
glLoadIdentity();
glTranslatef(0.0, 0.435,-3.0f);
//Find out how many lines we have room for in the box.
int nl= (1.26/glText->getHeight(FONT_MENUHIGHSCORE));
//If theres room for more than 20, only show 20..
nl > 20 ? nl=20 : nl=nl;
for(int i=0; i < nl; i++)
{
glTranslatef(0.0, -glText->getHeight(FONT_MENUHIGHSCORE),0.0f);
glText->write(highScores[i], FONT_MENUHIGHSCORE, 0, 1.0, -0.75, 0.0);
}
if(var.menuPressed)
{
switch(var.menuItem)
{
case 7:
var.menu=1;
break;
}
var.menuPressed=0;
}
} else if(var.menu==8)
{
//Load game
glLoadIdentity();
glTranslatef(0.0, 0.54,-3.0f);
if(var.menuItem==8)
glCallList(dl+2);
else
glCallList(dl+3);
glColor4f(1,1,1,1);
glText->write("Load Game", FONT_MENU, 1, 1.0, 0.0, -0.005);
for(int i=0; i < 6; i++)
{
glTranslatef(0.0,-0.22,0.0f);
if(var.menuItem==6-i)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
glText->write(saveGameName[i], FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
}
if(var.menuPressed)
{
if(var.menuItem==7)
{
var.menu=1;
} else if(var.menuItem !=0)
{
loadGame(var.menuItem*-1 +6);
var.menu=0;
resumeGame();
}
var.menuPressed=0;
}
} else if(var.menu == 9)
{
//Save game
//Back
if(var.enterSaveGameName)
{
glLoadIdentity();
glTranslatef(0.0, 0.54,-3.0f);
glTranslatef(0.0, 0.12,0.0f);
glColor4f(0,0,0,1);
glText->write("Enter name and press Enter to save. ESC to cancel", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,0,0,1);
}
glLoadIdentity();
glTranslatef(0.0, 0.54,-3.0f);
if(var.menuItem==8)
glCallList(dl+2);
else
glCallList(dl+3);
glColor4f(1,1,1,1);
glText->write("Save Game", FONT_MENU, 1, 1.0, 0.0, -0.005);
for(int i=0; i < 6; i++)
{
glTranslatef(0.0,-0.22,0.0f);
if(var.menuItem==6-i)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
glText->write(saveGameName[i], FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
}
if(var.menuPressed)
{
if(var.menuItem==7)
{
var.menu=1;
} else if(var.menuItem !=0)
{
var.enterSaveGameName = 1;
saveGameSlot = (var.menuItem*-1 +6);
saveGameName[saveGameSlot]="";
}
var.menuPressed=0;
}
} else if(var.menu == 10)
{
//Joystick options
glLoadIdentity();
glTranslatef(0.0, 0.54,-3.0f);
glCallList(dl+3);
glColor4f(1,1,1,1);
glText->write("Calibrate Joystick", FONT_MENU, 1, 1.0, 0.0, -0.005);
glTranslatef(0.0,-0.22,0.0f);
if(var.menuItem==6)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
if(setting.joyIsDigital)
glText->write("Digital Joystick", FONT_MENU, 1, 1.0, 0.0, -0.005);
else
glText->write("Analog Joystick", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
glTranslatef(0.0,-0.22,0.0f);
if(!setting.joyIsDigital)
{
if(var.menuItem==5)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
if(var.menuJoyCalStage==0)
glText->write("Start Calibration", FONT_MENU, 1, 1.0, 0.0, -0.005);
else if(var.menuJoyCalStage==1)
glText->write("Center, Push", FONT_MENU, 1, 1.0, 0.0, -0.005);
else if(var.menuJoyCalStage==2)
glText->write("Move Left, Push", FONT_MENU, 1, 1.0, 0.0, -0.005);
else if(var.menuJoyCalStage==3)
glText->write("Move Right, Push", FONT_MENU, 1, 1.0, 0.0, -0.005);
else if(var.menuJoyCalStage==4)
glText->write("Saving...", FONT_MENU, 1, 1.0, 0.0, -0.005);
else if(var.menuJoyCalStage==5)
glText->write("Finished.", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
}
glTranslatef(0.0,-0.22,0.0f);
glTranslatef(0.0,-0.22,0.0f);
glTranslatef(0.0,-0.22,0.0f);
glTranslatef(0.0,-0.22,0.0f);
if(var.menuItem==1)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
glText->write("Back", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
if(var.menuPressed)
{
switch(var.menuItem)
{
case 1:
var.menu=2;
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
if(!var.menuJoyCalStage)
var.menuJoyCalStage=1;
break;
case 6:
if(setting.joyIsDigital)
setting.joyIsDigital=0;
else
setting.joyIsDigital=1;
writeSettings();
break;
}
var.menuPressed=0;
}
var.menuNumItems=6;
}
#ifdef WITH_WIIUSE
else if(var.menu == 11) //Wiimote
{
glLoadIdentity();
glTranslatef(0.0, 0.54,-3.0f);
glCallList(dl+3);
glColor4f(1,1,1,1);
glText->write("Connect WiiMote", FONT_MENU, 1, 1.0, 0.0, -0.005);
glTranslatef(0.0,-0.22,0.0f);
if(var.menuItem==6 && !var.wiiConnect)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
if(var.menuJoyCalStage==-2)
glText->write("1+2 on WiiMote", FONT_MENU, 1, 1.0, 0.0, -0.005);
else if(var.menuJoyCalStage==-3)
glText->write("WiiMote Connected!", FONT_MENU, 1, 1.0, 0.0, -0.005);
else if(var.menuJoyCalStage==-4)
glText->write("Failed! Try again.", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
glCallList(dl+3);
glTranslatef(0.0,-1.0,0.0);
if(var.menuItem==1)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
glText->write("Back", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
if(var.menuPressed)
{
switch(var.menuItem)
{
case 6:
if(!var.wiiConnect)
{
var.menu=11;
var.menuJoyCalStage=-1;
}
break;
case 1:
var.menu=2;
break;
}
var.menuPressed=0;
}
var.menuNumItems=6;
}
#endif
else if(var.menu == 12) //Theme selector (Main screen)
{
glLoadIdentity();
glTranslatef(0.0, 0.54,-3.0f);
glCallList(dl+3);
if(!themeChanged)
{
glColor4f(0,0,0,1);
glText->write("Themes", FONT_MENU, 1, 1.0, 0.0, -0.005);
} else {
glColor4f(1,0,0,1);
glText->write("Restart to apply", FONT_MENU, 1, 1.0, 0.0, -0.005);
}
glColor4f(1,1,1,1);
int i=0;
for(vector::iterator it=tI.begin(); it < tI.end(); ++it)
{
if(i ==5)
break;
glTranslatef(0.0,-0.22,0.0f);
if(var.menuItem==6-i)
glCallList(dl+2);
else if(it->name.compare(setting.gfxTheme)==0)
glCallList(dl+3);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
glText->write(it->name, FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
i++;
}
for(int a=i; a < 6; a++)
{
glTranslatef(0.0,-0.22,0.0f);
}
if(var.menuItem==1)
glCallList(dl+2);
else
glCallList(dl+1);
glColor4f(0,0,0,1);
glText->write("Back", FONT_MENU, 1, 1.0, 0.0, -0.005);
glColor4f(1,1,1,1);
}
if(var.menuPressed)
{
switch(var.menuItem)
{
case 1:
var.menu=2;
break;
}
for(i=0; i < (int)tI.size() && i<5; i++)
{
if(6-i == var.menuItem)
{
setting.gfxTheme = tI.at(i).name;
setting.sndTheme = tI.at(i).name;
setting.lvlTheme = tI.at(i).name;
themeChanged=1;
writeSettings();
}
}
var.menuPressed=0;
}
}
};