]> icculus.org git repositories - btb/d2x.git/blob - main/kmatrix.c
Added d1x license
[btb/d2x.git] / main / kmatrix.c
1 /*
2 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
3 SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
4 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
5 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
6 IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
7 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
8 FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
9 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
10 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.  
11 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
12 */
13
14 #ifdef HAVE_CONFIG_H
15 #include <conf.h>
16 #endif
17
18 #ifdef RCS
19 static char rcsid[] = "$Id: kmatrix.c,v 1.3 2001-01-31 15:17:54 bradleyb Exp $";
20 #endif
21
22 #ifdef NETWORK
23
24 #ifdef WINDOWS
25 #include "desw.h"
26 #endif
27
28 #include <stdio.h>
29 #include <stdlib.h>
30 #include <string.h>
31 #include <ctype.h>
32 #include <stdarg.h>
33
34 #include "pa_enabl.h"       //$$POLY_ACC
35 #include "error.h"
36 #include "pstypes.h"
37 #include "gr.h"
38 #include "mono.h"
39 #include "key.h"
40 #include "palette.h"
41 #include "game.h"
42 #include "gamefont.h"
43 #include "u_mem.h"
44 #include "newmenu.h"
45 #include "menu.h"
46 #include "player.h"
47 #include "screens.h"
48 #include "gamefont.h"
49 #include "cntrlcen.h"
50 #include "mouse.h"
51 #include "joy.h"
52 #include "timer.h"
53 #include "text.h"
54 #include "songs.h"
55 #include "multi.h"
56 #include "kmatrix.h"
57 #include "gauges.h"
58 #include "pcx.h"
59 #include "network.h"
60
61 #if defined(POLY_ACC)
62 #include "poly_acc.h"
63 #endif
64
65 #define CENTERING_OFFSET(x) ((300 - (70 + (x)*25 ))/2)
66 #define CENTERSCREEN (MenuHires?320:160)
67
68 int kmatrix_kills_changed = 0;
69 char ConditionLetters[]={' ','P','E','D','E','E','V','W'};
70 char WaitingForOthers=0;
71
72 int Kmatrix_nomovie_message=0;
73
74 extern char MaxPowerupsAllowed[],PowerupsInMine[];
75
76 void kmatrix_reactor (char *message);
77 void kmatrix_phallic ();
78 void kmatrix_redraw_coop();
79
80 #define LHX(x)          ((x)*(MenuHires?2:1))
81 #define LHY(y)          ((y)*(MenuHires?2.4:1))
82  
83 void kmatrix_draw_item( int  i, int *sorted )
84 {
85         int j, x, y;
86         char temp[10];
87
88         y = LHY(50+i*9);
89
90         // Print player name.
91
92         gr_printf( LHX(CENTERING_OFFSET(N_players)), y, "%s", Players[sorted[i]].callsign );
93
94    if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
95            gr_printf (LHX(CENTERING_OFFSET(N_players)-15),y,"%c",ConditionLetters[Players[sorted[i]].connected]);
96     
97         for (j=0; j<N_players; j++) {
98
99                 x = LHX(70 + CENTERING_OFFSET(N_players) + j*25);
100
101                 if (sorted[i]==sorted[j]) {
102                         if (kill_matrix[sorted[i]][sorted[j]] == 0) {
103                                 gr_set_fontcolor( BM_XRGB(10,10,10),-1 );
104                                 gr_printf( x, y, "%d", kill_matrix[sorted[i]][sorted[j]] );
105                         } else {
106                                 gr_set_fontcolor( BM_XRGB(25,25,25),-1 );
107                                 gr_printf( x, y, "-%d", kill_matrix[sorted[i]][sorted[j]] );
108                         }
109                 } else {
110                         if (kill_matrix[sorted[i]][sorted[j]] <= 0) {
111                                 gr_set_fontcolor( BM_XRGB(10,10,10),-1 );
112                                 gr_printf( x, y, "%d", kill_matrix[sorted[i]][sorted[j]] );
113                         } else {
114                                 gr_set_fontcolor( BM_XRGB(25,25,25),-1 );
115                                 gr_printf( x, y, "%d", kill_matrix[sorted[i]][sorted[j]] );
116                         }
117                 }
118
119         }
120
121   if (Players[sorted[i]].net_killed_total+Players[sorted[i]].net_kills_total==0)
122         sprintf (temp,"NA");
123   else
124    sprintf (temp,"%d%%",(int)((float)((float)Players[sorted[i]].net_kills_total/((float)Players[sorted[i]].net_killed_total+(float)Players[sorted[i]].net_kills_total))*100.0));                
125                 
126         x = LHX(60 + CENTERING_OFFSET(N_players) + N_players*25);
127         gr_set_fontcolor( BM_XRGB(25,25,25),-1 );
128         gr_printf( x ,y,"%4d/%s",Players[sorted[i]].net_kills_total,temp);
129 }
130
131 void kmatrix_draw_coop_item( int  i, int *sorted )
132 {
133         int  x, y;
134
135         y = LHY(50+i*9);
136
137         // Print player name.
138
139         gr_printf( LHX(CENTERING_OFFSET(N_players)), y, "%s", Players[sorted[i]].callsign );
140    gr_printf (LHX(CENTERING_OFFSET(N_players)-15),y,"%c",ConditionLetters[Players[sorted[i]].connected]);
141     
142
143         x = CENTERSCREEN;
144
145         gr_set_fontcolor( BM_XRGB(60,40,10),-1 );
146         gr_printf( x, y, "%d", Players[sorted[i]].score );
147
148         x = CENTERSCREEN+LHX(50);
149
150         gr_set_fontcolor( BM_XRGB(60,40,10),-1 );
151         gr_printf( x, y, "%d", Players[sorted[i]].net_killed_total);
152 }
153
154
155 void kmatrix_draw_names(int *sorted)
156 {
157         int j, x;
158         
159         int color;
160
161    if (Kmatrix_nomovie_message)
162     {
163                 gr_set_fontcolor( BM_XRGB(63,0,0),-1 );
164                 gr_printf( CENTERSCREEN-LHX(40), LHY(20), "(Movie not played)");
165          }
166
167         for (j=0; j<N_players; j++) {
168                 if (Game_mode & GM_TEAM)
169                         color = get_team(sorted[j]);
170                 else
171                         color = sorted[j];
172
173                 x = LHX (70 + CENTERING_OFFSET(N_players) + j*25);
174
175       if (Players[sorted[j]].connected==0)
176         gr_set_fontcolor(gr_find_closest_color(31,31,31),-1);
177       else
178         gr_set_fontcolor(gr_getcolor(player_rgb[color].r,player_rgb[color].g,player_rgb[color].b),-1 );
179
180                 gr_printf( x, LHY(40), "%c", Players[sorted[j]].callsign[0] );
181
182         }
183
184         x = LHX(72 + CENTERING_OFFSET(N_players) + N_players*25);
185         gr_set_fontcolor( BM_XRGB(31,31,31),-1 );
186         gr_printf( x, LHY(40), "K/E");
187                 
188 }
189 void kmatrix_draw_coop_names(int *sorted)
190 {
191         sorted=sorted;
192
193    if (Kmatrix_nomovie_message)
194     {
195                 gr_set_fontcolor( BM_XRGB(63,0,0),-1 );
196                 gr_printf( CENTERSCREEN-LHX(40), LHY(20), "(Movie not played)");
197          }
198
199         gr_set_fontcolor( BM_XRGB(63,31,31),-1 );
200         gr_printf( CENTERSCREEN, LHY(40), "SCORE");
201
202         gr_set_fontcolor( BM_XRGB(63,31,31),-1 );
203         gr_printf( CENTERSCREEN+LHX(50), LHY(40), "DEATHS");
204 }
205
206
207 void kmatrix_draw_deaths(int *sorted)
208 {
209         int y,x;
210         char reactor_message[50];
211
212    sorted=sorted;
213
214    y = LHY(55 + 72 + 35);
215         x = LHX(35);
216
217         {
218           
219                 int sw, sh, aw;
220                                         
221       gr_set_fontcolor(gr_find_closest_color(63,20,0),-1);
222       gr_get_string_size("P-Playing E-Escaped D-Died", &sw, &sh, &aw); 
223
224            if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
225                    gr_printf( CENTERSCREEN-(sw/2), y,"P-Playing E-Escaped D-Died");
226    
227       y+=(sh+5);
228            gr_get_string_size("V-Viewing scores W-Waiting", &sw, &sh, &aw); 
229
230            if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
231                    gr_printf( CENTERSCREEN-(sw/2), y,"V-Viewing scores W-Waiting");
232
233         }
234
235    y+=LHY(20);
236
237         {
238                 int sw, sh, aw;
239       gr_set_fontcolor(gr_find_closest_color(63,63,63),-1);
240
241       if (Players[Player_num].connected==7)
242        {
243         gr_get_string_size("Waiting for other players...",&sw, &sh, &aw); 
244         gr_printf( CENTERSCREEN-(sw/2), y,"Waiting for other players...");
245        }
246       else
247        {
248         gr_get_string_size(TXT_PRESS_ANY_KEY2, &sw, &sh, &aw); 
249         gr_printf( CENTERSCREEN-(sw/2), y, TXT_PRESS_ANY_KEY2);
250        }
251         }
252
253   if (Countdown_seconds_left <=0)
254    kmatrix_reactor(TXT_REACTOR_EXPLODED);
255   else
256    {
257      sprintf((char *)&reactor_message, "%s: %d %s  ", TXT_TIME_REMAINING, Countdown_seconds_left, TXT_SECONDS);
258      kmatrix_reactor ((char *)&reactor_message);
259    }
260   
261   if (Game_mode & GM_HOARD)  
262           kmatrix_phallic();
263
264 }
265 void kmatrix_draw_coop_deaths(int *sorted)
266 {
267         int j, x, y;
268         char reactor_message[50];
269         
270         y = LHY(55 + N_players * 9);
271
272 //      gr_set_fontcolor(gr_getcolor(player_rgb[j].r,player_rgb[j].g,player_rgb[j].b),-1 );
273         gr_set_fontcolor( BM_XRGB(31,31,31),-1 );
274
275         x = CENTERSCREEN+LHX(50);
276         gr_printf( x, y, TXT_DEATHS );
277
278         for (j=0; j<N_players; j++) {
279                 x = CENTERSCREEN+LHX(50);
280                 gr_printf( x, y, "%d", Players[sorted[j]].net_killed_total );
281         }
282
283    y = LHY(55 + 72 + 35);
284         x = LHX(35);
285
286         {
287           
288                 int sw, sh, aw;
289
290       gr_set_fontcolor(gr_find_closest_color(63,20,0),-1);
291       gr_get_string_size("P-Playing E-Escaped D-Died", &sw, &sh, &aw); 
292
293           if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
294               gr_printf( CENTERSCREEN-(sw/2), y,"P-Playing E-Escaped D-Died");
295            
296    
297       y+=(sh+5);
298            gr_get_string_size("V-Viewing scores W-Waiting", &sw, &sh, &aw); 
299
300            if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
301                gr_printf( CENTERSCREEN-(sw/2), y,"V-Viewing scores W-Waiting");
302
303         }
304
305    y+=LHY(20);
306
307         {
308                 int sw, sh, aw;
309       gr_set_fontcolor(gr_find_closest_color(63,63,63),-1);
310
311       if (Players[Player_num].connected==7)
312        {
313         gr_get_string_size("Waiting for other players...",&sw, &sh, &aw); 
314         gr_printf( CENTERSCREEN-(sw/2), y,"Waiting for other players...");
315        }
316       else
317        {
318         gr_get_string_size(TXT_PRESS_ANY_KEY2, &sw, &sh, &aw); 
319         gr_printf( CENTERSCREEN-(sw/2), y, TXT_PRESS_ANY_KEY2);
320        }
321         }
322
323   if (Countdown_seconds_left <=0)
324    kmatrix_reactor(TXT_REACTOR_EXPLODED);
325   else
326    {
327      sprintf((char *)&reactor_message, "%s: %d %s  ", TXT_TIME_REMAINING, Countdown_seconds_left, TXT_SECONDS);
328      kmatrix_reactor ((char *)&reactor_message);
329    }
330
331 }
332
333 void kmatrix_reactor (char *message)
334  {
335   static char oldmessage[50]={0};
336   int sw, sh, aw;
337
338   if ((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL))
339         return;
340
341   grd_curcanv->cv_font = SMALL_FONT;
342
343   if (oldmessage[0]!=0)
344    {
345     gr_set_fontcolor(gr_find_closest_color(0,0,0),-1);
346     gr_get_string_size(oldmessage, &sw, &sh, &aw); 
347    // gr_printf( CENTERSCREEN-(sw/2), LHY(55+72+12), oldmessage);
348    }
349   gr_set_fontcolor(gr_find_closest_color(0,32,63),-1);
350   gr_get_string_size(message, &sw, &sh, &aw); 
351   gr_printf( CENTERSCREEN-(sw/2), LHY(55+72+12), message);
352
353   strcpy ((char *)&oldmessage,message);
354  }
355
356 extern int PhallicLimit,PhallicMan;
357
358 void kmatrix_phallic ()
359  {
360   int sw, sh, aw;
361   char message[80];
362
363   if (!(Game_mode & GM_HOARD))
364         return;
365
366   if ((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL))
367         return;
368   
369   if (PhallicMan==-1)
370         strcpy (message,"There was no record set for this level.");
371   else
372         sprintf (message,"%s had the best record at %d points.",Players[PhallicMan].callsign,PhallicLimit);
373
374   grd_curcanv->cv_font = SMALL_FONT;
375   gr_set_fontcolor(gr_find_closest_color(63,63,63),-1);
376   gr_get_string_size(message, &sw, &sh, &aw); 
377   gr_printf( CENTERSCREEN-(sw/2), LHY(55+72+3), message);
378  }
379
380  
381 void load_stars(void);
382
383 WINDOS(dd_grs_canvas *StarBackCanvas,
384                         grs_canvas *StarBackCanvas
385 );              //,*SaveCanvas;
386
387
388 void kmatrix_redraw()
389 {
390         int i, color;
391         int sorted[MAX_NUM_NET_PLAYERS];
392 WINDOS(
393         dd_grs_canvas *tempcanvas,
394    grs_canvas *tempcanvas
395 );
396    
397    if (Game_mode & GM_MULTI_COOP)
398          {
399           kmatrix_redraw_coop();
400           return;
401          }
402          
403         multi_sort_kill_list();
404
405         WINDOS(
406            tempcanvas=dd_gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h ),
407         tempcanvas=gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h )
408         );
409
410    WINDOS(
411                 dd_gr_set_current_canvas(tempcanvas),
412                 gr_set_current_canvas (tempcanvas)
413         );
414
415         WINDOS (
416                 dd_gr_blt_notrans(StarBackCanvas, 0,0,0,0, tempcanvas,0,0,0,0),
417                 gr_bitmap (0,0,&StarBackCanvas->cv_bitmap)
418         );
419
420 WIN(DDGRLOCK(dd_grd_curcanv));
421         grd_curcanv->cv_font = MEDIUM3_FONT;
422
423         gr_string( 0x8000, LHY(10), TXT_KILL_MATRIX_TITLE       );
424
425         grd_curcanv->cv_font = SMALL_FONT;
426
427         multi_get_kill_list(sorted);
428
429         kmatrix_draw_names(sorted);
430
431         for (i=0; i<N_players; i++ )            {
432 //              mprintf((0, "Sorted kill list pos %d = %d.\n", i+1, sorted[i]));
433
434                 if (Game_mode & GM_TEAM)
435                         color = get_team(sorted[i]);
436                 else
437                         color = sorted[i];
438
439      if (Players[sorted[i]].connected==0)
440        gr_set_fontcolor(gr_find_closest_color(31,31,31),-1);
441      else
442        gr_set_fontcolor(gr_getcolor(player_rgb[color].r,player_rgb[color].g,player_rgb[color].b),-1 );
443
444      kmatrix_draw_item( i, sorted );
445         }
446
447         kmatrix_draw_deaths(sorted);
448 WIN(DDGRUNLOCK(dd_grd_curcanv));
449
450 WINDOS(
451         dd_gr_set_current_canvas(NULL),
452         gr_set_current_canvas(NULL)
453 );
454
455 #if defined(POLY_ACC)
456     pa_save_clut();
457     pa_update_clut(gr_palette, 0, 256, 0);
458 #endif
459
460 PA_DFX (pa_set_frontbuffer_current());
461
462 WINDOS(
463         dd_gr_blt_notrans(tempcanvas, 0,0,0,0, dd_grd_curcanv, 0,0,0,0),
464         gr_bitmap (0,0,&tempcanvas->cv_bitmap)
465 );
466
467 PA_DFX (pa_set_backbuffer_current());
468
469 #if defined(POLY_ACC)
470     pa_restore_clut();
471 #endif
472
473         gr_palette_load(gr_palette);
474 WINDOS(
475         dd_gr_free_canvas(tempcanvas),
476         gr_free_canvas (tempcanvas)
477 );
478 }
479
480 void kmatrix_redraw_coop()
481 {
482         int i, color;
483         int sorted[MAX_NUM_NET_PLAYERS];
484
485 WINDOS(
486         dd_grs_canvas *tempcanvas,
487         grs_canvas *tempcanvas
488 );
489         
490         multi_sort_kill_list();
491
492 WINDOS(
493    tempcanvas=dd_gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h ),
494    tempcanvas=gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h )
495 );
496 WINDOS(
497         dd_gr_set_current_canvas(tempcanvas),
498    gr_set_current_canvas (tempcanvas)
499 );
500
501 WINDOS (
502         dd_gr_blt_notrans(StarBackCanvas, 0,0,0,0, tempcanvas,0,0,0,0),
503         gr_bitmap (0,0,&StarBackCanvas->cv_bitmap)
504 );
505
506
507
508 WIN(DDGRLOCK(dd_grd_curcanv));
509         grd_curcanv->cv_font = MEDIUM3_FONT;
510         gr_string( 0x8000, LHY(10), "COOPERATIVE SUMMARY"       );
511
512         grd_curcanv->cv_font = SMALL_FONT;
513
514         multi_get_kill_list(sorted);
515
516         kmatrix_draw_coop_names(sorted);
517
518         for (i=0; i<N_players; i++ )            {
519
520      color = sorted[i];
521
522      if (Players[sorted[i]].connected==0)
523        gr_set_fontcolor(gr_find_closest_color(31,31,31),-1);
524      else
525        gr_set_fontcolor(gr_getcolor(player_rgb[color].r,player_rgb[color].g,player_rgb[color].b),-1 );
526
527      kmatrix_draw_coop_item( i, sorted );
528         }
529
530         kmatrix_draw_deaths(sorted);
531 WIN(DDGRUNLOCK(dd_grd_curcanv));
532
533 WINDOS(
534         dd_gr_set_current_canvas(NULL),
535         gr_set_current_canvas(NULL)
536 );
537
538 #if defined(POLY_ACC)
539     pa_save_clut();
540     pa_update_clut(gr_palette, 0, 256, 0);
541 #endif
542
543 PA_DFX (pa_set_frontbuffer_current());
544
545 WINDOS(
546         dd_gr_blt_notrans(tempcanvas, 0,0,0,0, dd_grd_curcanv, 0,0,0,0),
547         gr_bitmap (0,0,&tempcanvas->cv_bitmap)
548 );
549
550 PA_DFX (pa_set_backbuffer_current());
551
552 #if defined(POLY_ACC)
553     pa_restore_clut();
554 #endif
555
556         gr_palette_load(gr_palette);
557 WINDOS(
558         dd_gr_free_canvas(tempcanvas),
559         gr_free_canvas (tempcanvas)
560 );
561 }
562
563 #define MAX_VIEW_TIME   F1_0*15
564 #define ENDLEVEL_IDLE_TIME      F1_0*10
565
566 fix StartAbortMenuTime;
567
568
569 #ifdef MACINTOSH
570 extern void load_stars_palette();
571 #endif
572
573 extern void network_endlevel_poll3( int nitems, struct newmenu_item * menus, int * key, int citem );
574
575 void kmatrix_view(int network)
576 {                                                                                         
577    int i, k, done,choice;
578         fix entry_time = timer_get_approx_seconds();
579         int key;
580    int oldstates[MAX_PLAYERS];
581    int previous_seconds_left=-1;
582    int num_ready,num_escaped;
583
584         network=Game_mode & GM_NETWORK;
585  
586    for (i=0;i<MAX_NUM_NET_PLAYERS;i++)
587         digi_kill_sound_linked_to_object (Players[i].objnum);
588         
589    set_screen_mode( SCREEN_MENU );
590
591         WINDOS(
592                 StarBackCanvas=dd_gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h ),
593                 StarBackCanvas=gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h )
594         );
595         WINDOS(
596                 dd_gr_set_current_canvas(StarBackCanvas),
597            gr_set_current_canvas(StarBackCanvas)
598         );
599         #ifdef MACINTOSH
600         if (virtual_memory_on) {
601                 load_stars_palette();           // horrible hack to prevent too much paging when doing endlevel syncing
602                 gr_clear_canvas( BM_XRGB(0, 0, 0) );
603         } else
604         #endif                                                  // note link to above if/else pair
605                 load_stars();
606    
607    WaitingForOthers=0;
608    kmatrix_redraw();
609
610         //@@gr_palette_fade_in( gr_palette,32, 0);
611         game_flush_inputs();
612
613         done = 0;
614
615    for (i=0;i<N_players;i++)
616     oldstates[i]=Players[i].connected;
617
618         if (network)
619            network_endlevel(&key);
620
621         while(!done)    {
622         #ifdef WINDOWS
623                 MSG msg;
624
625                 DoMessageStuff(&msg);
626
627                 DDGRRESTORE;
628
629         #endif
630
631       kmatrix_kills_changed = 0;
632       for (i=0; i<4; i++ ) 
633           if (joy_get_button_down_cnt(i)>0) 
634                           {  
635                                   #if defined (D2_OEM)
636                                          if (Current_level_num==8)
637                                                 {
638                         Players[Player_num].connected=0;
639                                                  if (network)
640                                 network_send_endlevel_packet();
641                                                 WINDOS(
642                                                         dd_gr_free_canvas(StarBackCanvas),
643                                                    gr_free_canvas (StarBackCanvas)
644                                                 );
645                                             multi_leave_game();
646                                        Kmatrix_nomovie_message=0;
647                                        longjmp(LeaveGame, 0); 
648                         return;
649                                                 }
650                                   #endif
651                 
652             Players[Player_num].connected=7;
653                                 if (network)
654                  network_send_endlevel_packet();
655                                 break;
656                           }                     
657         for (i=0; i<3; i++ )    
658           if (mouse_button_down_count(i)>0) 
659                                 {
660                                   #if defined (D2_OEM)
661                                          if (Current_level_num==8)
662                                                 {
663                         Players[Player_num].connected=0;
664                                                  if (network)
665                                 network_send_endlevel_packet();
666                                                 WINDOS(
667                                                         dd_gr_free_canvas(StarBackCanvas),
668                                                    gr_free_canvas (StarBackCanvas)
669                                                 );
670                                             multi_leave_game();
671                                        Kmatrix_nomovie_message=0;
672                                        longjmp(LeaveGame, 0); 
673                         return;
674                                                 }
675                                   #endif
676                                         Players[Player_num].connected=7;
677                                    if (network)
678                        network_send_endlevel_packet();
679                                         break;
680                       }                 
681
682                 //see if redbook song needs to be restarted
683                 songs_check_redbook_repeat();
684
685                 k = key_inkey();
686                 switch( k )     {
687                         case KEY_ENTER:
688                         case KEY_SPACEBAR:
689                                   if ((Game_mode & GM_SERIAL) || (Game_mode & GM_MODEM))                
690                                         {
691                                                 done=1;
692                                                 break;
693                                         }
694                                         
695                                   #if defined (D2_OEM)
696                                          if (Current_level_num==8)
697                                                 {
698                         Players[Player_num].connected=0;
699                                                  if (network)
700                                 network_send_endlevel_packet();
701                                                 WINDOS(
702                                                         dd_gr_free_canvas(StarBackCanvas),
703                                                    gr_free_canvas (StarBackCanvas)
704                                                 );
705                                             multi_leave_game();
706                                        Kmatrix_nomovie_message=0;
707                                        longjmp(LeaveGame, 0); 
708                         return;
709                                                 }
710                                   #endif
711                 
712               Players[Player_num].connected=7;
713                                   if (network)  
714                network_send_endlevel_packet();
715               break;
716                         case KEY_ESC:
717                                   if (Game_mode & GM_NETWORK)
718                                         {
719                                          StartAbortMenuTime=timer_get_approx_seconds();
720                                  choice=nm_messagebox1( NULL,network_endlevel_poll3, 2, TXT_YES, TXT_NO, TXT_ABORT_GAME );
721                                         }
722                                   else
723                           choice=nm_messagebox( NULL, 2, TXT_YES, TXT_NO, TXT_ABORT_GAME );
724               if (choice==0)
725                {
726                 Players[Player_num].connected=0;
727                                          if (network)
728                         network_send_endlevel_packet();
729                                                 WINDOS(
730                                                         dd_gr_free_canvas(StarBackCanvas),
731                                                    gr_free_canvas (StarBackCanvas)
732                                                 );
733                                     multi_leave_game();
734                                Kmatrix_nomovie_message=0;
735                                longjmp(LeaveGame, 0); 
736                 return;
737                }
738               else
739                kmatrix_kills_changed=1;
740            
741                                   break;
742
743                         case KEY_PRINT_SCREEN:
744                                 save_screen_shot(0);
745                                 break;
746                         case KEY_BACKSP:
747                                 Int3();
748                                 break;
749                         default:
750                                 break;
751                 }
752                 if (timer_get_approx_seconds() >= (entry_time+MAX_VIEW_TIME) && Players[Player_num].connected!=7)
753                         {
754                                   #if defined (D2_OEM)
755                                          if (Current_level_num==8)
756                                                 {
757                         Players[Player_num].connected=0;
758                                                  if (network)
759                                 network_send_endlevel_packet();
760                                                 WINDOS(
761                                                         dd_gr_free_canvas(StarBackCanvas),
762                                                    gr_free_canvas (StarBackCanvas)
763                                                 );
764                                             multi_leave_game();
765                                        Kmatrix_nomovie_message=0;
766                                        longjmp(LeaveGame, 0); 
767                         return;
768                                                 }
769                                   #endif
770                 
771                          if ((Game_mode & GM_SERIAL) || (Game_mode & GM_MODEM))         
772                                 {
773                                         done=1;
774                                         break;
775                                 }
776           Players[Player_num].connected=7;
777                          if (network)
778                   network_send_endlevel_packet();
779                    }     
780
781                 if (network && (Game_mode & GM_NETWORK))
782                 {
783         network_endlevel_poll2(0, NULL, &key, 0);
784                        
785         for (num_escaped=0,num_ready=0,i=0;i<N_players;i++)
786           {
787             if (Players[i].connected && i!=Player_num)
788                {
789                 // Check timeout for idle players
790                 if (timer_get_approx_seconds() > LastPacketTime[i]+ENDLEVEL_IDLE_TIME)
791                    {
792                     mprintf((0, "idle timeout for player %d.\n", i));
793                                   Players[i].connected = 0;
794                     network_send_endlevel_sub(i);
795                    }                        
796                 }
797
798                if (Players[i].connected!=oldstates[i])
799                   {
800                    if (ConditionLetters[Players[i].connected]!=ConditionLetters[oldstates[i]])
801                      kmatrix_kills_changed=1;
802                    oldstates[i]=Players[i].connected;
803                                                  network_send_endlevel_packet();
804                   }
805                                         if (Players[i].connected==0 || Players[i].connected==7)
806                                           num_ready++;
807
808                if (Players[i].connected!=1)
809                    num_escaped++;
810           }
811
812          if (num_ready>=N_players)
813              done=1;
814          if (num_escaped>=N_players)
815              Countdown_seconds_left=-1;
816
817          if (previous_seconds_left != Countdown_seconds_left)
818             {
819              previous_seconds_left=Countdown_seconds_left;
820                                  kmatrix_kills_changed=1;
821                                 }
822                                                  
823          if ( kmatrix_kills_changed )    
824             {
825              kmatrix_redraw();
826              kmatrix_kills_changed=0;
827                         }
828
829                 }
830         }
831
832   Players[Player_num].connected=7;
833
834   if (network)  
835      network_send_endlevel_packet();  // make sure
836
837        
838 // Restore background and exit
839         gr_palette_fade_out( gr_palette, 32, 0 );
840
841         game_flush_inputs();
842
843         WINDOS(
844                 dd_gr_free_canvas(StarBackCanvas),
845                 gr_free_canvas (StarBackCanvas)
846         );
847
848    Kmatrix_nomovie_message=0;
849
850 }
851
852 #endif
853