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