]> git.jsancho.org Git - lugaru.git/blob - Source/Game.cpp
Refactor of the texture system
[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
105         minimap = 0;
106
107         musictype = 0,oldmusictype = 0,oldoldmusictype = 0;
108         realthreat = 0;
109
110 //      Model rabbit;
111 //      XYZ rabbitcoords;
112
113 //      XYZ mapcenter;
114         mapradius = 0;
115
116 //      Text text;
117         fps = 0;
118
119 //      XYZ cameraloc;
120         cameradist = 0;
121
122         drawtoggle = 0;
123
124         editorenabled = 0;
125         editortype = 0;
126         editorsize = 0;
127         editorrotation = 0;
128         editorrotation2 = 0;
129
130         brightness = 0;
131
132         quit = 0;
133         tryquit = 0;
134
135 //      XYZ pathpoint[30];
136         numpathpoints = 0;
137         memset(numpathpointconnect, 0, sizeof(numpathpointconnect));
138         memset(pathpointconnect, 0, sizeof(pathpointconnect));
139         pathpointselected = 0;
140
141         endgame = 0;
142         scoreadded = 0;
143         numchallengelevels = 0;
144
145         console = false;
146         archiveselected = 0;
147
148         memset(consoletext, 0, sizeof(consoletext));
149         memset(consolechars, 0, sizeof(consolechars));
150         chatting = 0;
151         memset(displaytext, 0, sizeof(displaytext));
152         memset(displaychars, 0, sizeof(displaychars));
153         memset(displaytime, 0, sizeof(displaytime));
154         displayblinkdelay = 0;
155         displayblink = 0;
156         displayselected = 0;
157         consolekeydown = 0;
158         consoleblinkdelay = 0;
159         consoleblink = 0;
160         consoleselected = 0;
161         autocam = 0;
162
163         crouchkey = 0,jumpkey = 0,forwardkey = 0,chatkey = 0,backkey = 0,leftkey = 0,rightkey = 0,drawkey = 0,throwkey = 0,attackkey = 0;
164         oldattackkey = 0;
165
166         loading = 0;
167         talkdelay = 0;
168
169         numboundaries = 0;
170 //      XYZ boundary[360];
171
172         whichlevel = 0;
173         oldenvironment = 0;
174         targetlevel = 0;
175         changedelay = 0;
176
177         memset(musicvolume, 0, sizeof(musicvolume));
178         memset(oldmusicvolume, 0, sizeof(oldmusicvolume));
179         musicselected = 0;
180         change = 0;
181         
182 //------------
183
184         waiting = false;
185         mainmenu = 0;
186         
187         accountactive = NULL;
188 }
189
190 typedef struct {
191         Game* game;
192         void (Game::*method)();
193 } params_thread;
194
195 void Game::fireSound(int sound) {
196         emit_sound_at(sound);
197 }
198
199 void Game::inputText(char* str, int* charselected, int* nb_chars) {
200         SDL_Event evenement;
201         int i;
202         
203         if(!waiting) {
204                 waiting=true;
205                 SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY,SDL_DEFAULT_REPEAT_INTERVAL);
206                 SDL_EnableUNICODE(true);
207         }
208
209         SDL_PollEvent(&evenement);
210         
211         switch(evenement.type) {
212                 case SDL_KEYDOWN:
213                         if(evenement.key.keysym.sym == SDLK_ESCAPE) {
214                                 for(i=0;i<255;i++)
215                                         str[i]=0;
216                                 *nb_chars=0;
217                                 *charselected=0;
218                                 waiting=false;
219                         } else if(evenement.key.keysym.sym==SDLK_BACKSPACE){
220                                 if((*charselected)!=0) {
221                                         for(i=(*charselected)-1;i<255;i++)
222                                                 str[i]=str[i+1];
223                                         str[255]=0;
224                                         (*charselected)--;
225                                         (*nb_chars)--;
226                                 }
227                         } else if(evenement.key.keysym.sym==SDLK_DELETE){
228                                 if((*charselected)<(*nb_chars)){
229                     for(i=(*charselected);i<255;i++)
230                         str[i]=str[i+1];
231                     str[255]=0;
232                     (*nb_chars)--;
233                 }
234                         } else if(evenement.key.keysym.sym==SDLK_HOME){
235                 (*charselected)=0;
236                         } else if(evenement.key.keysym.sym==SDLK_END){
237                 (*charselected)=(*nb_chars);
238                         } else if(evenement.key.keysym.sym==SDLK_LEFT){
239                                 if((*charselected)!=0)
240                                         (*charselected)--;
241                         } else if(evenement.key.keysym.sym==SDLK_RIGHT){
242                                 if((*charselected)<(*nb_chars))
243                                         (*charselected)++;
244                         } else if(evenement.key.keysym.sym==SDLK_RETURN) {
245                                 waiting=false;
246                         } else if(evenement.key.keysym.unicode>=32&&evenement.key.keysym.unicode<127&&(*nb_chars)<60){
247                                 for(i=255;i>=(*charselected)+1;i--)
248                                         str[i]=str[i-1];
249                                 str[*charselected]=evenement.key.keysym.unicode;
250                                 (*charselected)++;
251                                 (*nb_chars)++;
252                         }
253                 break;
254         }
255         
256         if(!waiting) {
257                 SDL_EnableKeyRepeat(0,0); // disable key repeat
258                 SDL_EnableUNICODE(false);
259         }
260 }
261
262 void Game::setKeySelected() {
263         waiting=true;
264         params_thread* data = new params_thread;
265     data->game = this;
266     data->method = &Game::setKeySelected_thread;
267     printf("launch thread\n");
268         SDL_Thread* thread = SDL_CreateThread(Game::thread, data);
269     if ( thread == NULL ) {
270         fprintf(stderr, "Unable to create thread: %s\n", SDL_GetError());
271                 waiting=false;
272         return;
273     }
274 }
275
276 void Game::setKeySelected_thread() {
277         int keycode=-1;
278         SDL_Event evenement;
279         while(keycode==-1) {
280                 SDL_WaitEvent(&evenement);
281                 switch(evenement.type) {
282                         case SDL_KEYDOWN:
283                                 keycode = evenement.key.keysym.sym;
284                         break;
285                         case SDL_MOUSEBUTTONDOWN:
286                                 keycode = SDLK_LAST+evenement.button.button;
287                         break;
288                         default:
289                         break;
290                 }
291         }
292         if(keycode != SDLK_ESCAPE) {
293                 fireSound();
294                 switch(keyselect) {
295                         case 0: forwardkey=keycode;
296                         break;
297                         case 1: backkey=keycode;
298                         break;
299                         case 2: leftkey=keycode;
300                         break;
301                         case 3: rightkey=keycode;
302                         break;
303                         case 4: crouchkey=keycode;
304                         break;
305                         case 5: jumpkey=keycode;
306                         break;
307                         case 6: drawkey=keycode;
308                         break;
309                         case 7: throwkey=keycode;
310                         break;
311                         case 8: attackkey=keycode;
312                         break;
313                         default:
314                         break;
315                 }
316         }
317         keyselect=-1;
318         waiting=false;
319 }
320
321 int Game::thread(void *data) {
322         params_thread* pt = (params_thread*)data;
323     if(pt) {
324         (pt->game->*(pt->method))();
325     }
326 }
327
328 void Game::DrawGL() {
329         if ( stereomode == stereoNone ) {
330                 DrawGLScene(stereoCenter);
331         } else {
332                 DrawGLScene(stereoLeft);
333                 DrawGLScene(stereoRight);
334         }
335 }