]> git.jsancho.org Git - lugaru.git/blob - Source/Game.cpp
merge
[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
54         selected = 0;
55         keyselect = 0;
56         indemo = 0;
57
58         won = 0;
59
60         entername = 0;
61
62         memset(menustring, 0, sizeof(menustring));
63         memset(registrationname, 0, sizeof(registrationname));
64         registrationnumber = 0;
65
66         newdetail = 0;
67         newscreenwidth = 0;
68         newscreenheight = 0;
69
70         gameon = 0;
71         deltah = 0,deltav = 0;
72         mousecoordh = 0,mousecoordv = 0;
73         oldmousecoordh = 0,oldmousecoordv = 0;
74         rotation = 0,rotation2 = 0;
75
76 //      SkyBox skybox;
77
78         cameramode = 0;
79         olddrawmode = 0;
80         drawmode = 0;
81         firstload = 0;
82         oldbutton = 0;
83
84         leveltime = 0;
85         loadtime = 0;
86
87 //      Model hawk;
88
89 //      XYZ hawkcoords;
90 //      XYZ realhawkcoords;
91
92         hawktexture = 0;
93         hawkrotation = 0;
94         hawkcalldelay = 0;
95 /*
96         Model eye;
97         Model iris;
98         Model cornea;
99 */
100         stealthloading = 0;
101
102         whichchoice = 0;
103         actuallevel = 0;
104         winhotspot = false;
105         windialogue = false;
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         consolekey = 0;
167         oldattackkey = 0;
168
169         loading = 0;
170         talkdelay = 0;
171
172         numboundaries = 0;
173 //      XYZ boundary[360];
174
175         whichlevel = 0;
176         oldenvironment = 0;
177         targetlevel = 0;
178         changedelay = 0;
179
180         memset(musicvolume, 0, sizeof(musicvolume));
181         memset(oldmusicvolume, 0, sizeof(oldmusicvolume));
182         musicselected = 0;
183         change = 0;
184         
185 //------------
186
187         waiting = false;
188         mainmenu = 0;
189         
190         accountactive = NULL;
191 }
192
193 typedef struct {
194         Game* game;
195         void (Game::*method)();
196 } params_thread;
197
198 void Game::fireSound(int sound) {
199         emit_sound_at(sound);
200 }
201
202 void Game::inputText(char* str, int* charselected, int* nb_chars) {
203         SDL_Event evenement;
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         while(SDL_PollEvent(&evenement)) {
212         
213                 switch(evenement.type) {
214                         case SDL_KEYDOWN:
215                                 if(evenement.key.keysym.sym == SDLK_ESCAPE) {
216                                         for(int 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(int 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(int 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(int 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         
259         if(!waiting) {
260                 SDL_EnableKeyRepeat(0,0); // disable key repeat
261                 SDL_EnableUNICODE(false);
262         }
263 }
264
265 void Game::setKeySelected() {
266         waiting=true;
267         params_thread* data = new params_thread;
268     data->game = this;
269     data->method = &Game::setKeySelected_thread;
270     printf("launch thread\n");
271         SDL_Thread* thread = SDL_CreateThread(Game::thread, data);
272     if ( thread == NULL ) {
273         fprintf(stderr, "Unable to create thread: %s\n", SDL_GetError());
274                 waiting=false;
275         return;
276     }
277 }
278
279 void Game::setKeySelected_thread() {
280         int keycode=-1;
281         SDL_Event evenement;
282         while(keycode==-1) {
283                 SDL_WaitEvent(&evenement);
284                 switch(evenement.type) {
285                         case SDL_KEYDOWN:
286                                 keycode = evenement.key.keysym.sym;
287                         break;
288                         case SDL_MOUSEBUTTONDOWN:
289                                 keycode = SDLK_LAST+evenement.button.button;
290                         break;
291                         default:
292                         break;
293                 }
294         }
295         if(keycode != SDLK_ESCAPE) {
296                 fireSound();
297                 switch(keyselect) {
298                         case 0: forwardkey=keycode;
299                         break;
300                         case 1: backkey=keycode;
301                         break;
302                         case 2: leftkey=keycode;
303                         break;
304                         case 3: rightkey=keycode;
305                         break;
306                         case 4: crouchkey=keycode;
307                         break;
308                         case 5: jumpkey=keycode;
309                         break;
310                         case 6: drawkey=keycode;
311                         break;
312                         case 7: throwkey=keycode;
313                         break;
314                         case 8: attackkey=keycode;
315                         break;
316                         case 9: consolekey=keycode;
317                         break;
318                         default:
319                         break;
320                 }
321         }
322         keyselect=-1;
323         waiting=false;
324 }
325
326 int Game::thread(void *data) {
327         params_thread* pt = (params_thread*)data;
328     if(pt) {
329         (pt->game->*(pt->method))();
330     }
331 }
332
333 void Game::DrawGL() {
334         if ( stereomode == stereoNone ) {
335                 DrawGLScene(stereoCenter);
336         } else {
337                 DrawGLScene(stereoLeft);
338                 DrawGLScene(stereoRight);
339         }
340 }