]> git.jsancho.org Git - lugaru.git/blob - Source/Game.cpp
A lot of clean up in MenuDraw.
[lugaru.git] / Source / Game.cpp
1 #include "Game.h"
2 #include "openal_wrapper.h"
3 #include "SDL_thread.h"
4
5 extern int mainmenu;
6
7 int numdialogues;
8 int numdialogueboxes[max_dialogues];
9 int dialoguetype[max_dialogues];
10 int dialogueboxlocation[max_dialogues][max_dialoguelength];
11 float dialogueboxcolor[max_dialogues][max_dialoguelength][3];
12 int dialogueboxsound[max_dialogues][max_dialoguelength];
13 char dialoguetext[max_dialogues][max_dialoguelength][128];
14 char dialoguename[max_dialogues][max_dialoguelength][64];
15 XYZ dialoguecamera[max_dialogues][max_dialoguelength];
16 XYZ participantlocation[max_dialogues][10];
17 int participantfocus[max_dialogues][max_dialoguelength];
18 int participantaction[max_dialogues][max_dialoguelength];
19 float participantrotation[max_dialogues][10];
20 XYZ participantfacing[max_dialogues][max_dialoguelength][10];
21 float dialoguecamerarotation[max_dialogues][max_dialoguelength];
22 float dialoguecamerarotation2[max_dialogues][max_dialoguelength];
23 int indialogue;
24 int whichdialogue;
25 int directing;
26 float dialoguetime;
27 int dialoguegonethrough[20];
28
29 std::vector<TextureInfo> Game::textures;
30
31 Game::Game()
32 {
33         terraintexture = 0;
34         terraintexture2 = 0;
35         terraintexture3 = 0;
36         screentexture = 0;
37         screentexture2 = 0;
38         logotexture = 0;
39         loadscreentexture = 0;
40         Maparrowtexture = 0;
41         Mapboxtexture = 0;
42         Mapcircletexture = 0;
43         cursortexture = 0;
44
45         memset(Mainmenuitems, 0, sizeof(Mainmenuitems));
46
47         nummenuitems = 0;
48
49         memset(startx, 0, sizeof(startx));
50         memset(starty, 0, sizeof(starty));
51         memset(endx, 0, sizeof(endx));
52         memset(endy, 0, sizeof(endy));
53
54         memset(selectedlong, 0, sizeof(selectedlong));
55
56         selected = 0;
57         keyselect = 0;
58         indemo = 0;
59
60         won = 0;
61
62         entername = 0;
63
64         memset(menustring, 0, sizeof(menustring));
65         memset(registrationname, 0, sizeof(registrationname));
66         registrationnumber = 0;
67
68         newdetail = 0;
69         newscreenwidth = 0;
70         newscreenheight = 0;
71
72         gameon = 0;
73         deltah = 0,deltav = 0;
74         mousecoordh = 0,mousecoordv = 0;
75         oldmousecoordh = 0,oldmousecoordv = 0;
76         rotation = 0,rotation2 = 0;
77
78 //      SkyBox skybox;
79
80         cameramode = 0;
81         olddrawmode = 0;
82         drawmode = 0;
83         firstload = 0;
84         oldbutton = 0;
85
86         leveltime = 0;
87         loadtime = 0;
88
89 //      Model hawk;
90
91 //      XYZ hawkcoords;
92 //      XYZ realhawkcoords;
93
94         hawktexture = 0;
95         hawkrotation = 0;
96         hawkcalldelay = 0;
97 /*
98         Model eye;
99         Model iris;
100         Model cornea;
101 */
102         stealthloading = 0;
103
104         whichchoice = 0;
105         actuallevel = 0;
106
107         minimap = 0;
108
109         musictype = 0,oldmusictype = 0,oldoldmusictype = 0;
110         realthreat = 0;
111
112 //      Model rabbit;
113 //      XYZ rabbitcoords;
114
115 //      XYZ mapcenter;
116         mapradius = 0;
117
118 //      Text text;
119         fps = 0;
120
121 //      XYZ cameraloc;
122         cameradist = 0;
123
124         drawtoggle = 0;
125
126         editorenabled = 0;
127         editortype = 0;
128         editorsize = 0;
129         editorrotation = 0;
130         editorrotation2 = 0;
131
132         brightness = 0;
133
134         quit = 0;
135         tryquit = 0;
136
137 //      XYZ pathpoint[30];
138         numpathpoints = 0;
139         memset(numpathpointconnect, 0, sizeof(numpathpointconnect));
140         memset(pathpointconnect, 0, sizeof(pathpointconnect));
141         pathpointselected = 0;
142
143         endgame = 0;
144         scoreadded = 0;
145         numchallengelevels = 0;
146
147         console = false;
148         archiveselected = 0;
149
150         memset(consoletext, 0, sizeof(consoletext));
151         memset(consolechars, 0, sizeof(consolechars));
152         chatting = 0;
153         memset(displaytext, 0, sizeof(displaytext));
154         memset(displaychars, 0, sizeof(displaychars));
155         memset(displaytime, 0, sizeof(displaytime));
156         displayblinkdelay = 0;
157         displayblink = 0;
158         displayselected = 0;
159         consolekeydown = 0;
160         consoleblinkdelay = 0;
161         consoleblink = 0;
162         consoleselected = 0;
163         autocam = 0;
164
165         crouchkey = 0,jumpkey = 0,forwardkey = 0,chatkey = 0,backkey = 0,leftkey = 0,rightkey = 0,drawkey = 0,throwkey = 0,attackkey = 0;
166         oldattackkey = 0;
167
168         loading = 0;
169         talkdelay = 0;
170
171         numboundaries = 0;
172 //      XYZ boundary[360];
173
174         whichlevel = 0;
175         oldenvironment = 0;
176         targetlevel = 0;
177         changedelay = 0;
178
179         memset(musicvolume, 0, sizeof(musicvolume));
180         memset(oldmusicvolume, 0, sizeof(oldmusicvolume));
181         musicselected = 0;
182         change = 0;
183         
184 //------------
185
186         waiting = false;
187         mainmenu = 0;
188         
189         accountactive = NULL;
190 }
191
192 typedef struct {
193         Game* game;
194         void (Game::*method)();
195 } params_thread;
196
197 void Game::fireSound(int sound) {
198         emit_sound_at(sound);
199 }
200
201 void Game::inputText(char* str, int* charselected, int* nb_chars) {
202         SDL_Event evenement;
203         int i;
204         
205         if(!waiting) {
206                 waiting=true;
207                 SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY,SDL_DEFAULT_REPEAT_INTERVAL);
208                 SDL_EnableUNICODE(true);
209         }
210
211         SDL_PollEvent(&evenement);
212         
213         switch(evenement.type) {
214                 case SDL_KEYDOWN:
215                         if(evenement.key.keysym.sym == SDLK_ESCAPE) {
216                                 for(i=0;i<255;i++)
217                                         str[i]=0;
218                                 *nb_chars=0;
219                                 *charselected=0;
220                                 waiting=false;
221                         } else if(evenement.key.keysym.sym==SDLK_BACKSPACE){
222                                 if((*charselected)!=0) {
223                                         for(i=(*charselected)-1;i<255;i++)
224                                                 str[i]=str[i+1];
225                                         str[255]=0;
226                                         (*charselected)--;
227                                         (*nb_chars)--;
228                                 }
229                         } else if(evenement.key.keysym.sym==SDLK_DELETE){
230                                 if((*charselected)<(*nb_chars)){
231                     for(i=(*charselected);i<255;i++)
232                         str[i]=str[i+1];
233                     str[255]=0;
234                     (*nb_chars)--;
235                 }
236                         } else if(evenement.key.keysym.sym==SDLK_HOME){
237                 (*charselected)=0;
238                         } else if(evenement.key.keysym.sym==SDLK_END){
239                 (*charselected)=(*nb_chars);
240                         } else if(evenement.key.keysym.sym==SDLK_LEFT){
241                                 if((*charselected)!=0)
242                                         (*charselected)--;
243                         } else if(evenement.key.keysym.sym==SDLK_RIGHT){
244                                 if((*charselected)<(*nb_chars))
245                                         (*charselected)++;
246                         } else if(evenement.key.keysym.sym==SDLK_RETURN) {
247                                 waiting=false;
248                         } else if(evenement.key.keysym.unicode>=32&&evenement.key.keysym.unicode<127&&(*nb_chars)<60){
249                                 for(i=255;i>=(*charselected)+1;i--)
250                                         str[i]=str[i-1];
251                                 str[*charselected]=evenement.key.keysym.unicode;
252                                 (*charselected)++;
253                                 (*nb_chars)++;
254                         }
255                 break;
256         }
257         
258         if(!waiting) {
259                 SDL_EnableKeyRepeat(0,0); // disable key repeat
260                 SDL_EnableUNICODE(false);
261         }
262 }
263
264 void Game::setKeySelected() {
265         waiting=true;
266         params_thread* data = new params_thread;
267     data->game = this;
268     data->method = &Game::setKeySelected_thread;
269     printf("launch thread\n");
270         SDL_Thread* thread = SDL_CreateThread(Game::thread, data);
271     if ( thread == NULL ) {
272         fprintf(stderr, "Unable to create thread: %s\n", SDL_GetError());
273                 waiting=false;
274         return;
275     }
276 }
277
278 void Game::setKeySelected_thread() {
279         int keycode=-1;
280         SDL_Event evenement;
281         while(keycode==-1) {
282                 SDL_WaitEvent(&evenement);
283                 switch(evenement.type) {
284                         case SDL_KEYDOWN:
285                                 keycode = evenement.key.keysym.sym;
286                         break;
287                         case SDL_MOUSEBUTTONDOWN:
288                                 keycode = SDLK_LAST+evenement.button.button;
289                         break;
290                         default:
291                         break;
292                 }
293         }
294         if(keycode != SDLK_ESCAPE) {
295                 fireSound();
296                 switch(keyselect) {
297                         case 0: forwardkey=keycode;
298                         break;
299                         case 1: backkey=keycode;
300                         break;
301                         case 2: leftkey=keycode;
302                         break;
303                         case 3: rightkey=keycode;
304                         break;
305                         case 4: crouchkey=keycode;
306                         break;
307                         case 5: jumpkey=keycode;
308                         break;
309                         case 6: drawkey=keycode;
310                         break;
311                         case 7: throwkey=keycode;
312                         break;
313                         case 8: attackkey=keycode;
314                         break;
315                         default:
316                         break;
317                 }
318         }
319         keyselect=-1;
320         waiting=false;
321 }
322
323 int Game::thread(void *data) {
324         params_thread* pt = (params_thread*)data;
325     if(pt) {
326         (pt->game->*(pt->method))();
327     }
328 }
329
330 void Game::DrawGL() {
331         if ( stereomode == stereoNone ) {
332                 DrawGLScene(stereoCenter);
333         } else {
334                 DrawGLScene(stereoLeft);
335                 DrawGLScene(stereoRight);
336         }
337 }