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.
16 * Kill matrix displayed at end of level.
56 #define CENTERING_OFFSET(x) ((300 - (70 + (x)*25 ))/2)
57 #define CENTERSCREEN (MenuHires?320:160)
59 int kmatrix_kills_changed = 0;
60 char ConditionLetters[]={' ','P','E','D','E','E','V','W'};
61 char WaitingForOthers=0;
63 int Kmatrix_nomovie_message=0;
65 extern char MaxPowerupsAllowed[],PowerupsInMine[];
67 void kmatrix_reactor (char *message);
68 void kmatrix_phallic ();
69 void kmatrix_redraw_coop();
71 #define LHX(x) ((x)*(MenuHires?2:1))
72 #define LHY(y) ((y)*(MenuHires?2.4:1))
74 void kmatrix_draw_item( int i, int *sorted )
83 gr_printf( LHX(CENTERING_OFFSET(N_players)), y, "%s", Players[sorted[i]].callsign );
85 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
86 gr_printf (LHX(CENTERING_OFFSET(N_players)-15),y,"%c",ConditionLetters[Players[sorted[i]].connected]);
88 for (j=0; j<N_players; j++) {
90 x = LHX(70 + CENTERING_OFFSET(N_players) + j*25);
92 if (sorted[i]==sorted[j]) {
93 if (kill_matrix[sorted[i]][sorted[j]] == 0) {
94 gr_set_fontcolor( BM_XRGB(10,10,10),-1 );
95 gr_printf( x, y, "%d", kill_matrix[sorted[i]][sorted[j]] );
97 gr_set_fontcolor( BM_XRGB(25,25,25),-1 );
98 gr_printf( x, y, "-%d", kill_matrix[sorted[i]][sorted[j]] );
101 if (kill_matrix[sorted[i]][sorted[j]] <= 0) {
102 gr_set_fontcolor( BM_XRGB(10,10,10),-1 );
103 gr_printf( x, y, "%d", kill_matrix[sorted[i]][sorted[j]] );
105 gr_set_fontcolor( BM_XRGB(25,25,25),-1 );
106 gr_printf( x, y, "%d", kill_matrix[sorted[i]][sorted[j]] );
112 if (Players[sorted[i]].net_killed_total+Players[sorted[i]].net_kills_total==0)
115 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));
117 x = LHX(60 + CENTERING_OFFSET(N_players) + N_players*25);
118 gr_set_fontcolor( BM_XRGB(25,25,25),-1 );
119 gr_printf( x ,y,"%4d/%s",Players[sorted[i]].net_kills_total,temp);
122 void kmatrix_draw_coop_item( int i, int *sorted )
128 // Print player name.
130 gr_printf( LHX(CENTERING_OFFSET(N_players)), y, "%s", Players[sorted[i]].callsign );
131 gr_printf (LHX(CENTERING_OFFSET(N_players)-15),y,"%c",ConditionLetters[Players[sorted[i]].connected]);
136 gr_set_fontcolor( BM_XRGB(60,40,10),-1 );
137 gr_printf( x, y, "%d", Players[sorted[i]].score );
139 x = CENTERSCREEN+LHX(50);
141 gr_set_fontcolor( BM_XRGB(60,40,10),-1 );
142 gr_printf( x, y, "%d", Players[sorted[i]].net_killed_total);
146 void kmatrix_draw_names(int *sorted)
152 if (Kmatrix_nomovie_message)
154 gr_set_fontcolor( BM_XRGB(63,0,0),-1 );
155 gr_printf( CENTERSCREEN-LHX(40), LHY(20), "(Movie not played)");
158 for (j=0; j<N_players; j++) {
159 if (Game_mode & GM_TEAM)
160 color = get_team(sorted[j]);
164 x = LHX (70 + CENTERING_OFFSET(N_players) + j*25);
166 if (Players[sorted[j]].connected==0)
167 gr_set_fontcolor(gr_find_closest_color(31,31,31),-1);
169 gr_set_fontcolor(gr_getcolor(player_rgb[color].r,player_rgb[color].g,player_rgb[color].b),-1 );
171 gr_printf( x, LHY(40), "%c", Players[sorted[j]].callsign[0] );
175 x = LHX(72 + CENTERING_OFFSET(N_players) + N_players*25);
176 gr_set_fontcolor( BM_XRGB(31,31,31),-1 );
177 gr_printf( x, LHY(40), "K/E");
180 void kmatrix_draw_coop_names(int *sorted)
182 if (Kmatrix_nomovie_message)
184 gr_set_fontcolor( BM_XRGB(63,0,0),-1 );
185 gr_printf( CENTERSCREEN-LHX(40), LHY(20), "(Movie not played)");
188 gr_set_fontcolor( BM_XRGB(63,31,31),-1 );
189 gr_printf( CENTERSCREEN, LHY(40), "SCORE");
191 gr_set_fontcolor( BM_XRGB(63,31,31),-1 );
192 gr_printf( CENTERSCREEN+LHX(50), LHY(40), "DEATHS");
196 void kmatrix_draw_deaths(int *sorted)
199 char reactor_message[50];
201 y = LHY(55 + 72 + 35);
208 gr_set_fontcolor(gr_find_closest_color(63,20,0),-1);
209 gr_get_string_size("P-Playing E-Escaped D-Died", &sw, &sh, &aw);
211 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
212 gr_printf( CENTERSCREEN-(sw/2), y,"P-Playing E-Escaped D-Died");
215 gr_get_string_size("V-Viewing scores W-Waiting", &sw, &sh, &aw);
217 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
218 gr_printf( CENTERSCREEN-(sw/2), y,"V-Viewing scores W-Waiting");
226 gr_set_fontcolor(gr_find_closest_color(63,63,63),-1);
228 if (Players[Player_num].connected==7)
230 gr_get_string_size("Waiting for other players...",&sw, &sh, &aw);
231 gr_printf( CENTERSCREEN-(sw/2), y,"Waiting for other players...");
235 gr_get_string_size(TXT_PRESS_ANY_KEY2, &sw, &sh, &aw);
236 gr_printf( CENTERSCREEN-(sw/2), y, TXT_PRESS_ANY_KEY2);
240 if (Countdown_seconds_left <=0)
241 kmatrix_reactor(TXT_REACTOR_EXPLODED);
244 sprintf((char *)&reactor_message, "%s: %d %s ", TXT_TIME_REMAINING, Countdown_seconds_left, TXT_SECONDS);
245 kmatrix_reactor ((char *)&reactor_message);
248 if (Game_mode & GM_HOARD)
252 void kmatrix_draw_coop_deaths(int *sorted)
255 char reactor_message[50];
257 y = LHY(55 + N_players * 9);
259 // gr_set_fontcolor(gr_getcolor(player_rgb[j].r,player_rgb[j].g,player_rgb[j].b),-1 );
260 gr_set_fontcolor( BM_XRGB(31,31,31),-1 );
262 x = CENTERSCREEN+LHX(50);
263 gr_printf( x, y, TXT_DEATHS );
265 for (j=0; j<N_players; j++) {
266 x = CENTERSCREEN+LHX(50);
267 gr_printf( x, y, "%d", Players[sorted[j]].net_killed_total );
270 y = LHY(55 + 72 + 35);
277 gr_set_fontcolor(gr_find_closest_color(63,20,0),-1);
278 gr_get_string_size("P-Playing E-Escaped D-Died", &sw, &sh, &aw);
280 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
281 gr_printf( CENTERSCREEN-(sw/2), y,"P-Playing E-Escaped D-Died");
285 gr_get_string_size("V-Viewing scores W-Waiting", &sw, &sh, &aw);
287 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
288 gr_printf( CENTERSCREEN-(sw/2), y,"V-Viewing scores W-Waiting");
296 gr_set_fontcolor(gr_find_closest_color(63,63,63),-1);
298 if (Players[Player_num].connected==7)
300 gr_get_string_size("Waiting for other players...",&sw, &sh, &aw);
301 gr_printf( CENTERSCREEN-(sw/2), y,"Waiting for other players...");
305 gr_get_string_size(TXT_PRESS_ANY_KEY2, &sw, &sh, &aw);
306 gr_printf( CENTERSCREEN-(sw/2), y, TXT_PRESS_ANY_KEY2);
310 if (Countdown_seconds_left <=0)
311 kmatrix_reactor(TXT_REACTOR_EXPLODED);
314 sprintf((char *)&reactor_message, "%s: %d %s ", TXT_TIME_REMAINING, Countdown_seconds_left, TXT_SECONDS);
315 kmatrix_reactor ((char *)&reactor_message);
320 void kmatrix_reactor (char *message)
322 static char oldmessage[50]={0};
325 if ((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL))
328 grd_curcanv->cv_font = SMALL_FONT;
330 if (oldmessage[0]!=0)
332 gr_set_fontcolor(gr_find_closest_color(0,0,0),-1);
333 gr_get_string_size(oldmessage, &sw, &sh, &aw);
334 // gr_printf( CENTERSCREEN-(sw/2), LHY(55+72+12), oldmessage);
336 gr_set_fontcolor(gr_find_closest_color(0,32,63),-1);
337 gr_get_string_size(message, &sw, &sh, &aw);
338 gr_printf( CENTERSCREEN-(sw/2), LHY(55+72+12), message);
340 strcpy ((char *)&oldmessage,message);
343 extern int PhallicLimit,PhallicMan;
345 void kmatrix_phallic ()
350 if (!(Game_mode & GM_HOARD))
353 if ((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL))
357 strcpy (message,"There was no record set for this level.");
359 sprintf (message,"%s had the best record at %d points.",Players[PhallicMan].callsign,PhallicLimit);
361 grd_curcanv->cv_font = SMALL_FONT;
362 gr_set_fontcolor(gr_find_closest_color(63,63,63),-1);
363 gr_get_string_size(message, &sw, &sh, &aw);
364 gr_printf( CENTERSCREEN-(sw/2), LHY(55+72+3), message);
368 void load_stars(void);
370 grs_canvas *StarBackCanvas;
373 void kmatrix_redraw()
376 int sorted[MAX_NUM_NET_PLAYERS];
377 grs_canvas *tempcanvas;
379 if (Game_mode & GM_MULTI_COOP)
381 kmatrix_redraw_coop();
385 multi_sort_kill_list();
387 tempcanvas=gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h );
389 gr_set_current_canvas (tempcanvas);
391 gr_bitmap (0,0,&StarBackCanvas->cv_bitmap);
393 grd_curcanv->cv_font = MEDIUM3_FONT;
395 gr_string( 0x8000, LHY(10), TXT_KILL_MATRIX_TITLE );
397 grd_curcanv->cv_font = SMALL_FONT;
399 multi_get_kill_list(sorted);
401 kmatrix_draw_names(sorted);
403 for (i=0; i<N_players; i++ ) {
404 // mprintf((0, "Sorted kill list pos %d = %d.\n", i+1, sorted[i]));
406 if (Game_mode & GM_TEAM)
407 color = get_team(sorted[i]);
411 if (Players[sorted[i]].connected==0)
412 gr_set_fontcolor(gr_find_closest_color(31,31,31),-1);
414 gr_set_fontcolor(gr_getcolor(player_rgb[color].r,player_rgb[color].g,player_rgb[color].b),-1 );
416 kmatrix_draw_item( i, sorted );
419 kmatrix_draw_deaths(sorted);
421 gr_set_current_canvas(NULL);
423 gr_bitmap (0,0,&tempcanvas->cv_bitmap);
425 gr_palette_load(gr_palette);
426 gr_free_canvas (tempcanvas);
429 void kmatrix_redraw_coop()
432 int sorted[MAX_NUM_NET_PLAYERS];
433 grs_canvas *tempcanvas;
435 multi_sort_kill_list();
437 tempcanvas=gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h );
438 gr_set_current_canvas (tempcanvas);
440 gr_bitmap (0,0,&StarBackCanvas->cv_bitmap);
443 grd_curcanv->cv_font = MEDIUM3_FONT;
444 gr_string( 0x8000, LHY(10), "COOPERATIVE SUMMARY" );
446 grd_curcanv->cv_font = SMALL_FONT;
448 multi_get_kill_list(sorted);
450 kmatrix_draw_coop_names(sorted);
452 for (i=0; i<N_players; i++ ) {
456 if (Players[sorted[i]].connected==0)
457 gr_set_fontcolor(gr_find_closest_color(31,31,31),-1);
459 gr_set_fontcolor(gr_getcolor(player_rgb[color].r,player_rgb[color].g,player_rgb[color].b),-1 );
461 kmatrix_draw_coop_item( i, sorted );
464 kmatrix_draw_deaths(sorted);
466 gr_set_current_canvas(NULL);
468 gr_bitmap (0,0,&tempcanvas->cv_bitmap);
470 gr_palette_load(gr_palette);
471 gr_free_canvas (tempcanvas);
474 #define MAX_VIEW_TIME F1_0*15
475 #define ENDLEVEL_IDLE_TIME F1_0*10
477 fix StartAbortMenuTime;
481 extern void load_stars_palette();
484 extern void network_endlevel_poll3( int nitems, struct newmenu_item * menus, int * key, int citem );
486 void kmatrix_view(int network)
488 int i, k, done,choice;
489 fix entry_time = timer_get_approx_seconds();
491 int oldstates[MAX_PLAYERS];
492 int previous_seconds_left=-1;
493 int num_ready,num_escaped;
495 network=Game_mode & GM_NETWORK;
497 for (i=0;i<MAX_NUM_NET_PLAYERS;i++)
498 digi_kill_sound_linked_to_object (Players[i].objnum);
500 set_screen_mode( SCREEN_MENU );
502 StarBackCanvas=gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h );
503 gr_set_current_canvas(StarBackCanvas);
505 if (virtual_memory_on) {
506 load_stars_palette(); // horrible hack to prevent too much paging when doing endlevel syncing
507 gr_clear_canvas( BM_XRGB(0, 0, 0) );
509 #endif // note link to above if/else pair
515 //@@gr_palette_fade_in( gr_palette,32, 0);
520 for (i=0;i<N_players;i++)
521 oldstates[i]=Players[i].connected;
524 network_endlevel(&key);
527 kmatrix_kills_changed = 0;
529 if (joy_get_button_down_cnt(i)>0)
533 if (Current_level_num==8)
535 Players[Player_num].connected=0;
537 network_send_endlevel_packet();
538 gr_free_canvas (StarBackCanvas);
540 Kmatrix_nomovie_message=0;
541 longjmp(LeaveGame, 0);
546 Players[Player_num].connected=7;
548 network_send_endlevel_packet();
552 if (mouse_button_down_count(i)>0)
556 if (Current_level_num==8)
558 Players[Player_num].connected=0;
560 network_send_endlevel_packet();
561 gr_free_canvas (StarBackCanvas);
563 Kmatrix_nomovie_message=0;
564 longjmp(LeaveGame, 0);
568 Players[Player_num].connected=7;
570 network_send_endlevel_packet();
574 //see if redbook song needs to be restarted
575 songs_check_redbook_repeat();
581 if ((Game_mode & GM_SERIAL) || (Game_mode & GM_MODEM))
589 if (Current_level_num==8)
591 Players[Player_num].connected=0;
593 network_send_endlevel_packet();
594 gr_free_canvas (StarBackCanvas);
596 Kmatrix_nomovie_message=0;
597 longjmp(LeaveGame, 0);
602 Players[Player_num].connected=7;
604 network_send_endlevel_packet();
607 if (Game_mode & GM_NETWORK)
609 StartAbortMenuTime=timer_get_approx_seconds();
610 choice=nm_messagebox1( NULL,network_endlevel_poll3, 2, TXT_YES, TXT_NO, TXT_ABORT_GAME );
613 choice=nm_messagebox( NULL, 2, TXT_YES, TXT_NO, TXT_ABORT_GAME );
616 Players[Player_num].connected=0;
618 network_send_endlevel_packet();
619 gr_free_canvas (StarBackCanvas);
621 Kmatrix_nomovie_message=0;
622 longjmp(LeaveGame, 0);
626 kmatrix_kills_changed=1;
630 case KEY_PRINT_SCREEN:
639 if (timer_get_approx_seconds() >= (entry_time+MAX_VIEW_TIME) && Players[Player_num].connected!=7)
643 if (Current_level_num==8)
645 Players[Player_num].connected=0;
647 network_send_endlevel_packet();
648 gr_free_canvas (StarBackCanvas);
650 Kmatrix_nomovie_message=0;
651 longjmp(LeaveGame, 0);
656 if ((Game_mode & GM_SERIAL) || (Game_mode & GM_MODEM))
661 Players[Player_num].connected=7;
663 network_send_endlevel_packet();
666 if (network && (Game_mode & GM_NETWORK))
668 network_endlevel_poll2(0, NULL, &key, 0);
670 for (num_escaped=0,num_ready=0,i=0;i<N_players;i++)
672 if (Players[i].connected && i!=Player_num)
674 // Check timeout for idle players
675 if (timer_get_approx_seconds() > LastPacketTime[i]+ENDLEVEL_IDLE_TIME)
677 mprintf((0, "idle timeout for player %d.\n", i));
678 Players[i].connected = 0;
679 network_send_endlevel_sub(i);
683 if (Players[i].connected!=oldstates[i])
685 if (ConditionLetters[Players[i].connected]!=ConditionLetters[oldstates[i]])
686 kmatrix_kills_changed=1;
687 oldstates[i]=Players[i].connected;
688 network_send_endlevel_packet();
690 if (Players[i].connected==0 || Players[i].connected==7)
693 if (Players[i].connected!=1)
697 if (num_ready>=N_players)
699 if (num_escaped>=N_players)
700 Countdown_seconds_left=-1;
702 if (previous_seconds_left != Countdown_seconds_left)
704 previous_seconds_left=Countdown_seconds_left;
705 kmatrix_kills_changed=1;
708 if ( kmatrix_kills_changed )
711 kmatrix_kills_changed=0;
717 Players[Player_num].connected=7;
720 network_send_endlevel_packet(); // make sure
723 // Restore background and exit
724 gr_palette_fade_out( gr_palette, 32, 0 );
728 gr_free_canvas (StarBackCanvas);
730 Kmatrix_nomovie_message=0;