X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FGameInitDispose.cpp;h=a1e96031da4ccf4d13245e7a971ca721384b8097;hb=77f22d0571ddca7bbfd1d1f621d61785d375c889;hp=e7889a4d5cac70e830513c4193769a74488726e4;hpb=bd635bf9468562568574e88f543b4e635c845918;p=lugaru.git diff --git a/Source/GameInitDispose.cpp b/Source/GameInitDispose.cpp index e7889a4..a1e9603 100644 --- a/Source/GameInitDispose.cpp +++ b/Source/GameInitDispose.cpp @@ -1,97 +1,63 @@ /* Copyright (C) 2003, 2010 - Wolfire Games +Copyright (C) 2010-2017 - Lugaru contributors (see AUTHORS file) This file is part of Lugaru. -Lugaru 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 2 -of the License, or (at your option) any later version. +Lugaru 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 2 of the License, or +(at your option) any later version. -This program is distributed in the hope that it will be useful, +Lugaru 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. +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, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +along with Lugaru. If not, see . */ -#include "Game.h" -#include "openal_wrapper.h" -#include "Animation.h" +#include "Game.hpp" + +#include "Animation/Animation.hpp" +#include "Audio/openal_wrapper.hpp" +#include "Graphic/Texture.hpp" +#include "Menu/Menu.hpp" +#include "Utils/Folders.hpp" -extern float screenwidth,screenheight; +extern float screenwidth, screenheight; extern float viewdistance; extern XYZ viewer; -extern XYZ lightlocation; -extern float lightambient[3],lightbrightness[3]; extern float fadestart; extern float texscale; extern float gravity; extern Light light; -extern Skeleton testskeleton; -extern int numsounds; -extern int channels[100]; extern Terrain terrain; -//extern Sprites sprites; extern int kTextureSize; extern float texdetail; extern float realtexdetail; -extern float terraindetail; extern float volume; -extern Objects objects; extern int detail; extern bool cellophane; -extern GLubyte bloodText[512*512*3]; -extern GLubyte wolfbloodText[512*512*3]; extern bool ismotionblur; extern bool trilinear; -extern bool osx; extern bool musictoggle; -extern Weapons weapons; -extern Person player[maxplayers]; -extern int numplayers; extern int environment; extern bool ambientsound; extern float multiplier; extern int netdatanew; extern float mapinfo; extern bool stillloading; -extern TGAImageRec texture; -extern short vRefNum; -extern long dirID; extern int mainmenu; -extern int oldmainmenu; extern bool visibleloading; -extern int loadscreencolor; -extern float flashamount,flashr,flashg,flashb; +extern float flashamount, flashr, flashg, flashb; extern int flashdelay; extern int whichjointstartarray[26]; extern int whichjointendarray[26]; -extern int difficulty; -extern float tintr,tintg,tintb; extern float slomospeed; -extern char mapname[256]; extern bool gamestarted; -extern int numdialogues; -extern int numdialogueboxes[20]; -extern int dialoguetype[20]; -extern int dialogueboxlocation[20][20]; -extern float dialogueboxcolor[20][20][3]; -extern int dialogueboxsound[20][20]; -extern char dialoguetext[20][20][128]; -extern char dialoguename[20][20][64]; -extern XYZ dialoguecamera[20][20]; -extern float dialoguecamerarotation[20][20]; -extern float dialoguecamerarotation2[20][20]; -extern int indialogue; -extern int whichdialogue; -extern float dialoguetime; - extern float accountcampaignhighscore[10]; extern float accountcampaignfasttime[10]; extern float accountcampaignscore[10]; @@ -100,1259 +66,758 @@ extern float accountcampaigntime[10]; extern int accountcampaignchoicesmade[10]; extern int accountcampaignchoices[10][5000]; -extern OPENAL_STREAM * strm[20]; - -extern "C" void PlaySoundEx(int channel, OPENAL_SAMPLE *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused); -extern "C" void PlayStreamEx(int chan, OPENAL_STREAM *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused); - -void LOG(const std::string &fmt, ...) +void LOG(const std::string&, ...) { // !!! FIXME: write me. } - -Game::TextureList Game::textures; - -void Game::Dispose() +void Dispose() { - int i,j; + LOGFUNC; - LOGFUNC; - - if(endgame==2){ - accountactive->endGame(); - endgame=0; - } + if (Game::endgame == 2) { + Account::active().endGame(); + Game::endgame = 0; + } - Account::saveFile(":Data:Users", accountactive); + Account::saveFile(Folders::getUserSavePath()); - TexIter it = textures.begin(); - for (; it != textures.end(); ++it) - { - if (glIsTexture(it->second)) - glDeleteTextures(1, &it->second); - } - textures.clear(); + //textures.clear(); - LOG("Shutting down sound system..."); + LOG("Shutting down sound system..."); - OPENAL_StopSound(OPENAL_ALL); + OPENAL_StopSound(OPENAL_ALL); // this is causing problems on Linux, but we'll force an _exit() a little // later in the shutdown process. --ryan. #if !PLATFORM_LINUX -#define streamcount 20 -#define samplecount 100 - - for (i=0; i < samplecount; ++i) - { - OPENAL_Sample_Free(samp[i]); - } - - for (i=0; i < streamcount; ++i) - { - OPENAL_Stream_Close(strm[i]); - } - - OPENAL_Close(); - if (texture.data) - { - free(texture.data); - } - texture.data = 0; + + for (int i = 0; i < sounds_count; ++i) { + OPENAL_Sample_Free(samp[i]); + } + + OPENAL_Close(); #endif } - -void Game::LoadSounds() +void Game::newGame() { - LOGFUNC; - - LOG(std::string("Loading sounds...")); + text = new Text(); + textmono = new Text(); + skybox = new SkyBox(); +} - OPENAL_3D_SetDopplerFactor(0); +void Game::deleteGame() +{ + delete skybox; + delete text; + delete textmono; - OPENAL_SetSFXMasterVolume((int)(volume*255)); + glDeleteTextures(1, &screentexture); + glDeleteTextures(1, &screentexture2); - if(visibleloading){LoadingScreen(); loadscreencolor=5;} - loadAllSounds(); + Dispose(); } -void Game::LoadTexture(const char *fileName, GLuint *textureid,int mipmap, bool hasalpha) +void LoadSave(const std::string& fileName, GLubyte* array) { - GLuint type; - - LOGFUNC; - - LOG(std::string("Loading texture...") + fileName); - - // Fix filename so that is os appropreate - char * fixedFN = ConvertFileName(fileName); - - unsigned char fileNamep[256]; - CopyCStringToPascal(fixedFN, fileNamep); - //Load Image - upload_image( fileNamep ,hasalpha); - -// std::string fname(fileName); -// std::transform(fname.begin(), fname.end(), tolower); -// TexIter it = textures.find(fname); - - //Is it valid? - if(1==1) - //if(textures.end() == it) - { - //Alpha channel? - if ( texture.bpp == 24 ) - type = GL_RGB; - else - type = GL_RGBA; - - glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); - - if(!*textureid) - glGenTextures( 1, textureid ); - glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); - - glBindTexture( GL_TEXTURE_2D, *textureid); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - if(trilinear)if(mipmap)glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR ); - if(!trilinear)if(mipmap)glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST ); - if(!mipmap)glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - - gluBuild2DMipmaps( GL_TEXTURE_2D, type, texture.sizeX, texture.sizeY, type, GL_UNSIGNED_BYTE, texture.data ); - } -} + LOGFUNC; -void Game::LoadTextureSave(const char *fileName, GLuint *textureid,int mipmap,GLubyte *array, int *skinsize) -{ - GLuint type; - int i; - int bytesPerPixel; - - LOGFUNC; - - LOG(std::string("Loading texture (S)...") + fileName); - - //Load Image - unsigned char fileNamep[256]; - CopyCStringToPascal(ConvertFileName(fileName), fileNamep); - //Load Image - upload_image( fileNamep ,0); - //LoadTGA( fileName ); - -// std::string fname(fileName); -// std::transform(fname.begin(), fname.end(), tolower); -// TexIter it = textures.find(fname); - - //Is it valid? - if(1==1) - //if(textures.end() == it) - { - bytesPerPixel=texture.bpp/8; - - //Alpha channel? - if ( texture.bpp == 24 ) - type = GL_RGB; - else - type = GL_RGBA; - - glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); - - if(!*textureid)glGenTextures( 1, textureid ); - glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); - - glBindTexture( GL_TEXTURE_2D, *textureid); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - if(trilinear)if(mipmap)glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR ); - if(!trilinear)if(mipmap)glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST ); - if(!mipmap)glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - - int tempnum=0; - for(i=0;i<(int)(texture.sizeY*texture.sizeX*bytesPerPixel);i++){ - if((i+1)%4||type==GL_RGB){ - array[tempnum]=texture.data[i]; - tempnum++; - } - } - - *skinsize=texture.sizeX; - - gluBuild2DMipmaps( GL_TEXTURE_2D, type, texture.sizeX, texture.sizeY, GL_RGB, GL_UNSIGNED_BYTE, array ); - -// textures.insert(std::make_pair(fname, *textureid)); - } -// else -// { -// *textureid = it->second; -// } -} + LOG(std::string("Loading (S)...") + fileName); -void Game::LoadSave(const char *fileName, GLuint *textureid,bool mipmap,GLubyte *array, int *skinsize) -{ - int i; - int bytesPerPixel; - - LOGFUNC; - - LOG(std::string("Loading (S)...") + fileName); - - //Load Image - float temptexdetail=texdetail; - texdetail=1; - //upload_image( fileName ); - //LoadTGA( fileName ); - - // Converting file to something os specific - char * fixedFN = ConvertFileName(fileName); - - //Load Image - unsigned char fileNamep[256]; - CopyCStringToPascal(fixedFN, fileNamep); - //Load Image - upload_image( fileNamep ,0); - texdetail=temptexdetail; - - //Is it valid? - if(1==1){ - bytesPerPixel=texture.bpp/8; - - int tempnum=0; - for(i=0;i<(int)(texture.sizeY*texture.sizeX*bytesPerPixel);i++){ - if((i+1)%4||bytesPerPixel==3){ - array[tempnum]=texture.data[i]; - tempnum++; - } - } - } -} + //Load Image + float temptexdetail = texdetail; + texdetail = 1; -bool Game::AddClothes(const char *fileName, GLuint *textureid,bool mipmap,GLubyte *array, int *skinsize) -{ - int i; - int bytesPerPixel; - - LOGFUNC; - - //upload_image( fileName ); - //LoadTGA( fileName ); - //Load Image - unsigned char fileNamep[256]; - CopyCStringToPascal(fileName,fileNamep); - //Load Image - bool opened; - opened=upload_image( fileNamep ,1); - - float alphanum; - //Is it valid? - if(opened){ - if(tintr>1)tintr=1; - if(tintg>1)tintg=1; - if(tintb>1)tintb=1; - - if(tintr<0)tintr=0; - if(tintg<0)tintg=0; - if(tintb<0)tintb=0; - - bytesPerPixel=texture.bpp/8; - - int tempnum=0; - alphanum=255; - for(i=0;i<(int)(texture.sizeY*texture.sizeX*bytesPerPixel);i++){ - if(bytesPerPixel==3)alphanum=255; - else if((i+1)%4==0)alphanum=texture.data[i]; - //alphanum/=2; - if((i+1)%4||bytesPerPixel==3){ - if((i%4)==0)texture.data[i]*=tintr; - if((i%4)==1)texture.data[i]*=tintg; - if((i%4)==2)texture.data[i]*=tintb; - array[tempnum]=(float)array[tempnum]*(1-alphanum/255)+(float)texture.data[i]*(alphanum/255); - tempnum++; - } - } - } - else return 0; - return 1; -} + //Load Image + ImageRec texture; + if (!load_image(Folders::getResourcePath(fileName).c_str(), texture)) { + texdetail = temptexdetail; + return; + } + texdetail = temptexdetail; + int bytesPerPixel = texture.bpp / 8; + + int tempnum = 0; + for (int i = 0; i < (int)(texture.sizeY * texture.sizeX * bytesPerPixel); i++) { + if ((i + 1) % 4 || bytesPerPixel == 3) { + array[tempnum] = texture.data[i]; + tempnum++; + } + } +} //***************> ResizeGLScene() <******/ GLvoid Game::ReSizeGLScene(float fov, float pnear) { - if (screenheight==0) - { - screenheight=1; - } + if (screenheight == 0) { + screenheight = 1; + } - glViewport(0,0,screenwidth,screenheight); + glViewport(0, 0, screenwidth, screenheight); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); - gluPerspective(fov,(GLfloat)screenwidth/(GLfloat)screenheight,pnear,viewdistance); + gluPerspective(fov, (GLfloat)screenwidth / (GLfloat)screenheight, pnear, viewdistance); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); } void Game::LoadingScreen() { - static float loadprogress,minprogress,maxprogress; - static AbsoluteTime time = {0,0}; - static AbsoluteTime frametime = {0,0}; - AbsoluteTime currTime = UpTime (); - double deltaTime = (float) AbsoluteDeltaToDuration (currTime, frametime); - - if (0 > deltaTime) // if negative microseconds - deltaTime /= -1000000.0; - else // else milliseconds - deltaTime /= 1000.0; - - multiplier=deltaTime; - if(multiplier<.001)multiplier=.001; - if(multiplier>10)multiplier=10; - if(multiplier>.05){ - frametime = currTime; // reset for next time interval - - float size=1; - glLoadIdentity(); - //Clear to black - glClearColor(0,0,0,1); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - - loadtime+=multiplier*4; - - loadprogress=loadtime; - if(loadprogress>100)loadprogress=100; - - //loadprogress=abs(Random()%100); - - //Background - - glEnable(GL_TEXTURE_2D); - glBindTexture( GL_TEXTURE_2D, loadscreentexture); - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); - glDisable(GL_DEPTH_TEST); // Disables Depth Testing - glDisable(GL_CULL_FACE); - glDisable(GL_LIGHTING); - glDepthMask(0); - glMatrixMode(GL_PROJECTION); // Select The Projection Matrix - glPushMatrix(); // Store The Projection Matrix - glLoadIdentity(); // Reset The Projection Matrix - glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix - glPushMatrix(); // Store The Modelview Matrix - glLoadIdentity(); // Reset The Modelview Matrix - glTranslatef(screenwidth/2,screenheight/2,0); - glScalef((float)screenwidth/2,(float)screenheight/2,1); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - glDisable(GL_BLEND); - glColor4f(loadprogress/100,loadprogress/100,loadprogress/100,1); - //glColor4f(1,1,1,1); - /*if(loadscreencolor==0)glColor4f(1,1,1,1); - if(loadscreencolor==1)glColor4f(1,0,0,1); - if(loadscreencolor==2)glColor4f(0,1,0,1); - if(loadscreencolor==3)glColor4f(0,0,1,1); - if(loadscreencolor==4)glColor4f(1,1,0,1); - if(loadscreencolor==5)glColor4f(1,0,1,1); - */ - glPushMatrix(); - //glScalef(.25,.25,.25); - glBegin(GL_QUADS); - glTexCoord2f(.1-loadprogress/100,0+loadprogress/100+.3); - glVertex3f(-1, -1, 0.0f); - glTexCoord2f(.1-loadprogress/100,0+loadprogress/100+.3); - glVertex3f(1, -1, 0.0f); - glTexCoord2f(.1-loadprogress/100,1+loadprogress/100+.3); - glVertex3f(1, 1, 0.0f); - glTexCoord2f(.1-loadprogress/100,1+loadprogress/100+.3); - glVertex3f(-1, 1, 0.0f); - glEnd(); - glPopMatrix(); - glEnable(GL_BLEND); - glPushMatrix(); - //glScalef(.25,.25,.25); - glBegin(GL_QUADS); - glTexCoord2f(.4+loadprogress/100,0+loadprogress/100); - glVertex3f(-1, -1, 0.0f); - glTexCoord2f(.4+loadprogress/100,0+loadprogress/100); - glVertex3f(1, -1, 0.0f); - glTexCoord2f(.4+loadprogress/100,1+loadprogress/100); - glVertex3f(1, 1, 0.0f); - glTexCoord2f(.4+loadprogress/100,1+loadprogress/100); - glVertex3f(-1, 1, 0.0f); - glEnd(); - glPopMatrix(); - glDisable(GL_TEXTURE_2D); - glMatrixMode(GL_PROJECTION); // Select The Projection Matrix - glPopMatrix(); // Restore The Old Projection Matrix - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix - glPopMatrix(); // Restore The Old Projection Matrix - glDisable(GL_BLEND); - glDepthMask(1); - - glEnable(GL_TEXTURE_2D); - glBindTexture( GL_TEXTURE_2D, loadscreentexture); - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); - glDisable(GL_DEPTH_TEST); // Disables Depth Testing - glDisable(GL_CULL_FACE); - glDisable(GL_LIGHTING); - glDepthMask(0); - glMatrixMode(GL_PROJECTION); // Select The Projection Matrix - glPushMatrix(); // Store The Projection Matrix - glLoadIdentity(); // Reset The Projection Matrix - glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix - glPushMatrix(); // Store The Modelview Matrix - glLoadIdentity(); // Reset The Modelview Matrix - glTranslatef(screenwidth/2,screenheight/2,0); - glScalef((float)screenwidth/2*(1.5-(loadprogress)/200),(float)screenheight/2*(1.5-(loadprogress)/200),1); - glBlendFunc(GL_SRC_ALPHA,GL_ONE); - glEnable(GL_BLEND); - //glColor4f(loadprogress/100,loadprogress/100,loadprogress/100,1); - glColor4f(loadprogress/100,loadprogress/100,loadprogress/100,1); - /*if(loadscreencolor==0)glColor4f(1,1,1,1); - if(loadscreencolor==1)glColor4f(1,0,0,1); - if(loadscreencolor==2)glColor4f(0,1,0,1); - if(loadscreencolor==3)glColor4f(0,0,1,1); - if(loadscreencolor==4)glColor4f(1,1,0,1); - if(loadscreencolor==5)glColor4f(1,0,1,1); - */ - glPushMatrix(); - //glScalef(.25,.25,.25); - glBegin(GL_QUADS); - glTexCoord2f(0+.5,0+.5); - glVertex3f(-1, -1, 0.0f); - glTexCoord2f(1+.5,0+.5); - glVertex3f(1, -1, 0.0f); - glTexCoord2f(1+.5,1+.5); - glVertex3f(1, 1, 0.0f); - glTexCoord2f(0+.5,1+.5); - glVertex3f(-1, 1, 0.0f); - glEnd(); - glPopMatrix(); - glDisable(GL_TEXTURE_2D); - glMatrixMode(GL_PROJECTION); // Select The Projection Matrix - glPopMatrix(); // Restore The Old Projection Matrix - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix - glPopMatrix(); // Restore The Old Projection Matrix - glDisable(GL_BLEND); - glDepthMask(1); - - glEnable(GL_TEXTURE_2D); - glBindTexture( GL_TEXTURE_2D, loadscreentexture); - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); - glDisable(GL_DEPTH_TEST); // Disables Depth Testing - glDisable(GL_CULL_FACE); - glDisable(GL_LIGHTING); - glDepthMask(0); - glMatrixMode(GL_PROJECTION); // Select The Projection Matrix - glPushMatrix(); // Store The Projection Matrix - glLoadIdentity(); // Reset The Projection Matrix - glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix - glPushMatrix(); // Store The Modelview Matrix - glLoadIdentity(); // Reset The Modelview Matrix - glTranslatef(screenwidth/2,screenheight/2,0); - glScalef((float)screenwidth/2*(100+loadprogress)/100,(float)screenheight/2*(100+loadprogress)/100,1); - glBlendFunc(GL_SRC_ALPHA,GL_ONE); - glEnable(GL_BLEND); - glColor4f(loadprogress/100,loadprogress/100,loadprogress/100,.4); - glPushMatrix(); - //glScalef(.25,.25,.25); - glBegin(GL_QUADS); - glTexCoord2f(0+.2,0+.8); - glVertex3f(-1, -1, 0.0f); - glTexCoord2f(1+.2,0+.8); - glVertex3f(1, -1, 0.0f); - glTexCoord2f(1+.2,1+.8); - glVertex3f(1, 1, 0.0f); - glTexCoord2f(0+.2,1+.8); - glVertex3f(-1, 1, 0.0f); - glEnd(); - glPopMatrix(); - glDisable(GL_TEXTURE_2D); - glMatrixMode(GL_PROJECTION); // Select The Projection Matrix - glPopMatrix(); // Restore The Old Projection Matrix - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix - glPopMatrix(); // Restore The Old Projection Matrix - glDisable(GL_BLEND); - glDepthMask(1); - - //Text - /* - glEnable(GL_TEXTURE_2D); - static char string[256]=""; - sprintf (string, "LOADING... %d%",(int)loadprogress); - glColor4f(1,1,1,.2); - text.glPrint(280-280*loadprogress/100/2/4,125-125*loadprogress/100/2/4,string,1,1+loadprogress/100,640,480); - glColor4f(1.2-loadprogress/100,1.2-loadprogress/100,1.2-loadprogress/100,1); - text.glPrint(280,125,string,1,1,640,480); - */ - - if(flashamount>0){ - if(flashamount>1)flashamount=1; - if(flashdelay<=0)flashamount-=multiplier; - flashdelay--; - if(flashamount<0)flashamount=0; - glDisable(GL_DEPTH_TEST); // Disables Depth Testing - glDisable(GL_CULL_FACE); - glDisable(GL_LIGHTING); - glDisable(GL_TEXTURE_2D); - glDepthMask(0); - glMatrixMode(GL_PROJECTION); // Select The Projection Matrix - glPushMatrix(); // Store The Projection Matrix - glLoadIdentity(); // Reset The Projection Matrix - glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix - glPushMatrix(); // Store The Modelview Matrix - glLoadIdentity(); // Reset The Modelview Matrix - glScalef(screenwidth,screenheight,1); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL_BLEND); - glColor4f(flashr,flashg,flashb,flashamount); - glBegin(GL_QUADS); - glVertex3f(0, 0, 0.0f); - glVertex3f(256, 0, 0.0f); - glVertex3f(256, 256, 0.0f); - glVertex3f(0, 256, 0.0f); - glEnd(); - glMatrixMode(GL_PROJECTION); // Select The Projection Matrix - glPopMatrix(); // Restore The Old Projection Matrix - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix - glPopMatrix(); // Restore The Old Projection Matrix - glEnable(GL_DEPTH_TEST); // Enables Depth Testing - glEnable(GL_CULL_FACE); - glDisable(GL_BLEND); - glDepthMask(1); - } - - swap_gl_buffers(); - loadscreencolor=0; - } -} - -void Game::FadeLoadingScreen(float howmuch) -{ - static float loadprogress,minprogress,maxprogress; - - float size=1; - glLoadIdentity(); - //Clear to black - glClearColor(0,0,0,1); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - loadprogress=howmuch; - - //loadprogress=abs(Random()%100); - - //Background - - //glEnable(GL_TEXTURE_2D); - glDisable(GL_TEXTURE_2D); - //glBindTexture( GL_TEXTURE_2D, loadscreentexture); - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); - glDisable(GL_DEPTH_TEST); // Disables Depth Testing - glDisable(GL_CULL_FACE); - glDisable(GL_LIGHTING); - glDepthMask(0); - glMatrixMode(GL_PROJECTION); // Select The Projection Matrix - glPushMatrix(); // Store The Projection Matrix - glLoadIdentity(); // Reset The Projection Matrix - glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix - glPushMatrix(); // Store The Modelview Matrix - glLoadIdentity(); // Reset The Modelview Matrix - glTranslatef(screenwidth/2,screenheight/2,0); - glScalef((float)screenwidth/2,(float)screenheight/2,1); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - glDisable(GL_BLEND); - glColor4f(loadprogress/100,0,0,1); - /*if(loadscreencolor==0)glColor4f(1,1,1,1); - if(loadscreencolor==1)glColor4f(1,0,0,1); - if(loadscreencolor==2)glColor4f(0,1,0,1); - if(loadscreencolor==3)glColor4f(0,0,1,1); - if(loadscreencolor==4)glColor4f(1,1,0,1); - if(loadscreencolor==5)glColor4f(1,0,1,1); - */ - glPushMatrix(); - //glScalef(.25,.25,.25); - glBegin(GL_QUADS); - glTexCoord2f(0,0); - glVertex3f(-1, -1, 0.0f); - glTexCoord2f(1,0); - glVertex3f(1, -1, 0.0f); - glTexCoord2f(1,1); - glVertex3f(1, 1, 0.0f); - glTexCoord2f(0,1); - glVertex3f(-1, 1, 0.0f); - glEnd(); - glPopMatrix(); - glDisable(GL_TEXTURE_2D); - glMatrixMode(GL_PROJECTION); // Select The Projection Matrix - glPopMatrix(); // Restore The Old Projection Matrix - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix - glPopMatrix(); // Restore The Old Projection Matrix - glDisable(GL_BLEND); - glDepthMask(1); - //Text - /* - glEnable(GL_TEXTURE_2D); - static char string[256]=""; - sprintf (string, "LOADING... %d%",(int)loadprogress); - glColor4f(1,1,1,.2); - text.glPrint(280-280*loadprogress/100/2/4,125-125*loadprogress/100/2/4,string,1,1+loadprogress/100,640,480); - glColor4f(1.2-loadprogress/100,1.2-loadprogress/100,1.2-loadprogress/100,1); - text.glPrint(280,125,string,1,1,640,480); - */ - swap_gl_buffers(); - loadscreencolor=0; -} - - -void Game::InitGame() -{ -#if PLATFORM_MACOSX - ProcessSerialNumber PSN; - ProcessInfoRec pinfo; - FSSpec pspec; - OSStatus err; - /* set up process serial number */ - PSN.highLongOfPSN = 0; - PSN.lowLongOfPSN = kCurrentProcess; - /* set up info block */ - pinfo.processInfoLength = sizeof(pinfo); - pinfo.processName = NULL; - pinfo.processAppSpec = &pspec; - /* grab the vrefnum and directory */ - err = GetProcessInformation(&PSN, &pinfo); - if (err == noErr) { - vRefNum = pspec.vRefNum; - dirID = pspec.parID; - } -#endif + if (!visibleloading) { + return; + } - LOGFUNC; + static float loadprogress; + static AbsoluteTime frametime = { 0, 0 }; + AbsoluteTime currTime = UpTime(); + double deltaTime = (float)AbsoluteDeltaToDuration(currTime, frametime); - autocam=0; + if (0 > deltaTime) { // if negative microseconds + deltaTime /= -1000000.0; + } else { // else milliseconds + deltaTime /= 1000.0; + } - int i,j; + multiplier = deltaTime; + if (multiplier < .001) { + multiplier = .001; + } + if (multiplier > 10) { + multiplier = 10; + } + if (multiplier > .05) { + frametime = currTime; // reset for next time interval - numchallengelevels=14; + glLoadIdentity(); + //Clear to black + glClearColor(0, 0, 0, 1); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - accountactive=Account::loadFile(":Data:Users"); + loadtime += multiplier * 4; - tintr=1; - tintg=1; - tintb=1; + loadprogress = loadtime; + if (loadprogress > 100) { + loadprogress = 100; + } - whichjointstartarray[0]=righthip; - whichjointendarray[0]=rightfoot; + //Background + + glEnable(GL_TEXTURE_2D); + loadscreentexture.bind(); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glDisable(GL_DEPTH_TEST); + glDisable(GL_CULL_FACE); + glDisable(GL_LIGHTING); + glDepthMask(0); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrtho(0, screenwidth, 0, screenheight, -100, 100); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glTranslatef(screenwidth / 2, screenheight / 2, 0); + glScalef((float)screenwidth / 2, (float)screenheight / 2, 1); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDisable(GL_BLEND); + glColor4f(loadprogress / 100, loadprogress / 100, loadprogress / 100, 1); + glPushMatrix(); + glBegin(GL_QUADS); + glTexCoord2f(.1 - loadprogress / 100, 0 + loadprogress / 100 + .3); + glVertex3f(-1, -1, 0.0f); + glTexCoord2f(.1 - loadprogress / 100, 0 + loadprogress / 100 + .3); + glVertex3f(1, -1, 0.0f); + glTexCoord2f(.1 - loadprogress / 100, 1 + loadprogress / 100 + .3); + glVertex3f(1, 1, 0.0f); + glTexCoord2f(.1 - loadprogress / 100, 1 + loadprogress / 100 + .3); + glVertex3f(-1, 1, 0.0f); + glEnd(); + glPopMatrix(); + glEnable(GL_BLEND); + glPushMatrix(); + glBegin(GL_QUADS); + glTexCoord2f(.4 + loadprogress / 100, 0 + loadprogress / 100); + glVertex3f(-1, -1, 0.0f); + glTexCoord2f(.4 + loadprogress / 100, 0 + loadprogress / 100); + glVertex3f(1, -1, 0.0f); + glTexCoord2f(.4 + loadprogress / 100, 1 + loadprogress / 100); + glVertex3f(1, 1, 0.0f); + glTexCoord2f(.4 + loadprogress / 100, 1 + loadprogress / 100); + glVertex3f(-1, 1, 0.0f); + glEnd(); + glPopMatrix(); + glDisable(GL_TEXTURE_2D); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + glDisable(GL_BLEND); + glDepthMask(1); + + glEnable(GL_TEXTURE_2D); + loadscreentexture.bind(); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glDisable(GL_DEPTH_TEST); + glDisable(GL_CULL_FACE); + glDisable(GL_LIGHTING); + glDepthMask(0); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrtho(0, screenwidth, 0, screenheight, -100, 100); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glTranslatef(screenwidth / 2, screenheight / 2, 0); + glScalef((float)screenwidth / 2 * (1.5 - (loadprogress) / 200), (float)screenheight / 2 * (1.5 - (loadprogress) / 200), 1); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glEnable(GL_BLEND); + glColor4f(loadprogress / 100, loadprogress / 100, loadprogress / 100, 1); + glPushMatrix(); + glBegin(GL_QUADS); + glTexCoord2f(0 + .5, 0 + .5); + glVertex3f(-1, -1, 0.0f); + glTexCoord2f(1 + .5, 0 + .5); + glVertex3f(1, -1, 0.0f); + glTexCoord2f(1 + .5, 1 + .5); + glVertex3f(1, 1, 0.0f); + glTexCoord2f(0 + .5, 1 + .5); + glVertex3f(-1, 1, 0.0f); + glEnd(); + glPopMatrix(); + glDisable(GL_TEXTURE_2D); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + glDisable(GL_BLEND); + glDepthMask(1); + + glEnable(GL_TEXTURE_2D); + loadscreentexture.bind(); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glDisable(GL_DEPTH_TEST); + glDisable(GL_CULL_FACE); + glDisable(GL_LIGHTING); + glDepthMask(0); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrtho(0, screenwidth, 0, screenheight, -100, 100); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glTranslatef(screenwidth / 2, screenheight / 2, 0); + glScalef((float)screenwidth / 2 * (100 + loadprogress) / 100, (float)screenheight / 2 * (100 + loadprogress) / 100, 1); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glEnable(GL_BLEND); + glColor4f(loadprogress / 100, loadprogress / 100, loadprogress / 100, .4); + glPushMatrix(); + glBegin(GL_QUADS); + glTexCoord2f(0 + .2, 0 + .8); + glVertex3f(-1, -1, 0.0f); + glTexCoord2f(1 + .2, 0 + .8); + glVertex3f(1, -1, 0.0f); + glTexCoord2f(1 + .2, 1 + .8); + glVertex3f(1, 1, 0.0f); + glTexCoord2f(0 + .2, 1 + .8); + glVertex3f(-1, 1, 0.0f); + glEnd(); + glPopMatrix(); + glDisable(GL_TEXTURE_2D); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + glDisable(GL_BLEND); + glDepthMask(1); + + //Text + + if (flashamount > 0) { + if (flashamount > 1) { + flashamount = 1; + } + if (flashdelay <= 0) { + flashamount -= multiplier; + } + flashdelay--; + if (flashamount < 0) { + flashamount = 0; + } + glDisable(GL_DEPTH_TEST); + glDisable(GL_CULL_FACE); + glDisable(GL_LIGHTING); + glDisable(GL_TEXTURE_2D); + glDepthMask(0); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrtho(0, screenwidth, 0, screenheight, -100, 100); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glScalef(screenwidth, screenheight, 1); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + glColor4f(flashr, flashg, flashb, flashamount); + glBegin(GL_QUADS); + glVertex3f(0, 0, 0.0f); + glVertex3f(256, 0, 0.0f); + glVertex3f(256, 256, 0.0f); + glVertex3f(0, 256, 0.0f); + glEnd(); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + glEnable(GL_DEPTH_TEST); + glEnable(GL_CULL_FACE); + glDisable(GL_BLEND); + glDepthMask(1); + } - whichjointstartarray[1]=righthip; - whichjointendarray[1]=rightankle; + swap_gl_buffers(); + } +} - whichjointstartarray[2]=righthip; - whichjointendarray[2]=rightknee; +void FadeLoadingScreen(float howmuch) +{ + static float loadprogress; + + glLoadIdentity(); + //Clear to black + glClearColor(0, 0, 0, 1); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + loadprogress = howmuch; + + //Background + + glDisable(GL_TEXTURE_2D); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glDisable(GL_DEPTH_TEST); + glDisable(GL_CULL_FACE); + glDisable(GL_LIGHTING); + glDepthMask(0); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrtho(0, screenwidth, 0, screenheight, -100, 100); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glTranslatef(screenwidth / 2, screenheight / 2, 0); + glScalef((float)screenwidth / 2, (float)screenheight / 2, 1); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDisable(GL_BLEND); + glColor4f(loadprogress / 100, 0, 0, 1); + glPushMatrix(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); + glVertex3f(-1, -1, 0.0f); + glTexCoord2f(1, 0); + glVertex3f(1, -1, 0.0f); + glTexCoord2f(1, 1); + glVertex3f(1, 1, 0.0f); + glTexCoord2f(0, 1); + glVertex3f(-1, 1, 0.0f); + glEnd(); + glPopMatrix(); + glDisable(GL_TEXTURE_2D); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + glDisable(GL_BLEND); + glDepthMask(1); + //Text + swap_gl_buffers(); +} - whichjointstartarray[3]=rightknee; - whichjointendarray[3]=rightankle; +void Game::InitGame() +{ + LOGFUNC; - whichjointstartarray[4]=rightankle; - whichjointendarray[4]=rightfoot; + numchallengelevels = 14; - whichjointstartarray[5]=lefthip; - whichjointendarray[5]=leftfoot; + Account::loadFile(Folders::getUserSavePath()); - whichjointstartarray[6]=lefthip; - whichjointendarray[6]=leftankle; + whichjointstartarray[0] = righthip; + whichjointendarray[0] = rightfoot; - whichjointstartarray[7]=lefthip; - whichjointendarray[7]=leftknee; + whichjointstartarray[1] = righthip; + whichjointendarray[1] = rightankle; - whichjointstartarray[8]=leftknee; - whichjointendarray[8]=leftankle; + whichjointstartarray[2] = righthip; + whichjointendarray[2] = rightknee; - whichjointstartarray[9]=leftankle; - whichjointendarray[9]=leftfoot; + whichjointstartarray[3] = rightknee; + whichjointendarray[3] = rightankle; - whichjointstartarray[10]=abdomen; - whichjointendarray[10]=rightshoulder; + whichjointstartarray[4] = rightankle; + whichjointendarray[4] = rightfoot; - whichjointstartarray[11]=abdomen; - whichjointendarray[11]=rightelbow; + whichjointstartarray[5] = lefthip; + whichjointendarray[5] = leftfoot; - whichjointstartarray[12]=abdomen; - whichjointendarray[12]=rightwrist; + whichjointstartarray[6] = lefthip; + whichjointendarray[6] = leftankle; - whichjointstartarray[13]=abdomen; - whichjointendarray[13]=righthand; + whichjointstartarray[7] = lefthip; + whichjointendarray[7] = leftknee; - whichjointstartarray[14]=rightshoulder; - whichjointendarray[14]=rightelbow; + whichjointstartarray[8] = leftknee; + whichjointendarray[8] = leftankle; - whichjointstartarray[15]=rightelbow; - whichjointendarray[15]=rightwrist; + whichjointstartarray[9] = leftankle; + whichjointendarray[9] = leftfoot; - whichjointstartarray[16]=rightwrist; - whichjointendarray[16]=righthand; + whichjointstartarray[10] = abdomen; + whichjointendarray[10] = rightshoulder; - whichjointstartarray[17]=abdomen; - whichjointendarray[17]=leftshoulder; + whichjointstartarray[11] = abdomen; + whichjointendarray[11] = rightelbow; - whichjointstartarray[18]=abdomen; - whichjointendarray[18]=leftelbow; + whichjointstartarray[12] = abdomen; + whichjointendarray[12] = rightwrist; - whichjointstartarray[19]=abdomen; - whichjointendarray[19]=leftwrist; + whichjointstartarray[13] = abdomen; + whichjointendarray[13] = righthand; - whichjointstartarray[20]=abdomen; - whichjointendarray[20]=lefthand; + whichjointstartarray[14] = rightshoulder; + whichjointendarray[14] = rightelbow; - whichjointstartarray[21]=leftshoulder; - whichjointendarray[21]=leftelbow; + whichjointstartarray[15] = rightelbow; + whichjointendarray[15] = rightwrist; - whichjointstartarray[22]=leftelbow; - whichjointendarray[22]=leftwrist; + whichjointstartarray[16] = rightwrist; + whichjointendarray[16] = righthand; - whichjointstartarray[23]=leftwrist; - whichjointendarray[23]=lefthand; + whichjointstartarray[17] = abdomen; + whichjointendarray[17] = leftshoulder; - whichjointstartarray[24]=abdomen; - whichjointendarray[24]=neck; + whichjointstartarray[18] = abdomen; + whichjointendarray[18] = leftelbow; - whichjointstartarray[25]=neck; - whichjointendarray[25]=head; + whichjointstartarray[19] = abdomen; + whichjointendarray[19] = leftwrist; - FadeLoadingScreen(0); + whichjointstartarray[20] = abdomen; + whichjointendarray[20] = lefthand; - stillloading=1; + whichjointstartarray[21] = leftshoulder; + whichjointendarray[21] = leftelbow; - texture.data = ( GLubyte* )malloc( 1024*1024*4 ); + whichjointstartarray[22] = leftelbow; + whichjointendarray[22] = leftwrist; - int temptexdetail=texdetail; - texdetail=1; - text.LoadFontTexture(":Data:Textures:Font.png"); - text.BuildFont(); - texdetail=temptexdetail; + whichjointstartarray[23] = leftwrist; + whichjointendarray[23] = lefthand; - FadeLoadingScreen(10); + whichjointstartarray[24] = abdomen; + whichjointendarray[24] = neck; - if(detail==2){ - texdetail=1; - terraindetail=1; - } - if(detail==1){ - texdetail=2; - terraindetail=1; - } - if(detail==0){ - texdetail=4; - terraindetail=1; - //terraindetail=2; - } + whichjointstartarray[25] = neck; + whichjointendarray[25] = head; - memset(channels, 0xff, sizeof(channels)); - for (int it = 0; it < 20; ++it) - { - strm[it] = NULL; - } + FadeLoadingScreen(0); - LOG("Initializing sound system..."); + stillloading = 1; - int output = -1; + int temptexdetail = texdetail; + texdetail = 1; + text->LoadFontTexture("Textures/Font.png"); + text->BuildFont(); + textmono->LoadFontTexture("Textures/FontMono.png"); + textmono->BuildFont(); + texdetail = temptexdetail; - #if PLATFORM_LINUX - extern bool cmdline(const char *cmd); - unsigned char rc = 0; - output = OPENAL_OUTPUT_ALSA; // Try alsa first... - if (cmdline("forceoss")) // ...but let user override that. - output = OPENAL_OUTPUT_OSS; - else if (cmdline("nosound")) - output = OPENAL_OUTPUT_NOSOUND; + FadeLoadingScreen(10); - OPENAL_SetOutput(output); - if ((rc = OPENAL_Init(44100, 32, 0)) == false) - { - // if we tried ALSA and failed, fall back to OSS. - if ( (output == OPENAL_OUTPUT_ALSA) && (!cmdline("forcealsa")) ) - { - OPENAL_Close(); - output = OPENAL_OUTPUT_OSS; - OPENAL_SetOutput(output); - rc = OPENAL_Init(44100, 32, 0); - } + if (detail == 2) { + texdetail = 1; } - - if (rc == false) - { - OPENAL_Close(); - output = OPENAL_OUTPUT_NOSOUND; // we tried! just do silence. - OPENAL_SetOutput(output); - rc = OPENAL_Init(44100, 32, 0); + if (detail == 1) { + texdetail = 2; + } + if (detail == 0) { + texdetail = 4; } - #else - OPENAL_Init(44100, 32, 0); - #endif - - OPENAL_SetSFXMasterVolume((int)(volume*255)); - - strm[stream_music3] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:music3.mp3"), OPENAL_2D, 0, 0); if(visibleloading){LoadingScreen(); loadscreencolor=0;} - OPENAL_Stream_SetMode(strm[stream_music3], OPENAL_LOOP_NORMAL); - - if(musictoggle){ -// PlaySoundEx( stream_music3, strm[stream_music3], NULL, true); - PlayStreamEx(stream_music3, strm[stream_music3], 0, true); - OPENAL_SetPaused(channels[stream_music3], false); - OPENAL_SetVolume(channels[stream_music3], 256); - } - - FadeLoadingScreen(20); - - if(ambientsound){ - strm[stream_wind] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:wind.mp3"), OPENAL_2D, 0, 0); if(visibleloading){LoadingScreen(); loadscreencolor=5;} - OPENAL_Stream_SetMode(strm[stream_wind], OPENAL_LOOP_NORMAL); - - FadeLoadingScreen(30); - - strm[stream_desertambient] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:desertambient.mp3"), OPENAL_2D, 0, 0); if(visibleloading){LoadingScreen(); loadscreencolor=5;} - OPENAL_Stream_SetMode(strm[stream_desertambient], OPENAL_LOOP_NORMAL); - } - - FadeLoadingScreen(40); - strm[stream_firesound] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:fire.ogg"), OPENAL_2D, 0, 0); if(visibleloading){LoadingScreen(); loadscreencolor=5;} - OPENAL_Stream_SetMode(strm[stream_firesound], OPENAL_LOOP_NORMAL); + LOG("Initializing sound system..."); - FadeLoadingScreen(50); + OPENAL_Init(44100, 32, 0); - //if(musictoggle){ - strm[stream_music1grass] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:music1grass.mp3"), OPENAL_2D, 0, 0); if(visibleloading){LoadingScreen(); loadscreencolor=1;} - OPENAL_Stream_SetMode(strm[stream_music1grass], OPENAL_LOOP_NORMAL); + OPENAL_SetSFXMasterVolume((int)(volume * 255)); + loadAllSounds(); - strm[stream_music1snow] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:music1snow.mp3"), OPENAL_2D, 0, 0); if(visibleloading){LoadingScreen(); loadscreencolor=2;} - OPENAL_Stream_SetMode(strm[stream_music1snow], OPENAL_LOOP_NORMAL); + if (musictoggle) { + emit_stream_np(stream_menutheme); + } - FadeLoadingScreen(60); + cursortexture.load("Textures/Cursor.png", 0); - strm[stream_music1desert] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:music1desert.mp3"), OPENAL_2D, 0, 0); if(visibleloading){LoadingScreen(); loadscreencolor=3;} - OPENAL_Stream_SetMode(strm[stream_music1desert], OPENAL_LOOP_NORMAL); + Mapcircletexture.load("Textures/MapCircle.png", 0); + Mapboxtexture.load("Textures/MapBox.png", 0); + Maparrowtexture.load("Textures/MapArrow.png", 0); - FadeLoadingScreen(80); - strm[stream_music2] = OPENAL_Sample_Load(OPENAL_FREE, ConvertFileName(":Data:Sounds:music2.ogg"), OPENAL_2D, 0, 0); if(visibleloading){LoadingScreen(); loadscreencolor=4;} - OPENAL_Stream_SetMode(strm[stream_music2], OPENAL_LOOP_NORMAL); + temptexdetail = texdetail; + if (texdetail > 2) { + texdetail = 2; + } + Mainmenuitems[0].load("Textures/Lugaru.png", 0); + Mainmenuitems[1].load("Textures/NewGame.png", 0); + Mainmenuitems[2].load("Textures/Options.png", 0); + Mainmenuitems[3].load("Textures/Quit.png", 0); + Mainmenuitems[4].load("Textures/Eyelid.png", 0); + Mainmenuitems[5].load("Textures/Resume.png", 0); + Mainmenuitems[6].load("Textures/EndGame.png", 0); - //} + texdetail = temptexdetail; + FadeLoadingScreen(95); - FadeLoadingScreen(90); + gameon = 0; + mainmenu = 1; + stillloading = 0; + firstLoadDone = false; - LoadTexture(":Data:Textures:Cursor.png",&cursortexture,0,1); + newdetail = detail; + newscreenwidth = screenwidth; + newscreenheight = screenheight; - LoadTexture(":Data:Textures:MapCircle.png",&Mapcircletexture,0,1); - LoadTexture(":Data:Textures:MapBox.png",&Mapboxtexture,0,1); - LoadTexture(":Data:Textures:MapArrow.png",&Maparrowtexture,0,1); + Menu::Load(); - temptexdetail=texdetail; - if(texdetail>2)texdetail=2; - LoadTexture(":Data:Textures:Lugaru.png",&Mainmenuitems[0],0,0); - LoadTexture(":Data:Textures:Newgame.png",&Mainmenuitems[1],0,0); - LoadTexture(":Data:Textures:Options.png",&Mainmenuitems[2],0,0); - LoadTexture(":Data:Textures:Quit.png",&Mainmenuitems[3],0,0); - LoadTexture(":Data:Textures:World.png",&Mainmenuitems[7],0,0); - LoadTexture(":Data:Textures:Eyelid.png",&Mainmenuitems[4],0,1); - //LoadTexture(":Data:Textures:Eye.jpg",&Mainmenuitems[5],0,1); - texdetail=temptexdetail; + Animation::loadAll(); - loaddistrib=0; - anim=0; + PersonType::Load(); - FadeLoadingScreen(95); + Person::players.emplace_back(new Person()); +} +void Game::LoadScreenTexture() +{ + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - gameon=0; - mainmenu=1; + if (!Game::screentexture) { + glGenTextures(1, &Game::screentexture); + } + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - stillloading=0; - firstload=0; - oldmainmenu=0; + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, Game::screentexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - newdetail=detail; - newscreenwidth=screenwidth; - newscreenheight=screenheight; + glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, kTextureSize, kTextureSize, 0); } - +//TODO: move LoadStuff() closer to GameTick.cpp to get rid of various vars shared in Game.hpp +/* Loads models and textures which only needs to be loaded once */ void Game::LoadStuff() { - static float temptexdetail; - static float viewdistdetail; - static int i,j,texsize; - float megascale =1; - - LOGFUNC; - - visibleloading=1; - - /*musicvolume[3]=512; - PlaySoundEx( music4, samp[music4], NULL, true); - OPENAL_SetPaused(channels[music4], false); - OPENAL_SetVolume(channels[music4], 512); - */ - loadtime=0; - - stillloading=1; - - //texture.data = ( GLubyte* )malloc( 1024*1024*4 ); - - for(i=0;i4)texdetail=4; - LoadTexture(":Data:Textures:shadow.png",&terrain.shadowtexture,0,1); - - LoadTexture(":Data:Textures:blood.png",&terrain.bloodtexture,0,1); - - LoadTexture(":Data:Textures:break.png",&terrain.breaktexture,0,1); - - LoadTexture(":Data:Textures:blood.png",&terrain.bloodtexture2,0,1); - - - LoadTexture(":Data:Textures:footprint.png",&terrain.footprinttexture,0,1); - - LoadTexture(":Data:Textures:bodyprint.png",&terrain.bodyprinttexture,0,1); - - /*LoadTexture(":Data:Textures:cloud.png",&Sprite::cloudtexture,1); - - LoadTexture(":Data:Textures:cloudimpact.png",&Sprite::cloudimpacttexture,1); - - LoadTexture(":Data:Textures:bloodparticle.png",&Sprite::bloodtexture,1); - - LoadTexture(":Data:Textures:snowflake.png",&Sprite::snowflaketexture,1); - - LoadTexture(":Data:Textures:flame.png",&Sprite::flametexture,1); - - LoadTexture(":Data:Textures:smoke.png",&Sprite::smoketexture,1); - //texdetail=temptexdetail; - LoadTexture(":Data:Textures:shine.png",&Sprite::shinetexture,1);*/ - - - - LoadTexture(":Data:Textures:hawk.png",&hawktexture,0,1); - - LoadTexture(":Data:Textures:logo.png",&logotexture,0,1); - - - //LoadTexture(":Data:Textures:box.jpg",&objects.boxtextureptr,1,0); - - - LoadTexture(":Data:Textures:cloud.png",&Sprite::cloudtexture,1,1); - LoadTexture(":Data:Textures:cloudimpact.png",&Sprite::cloudimpacttexture,1,1); - LoadTexture(":Data:Textures:bloodparticle.png",&Sprite::bloodtexture,1,1); - LoadTexture(":Data:Textures:snowflake.png",&Sprite::snowflaketexture,1,1); - LoadTexture(":Data:Textures:flame.png",&Sprite::flametexture,1,1); - LoadTexture(":Data:Textures:bloodflame.png",&Sprite::bloodflametexture,1,1); - LoadTexture(":Data:Textures:smoke.png",&Sprite::smoketexture,1,1); - LoadTexture(":Data:Textures:shine.png",&Sprite::shinetexture,1,0); - LoadTexture(":Data:Textures:splinter.png",&Sprite::splintertexture,1,1); - LoadTexture(":Data:Textures:leaf.png",&Sprite::leaftexture,1,1); - LoadTexture(":Data:Textures:tooth.png",&Sprite::toothtexture,1,1); - - rotation=0; - rotation2=0; - ReSizeGLScene(90,.01); - - viewer=0; - - - - - if(detail)kTextureSize=1024; - if(detail==1)kTextureSize=512; - if(detail==0)kTextureSize=256; - - - //drawmode=motionblurmode; - - //Set up distant light - light.color[0]=.95; - light.color[1]=.95; - light.color[2]=1; - light.ambient[0]=.2; - light.ambient[1]=.2; - light.ambient[2]=.24; - light.location.x=1; - light.location.y=1; - light.location.z=-.2; - Normalise(&light.location); - - LoadingScreen(); - - SetUpLighting(); - - - fadestart=.6; - gravity=-10; - - texscale=.2/megascale/viewdistdetail; - terrain.scale=3*megascale*terraindetail*viewdistdetail; + float temptexdetail; + float viewdistdetail; + float megascale = 1; + + LOGFUNC; + + loadtime = 0; + + stillloading = 1; + + visibleloading = false; //don't use loadscreentexture yet + loadscreentexture.load("Textures/Fire.jpg", 1); + visibleloading = true; + + temptexdetail = texdetail; + texdetail = 1; + text->LoadFontTexture("Textures/Font.png"); + text->BuildFont(); + textmono->LoadFontTexture("Textures/FontMono.png"); + textmono->BuildFont(); + texdetail = temptexdetail; + + viewdistdetail = 2; + viewdistance = 50 * megascale * viewdistdetail; + + if (detail == 2) { + texdetail = 1; + kTextureSize = 1024; + } else if (detail == 1) { + texdetail = 2; + kTextureSize = 512; + } else { + texdetail = 4; + kTextureSize = 256; + } - viewer.x=terrain.size/2*terrain.scale; - viewer.z=terrain.size/2*terrain.scale; + realtexdetail = texdetail; + + Weapon::Load(); + + terrain.shadowtexture.load("Textures/Shadow.png", 0); + terrain.bloodtexture.load("Textures/Blood.png", 0); + terrain.breaktexture.load("Textures/Break.png", 0); + terrain.bloodtexture2.load("Textures/Blood.png", 0); + + terrain.footprinttexture.load("Textures/Footprint.png", 0); + terrain.bodyprinttexture.load("Textures/Bodyprint.png", 0); + hawktexture.load("Textures/Hawk.png", 0); + + Sprite::cloudtexture.load("Textures/Cloud.png", 1); + Sprite::cloudimpacttexture.load("Textures/CloudImpact.png", 1); + Sprite::bloodtexture.load("Textures/BloodParticle.png", 1); + Sprite::snowflaketexture.load("Textures/SnowFlake.png", 1); + Sprite::flametexture.load("Textures/Flame.png", 1); + Sprite::bloodflametexture.load("Textures/BloodFlame.png", 1); + Sprite::smoketexture.load("Textures/Smoke.png", 1); + Sprite::shinetexture.load("Textures/Shine.png", 1); + Sprite::splintertexture.load("Textures/Splinter.png", 1); + Sprite::leaftexture.load("Textures/Leaf.png", 1); + Sprite::toothtexture.load("Textures/Tooth.png", 1); + + yaw = 0; + pitch = 0; + ReSizeGLScene(90, .01); + + viewer = 0; + + //Set up distant light + light.color[0] = .95; + light.color[1] = .95; + light.color[2] = 1; + light.ambient[0] = .2; + light.ambient[1] = .2; + light.ambient[2] = .24; + light.location.x = 1; + light.location.y = 1; + light.location.z = -.2; + Normalise(&light.location); + + LoadingScreen(); + + SetUpLighting(); + + fadestart = .6; + gravity = -10; + + texscale = .2 / megascale / viewdistdetail; + terrain.scale = 3 * megascale * viewdistdetail; + + viewer.x = terrain.size / 2 * terrain.scale; + viewer.z = terrain.size / 2 * terrain.scale; + + hawk.load("Models/Hawk.solid"); + hawk.Scale(.03, .03, .03); + hawk.Rotate(90, 1, 1); + hawk.CalculateNormals(0); + hawk.ScaleNormals(-1, -1, -1); + hawkcoords.x = terrain.size / 2 * terrain.scale - 5 - 7; + hawkcoords.z = terrain.size / 2 * terrain.scale - 5 - 7; + hawkcoords.y = terrain.getHeight(hawkcoords.x, hawkcoords.z) + 25; + + eye.load("Models/Eye.solid"); + eye.Scale(.03, .03, .03); + eye.CalculateNormals(0); + + cornea.load("Models/Cornea.solid"); + cornea.Scale(.03, .03, .03); + cornea.CalculateNormals(0); + + iris.load("Models/Iris.solid"); + iris.Scale(.03, .03, .03); + iris.CalculateNormals(0); + + LoadSave("Textures/WolfBloodFur.png", &PersonType::types[wolftype].bloodText[0]); + LoadSave("Textures/BloodFur.png", &PersonType::types[rabbittype].bloodText[0]); + + oldenvironment = -4; + + gameon = 1; + mainmenu = 0; + + //Fix knife stab, too lazy to do it manually + XYZ moveamount; + moveamount = 0; + moveamount.z = 2; + // FIXME - Why this uses skeleton.joints.size() and not Animation::numjoints? (are they equal?) + // It seems skeleton.joints.size() is 0 at this point, so this is useless. + for (unsigned i = 0; i < Person::players[0]->skeleton.joints.size(); i++) { + for (unsigned j = 0; j < Animation::animations[knifesneakattackanim].frames.size(); j++) { + Animation::animations[knifesneakattackanim].frames[j].joints[i].position += moveamount; + } + } - hawk.load((char *)":Data:Models:hawk.solid",1); - hawk.Scale(.03,.03,.03); - hawk.Rotate(90,1,1); - hawk.CalculateNormals(0); - hawk.ScaleNormals(-1,-1,-1); - hawkcoords.x=terrain.size/2*terrain.scale-5-7; - hawkcoords.z=terrain.size/2*terrain.scale-5-7; - hawkcoords.y=terrain.getHeight(hawkcoords.x,hawkcoords.z)+25; + LoadingScreen(); + for (unsigned i = 0; i < Person::players[0]->skeleton.joints.size(); i++) { + for (unsigned j = 0; j < Animation::animations[knifesneakattackedanim].frames.size(); j++) { + Animation::animations[knifesneakattackedanim].frames[j].joints[i].position += moveamount; + } + } - eye.load((char *)":Data:Models:eye.solid",1); - eye.Scale(.03,.03,.03); - eye.CalculateNormals(0); + LoadingScreen(); - cornea.load((char *)":Data:Models:cornea.solid",1); - cornea.Scale(.03,.03,.03); - cornea.CalculateNormals(0); + for (unsigned i = 0; i < Person::players[0]->skeleton.joints.size(); i++) { + Animation::animations[dead1anim].frames[1].joints[i].position = Animation::animations[dead1anim].frames[0].joints[i].position; + Animation::animations[dead2anim].frames[1].joints[i].position = Animation::animations[dead2anim].frames[0].joints[i].position; + Animation::animations[dead3anim].frames[1].joints[i].position = Animation::animations[dead3anim].frames[0].joints[i].position; + Animation::animations[dead4anim].frames[1].joints[i].position = Animation::animations[dead4anim].frames[0].joints[i].position; + } + Animation::animations[dead1anim].frames[0].speed = 0.001; + Animation::animations[dead2anim].frames[0].speed = 0.001; + Animation::animations[dead3anim].frames[0].speed = 0.001; + Animation::animations[dead4anim].frames[0].speed = 0.001; + + Animation::animations[dead1anim].frames[1].speed = 0.001; + Animation::animations[dead2anim].frames[1].speed = 0.001; + Animation::animations[dead3anim].frames[1].speed = 0.001; + Animation::animations[dead4anim].frames[1].speed = 0.001; + + for (unsigned i = 0; i < Person::players[0]->skeleton.joints.size(); i++) { + for (unsigned j = 0; j < Animation::animations[swordsneakattackanim].frames.size(); j++) { + Animation::animations[swordsneakattackanim].frames[j].joints[i].position += moveamount; + } + } + LoadingScreen(); + for (unsigned j = 0; j < Animation::animations[swordsneakattackanim].frames.size(); j++) { + Animation::animations[swordsneakattackanim].frames[j].weapontarget += moveamount; + } - iris.load((char *)":Data:Models:iris.solid",1); - iris.Scale(.03,.03,.03); - iris.CalculateNormals(0); + LoadingScreen(); - LoadSave(":Data:Textures:Bloodfur.png",0,1,&bloodText[0],0); - LoadSave(":Data:Textures:Wolfbloodfur.png",0,1,&wolfbloodText[0],0); + for (unsigned i = 0; i < Person::players[0]->skeleton.joints.size(); i++) { + for (unsigned j = 0; j < Animation::animations[swordsneakattackedanim].frames.size(); j++) { + Animation::animations[swordsneakattackedanim].frames[j].joints[i].position += moveamount; + } + } - oldenvironment=-4; + LoadingScreen(); - gameon=1; - mainmenu=0; + if (!screentexture) { + LoadScreenTexture(); + } - firstload=0; - //if(targetlevel!=7) - Loadlevel(targetlevel); + if (targetlevel != 7) { + emit_sound_at(fireendsound); + } + stillloading = 0; + loading = 0; + changedelay = 1; - rabbitcoords=player[0].coords; - rabbitcoords.y=terrain.getHeight(rabbitcoords.x,rabbitcoords.z); - - loadAllAnimations(); - //Fix knife stab, too lazy to do it manually - XYZ moveamount; - moveamount=0; - moveamount.z=2; - for(i=0;i