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