1 /***********************************************************
2 *                      K O U L E S                         *
3 *----------------------------------------------------------*
4 *  C1995 JAHUSOFT                                          *
5 *        Jan Hubicka                                       *
6 *        Dukelskych Bojovniku 1944                         *
7 *        390 03 Tabor                                      *
8 *        Czech Republic                                    *
9 *        Phone: 0041-361-32613                             *
10 *        eMail: hubicka@limax.paru.cas.cz                  *
11 *----------------------------------------------------------*
12 *   Copyright(c)1995,1996 by Jan Hubicka.See README for    *
13 *                    licence details.                      *
14 *----------------------------------------------------------*
15 *  menu.c                                                  *
16 *   GUI menuing system					   *
17 ***********************************************************/
18 /* Changes for joystick "accelerate by deflection"         *
19  *  (c) 1997 by Ludvik Tesar (Ludv\'{\i}k Tesa\v{r})       *
20  ************************LT*********************************/
21 
22 #include "koules.h"
23 #include "net.h"
24 #include "client.h"
25 #ifdef JOYSTICK
26 #include <sys/ioctl.h>
27 #endif
28 typedef struct
29   {
30     char           *text;
31     void            (*func) ();
32   }
33 Menu;
34 
35 typedef struct
36   {
37     int             x, y, *number, max, min;
38     int             line;
39     void            (*func) ();
40   }
41 Numbers;
42 
43 int             ssound = 1;
44 static Numbers  minim[2], maxim[2];
45 static int      nmenu;
46 static int      nnumbers;
47 static Menu     menu[20];
48 static int      selected = 0;
49 static float    mx1, my1, mx1p, my1p;
50 static float    mx2, my2, mx2p, my2p;
51 static int      mtime;
52 static char     playertext[] = " 1  PLAYER";
53 static char     leveltext[] = "LEVEL  000 ";
54 #define YPOSITION(i) (MAPHEIGHT/2+20-5*nmenu+10*i)
55 #define XPOSITION(i) (MAPWIDTH/2-4*strlen(menu[i].text))
56 #define XPOSITION1(i) (MAPWIDTH/2+4*strlen(menu[i].text))
57 static int      player, keynum, lastplayer;
58 #ifdef JOYSTICK
59 static int      joystick, joypos;
60 static struct JS_DATA_TYPE js_data;
61 #endif
62 
63 static void     main_menu ();
64 static void     change_menu ();
65 #ifdef JOYSTICK
66 static void
calibrate_init()67 calibrate_init ()
68 {
69   int             status;
70   long            tmpl;
71 
72   if (joystickdevice[joystick]<0)
73     {
74       printf("Joystick %c not found during initialization.", joystick+'A');
75       joystickplayer[joystick] = -2;
76       gamemode = MENU;
77       change_menu ();
78       return;
79     }
80 
81   status = ioctl (joystickdevice[joystick], JS_GET_TIMELIMIT, &tmpl);
82   if (status == -1)
83     {
84       perror ("Joystick");
85       joystickplayer[joystick] = -2;
86       gamemode = MENU;
87       change_menu ();
88       return;
89     }
90 
91   tmpl = 10; /* 10miliseconds */
92   status = ioctl (joystickdevice[joystick], JS_SET_TIMELIMIT, &tmpl);
93   if (status == -1)
94     {
95       perror ("Joystick");
96       joystickplayer[joystick] = -2;
97       gamemode = MENU;
98       change_menu ();
99       return;
100     }
101 }
102 #endif
103 
104 
105 static void
player_change()106 player_change ()
107 {
108   player = (selected - 2) / 2;
109   lastplayer = (selected - 2) / 2;
110 #ifdef MOUSE
111   if (player == mouseplayer)
112     return;
113 #endif
114 #ifdef JOYSTICK
115   if (player == joystickplayer[0])
116     {
117       joystick = 0;
118       joypos = 0;
119       gamemode = JOY;
120       calibrate_init ();
121       return;
122     }
123   if (player == joystickplayer[1])
124     {
125       joystick = 1;
126       joypos = 0;
127       gamemode = JOY;
128       calibrate_init ();
129       return;
130     }
131 #endif
132   keynum = 0;
133   gamemode = KEYS;
134 }
135 
136 
137 static void
control_change()138 control_change ()
139 {
140   int             player;
141   player = (selected - 1) / 2;
142 #ifdef NETSUPPORT
143   if (client && !control[player])
144     return;
145 #endif
146 #ifdef MOUSE
147    if(mouseplayer<0) mouseplayer=-1;
148    if(mouseplayer>=nrockets) mouseplayer=-1;
149 #endif
150 #ifdef JOYSTICK
151    if(joystickplayer[0]<0) joystickplayer[0]=-1;
152    if(joystickplayer[0]>=nrockets) joystickplayer[0]=-1;
153    if(joystickplayer[1]<0) joystickplayer[1]=-1;
154    if(joystickplayer[1]>=nrockets) joystickplayer[1]=-1;
155 #ifdef NETSUPPORT
156   if(client && !control[joystickplayer[0]]) joystickplayer[0]=-1;
157   if(client && !control[joystickplayer[1]]) joystickplayer[1]=-1;
158   if (client && !control[player])
159     return;
160 #endif
161 #endif
162 #ifdef NETSUPPORT
163   if(client && !control[mouseplayer]) mouseplayer=-1;
164 #endif
165 
166    if (rotation[player]==1)
167       {
168          rotation[player] = 0;
169 #ifdef MOUSE
170 	 if (mouseplayer == -1 && !nomouse) mouseplayer = player;
171 #ifdef JOYSTICK
172          else goto maybejoystick;
173 	   /* mouse couldn't be chosen, but let's offer joystick if available*/
174 #endif
175       }
176    else if (player == mouseplayer)
177       {
178          mouseplayer = -1;
179 #endif
180 #ifdef JOYSTICK
181 maybejoystick:;
182          if((joystickplayer[0] == -1)&&(joystickdevice[0]>=0))
183             {
184                joystickplayer[0]=player;
185 	       joystickmul[0]=JOYMUL1;
186 	    }
187          else if((joystickplayer[1] == -1)&&(joystickdevice[1]>=0))
188             {
189    	       joystickplayer[1]=player;
190 	       joystickmul[1]=JOYMUL1;
191 	    }
192       }
193    else if(player==joystickplayer[0])
194       {
195          if(joystickmul[0]==JOYMUL1)joystickmul[0]=JOYMUL2;
196 	 else
197 	    {
198 	       joystickplayer[0]=-1;
199 	       if((joystickplayer[1] == -1)&&(joystickdevice[1]>=0))
200 	          {
201 		     joystickplayer[1]=player;
202                      joystickmul[1]=JOYMUL1;
203 	          }
204 	    }
205       }
206    else if(player==joystickplayer[1])
207       {
208 	 if(joystickmul[1]==JOYMUL1)joystickmul[1]=JOYMUL2;
209 	 else joystickplayer[1]=-1;
210 #endif
211       }
212    else if (rotation[player]==0)
213       {
214          rotation[player] = 1;
215       }
216    change_menu ();
217 }
218 
219 void
start()220 start ()
221 {
222   int             i;
223 #ifdef JOYSTICK
224   if (joystickplayer[0] >= 0 && !calibrated[0])
225     {
226       joystick = 0;
227       joypos = 0;
228       gamemode = JOY;
229       calibrate_init ();
230       return;
231     }
232   if (joystickplayer[1] >= 1 && !calibrated[1])
233     {
234       joystick = 1;
235       joypos = 0;
236       gamemode = JOY;
237       calibrate_init ();
238       return;
239     }
240 #endif
241   for (i = 0; i < nrockets; i++)
242     {
243       object[i].score = 0;
244 #ifdef JOYSTICK
245       if(joystickplayer[0]==i)
246 	  {
247 	     object[i].joymulx = joystickmul[0]/center[0][0];
248 	     object[i].joymuly = joystickmul[0]/center[0][1];
249 	     object[i].joythresh = joystickthresh[0];
250 	  }
251       else if(joystickplayer[1]==i)
252 	  {
253 	     object[i].joymulx = joystickmul[1]/center[1][0];
254 	     object[i].joymuly = joystickmul[1]/center[1][1];
255 	     object[i].joythresh = joystickthresh[1];
256 	  }
257 #endif
258     }
259   sound = ssound;
260   gamemode = GAME;
261   gameplan_init ();
262   init_objects ();
263 }
264 
265 
266 static void
playerchange()267 playerchange ()
268 {
269 /*  nrockets++;
270    if (nrockets > 5)
271    nrockets = 1; */
272   playertext[1] = nrockets + '0';
273 }
274 static void
levelchange()275 levelchange ()
276 {
277   sprintf (leveltext, "LEVEL  %03i ", lastlevel + 1);
278 }
279 
280 
281 static void
quit()282 quit ()
283 {
284 #ifdef NETSUPPORT
285   if (client)
286     CQuit ("Selected quit in main menu");
287 #endif
288   uninitialize ();
289   exit (0);
290 }
291 
292 static void
fit_selector()293 fit_selector ()
294 {
295   mtime = MENUTIME;
296   mx1p = (XPOSITION (selected) - 2 - mx1) / mtime;
297   mx2p = (XPOSITION1 (selected) + 1 - mx2) / mtime;
298   my1p = (YPOSITION (selected) - 2 - my1) / mtime;
299   my2p = (YPOSITION (selected) + 8 + 0 - my2) / mtime;
300 }
301 
302 static void
to_main_menu()303 to_main_menu ()
304 {
305   save_rc ();
306   main_menu ();
307 }
308 static void
change_menu()309 change_menu ()
310 {
311   static char     s[2][5][40], *s1;
312   int             i;
313 #ifdef NETSUPPORT
314   if (client)
315     {
316       menu[0].text = "START GAME";
317       menu[0].func = start_game;
318     }
319   else
320 #endif
321     {
322       menu[0].text = "BACK TO MAIN MENU";
323       menu[0].func = to_main_menu;
324     }
325   nnumbers = 0;
326   for (i = 0; i < nrockets; i++)
327     {
328 #ifdef NETSUPPORT
329       if (control[i] == 0 && client)
330 	s1 = "REMOTE";
331       else
332 #endif
333 #ifdef MOUSE
334       if (i == mouseplayer)
335 	s1 = "MOUSE";
336       else
337 #endif
338 #ifdef JOYSTICK
339       if (i == joystickplayer[0])
340 	 {
341 	    if(joystickmul[0]==JOYMUL1)s1 = "JOYSTICK A button";
342 	    else s1 = "JOYSTICK A deflection";
343 	 }
344       else if (i == joystickplayer[1])
345 	 {
346 	    if(joystickmul[1]==JOYMUL1)s1 = "JOYSTICK B button";
347 	    else s1 = "JOYSTICK B deflection";
348 	 }
349       else
350 #endif
351       if (rotation[i])
352 	s1 = "ROTATION KEYBOARD";
353       else
354 	s1 = "KEYBOARD";
355       sprintf (s[0][i], "PLAYER %i:%s", i + 1, s1);
356 #ifdef NETSUPPORT
357       if (control[i] == 0 && client)
358 	sprintf (s[1][i], " ");
359       else
360 #endif
361 #ifdef JOYSTICK
362       if (i == joystickplayer[0])
363 	sprintf (s[1][i], "CALIBRATE");
364       else if (i == joystickplayer[1])
365 	sprintf (s[1][i], "CALIBRATE");
366       else
367 #endif
368 #ifdef MOUSE
369       if (i == mouseplayer)
370 	sprintf (s[1][i], " ");
371       else
372 #endif
373 	sprintf (s[1][i], "CHANGE KEYS");
374       menu[i * 2 + 1].text = s[0][i];
375       menu[i * 2 + 2].text = s[1][i];
376       menu[i * 2 + 1].func = control_change;
377       menu[i * 2 + 2].func = player_change;
378     }
379   nmenu = nrockets * 2 + 1;
380   if (selected >= nmenu)
381     selected = 0;
382   fit_selector ();
383 }
384 static void
deathmatch()385 deathmatch ()
386 {
387   gameplan = DEATHMATCH;
388   main_menu ();
389 }
390 
391 static void
cooperative()392 cooperative ()
393 {
394   gameplan = COOPERATIVE;
395   main_menu ();
396 }
397 
398 static void
setsound()399 setsound ()
400 {
401 #ifdef SOUND
402   if (sndinit)
403     ssound = !ssound;
404 #endif
405   main_menu ();
406 }
407 
408 static void
veryhard()409 veryhard ()
410 {
411   difficulty = 0;
412   main_menu ();
413 }
414 
415 static void
hard()416 hard ()
417 {
418   difficulty = 1;
419   main_menu ();
420 }
421 
422 static void
medium()423 medium ()
424 {
425   difficulty = 2;
426   main_menu ();
427 }
428 
429 static void
easy()430 easy ()
431 {
432   difficulty = 3;
433   main_menu ();
434 }
435 
436 static void
veryeasy()437 veryeasy ()
438 {
439   difficulty = 4;
440   main_menu ();
441 }
442 
443 
444 
445 
446 static void
change_mode()447 change_mode ()
448 {
449   nnumbers = 0;
450   menu[0].text = "DEATH MATCH(DOOM)";
451   menu[0].func = deathmatch;
452   menu[1].text = "COOPERATIVE";
453   menu[1].func = cooperative;
454   nmenu = 2;
455   selected = 1;
456   fit_selector ();
457 }
458 
459 static void
change_obtiznost()460 change_obtiznost ()
461 {
462   menu[0].text = "NIGHTMARE";
463   menu[0].func = veryhard;
464   menu[1].text = "HARD";
465   menu[1].func = hard;
466   menu[2].text = "MEDIUM";
467   menu[2].func = medium;
468   menu[3].text = "EASY";
469   menu[3].func = easy;
470   menu[4].text = "VERY EASY";
471   menu[4].func = veryeasy;
472   nnumbers = 0;
473   nmenu = 5;
474   selected = 2;
475   fit_selector ();
476 }
477 
478 static void
nmain_menu()479 nmain_menu ()
480 {
481   nnumbers = 2;
482   nmenu = 8;
483   menu[0].text = "START GAME";
484   menu[0].func = start;
485   menu[1].text = playertext;
486   menu[1].func = playerchange;
487   minim[0].x = XPOSITION (1);
488   minim[0].y = YPOSITION (1);
489   minim[0].line = 1;
490   minim[0].number = &nrockets;
491   minim[0].max = 5;
492   minim[0].min = 1;
493   minim[0].func = playerchange;
494   maxim[0].x = XPOSITION (1) + 8 * 2;
495   maxim[0].y = YPOSITION (1);
496   maxim[0].line = 1;
497   maxim[0].number = &nrockets;
498   maxim[0].max = 5;
499   maxim[0].min = 1;
500   maxim[0].func = playerchange;
501   playerchange ();
502   levelchange ();
503   menu[2].text = leveltext;
504   menu[2].func = playerchange;
505   minim[1].x = XPOSITION (2) + 7 * 7;
506   minim[1].y = YPOSITION (2);
507   minim[1].line = 2;
508   minim[1].number = &lastlevel;
509   minim[1].max = maxlevel;
510   minim[1].min = 0;
511   minim[1].func = levelchange;
512   maxim[1].x = XPOSITION (2) + 11 * 7;
513   maxim[1].y = YPOSITION (2);
514   maxim[1].line = 2;
515   maxim[1].number = &lastlevel;
516   maxim[1].max = maxlevel;
517   maxim[1].min = 0;
518   maxim[1].func = levelchange;
519   nnumbers = 2;
520   menu[3].text = "CONTROL";
521   menu[3].func = change_menu;
522   menu[4].text = "GAME MODE";
523   menu[4].func = change_mode;
524   menu[5].text = "DIFFICULTY";
525   menu[5].func = change_obtiznost;
526 #ifdef SOUND
527   menu[6].text = ssound ? "SOUND ON" : (sndinit ? "SOUND OFF" : "SOUND OFF-NOT INITIALIZED");
528 #else
529   menu[6].text = "SOUND OFF(NOT AVAIABLE)";
530 #endif
531   menu[6].func = setsound;
532   menu[7].text = "QUIT";
533   menu[7].func = quit;
534   selected = 0;
535   fit_selector ();
536 }
537 
538 /***************************************************************************/
539 #ifdef NETSUPPORT
540 extern void     register_players ();
541 extern void     start_game ();
542 int             nplayers = 1, maxnplayers = 5;
543 static void
nplayerchange()544 nplayerchange ()
545 {
546   playertext[1] = nplayers + '0';
547 }
548 void
setnplayers(int n)549 setnplayers (int n)
550 {
551   nrockets = n;
552   maxnplayers = MAXROCKETS - nrockets;
553   if (minim[0].number == &nplayers)
554     {
555       minim[0].max = maxnplayers;
556       if (nplayers > maxnplayers)
557 	nplayers = maxnplayers;
558     }
559   nplayerchange ();
560 }
561 void
cmenu2(unsigned char * message,int size)562 cmenu2 (unsigned char *message, int size)
563 {
564   printf ("entering change menu");
565   change_menu ();
566   gamemode = MENU;
567 }
568 
569 static void
cmain_menu()570 cmain_menu ()
571 {
572   nnumbers = 1;
573   nmenu = 4;
574   menu[0].text = "REGISTER PLAYERS";
575   menu[0].func = register_players;
576   menu[1].text = playertext;
577   menu[1].func = nplayerchange;
578   minim[0].x = XPOSITION (1);
579   minim[0].y = YPOSITION (1);
580   minim[0].line = 1;
581   minim[0].number = &nplayers;
582   minim[0].max = maxnplayers;
583   minim[0].min = 1;
584   minim[0].func = nplayerchange;
585   maxim[0].x = XPOSITION (1) + 8 * 2;
586   maxim[0].y = YPOSITION (1);
587   maxim[0].line = 1;
588   maxim[0].number = &nplayers;
589   maxim[0].max = maxnplayers;
590   maxim[0].min = 1;
591   maxim[0].func = nplayerchange;
592   nplayerchange ();
593 #ifdef SOUND
594   menu[2].text = ssound ? "SOUND ON" : (sndinit ? "SOUND OFF" : "SOUND OFF-NOT INITIALIZED");
595 #else
596   menu[2].text = "SOUND OFF(NOT AVAIABLE)";
597 #endif
598   menu[2].func = setsound;
599   menu[3].text = "QUIT";
600   menu[3].func = quit;
601   selected = 0;
602   fit_selector ();
603 }
604 #endif
605 /***************************************************************************/
606 
607 static void
main_menu()608 main_menu ()
609 {
610 #ifdef NETSUPPORT
611   if (client)
612     cmain_menu ();
613   else
614 #endif
615     nmain_menu ();
616 }
617 
618 
619 
620 void
init_menu()621 init_menu ()
622 {
623   mx1 = 10;
624   mx2 = MAPWIDTH - 10;
625   my2 = 10;
626   my2 = MAPHEIGHT - 10;
627   ssound = sound;
628   playertext[1] = nrockets + '0';
629   main_menu ();
630 }
631 
632 void
draw_menu(CONST int draw)633 draw_menu (CONST int draw)
634 {
635   int             i;
636   sound = 0;
637   if (draw)
638     {
639       levelchange ();
640       DrawRectangle ((int) mx1, (int) my1, (int) mx2, (int) my2, ball (2));
641       DrawRectangle ((int) mx1 + 1, (int) my1 + 1, (int) mx2 + 1, (int) my2 + 1, ball (20));
642       DrawBlackMaskedText (MAPWIDTH / 2 - 8 * 4 + 1, 1, "THE GAME");
643       DrawBlackMaskedText (MAPWIDTH / 2 - 10 * 4 + 1, 11, "K O U L E S");
644       DrawBlackMaskedText (MAPWIDTH / 2 - 2 * 4 + 1, 21, "BY");
645       DrawBlackMaskedText (MAPWIDTH / 2 - 8 * 4 + 1, 31, "JAHUSOFT");
646       DrawBlackMaskedText (MAPWIDTH / 2 - 30 * 4 + 1, 46, "PRESS P FOR PAUSE / H FOR HELP");
647 #ifdef __OS2__
648       DrawBlackMaskedText (MAPWIDTH / 2 - 28 * 4, 40, "OS/2 Warp VERSION BY T.A.K.K");
649 #endif
650       DrawWhiteMaskedText (MAPWIDTH / 2 - 8 * 4, 0, "THE GAME");
651       DrawWhiteMaskedText (MAPWIDTH / 2 - 10 * 4, 10, "K O U L E S");
652       DrawWhiteMaskedText (MAPWIDTH / 2 - 2 * 4, 20, "BY");
653       DrawWhiteMaskedText (MAPWIDTH / 2 - 8 * 4, 30, "JAHUSOFT");
654       DrawWhiteMaskedText (MAPWIDTH / 2 - 30 * 4, 45, "PRESS P FOR PAUSE / H FOR HELP");
655 #ifdef __OS2__
656       DrawWhiteMaskedText (MAPWIDTH / 2 - 28 * 4, 40, "OS/2 Warp VERSION BY T.A.K.K");
657 #endif
658       for (i = 0; i < nnumbers; i++)
659 	{
660 	  Line (minim[i].x, minim[i].y + 3, minim[i].x + 6, minim[i].y + 3, ball (2));
661 	  Line (minim[i].x + 3, minim[i].y + 0, minim[i].x, minim[i].y + 3, ball (2));
662 	  Line (minim[i].x + 4, minim[i].y + 0, minim[i].x + 1, minim[i].y + 3, ball (2));
663 	  Line (minim[i].x + 3, minim[i].y + 6, minim[i].x, minim[i].y + 3, ball (2));
664 	  Line (minim[i].x + 4, minim[i].y + 6, minim[i].x + 1, minim[i].y + 3, ball (2));
665 	  Line (maxim[i].x + 2, maxim[i].y + 3, maxim[i].x + 8, maxim[i].y + 3, ball (2));
666 	  Line (maxim[i].x + 5, maxim[i].y + 0, maxim[i].x + 8, maxim[i].y + 3, ball (2));
667 	  Line (maxim[i].x + 4, maxim[i].y + 0, maxim[i].x + 7, maxim[i].y + 3, ball (2));
668 	  Line (maxim[i].x + 5, maxim[i].y + 6, maxim[i].x + 8, maxim[i].y + 3, ball (2));
669 	  Line (maxim[i].x + 4, maxim[i].y + 6, maxim[i].x + 7, maxim[i].y + 3, ball (2));
670 	}
671       for (i = 0; i < nmenu; i++)
672 	{
673 	  DrawBlackMaskedText ((int) XPOSITION (i) + 1, (int) YPOSITION (i) + 1, menu[i].text);
674 	  DrawWhiteMaskedText ((int) XPOSITION (i), (int) YPOSITION (i), menu[i].text);
675 	}
676     }
677   if (mtime)
678     {
679       mtime--;
680       my1 += my1p;
681       mx1 += mx1p;
682       my2 += my2p;
683       mx2 += mx2p;
684     }
685 }
686 static int      inctime, changed, waittime;
687 static void
increase(int i)688 increase (int i)
689 {
690   changed = 1;
691   if (waittime)
692     {
693       waittime--;
694       return;
695     }
696   waittime = inctime;
697   if (inctime > 1)
698     inctime--;
699   else
700     (*maxim[i].number) += 2;
701   (*maxim[i].number)++;
702   if (*maxim[i].number > maxim[i].max)
703     *maxim[i].number = maxim[i].max;
704 #ifdef SOUND
705   if (ssound && inctime != 1)
706     play_sound (S_CREATOR2);
707 #endif
708   maxim[i].func ();
709   save_rc ();
710 }
711 static void
decrease(int i)712 decrease (int i)
713 {
714   changed = 1;
715   if (waittime)
716     {
717       waittime--;
718       return;
719     }
720   waittime = inctime;
721   if (inctime > 1)
722     inctime--;
723   else
724     (*maxim[i].number) -= 2;
725   (*minim[i].number)--;
726   if (*minim[i].number < minim[i].min)
727     *minim[i].number = minim[i].min;
728 #ifdef SOUND
729   if (ssound && inctime != 1)
730     play_sound (S_CREATOR2);
731 #endif
732   minim[i].func ();
733   save_rc ();
734 }
735 
736 void
menu_keys()737 menu_keys ()
738 {
739   static int      enter;
740   int             ent = 0;
741   static int	  esc;
742 #ifdef MOUSE
743   static int      button;
744   int             but = 0;
745 #endif
746   if (maxim[1].max != maxlevel && !client)
747     main_menu ();
748   changed = 0;
749   if (IsPressedLeft ())
750     {
751       int             i;
752       for (i = 0; i < nnumbers; i++)
753 	if (maxim[i].line == selected)
754 	  decrease (i);
755     }
756   if (IsPressedRight ())
757     {
758       int             i;
759       for (i = 0; i < nnumbers; i++)
760 	if (maxim[i].line == selected)
761 	  increase (i);
762     }
763 #ifdef MOUSE
764   but = nomouse ? 0 : MouseButtons ();
765   if (but)
766     {
767       int             i;
768       for (i = 0; i < nnumbers; i++)
769 	{
770 	  if (MouseX () > maxim[i].x &&
771 	      MouseX () < maxim[i].x + 8 &&
772 	      MouseY () > maxim[i].y &&
773 	      MouseY () < maxim[i].y + 8)
774 	    increase (i);
775 	  if (MouseX () > minim[i].x &&
776 	      MouseX () < minim[i].x + 8 &&
777 	      MouseY () > minim[i].y &&
778 	      MouseY () < minim[i].y + 8)
779 	    decrease (i);
780 	}
781     }
782   if (!but && button)
783     {
784       int             i;
785       i = (MouseY () - MAPHEIGHT / 2 - 20 + 5 * nmenu) / 10;
786       if (i >= 0 && i < nmenu)
787 	{
788 	  selected = i;
789 #ifdef SOUND
790 	  if (ssound)
791 	    play_sound (S_CREATOR2);
792 #endif
793 	  menu[selected].func ();
794 	  button = 0;
795 	  return;
796 	}
797     }
798   button = but;
799 #endif
800   if (IsPressedEsc ())
801     {
802       if(!esc) {
803       if (client || nnumbers == 2)
804 	quit ();
805       to_main_menu ();
806       }
807       esc=1;
808     } else esc=0;
809   if (IsPressedUp () && !mtime && selected > 0)
810     selected--, fit_selector ();
811   if (IsPressedDown () && !mtime && selected < nmenu - 1)
812     selected++, fit_selector ();
813   if (IsPressedEnter () && !mtime)
814     ent = 1;
815   if (!ent && enter)
816     {
817 #ifdef SOUND
818       if (ssound)
819 	play_sound (S_CREATOR2);
820 #endif
821       menu[selected].func ();
822     }
823   enter = ent;
824   if (!changed)
825     inctime = 7, waittime = 0;
826 
827 }
828 
829 void
keys_keys()830 keys_keys ()
831 {
832   static int      lscan_code;
833   int             scan_code;
834   scan_code = GetKey ();
835   if (!scan_code && lscan_code)
836     {
837       keys[player][keynum] = lscan_code;
838       keynum++;
839 #ifdef SOUND
840       if (ssound)
841 	play_sound (S_CREATOR2);
842 #endif
843       if (keynum > (rotation[player] ? 2 : 3))
844 	{
845 	  player++;
846 	  keynum = 0;
847 	  if (player > lastplayer)
848 	    {
849 	      change_menu ();
850 	      gamemode = MENU;
851 	    }
852 	}
853     }
854   lscan_code = scan_code;
855 }
856 
857 
858 void
draw_keys(int draw)859 draw_keys (int draw)
860 {
861   char            s[20];
862   static char    *key[4] =
863   {"UP", "DOWN", "LEFT", "RIGHT"};
864   static char    *rkey[3] =
865   {"ACCELERATION", "ROTATE LEFT", "ROTATE RIGHT"};
866   if (!draw)
867     return;
868   nmenu = 2;
869   sprintf (s, "PLAYER:%i", player + 1);
870   DrawWhiteMaskedText ((int) (MAPWIDTH / 2 - 4 * strlen (s)), (int) YPOSITION (0), s);
871   if (rotation[player])
872     sprintf (s, "KEY:%s", rkey[keynum]);
873   else
874     sprintf (s, "KEY:%s", key[keynum]);
875   DrawWhiteMaskedText ((int) (MAPWIDTH / 2 - 4 * strlen (s)), (int) YPOSITION (1), s);
876 
877 }
878 
879 #ifdef JOYSTICK
880 void
joy_keys()881 joy_keys ()
882 {
883   int             status, tmp;
884   static int      lastbutton, button;
885   if (read (joystickdevice[joystick], &js_data, JS_RETURN) <= 0)
886     {
887       perror ("Joystick");
888       joystickplayer[joystick] = -2;
889       gamemode = MENU;
890       change_menu ();
891       return;
892     }
893   button = lastbutton;
894   lastbutton = js_data.buttons + IsPressedEnter ();
895   if (joypos == 0)
896     {
897       if ((button == 0x00 || lastbutton != 0x00))
898 	return;
899       joypos++;
900 
901       for (tmp = 0; js_data.x > 0xff; tmp++, js_data.x = js_data.x >> 1);
902       js_data.x = tmp;
903       for (tmp = 0; js_data.y > 0xff; tmp++, js_data.y = js_data.y >> 1);
904       js_data.y = tmp;
905 
906 
907       status = ioctl (joystickdevice[joystick], JS_SET_CAL, &js_data);
908       if (status == -1)
909 	{
910 	  perror ("Joystick");
911 	}
912       return;
913     }
914   if ((button == 0x00 || lastbutton != 0x00))
915     return;
916 
917   calibrated[joystick] = 1;
918   center[joystick][0] = js_data.x;
919   center[joystick][1] = js_data.y;
920   gamemode = MENU;
921   change_menu ();
922 }
923 
924 
925 void
draw_joy(CONST int draw)926 draw_joy (CONST int draw)
927 {
928   char            s[20];
929   static char    *mess[2] =
930   {"Move joystick to lower right corner", "Center joystick"};
931   if (!draw)
932     return;
933   nmenu = 4;
934   sprintf (s, "JOYSTICK:%i", joystick + 1);
935   DrawWhiteMaskedText ((int) (MAPWIDTH / 2 - 4 * strlen (s)), (int) YPOSITION (0), s);
936   DrawWhiteMaskedText ((int) (MAPWIDTH / 2 - 4 * strlen (mess[joypos])), (int) YPOSITION (1), mess[joypos]);
937   DrawWhiteMaskedText ((int) (MAPWIDTH / 2 - 4 * 33), (int) YPOSITION (2), "and press either button or enter");
938   sprintf (s, "x:%i y:%i", js_data.x, js_data.y);
939   DrawWhiteMaskedText ((int) (MAPWIDTH / 2 - 4 * strlen (s)), (int) YPOSITION (3), s);
940 
941 }
942 
943 #endif
944