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