X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FGame.cpp;h=16014421732bfa4904e70777d8efc968c85c2265;hb=1c7d28a2fc93699ab955ea66203d0c36bba9d977;hp=66aafdf565c0afcc003bf3f63e820fb659f39980;hpb=f7f3989db89536a13751c11625168948a08e03e0;p=lugaru.git diff --git a/Source/Game.cpp b/Source/Game.cpp index 66aafdf..1601442 100644 --- a/Source/Game.cpp +++ b/Source/Game.cpp @@ -1,3 +1,24 @@ +/* +Copyright (C) 2003, 2010 - Wolfire Games + +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. + +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, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + #include "Game.h" #include "openal_wrapper.h" #include "SDL_thread.h" @@ -16,350 +37,244 @@ XYZ dialoguecamera[max_dialogues][max_dialoguelength]; XYZ participantlocation[max_dialogues][10]; int participantfocus[max_dialogues][max_dialoguelength]; int participantaction[max_dialogues][max_dialoguelength]; -float participantrotation[max_dialogues][10]; +float participantyaw[max_dialogues][10]; XYZ participantfacing[max_dialogues][max_dialoguelength][10]; -float dialoguecamerarotation[max_dialogues][max_dialoguelength]; -float dialoguecamerarotation2[max_dialogues][max_dialoguelength]; +float dialoguecamerayaw[max_dialogues][max_dialoguelength]; +float dialoguecamerapitch[max_dialogues][max_dialoguelength]; int indialogue; int whichdialogue; int directing; float dialoguetime; int dialoguegonethrough[20]; -std::vector Game::textures; - -Game::Game() +namespace Game { - terraintexture = 0; - terraintexture2 = 0; - terraintexture3 = 0; - screentexture = 0; - screentexture2 = 0; - logotexture = 0; - loadscreentexture = 0; - Maparrowtexture = 0; - Mapboxtexture = 0; - Mapcircletexture = 0; - cursortexture = 0; - - memset(Mainmenuitems, 0, sizeof(Mainmenuitems)); - - nummenuitems = 0; - - memset(startx, 0, sizeof(startx)); - memset(starty, 0, sizeof(starty)); - memset(endx, 0, sizeof(endx)); - memset(endy, 0, sizeof(endy)); - - memset(selectedlong, 0, sizeof(selectedlong)); - memset(offsetx, 0, sizeof(offsetx)); - memset(offsety, 0, sizeof(offsety)); - memset(movex, 0, sizeof(movex)); - memset(movey, 0, sizeof(movey)); - memset(endy, 0, sizeof(endy)); - - transition = 0; - anim = 0; - selected = 0; - loaddistrib = 0; - keyselect = 0; - indemo = 0; - - won = 0; - - entername = 0; - - memset(menustring, 0, sizeof(menustring)); - memset(registrationname, 0, sizeof(registrationname)); - registrationnumber = 0; - - newdetail = 0; - newscreenwidth = 0; - newscreenheight = 0; - - gameon = 0; - deltah = 0,deltav = 0; - mousecoordh = 0,mousecoordv = 0; - oldmousecoordh = 0,oldmousecoordv = 0; - rotation = 0,rotation2 = 0; - -// SkyBox skybox; - - cameramode = 0; - olddrawmode = 0; - drawmode = 0; - firstload = 0; - oldbutton = 0; - - leveltime = 0; - loadtime = 0; - -// Model hawk; - -// XYZ hawkcoords; -// XYZ realhawkcoords; - - hawktexture = 0; - hawkrotation = 0; - hawkcalldelay = 0; -/* - Model eye; - Model iris; - Model cornea; -*/ - stealthloading = 0; - - campaignnumlevels = 0; - - memset(campaignmapname, 0, sizeof(campaignmapname)); - memset(campaigndescription, 0, sizeof(campaigndescription)); - memset(campaignchoosenext, 0, sizeof(campaignchoosenext)); - memset(campaignnumnext, 0, sizeof(campaignnumnext)); - memset(campaignnextlevel, 0, sizeof(campaignnextlevel)); - int campaignchoicesmade; - memset(campaignchoices, 0, sizeof(campaignchoices)); - memset(campaignlocationx, 0, sizeof(campaignlocationx)); - memset(campaignlocationy, 0, sizeof(campaignlocationy)); - memset(campaignlocationy, 0, sizeof(campaignlocationy)); - - campaignchoicenum = 0; - - memset(campaignchoicewhich, 0, sizeof(campaignchoicewhich)); - - whichchoice = 0; - - numlevelspassed = 0; - - memset(levelorder, 0, sizeof(levelorder)); - memset(levelvisible, 0, sizeof(levelvisible)); - memset(levelhighlight, 0, sizeof(levelhighlight)); - - minimap = 0; - - musictype = 0,oldmusictype = 0,oldoldmusictype = 0; - realthreat = 0; - -// Model rabbit; -// XYZ rabbitcoords; - -// XYZ mapcenter; - mapradius = 0; - -// Text text; - fps = 0; - -// XYZ cameraloc; - cameradist = 0; - - drawtoggle = 0; - - editorenabled = 0; - editortype = 0; - editorsize = 0; - editorrotation = 0; - editorrotation2 = 0; - - brightness = 0; - - quit = 0; - tryquit = 0; - -// XYZ pathpoint[30]; - numpathpoints = 0; - memset(numpathpointconnect, 0, sizeof(numpathpointconnect)); - memset(pathpointconnect, 0, sizeof(pathpointconnect)); - pathpointselected = 0; - - endgame = 0; - scoreadded = 0; - numchallengelevels = 0; - - console = 0; - archiveselected = 0; - - memset(consoletext, 0, sizeof(consoletext)); - memset(consolechars, 0, sizeof(consolechars)); - chatting = 0; - memset(displaytext, 0, sizeof(displaytext)); - memset(displaychars, 0, sizeof(displaychars)); - memset(displaytime, 0, sizeof(displaytime)); - displayblinkdelay = 0; - displayblink = 0; - displayselected = 0; - consolekeydown = 0; - consoleblinkdelay = 0; - consoleblink = 0; - consoleselected = 0; - autocam = 0; - - crouchkey = 0,jumpkey = 0,forwardkey = 0,chatkey = 0,backkey = 0,leftkey = 0,rightkey = 0,drawkey = 0,throwkey = 0,attackkey = 0; - oldattackkey = 0; - - loading = 0; - talkdelay = 0; +Texture terraintexture; +Texture terraintexture2; +Texture loadscreentexture; +Texture Maparrowtexture; +Texture Mapboxtexture; +Texture Mapcircletexture; +Texture cursortexture; +GLuint screentexture = 0; +GLuint screentexture2 = 0; +Texture Mainmenuitems[10]; + +int selected = 0; +int keyselect = 0; + +int newdetail = 0; +int newscreenwidth = 0; +int newscreenheight = 0; + +bool gameon = 0; +float deltah = 0; +float deltav = 0; +int mousecoordh = 0; +int mousecoordv = 0; +int oldmousecoordh = 0; +int oldmousecoordv = 0; +float yaw = 0; +float pitch = 0; +SkyBox *skybox = NULL; +bool cameramode = 0; +bool firstload = 0; + +Texture hawktexture; +float hawkyaw = 0; +float hawkcalldelay = 0; +float leveltime = 0; +float loadtime = 0; + +Model hawk; +XYZ hawkcoords; +XYZ realhawkcoords; + +Model eye; +Model iris; +Model cornea; + +bool stealthloading = 0; + +int musictype = 0; + +XYZ mapcenter; +float mapradius = 0; + +Text *text = NULL; +float fps = 0; + +bool editorenabled = 0; +int editortype = 0; +float editorsize = 0; +float editoryaw = 0; +float editorpitch = 0; + +int tryquit = 0; + +XYZ pathpoint[30]; +int numpathpoints = 0; +int numpathpointconnect[30] = {}; +int pathpointconnect[30][30] = {}; +int pathpointselected = 0; + +int endgame = 0; +bool scoreadded = 0; +int numchallengelevels = 0; + +bool console = false; +std::string consoletext[15] = {}; +bool chatting = 0; +std::string displaytext[15] = {}; +float displaytime[15] = {}; +float displayblinkdelay = 0; +bool displayblink = 0; +int displayselected = 0; +float consoleblinkdelay = 0; +bool consoleblink = 0; +int consoleselected = 0; + +unsigned short crouchkey = 0, jumpkey = 0, forwardkey = 0, chatkey = 0, backkey = 0, leftkey = 0, rightkey = 0, drawkey = 0, throwkey = 0, attackkey = 0; +unsigned short consolekey = 0; + +int loading = 0; + +int oldenvironment = 0; +int targetlevel = 0; +float changedelay = 0; + +bool waiting = false; +Account* accountactive = NULL; +} - numboundaries = 0; -// XYZ boundary[360]; +void Game::fireSound(int sound) +{ + emit_sound_at(sound); +} - whichlevel = 0; - oldenvironment = 0; - targetlevel = 0; - changedelay = 0; +void Game::inputText(string& str, int* charselected) +{ + SDL_Event evenement; - memset(musicvolume, 0, sizeof(musicvolume)); - memset(oldmusicvolume, 0, sizeof(oldmusicvolume)); - musicselected = 0; - change = 0; - -//------------ - - waiting = false; - mainmenu = 0; - - accountactive = NULL; -} + if (!waiting) { + SDL_StartTextInput(); + waiting = true; + } -typedef struct { - Game* game; - void (Game::*method)(); -} params_thread; + while (SDL_PollEvent(&evenement)) { + switch (evenement.type) { + case SDL_TEXTEDITING: + /* FIXME - We should handle this for complete input method support */ + break; + case SDL_TEXTINPUT: + str.insert(*charselected, evenement.text.text); + (*charselected) += strlen(evenement.text.text); + break; + case SDL_KEYDOWN: + if (evenement.key.keysym.sym == SDLK_ESCAPE) { + str.clear(); + *charselected = 0; + waiting = false; + } else if (evenement.key.keysym.sym == SDLK_BACKSPACE) { + if ((*charselected) > 0) { + (*charselected)--; + str.erase(*charselected, 1); + } + } else if (evenement.key.keysym.sym == SDLK_DELETE) { + if ((*charselected) < str.size()) { + str.erase(*charselected, 1); + } + } else if (evenement.key.keysym.sym == SDLK_HOME) { + (*charselected) = 0; + } else if (evenement.key.keysym.sym == SDLK_END) { + (*charselected) = str.size(); + } else if (evenement.key.keysym.sym == SDLK_LEFT) { + if ((*charselected) != 0) + (*charselected)--; + } else if (evenement.key.keysym.sym == SDLK_RIGHT) { + if ((*charselected) < str.size()) + (*charselected)++; + } else if (evenement.key.keysym.sym == SDLK_RETURN) { + waiting = false; + } + break; + } + } -void Game::fireSound(int sound) { - emit_sound_at(sound); + if (!waiting) { + SDL_StopTextInput(); + } } -void Game::inputText(char* str, int* charselected, int* nb_chars) { - SDL_Event evenement; - int i; - - if(!waiting) { - waiting=true; - SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY,SDL_DEFAULT_REPEAT_INTERVAL); - SDL_EnableUNICODE(true); - } - - SDL_PollEvent(&evenement); - - switch(evenement.type) { - case SDL_KEYDOWN: - if(evenement.key.keysym.sym == SDLK_ESCAPE) { - for(i=0;i<255;i++){ - str[i]=' '; - } - *nb_chars=0; - *charselected=0; - waiting=false; - } else if(evenement.key.keysym.sym==SDLK_BACKSPACE){ - if((*charselected)!=0) { - for(i=(*charselected)-1;i<255;i++){ - str[i]=str[i+1]; - } - str[255]=' '; - (*charselected)--; - (*nb_chars)--; - } - } else if(evenement.key.keysym.sym==SDLK_DELETE){ - for(i=(*charselected);i<255;i++){ - str[i]=str[i+1]; - } - str[255]=' '; - (*nb_chars)--; - } else if(evenement.key.keysym.sym==SDLK_LEFT){ - if((*charselected)!=0) - (*charselected)--; - } else if(evenement.key.keysym.sym==SDLK_RIGHT){ - if((*charselected)<(*nb_chars)) - (*charselected)++; - } else if(evenement.key.keysym.sym==SDLK_RETURN) { - waiting=false; - } else if((evenement.key.keysym.unicode<127)&&((*nb_chars)<60)&&(evenement.key.keysym.sym!=SDLK_LSHIFT)&&(evenement.key.keysym.sym!=SDLK_RSHIFT)) { - for(i=255;i>=(*charselected)+1;i--){ - str[i]=str[i-1]; - } - str[*charselected]=evenement.key.keysym.unicode; - (*charselected)++; - (*nb_chars)++; - } - break; - } - - if(!waiting) { - SDL_EnableKeyRepeat(0,0); // disable key repeat - SDL_EnableUNICODE(false); - } +int setKeySelected_thread(void* data) +{ + using namespace Game; + int scancode = -1; + SDL_Event evenement; + while (scancode == -1) { + SDL_WaitEvent(&evenement); + switch (evenement.type) { + case SDL_KEYDOWN: + scancode = evenement.key.keysym.scancode; + break; + case SDL_MOUSEBUTTONDOWN: + scancode = SDL_NUM_SCANCODES + evenement.button.button; + break; + default: + break; + } + } + if (scancode != SDL_SCANCODE_ESCAPE) { + fireSound(); + switch (keyselect) { + case 0: + forwardkey = scancode; + break; + case 1: + backkey = scancode; + break; + case 2: + leftkey = scancode; + break; + case 3: + rightkey = scancode; + break; + case 4: + crouchkey = scancode; + break; + case 5: + jumpkey = scancode; + break; + case 6: + drawkey = scancode; + break; + case 7: + throwkey = scancode; + break; + case 8: + attackkey = scancode; + break; + case 9: + consolekey = scancode; + break; + default: + break; + } + } + keyselect = -1; + waiting = false; + LoadMenu(); + return 0; } -void Game::setKeySelected() { - waiting=true; - params_thread* data = new params_thread; - data->game = this; - data->method = &Game::setKeySelected_thread; +void Game::setKeySelected() +{ + waiting = true; printf("launch thread\n"); - SDL_Thread* thread = SDL_CreateThread(Game::thread, data); + SDL_Thread* thread = SDL_CreateThread(setKeySelected_thread, NULL, NULL); if ( thread == NULL ) { fprintf(stderr, "Unable to create thread: %s\n", SDL_GetError()); - waiting=false; + waiting = false; return; } } - -void Game::setKeySelected_thread() { - int keycode=-1; - SDL_Event evenement; - while(keycode==-1) { - SDL_WaitEvent(&evenement); - switch(evenement.type) { - case SDL_KEYDOWN: - keycode = evenement.key.keysym.sym; - break; - case SDL_MOUSEBUTTONDOWN: - keycode = SDLK_LAST+evenement.button.button; - break; - default: - break; - } - } - if(keycode != SDLK_ESCAPE) { - fireSound(); - switch(keyselect) { - case 0: forwardkey=keycode; - break; - case 1: backkey=keycode; - break; - case 2: leftkey=keycode; - break; - case 3: rightkey=keycode; - break; - case 4: crouchkey=keycode; - break; - case 5: jumpkey=keycode; - break; - case 6: drawkey=keycode; - break; - case 7: throwkey=keycode; - break; - case 8: attackkey=keycode; - break; - default: - break; - } - } - keyselect=-1; - waiting=false; -} - -int Game::thread(void *data) { - params_thread* pt = (params_thread*)data; - if(pt) { - (pt->game->*(pt->method))(); - } -} - -void Game::DrawGL() { - if ( stereomode == stereoNone ) { - DrawGLScene(stereoCenter); - } else { - DrawGLScene(stereoLeft); - DrawGLScene(stereoRight); - } -}