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