#include "Awards.h"
#include "Menu.h"
-#include <dirent.h>
-
-using namespace std;
-
extern XYZ viewer;
extern int environment;
extern float texscale;
extern bool showdamagebar;
+
+
+int drawtoggle = 0;
+int numboundaries = 0;
+XYZ boundary[360];
+int change = 0;
+
+
+
enum drawmodes {
normalmode, motionblurmode, radialzoommode,
realmotionblurmode, doublevisionmode, glowmode,
flashamount=1;
flashdelay=1;
}
+
+void DrawMenu();
+
/*********************> DrawGLScene() <*****/
int Game::DrawGLScene(StereoSide side)
-{
+{
static float texcoordwidth,texcoordheight;
static float texviewwidth, texviewheight;
static int i,j,k,l;
static char string[256]="";
static char string2[256]="";
static char string3[256]="";
+ static int drawmode = 0;
if ( stereomode == stereoAnaglyph ) {
switch(side) {
static int changed;
changed=0;
- olddrawmode=drawmode;
+ int olddrawmode=drawmode;
if(ismotionblur&&!loading){
if((findLengthfast(&player[0].velocity)>200)&&velocityblur&&!cameramode){
drawmode=motionblurmode;
static XYZ terrainlight;
static float distance;
if(drawmode==normalmode)
- ReSizeGLScene(90,.1f);
+ Game::ReSizeGLScene(90,.1f);
if(drawmode!=normalmode)
glViewport(0,0,texviewwidth,texviewheight);
glDepthFunc(GL_LEQUAL);
//shake
glRotatef(float(Random()%100)/10*camerashake/*+(woozy*woozy)/10*/,0,0,1);
//sway
- glRotatef(rotation2+sin(woozy/2)*(player[0].damage/player[0].damagetolerance)*5,1,0,0);
- glRotatef(rotation+sin(woozy)*(player[0].damage/player[0].damagetolerance)*5,0,1,0);
+ glRotatef(pitch+sin(woozy/2)*(player[0].damage/player[0].damagetolerance)*5,1,0,0);
+ glRotatef(yaw+sin(woozy)*(player[0].damage/player[0].damagetolerance)*5,0,1,0);
}
if(cameramode||freeze||winfreeze){
- glRotatef(rotation2,1,0,0);
- glRotatef(rotation,0,1,0);
+ glRotatef(pitch,1,0,0);
+ glRotatef(yaw,0,1,0);
}
if(environment==desertenvironment){
glRotatef((float)(abs(Random()%100))/1000,1,0,0);
glRotatef((float)(abs(Random()%100))/1000,0,1,0);
}
- skybox.draw();
+ skybox->draw();
glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0);
glPopMatrix();
glTranslatef(-viewer.x,-viewer.y,-viewer.z);
if(frustum.SphereInFrustum(player[k].coords.x,player[k].coords.y+player[k].scale*3,player[k].coords.z,player[k].scale*7)&&player[k].occluded<25)
for(i=0;i<player[k].skeleton.num_joints;i++){
if(player[k].skeleton.joints[i].label==leftknee||player[k].skeleton.joints[i].label==rightknee||player[k].skeleton.joints[i].label==groin){
- point=DoRotation(player[k].skeleton.joints[i].position,0,player[k].rotation,0)*player[k].scale+player[k].coords;
+ point=DoRotation(player[k].skeleton.joints[i].position,0,player[k].yaw,0)*player[k].scale+player[k].coords;
size=.4f;
opacity=.4-player[k].skeleton.joints[i].position.y*player[k].scale/5-(player[k].coords.y-terrain.getHeight(player[k].coords.x,player[k].coords.z))/10;
if(k!=0&&tutoriallevel==1){
for(l=0;l<terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz];l++){
j=terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
if(objects.position[j].y<player[k].coords.y||objects.type[j]==tunneltype||objects.type[j]==weirdtype){
- point=DoRotation(DoRotation(player[k].skeleton.joints[i].position,0,player[k].rotation,0)*player[k].scale+player[k].coords-objects.position[j],0,-objects.rotation[j],0);
+ point=DoRotation(DoRotation(player[k].skeleton.joints[i].position,0,player[k].yaw,0)*player[k].scale+player[k].coords-objects.position[j],0,-objects.yaw[j],0);
size=.4f;
opacity=.4f;
if(k!=0&&tutoriallevel==1){
if(player[k].skeleton.free)
point=player[k].skeleton.joints[i].position*player[k].scale+player[k].coords;
else
- point=DoRotation(player[k].skeleton.joints[i].position,0,player[k].rotation,0)*player[k].scale+player[k].coords;
+ point=DoRotation(player[k].skeleton.joints[i].position,0,player[k].yaw,0)*player[k].scale+player[k].coords;
size=.4f;
opacity=.4-player[k].skeleton.joints[i].position.y*player[k].scale/5-(player[k].coords.y-terrain.getHeight(player[k].coords.x,player[k].coords.z))/5;
if(k!=0&&tutoriallevel==1){
for(l=0;l<terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz];l++){
j=terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
if(objects.position[j].y<player[k].coords.y||objects.type[j]==tunneltype||objects.type[j]==weirdtype){
- if(player[k].skeleton.free)point=DoRotation(player[k].skeleton.joints[i].position*player[k].scale+player[k].coords-objects.position[j],0,-objects.rotation[j],0);
- else point=DoRotation(DoRotation(player[k].skeleton.joints[i].position,0,player[k].rotation,0)*player[k].scale+player[k].coords-objects.position[j],0,-objects.rotation[j],0);
+ if(player[k].skeleton.free)point=DoRotation(player[k].skeleton.joints[i].position*player[k].scale+player[k].coords-objects.position[j],0,-objects.yaw[j],0);
+ else point=DoRotation(DoRotation(player[k].skeleton.joints[i].position,0,player[k].yaw,0)*player[k].scale+player[k].coords-objects.position[j],0,-objects.yaw[j],0);
size=.4f;
opacity=.4f;
if(k!=0&&tutoriallevel==1){
terrain.MakeDecal(shadowdecal,point,size,opacity*.7,rotation);
for(l=0;l<terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz];l++){
j=terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
- point=DoRotation(player[k].coords-objects.position[j],0,-objects.rotation[j],0);
+ point=DoRotation(player[k].coords-objects.position[j],0,-objects.yaw[j],0);
size=.7;
opacity=.4f;
objects.model[j].MakeDecal(shadowdecal,&point,&size,&opacity,&rotation);
glDisable(GL_BLEND);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glBindTexture( GL_TEXTURE_2D, terraintexture);
+ terraintexture.bind();
terrain.draw(0);
- glBindTexture( GL_TEXTURE_2D, terraintexture2);
+ terraintexture2.bind();
terrain.draw(1);
//glBindTexture( GL_TEXTURE_2D, terraintexture3);
//glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glEnable(GL_LIGHTING);
terrainlight=terrain.getLighting(player[k].coords.x,player[k].coords.z);
- distance=findDistancefast(&viewer,&player[k].coords);
+ distance=distsq(&viewer,&player[k].coords);
distance=(viewdistance*viewdistance-(distance-(viewdistance*viewdistance*fadestart))*(1/(1-fadestart)))/viewdistance/viewdistance;
glColor4f(terrainlight.x,terrainlight.y,terrainlight.z,distance);
if(distance>=1)
glDisable(GL_BLEND);
if(distance>=.5){
- checkpoint=DoRotation(player[k].skeleton.joints[abs(Random()%player[k].skeleton.num_joints)].position,0,player[k].rotation,0)*player[k].scale+player[k].coords;
+ checkpoint=DoRotation(player[k].skeleton.joints[abs(Random()%player[k].skeleton.num_joints)].position,0,player[k].yaw,0)*player[k].scale+player[k].coords;
checkpoint.y+=1;
if(!player[k].occluded==0)
i=checkcollide(viewer,checkpoint,player[k].lastoccluded);
}
if(!cameramode&&musictype==stream_fighttheme)
- playerdist=findDistancefastflat(&player[0].coords,&viewer);
+ playerdist=distsqflat(&player[0].coords,&viewer);
else
playerdist=-100;
glPushMatrix();
glDisable(GL_LIGHTING);
glEnable(GL_BLEND);
glTranslatef(hawkcoords.x,hawkcoords.y,hawkcoords.z);
- glRotatef(hawkrotation,0,1,0);
+ glRotatef(hawkyaw,0,1,0);
glTranslatef(25,0,0);
- distance=findDistancefast(&viewer,&realhawkcoords)*1.2;
+ distance=distsq(&viewer,&realhawkcoords)*1.2;
glColor4f(light.color[0],light.color[1],light.color[2],(viewdistance*viewdistance-(distance-(viewdistance*viewdistance*fadestart))*(1/(1-fadestart)))/viewdistance/viewdistance);
if((viewdistance*viewdistance-(distance-(viewdistance*viewdistance*fadestart))*(1/(1-fadestart)))/viewdistance/viewdistance>1)
glColor4f(light.color[0],light.color[1],light.color[2],1);
glEnable(GL_BLEND);
glEnable(GL_LIGHTING);
terrainlight=terrain.getLighting(player[k].coords.x,player[k].coords.z);
- distance=findDistancefast(&viewer,&player[k].coords);
+ distance=distsq(&viewer,&player[k].coords);
distance=(viewdistance*viewdistance-(distance-(viewdistance*viewdistance*fadestart))*(1/(1-fadestart)))/viewdistance/viewdistance;
glColor4f(terrainlight.x,terrainlight.y,terrainlight.z,distance);
if(distance>=1)
glDisable(GL_BLEND);
if(distance>=.5){
- checkpoint=DoRotation(player[k].skeleton.joints[abs(Random()%player[k].skeleton.num_joints)].position,0,player[k].rotation,0)*player[k].scale+player[k].coords;
+ checkpoint=DoRotation(player[k].skeleton.joints[abs(Random()%player[k].skeleton.num_joints)].position,0,player[k].yaw,0)*player[k].scale+player[k].coords;
checkpoint.y+=1;
if(!player[k].occluded==0)
i=checkcollide(viewer,checkpoint,player[k].lastoccluded);
float distance=0;
closest=currenthotspot;
for(i=0;i<numhotspots;i++){
- distance=findDistancefast(&player[0].coords,&hotspot[i]);
+ distance=distsq(&player[0].coords,&hotspot[i]);
if(closestdist==-1||distance<closestdist){
- if(findDistancefast(&player[0].coords,&hotspot[i])<hotspotsize[i]&&((hotspottype[i]<=10&&hotspottype[i]>=0)||(hotspottype[i]<=40&&hotspottype[i]>=20))){
+ if(distsq(&player[0].coords,&hotspot[i])<hotspotsize[i]&&((hotspottype[i]<=10&&hotspottype[i]>=0)||(hotspottype[i]<=40&&hotspottype[i]>=20))){
closestdist=distance;
closest=i;
}
currenthotspot=closest;
if(currenthotspot!=-1){
if(hotspottype[closest]<=10){
- if(findDistancefast(&player[0].coords,&hotspot[closest])<hotspotsize[closest])
+ if(distsq(&player[0].coords,&hotspot[closest])<hotspotsize[closest])
tutorialstagetime=0;
tutorialmaxtime=1;
tutorialopac=tutorialmaxtime-tutorialstagetime;
whichdialogue=hotspottype[closest]-20;
for(j=0;j<numdialogueboxes[whichdialogue];j++){
player[participantfocus[whichdialogue][j]].coords=participantlocation[whichdialogue][participantfocus[whichdialogue][j]];
- player[participantfocus[whichdialogue][j]].rotation=participantrotation[whichdialogue][participantfocus[whichdialogue][j]];
- player[participantfocus[whichdialogue][j]].targetrotation=participantrotation[whichdialogue][participantfocus[whichdialogue][j]];
+ player[participantfocus[whichdialogue][j]].yaw=participantyaw[whichdialogue][participantfocus[whichdialogue][j]];
+ player[participantfocus[whichdialogue][j]].targetyaw=participantyaw[whichdialogue][participantfocus[whichdialogue][j]];
player[participantfocus[whichdialogue][j]].velocity=0;
- player[participantfocus[whichdialogue][j]].targetanimation=player[participantfocus[whichdialogue][j]].getIdle();
- player[participantfocus[whichdialogue][j]].targetframe=0;
+ player[participantfocus[whichdialogue][j]].animTarget=player[participantfocus[whichdialogue][j]].getIdle();
+ player[participantfocus[whichdialogue][j]].frameTarget=0;
}
directing=0;
indialogue=0;
sprintf (string, "The framespersecond is %d.",(int)(fps));
text->glPrint(10,30,string,0,.8,1024,768);
- sprintf (string, "Name: %s", registrationname);
- text->glPrint(10,260,string,0,.8,1024,768);
-
-
if(editorenabled)
sprintf (string, "Map editor enabled.");
else
if(editorenabled){
sprintf (string, "Object size: %f",editorsize);
text->glPrint(10,75,string,0,.8,1024,768);
- if(editorrotation>=0)sprintf (string, "Object rotation: %f",editorrotation);
- else sprintf (string, "Object rotation: Random");
+ if(editoryaw>=0)sprintf (string, "Object yaw: %f",editoryaw);
+ else sprintf (string, "Object yaw: Random");
text->glPrint(10,90,string,0,.8,1024,768);
- if(editorrotation2>=0)sprintf (string, "Object rotation2: %f",editorrotation2);
- else sprintf (string, "Object rotation2: Random");
+ if(editorpitch>=0)sprintf (string, "Object pitch: %f",editorpitch);
+ else sprintf (string, "Object pitch: Random");
text->glPrint(10,105,string,0,.8,1024,768);
sprintf (string, "Object type: %d",editortype);
text->glPrint(10,120,string,0,.8,1024,768);
}
}
- if(minimap&&indialogue==-1){
+ if(difficulty<2&&indialogue==-1){ // minimap
float mapviewdist = 20000;
glDisable(GL_DEPTH_TEST);
float tempdist;
//~ int whichclosest;
for(i=0;i<objects.numobjects;i++){
- tempdist=findDistancefast(¢er,&objects.position[i]);
+ tempdist=distsq(¢er,&objects.position[i]);
if(tempdist>maxdistance){
//~ whichclosest=i;
maxdistance=tempdist;
}
for(i=0;i<numplayers;i++){
if(!player[i].dead){
- tempdist=findDistancefast(¢er,&player[i].coords);
+ tempdist=distsq(¢er,&player[i].coords);
if(tempdist>maxdistance){
//~ whichclosest=i;
maxdistance=tempdist;
glPushMatrix();
glScalef(1/(1/radius*256*terrain.scale*.4),1/(1/radius*256*terrain.scale*.4),1);
glPopMatrix();
- glRotatef(player[0].lookrotation*-1+180,0,0,1);
+ glRotatef(player[0].lookyaw*-1+180,0,0,1);
glTranslatef(-(center.x/terrain.scale/256*-2+1),(center.z/terrain.scale/256*-2+1),0);
for(i=0;i<objects.numobjects;i++){
if(objects.type[i]==treetrunktype){
- distcheck=findDistancefast(&player[0].coords,&objects.position[i]);
+ distcheck=distsq(&player[0].coords,&objects.position[i]);
if(distcheck<mapviewdist){
- glBindTexture( GL_TEXTURE_2D, Mapcircletexture);
+ Mapcircletexture.bind();
glColor4f(0,.3,0,opac*(1-distcheck/mapviewdist));
glPushMatrix();
glTranslatef(objects.position[i].x/terrain.scale/256*-2+1,objects.position[i].z/terrain.scale/256*2-1,0);
- glRotatef(objects.rotation[i],0,0,1);
+ glRotatef(objects.yaw[i],0,0,1);
glScalef(.003,.003,.003);
glBegin(GL_QUADS);
glTexCoord2f(0,0);
}
}
if(objects.type[i]==boxtype){
- distcheck=findDistancefast(&player[0].coords,&objects.position[i]);
+ distcheck=distsq(&player[0].coords,&objects.position[i]);
if(distcheck<mapviewdist){
- glBindTexture( GL_TEXTURE_2D, Mapboxtexture);
+ Mapboxtexture.bind();
glColor4f(.4,.4,.4,opac*(1-distcheck/mapviewdist));
glPushMatrix();
glTranslatef(objects.position[i].x/terrain.scale/256*-2+1,objects.position[i].z/terrain.scale/256*2-1,0);
- glRotatef(objects.rotation[i],0,0,1);
+ glRotatef(objects.yaw[i],0,0,1);
glScalef(.01*objects.scale[i],.01*objects.scale[i],.01*objects.scale[i]);
glBegin(GL_QUADS);
glTexCoord2f(0,0);
}
}
if(editorenabled){
- glBindTexture( GL_TEXTURE_2D, Mapcircletexture);
+ Mapcircletexture.bind();
for(i=0;i<numboundaries;i++){
glColor4f(0,0,0,opac/3);
glPushMatrix();
}
}
for(i=0;i<numplayers;i++){
- distcheck=findDistancefast(&player[0].coords,&player[i].coords);
+ distcheck=distsq(&player[0].coords,&player[i].coords);
if(distcheck<mapviewdist){
glPushMatrix();
- glBindTexture( GL_TEXTURE_2D, Maparrowtexture);
+ Maparrowtexture.bind();
if(i==0)glColor4f(1,1,1,opac);
else if(player[i].dead==2||player[i].howactive>typesleeping)glColor4f(0,0,0,opac*(1-distcheck/mapviewdist));
else if(player[i].dead)glColor4f(.3,.3,.3,opac*(1-distcheck/mapviewdist));
else if(player[i].aitype==passivetype)glColor4f(0,1,0,opac*(1-distcheck/mapviewdist));
else glColor4f(1,1,0,1);
glTranslatef(player[i].coords.x/terrain.scale/256*-2+1,player[i].coords.z/terrain.scale/256*2-1,0);
- glRotatef(player[i].rotation+180,0,0,1);
+ glRotatef(player[i].yaw+180,0,0,1);
glScalef(.005,.005,.005);
glBegin(GL_QUADS);
glTexCoord2f(0,0);
}
glClear(GL_DEPTH_BUFFER_BIT);
- ReSizeGLScene(90,.1f);
+ Game::ReSizeGLScene(90,.1f);
glViewport(0,0,screenwidth,screenheight);
if(drawmode!=normalmode){
return 0;
}
-vector<string> Game::ListCampaigns() {
- DIR *campaigns = opendir(ConvertFileName(":Data:Campaigns"));
- struct dirent *campaign = NULL;
- if(!campaigns) {
- perror("Problem while loading campaigns");
- cerr << "campaign folder was : " << ConvertFileName(":Data:Campaigns") << endl;
- exit(EXIT_FAILURE);
- }
- vector<string> campaignNames;
- while ((campaign = readdir(campaigns)) != NULL) {
- string name(campaign->d_name);
- if(name.length()<5)
- continue;
- if(!name.compare(name.length()-4,4,".txt")) {
- campaignNames.push_back(name.substr(0,name.length()-4));
- }
- }
- closedir(campaigns);
- return campaignNames;
-}
-
-void Game::LoadCampaign() {
- if(!accountactive)
- return;
- ifstream ipstream(ConvertFileName((":Data:Campaigns:"+accountactive->getCurrentCampaign()+".txt").c_str()));
- ipstream.ignore(256,':');
- int numlevels;
- ipstream >> numlevels;
- campaignlevels.clear();
- for(int i=0;i<numlevels;i++) {
- CampaignLevel cl;
- ipstream >> cl;
- campaignlevels.push_back(cl);
- }
- ipstream.close();
-
- ifstream test(ConvertFileName((":Data:Textures:"+accountactive->getCurrentCampaign()+":World.png").c_str()));
- if(test.good()) {
- LoadTexture((":Data:Textures:"+accountactive->getCurrentCampaign()+":World.png").c_str(),&Mainmenuitems[7],0,0);
- } else {
- LoadTexture(":Data:Textures:World.png",&Mainmenuitems[7],0,0);
- }
-
- if(accountactive->getCampaignChoicesMade()==0) {
- accountactive->setCampaignScore(0);
- accountactive->resetFasttime();
- }
-}
-
-void Game::DrawMenu() {
+void DrawMenu() {
// !!! FIXME: hack: clamp framerate in menu so text input works correctly on fast systems.
SDL_Delay(15);
glDrawBuffer(GL_BACK);
glReadBuffer(GL_BACK);
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
- ReSizeGLScene(90,.1f);
+ Game::ReSizeGLScene(90,.1f);
//draw menu background
glClear(GL_DEPTH_BUFFER_BIT);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
glEnable(GL_TEXTURE_2D);
- glBindTexture( GL_TEXTURE_2D, Mainmenuitems[4]);
+ Game::Mainmenuitems[4].bind();
glBegin(GL_QUADS);
glTexCoord2f(0,0);
glVertex3f(-1,-1,0);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
glPopMatrix();
- if(!waiting) { // hide the cursor while waiting for a key
+ if(!Game::waiting) { // hide the cursor while waiting for a key
glPushMatrix();
- glTranslatef(mousecoordh-screenwidth/2,mousecoordv*-1+screenheight/2,0);
+ glTranslatef(Game::mousecoordh-screenwidth/2,Game::mousecoordv*-1+screenheight/2,0);
glScalef((float)screenwidth/64,(float)screenwidth/64,1);
glTranslatef(1,-1,0);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glColor4f(1,1,1,1);
- glBindTexture( GL_TEXTURE_2D, cursortexture);
+ Game::cursortexture.bind();
glPushMatrix();
//glScalef(.25,.25,.25);
glBegin(GL_QUADS);