1
0
Fork 0
blockofighter/src/menu.cpp

901 lines
18 KiB
C++

/*
* $Id: menu.cpp,v 1.14 2002/07/22 01:14:14 msell Exp $
*
*
* $Log: menu.cpp,v $
* Revision 1.14 2002/07/22 01:14:14 msell
* Lopetussysteemi
*
* Revision 1.13 2002/07/21 22:50:39 msell
* no message
*
* Revision 1.12 2002/07/21 20:14:28 msell
* no message
*
* Revision 1.11 2002/07/21 16:37:00 msell
* no message
*
* Revision 1.10 2002/07/19 22:38:37 msell
* Pingviini
*
* Revision 1.9 2002/07/19 14:05:52 msell
* Damagetextuurit näkyy
*
* Revision 1.8 2002/07/19 12:28:29 msell
* 2D-mode
*
* Revision 1.7 2002/07/19 12:10:53 msell
* Hups
*
* Revision 1.6 2002/07/18 23:05:31 msell
* Partikkelit ja kakkospelaajan liike
*
* Revision 1.5 2002/07/17 22:45:54 msell
* Ääniä vähän
*
* Revision 1.4 2002/07/17 20:32:47 msell
* Detail-optio toimii
*
* Revision 1.3 2002/07/17 16:40:33 msell
* Resoluution vaihto
*
* Revision 1.2 2002/07/16 18:55:16 msell
* Äänet valikkoon
*
* Revision 1.1 2002/07/16 17:16:35 msell
* Fontit ja valikot
*
*
*
* $Date: 2002/07/22 01:14:14 $
*
*/
#include "main.h"
#include <math.h>
#include "legoblocks.h"
#include "camera.h"
#include "light.h"
#include "audio.h"
#include "object.h"
#include "appearance.h"
#include "sphere.h"
#include "vector.h"
#include "collision.h"
#include "utils.h"
#include "graphics.h"
#include "objectfactory.h"
#include "world.h"
#include "3dutils.h"
#include "legoman.h"
#include "font.h"
#include "run.h"
#include "menu.h"
#include "fight.h"
#include "glapi.h"
Camera titlecamera;
Light titlelight;
World *titleworld;
Sound *changesound;
Sound *selectsound;
Sound *menumusic;
bool menuinitialized = false;
void initMenu(void){
if (!menuinitialized){
titleworld = new World();
}
titlelight.setColor(1, 1, 1);
titlelight.setSpecular(1, 1, 1);
titlelight.setPosition(-0.5, BLOCKHEIGHT*16, 0.5);
titlelight.setAttenuation(0.0, 0.0, 0.01);
if (!menuinitialized){
Object *lamp;
lamp = new Object();
lamp->appearance = new LampAppearance();
lamp->setPosition(-0.5, BLOCKHEIGHT*15.5, 0.5);
titleworld->addChild(lamp);
//Floor
BasicBlock *floorblock;
floorblock = new BasicBlock(33, 1, 5);
floorblock->setPosition(-0.5, -BLOCKHEIGHT/2.0 + BLOCKHEIGHT*(4*3+1), 0.5-5);
floorblock->setColor(0, 1, 0);
titleworld->addChild(floorblock);
floorblock = new BasicBlock(41, 1, 10);
floorblock->setPosition(8.5-5, -BLOCKHEIGHT/2.0, 0.5-2.5);
floorblock->setColor(0, 1, 0);
titleworld->addChild(floorblock);
floorblock = new BasicBlock(1, 4*3, 1);
floorblock->setPosition(-14.5, BLOCKHEIGHT*4*3/2.0, 0.5-5);
floorblock->setColor(1, 0, 0);
titleworld->addChild(floorblock);
floorblock = new BasicBlock(1, 4*3, 1);
floorblock->setPosition(13.5, BLOCKHEIGHT*4*3/2.0, 0.5-5);
floorblock->setColor(1, 0, 0);
titleworld->addChild(floorblock);
//Letters
//B
/*int Bsize = 8;
int Bwidth = 5;
int Bletter[8][4] = {
{0, 0, 4, 1},
{0, 4, 3, 1},
{0, 8, 4, 1},
{0, 1, 1, 7},
//{3, 1, 2, 1},
{2, 3, 3, 1},
{2, 5, 3, 1},
//{3, 7, 2, 1},
{4, 0, 1, 3},
{4, 6, 1, 3}};*/
int Bsize = 10;
int Bwidth = 5;
int Bletter[10][4] = {
{0, 0, 4, 1},
{0, 4, 4, 1},
{0, 8, 4, 1},
{0, 1, 1, 7},
{3, 1, 2, 1},
{3, 3, 2, 1},
{3, 5, 2, 1},
{3, 7, 2, 1},
{4, 2, 1, 1},
{4, 6, 1, 1}};
//l
int lsize = 2;
int lwidth = 4;
int lletter[2][4] = {
{0, 0, 4, 1},
{0, 1, 1, 4}};
//o
int osize = 4;
int owidth = 4;
int oletter[4][4] = {
{0, 0, 4, 1},
{0, 4, 4, 1},
{0, 1, 1, 3},
{3, 1, 1, 3}};
//c
int csize = 5;
int cwidth = 4;
int cletter[5][4] = {
{0, 0, 4, 1},
{0, 4, 4, 1},
{0, 1, 1, 3},
{3, 1, 1, 1},
{3, 3, 1, 1}};
/* {1, 0, 2, 1},
{1, 4, 2, 1},
{0, 1, 1, 3},
{3, 1, 1, 1},
{3, 3, 1, 1}};*/
//k
int ksize = 6;
int kwidth = 4;
int kletter[6][4] = {
{0, 0, 1, 5},
{1, 2, 2, 1},
{2, 1, 2, 1},
{2, 3, 2, 1},
{3, 0, 1, 1},
{3, 4, 1, 1}};
/* {0, 0, 1, 5},
{1, 2, 1, 1},
{2, 1, 1, 1},
{2, 3, 1, 1},
{3, 0, 1, 1},
{3, 4, 1, 1}};*/
//F
int Fsize = 3;
int Fwidth = 3;
int Fletter[3][4] = {
{0, 0, 1, 7},
{0, 4, 3, 1},
{0, 7, 6, 1}};
//i
int isize = 1;
int iwidth = 1;
int iletter[1][4] = {
{0, 0, 1, 4}};
//g
int gsize = 5;
int gwidth = 4;
int gletter[5][4] = {
{0, 0, 4, 1},
{0, 4, 4, 1},
{0, 1, 1, 3},
{3, 1, 1, 1},
{2, 2, 2, 1}};
//h
int hsize = 3;
int hwidth = 1;
int hletter[3][4] = {
{0, 0, 1, 5},
{3, 0, 1, 5},
{0, 2, 4, 1}};
//t
int tsize = 2;
int twidth = 4;
int tletter[2][4] = {
{3, 0, 1, 6},
{0, 6, 7, 1}};
//e
int esize = 5;
int ewidth = 4;
int eletter[5][4] = {
{0, 0, 4, 1},
{0, 4, 4, 1},
{0, 2, 3, 1},
{0, 1, 1, 1},
{0, 3, 1, 1}};
//r
int rsize = 6;
int rwidth = 4;
int rletter[6][4] = {
{0, 0, 1, 5},
{0, 2, 3, 1},
{0, 4, 3, 1},
{2, 1, 2, 1},
{3, 0, 1, 1},
{2, 3, 2, 1}};
/*int rsize = 5;
int rwidth = 4;
int rletter[5][4] = {
{0, 0, 1, 5},
{0, 2, 3, 1},
{0, 4, 3, 1},
{3, 0, 1, 2},
{3, 3, 1, 1}};*/
#define LETTERCOUNT 6
int lettersizes[LETTERCOUNT] = {
Bsize,
lsize,
osize,
csize,
ksize,
osize
};
int letterwidths[LETTERCOUNT] = {
Bwidth,
lwidth,
owidth,
cwidth,
kwidth,
owidth
};
int *letters[LETTERCOUNT] = {
&Bletter[0][0],
&lletter[0][0],
&oletter[0][0],
&cletter[0][0],
&kletter[0][0],
&oletter[0][0]
};
#define LETTERCOUNT2 7
int lettersizes2[LETTERCOUNT2] = {
Fsize,
isize,
gsize,
hsize,
tsize,
esize,
rsize
};
int letterwidths2[LETTERCOUNT2] = {
Fwidth,
iwidth,
gwidth,
hwidth,
twidth,
ewidth,
rwidth
};
int *letters2[LETTERCOUNT2] = {
&Fletter[0][0],
&iletter[0][0],
&gletter[0][0],
&hletter[0][0],
&tletter[0][0],
&eletter[0][0],
&rletter[0][0]
};
BasicBlock *letterblock;
float z = 0.5;
int i, j;
int dx = -15;
int dy = BLOCKHEIGHT*(4*3+1);
int dz = -5;
for (i = 0; i < LETTERCOUNT; i++){
int size = lettersizes[i];
int width = letterwidths[i];
for (j = 0; j < size; j++){
int x = letters[i][j*4+0];
int y = letters[i][j*4+1]*3;
int w = letters[i][j*4+2];
int h = letters[i][j*4+3]*3;
letterblock = new BasicBlock(w, h, 1);
letterblock->setPosition(dx+x+w/2.0, dy+BLOCKHEIGHT*(y+h/2.0), dz+z + randomf(0.1));
letterblock->setColor(1, 0.5, 1);
titleworld->addChild(letterblock);
}
dx += width + 1;
}
dx = -5;
dy = 0;
dz = 0;
for (i = 0; i < LETTERCOUNT2; i++){
int size = lettersizes2[i];
int width = letterwidths2[i];
for (j = 0; j < size; j++){
int x = letters2[i][j*4+0];
int y = letters2[i][j*4+1]*3;
int w = letters2[i][j*4+2];
int h = letters2[i][j*4+3]*3;
letterblock = new BasicBlock(w, h, 1);
letterblock->setPosition(dx+x+w/2.0, dy+BLOCKHEIGHT*(y+h/2.0), dz+z + randomf(0.1));
//float rotate[3] = {0, randomf(0.1), 0};
//matrixCreateRotation(letterblock->rotation, rotate);
letterblock->setColor(1, 0.5, 1);
titleworld->addChild(letterblock);
}
dx += width + 1;
}
Object *flower;
flower = new Object();
flower->appearance = new FlowerAppearance(FLOWER_RED, FLOWER_WHITE, FLOWER_YELLOW);
flower->setPosition(-7.5, 0, 1.5);
titleworld->addChild(flower);
flower = new Object();
flower->appearance = new FlowerAppearance(FLOWER_YELLOW, FLOWER_RED, FLOWER_YELLOW);
flower->setPosition(-11.5, 0, -2.5);
titleworld->addChild(flower);
flower = new Object();
flower->appearance = new FlowerAppearance(FLOWER_WHITE, FLOWER_WHITE, FLOWER_RED);
flower->setPosition(-14.5, 0, 0.5);
titleworld->addChild(flower);
changesound = new Sound(DATAPATH"menuchange.wav");
selectsound = new Sound(DATAPATH"menuselect.wav");
menumusic = new Sound(DATAPATH"menu.mp3", true);
}
titleworld->prepare();
menuinitialized = true;
}
#define MODEMAIN 0
#define MODEOPTIONS 1
#define MAINSTART 0
#define MAINOPTIONS 1
#define MAINQUIT 2
#define OPTIONSRESOLUTION 0
#define OPTIONSFULLSCREEN 1
#define OPTIONSDETAIL 2
#define OPTIONSRETURN 3
int menuoption = MAINSTART;
int maxoption;
int menumode = MODEMAIN;
bool pressed = false;
float obx1, oby1, obx2, oby2;
float bx1, by1, bx2, by2;
float interpolator = 1.0;
int xres, yres;
int oldresolution;
int resolution = 2;
bool fullscreen = false;
int olddetail;
int detail = 2;
#define RESOLUTIONCOUNT 6
int resolutions[RESOLUTIONCOUNT][2] = {
{640, 480},
{800, 600},
{1024, 768},
{1280, 960},
{1280, 1024},
{1600, 1200}
};
#define DETAILCOUNT 4
char *details[DETAILCOUNT] = {"Off", "Low", "Medium", "High"};
int menurestartcounter = -1;
void menuRestart(void){
menurestartcounter = 0;
}
void menuMain(void){
interpolator = 0.0;
menumode = MODEMAIN;
menuoption = MAINOPTIONS;
obx1 = bx1;
oby1 = by1;
obx2 = bx2;
oby2 = by2;
}
float menufade;
int gamestart = 0;
bool loading = true;
void menuStartGame(void){
menumusic->fadeOut(300);
gamestart = 200;
menurestartcounter = -1;
}
void menuStartGame2(void){
titlelight.setEnabled(false);
changeGameMode(FIGHTMODE);
startFight();
menurestartcounter = -1;
}
void menuOptions(void){
interpolator = 0.0;
menumode = MODEOPTIONS;
menuoption = OPTIONSRESOLUTION;
obx1 = bx1;
oby1 = by1;
obx2 = bx2;
oby2 = by2;
oldresolution = resolution;
olddetail = detail;
}
int quitcounter = -1;
void menuEscPressed(void){
menurestartcounter = -1;
//menumusic->stop();
menumusic->fadeOut(200);
quitcounter = 0;
}
void menuQuit(void){
exitProgram(0);
}
void menuResolution(int dir){
resolution += dir;
if (resolution < 0) resolution = 0;
if (resolution >= RESOLUTIONCOUNT) resolution = RESOLUTIONCOUNT-1;
//resolution = (resolution + RESOLUTIONCOUNT) % RESOLUTIONCOUNT;
}
void calculateMenu(int framecount){
if (framecount == 1){
menumusic->setVolume(0);
menumusic->play();
menumusic->fadeIn(300);
}
if (menurestartcounter != -1){
menurestartcounter++;
if (menurestartcounter == 300){
menumusic->play();
menumusic->fadeIn(100);
menurestartcounter = -1;
}
}
menufade = -1;
titlelight.setEnabled(true);
if (framecount < 200){
menufade = 1-framecount/200.0;
} else{
loading = false;
}
if (gamestart > 0){
gamestart--;
if (gamestart == 0){
menuStartGame2();
}
menufade = (200-gamestart)/200.0;
}
if (quitcounter != -1){
menufade = quitcounter/200.0;
quitcounter++;
if (quitcounter == 200) menuQuit();
}
float cameratarget[3] = {0, 0, 0};
titlecamera.setPosition(sin(framecount*0.001)*2-8, sin(framecount*0.0033)*2+15, cos(framecount*0.001)*2+25);
titlecamera.setTarget(cameratarget);
titleworld->move();
xres = resolutions[resolution][0];
yres = resolutions[resolution][1];
switch(menumode){
case MODEMAIN:
maxoption = 2;
bx1 = 0.03;
by1 = 0.49;
bx2 = 0.68;
by2 = 0.96;
break;
case MODEOPTIONS:
maxoption = 3;
bx1 = 0.1;
by1 = 0.3;
bx2 = 0.9;
by2 = 0.8;
break;
}
if (interpolator < 1.0){
interpolator += 0.02;
} else{
interpolator = 1.0;
if (menufade == -1){
if (keys[SDLK_DOWN]){
if (!pressed){
/*if (menuoption < maxoption){
menuoption++;
changesound->play();
}*/
menuoption = (menuoption + 1)%(maxoption+1);
changesound->play();
pressed = true;
}
} else if (keys[SDLK_UP]){
if (!pressed){
/*if (menuoption > 0){
menuoption--;
changesound->play();
}*/
menuoption = (menuoption + maxoption)%(maxoption+1);
changesound->play();
pressed = true;
}
} else if (keys[SDLK_LEFT]){
if (!pressed){
switch(menumode){
case MODEOPTIONS:
switch(menuoption){
case OPTIONSRESOLUTION:
menuResolution(-1);
break;
case OPTIONSDETAIL:
if (detail > 0) detail--;
break;
}
break;
}
selectsound->play();
pressed = true;
}
} else if (keys[SDLK_RIGHT]){
if (!pressed){
switch(menumode){
case MODEOPTIONS:
switch(menuoption){
case OPTIONSRESOLUTION:
menuResolution(1);
break;
case OPTIONSDETAIL:
if (detail < DETAILCOUNT-1) detail++;
break;
}
break;
}
selectsound->play();
pressed = true;
}
} else if (keys[SDLK_ESCAPE]){
if (!pressed){
switch(menumode){
case MODEMAIN:
if (menuoption != MAINQUIT){
menuoption = MAINQUIT;
changesound->play();
}
else menuEscPressed();
break;
case MODEOPTIONS:
selectsound->play();
resolution = oldresolution;
detail = olddetail;
menuMain();
break;
}
pressed = true;
}
} else if (keys[SDLK_RETURN]){
if (!pressed){
switch(menumode){
case MODEMAIN:
switch(menuoption){
case MAINSTART:
menuStartGame();
break;
case MAINOPTIONS:
menuOptions();
break;
case MAINQUIT:
menuEscPressed();
break;
}
break;
case MODEOPTIONS:
switch(menuoption){
case OPTIONSRESOLUTION:
if (resolution != oldresolution) changeResolution(xres, yres, fullscreen);
oldresolution = resolution;
break;
case OPTIONSFULLSCREEN:
fullscreen = !fullscreen;
changeResolution(xres, yres, fullscreen);
break;
case OPTIONSDETAIL:
setDetail(detail);
olddetail = detail;
break;
case OPTIONSRETURN:
if (resolution != oldresolution){
changeResolution(xres, yres, fullscreen);
oldresolution = resolution;
}
if (detail != olddetail){
setDetail(detail);
olddetail = detail;
}
menuMain();
break;
}
break;
}
selectsound->play();
pressed = true;
}
} else pressed = false;
}
}
}
void drawMenu(int framecount){
//createSkyBox(0, -20, 0, 400, 200, 400);
createSkyBox(-200, -200, -200, 400, 400, 400);
glLoadIdentity();
titlecamera.glUpdate();
updateLights();
titleworld->draw();
flaretexture->enable();
titlelight.createFlare();
flaretexture->disable();
/*//2D-view
glDisable(GL_LIGHTING);
glDisable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluOrtho2D(0, 1, 1, 0);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();*/
enable2D();
glColor3f(1, 1, 1);
print(0.73, 0.55,
"Programming:\n" \
" Miika Sell\n" \
" Juha Kaarlas\n" \
"\n" \
"Graphics:\n" \
" Miika Sell\n" \
" Juha Kaarlas\n" \
"\n" \
"Musics:\n" \
" Osmand"
, 0.03);
print(0.35, 0.965, "http://blockofighter.kicks-ass.net/", 0.02);
print(0.88, 0.96, "Version 2.0", 0.02);
tuxtexture->enable();
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glColor3f(1, 1, 1);
float tuxx = 0.9;
float tuxy = 0.02;
float tuxw = 0.1*3/4;
float tuxh = 0.1;
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2f(tuxx, tuxy);
glTexCoord2f(1, 0);
glVertex2f(tuxx+tuxw, tuxy);
glTexCoord2f(1, 1);
glVertex2f(tuxx+tuxw, tuxy+tuxh);
glTexCoord2f(0, 1);
glVertex2f(tuxx, tuxy+tuxh);
glEnd();
tuxtexture->disable();
glColor3f(1, 1, 1);
print(0.88, 0.12, "supported", 0.02);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glColor4f(0, 0, 0, 0.5);
float x1, y1, x2, y2;
x1 = (1-interpolator)*obx1 + interpolator*bx1;
y1 = (1-interpolator)*oby1 + interpolator*by1;
x2 = (1-interpolator)*obx2 + interpolator*bx2;
y2 = (1-interpolator)*oby2 + interpolator*by2;
glBegin(GL_QUADS);
glVertex2f(x1, y1);
glVertex2f(x2, y1);
glVertex2f(x2, y2);
glVertex2f(x1, y2);
glEnd();
if (interpolator == 1.0){
switch(menumode){
case MODEMAIN:
glColor3f(1, 1, 1);
print(0.05, 0.5, "Start game", 0.1);
print(0.05, 0.65, "Options", 0.1);
print(0.05, 0.8, "Quit", 0.1);
x1 = 0.04;
x2 = 0.67;
switch(menuoption){
case 0:
y1 = 0.5;
y2 = 0.65;
break;
case 1:
y1 = 0.65;
y2 = 0.79;
break;
case 2:
y1 = 0.79;
y2 = 0.95;
break;
}
break;
case MODEOPTIONS:
glColor3f(1, 1, 1);
char resolutionstring[22];
sprintf(resolutionstring, "Resolution: %ix%i", xres, yres);
print(0.12, 0.32, resolutionstring, 0.07);
print(0.12, 0.42, "Toggle fullscreen", 0.07);
char detailstring[22];
sprintf(detailstring, "Detail: %s", details[detail]);
print(0.12, 0.52, detailstring, 0.07);
print(0.12, 0.68, "Save and return", 0.07);
x1 = 0.11;
x2 = 0.89;
switch(menuoption){
case 0:
y1 = 0.32;
y2 = 0.42;
break;
case 1:
y1 = 0.42;
y2 = 0.52;
break;
case 2:
y1 = 0.52;
y2 = 0.62;
break;
case 3:
y1 = 0.68;
y2 = 0.78;
break;
}
break;
}
glLineWidth(2);
glColor4f(sin(framecount*0.04)*0.4+0.6, sin(framecount*0.04)*0.4+0.6, sin(framecount*0.04)*0.4+0.6, 0.5);
glBegin(GL_LINE_LOOP);
glVertex2f(x1, y1);
glVertex2f(x2, y1);
glVertex2f(x2, y2);
glVertex2f(x1, y2);
glEnd();
}
if (menufade != -1){
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glColor4f(0, 0, 0, menufade);
glBegin(GL_QUADS);
glVertex2f(0, 0);
glVertex2f(1, 0);
glVertex2f(1, 1);
glVertex2f(0, 1);
glEnd();
if (loading){
glColor4f(menufade, menufade, menufade, menufade);
print(0.08, 0.4, "Loading...", 0.2);
}
}
disable2D();
/*//Back to 3D-view
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);*/
}