1 /* $Id: kmatrix.c,v 1.9 2005-08-02 06:13:56 chris Exp $ */
3 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
4 SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
5 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
6 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
7 IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
8 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
9 FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
10 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
11 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
12 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
17 * Kill matrix displayed at end of level.
57 #define CENTERING_OFFSET(x) ((300 - (70 + (x)*25 ))/2)
58 #define CENTERSCREEN (MenuHires?320:160)
60 int kmatrix_kills_changed = 0;
61 char ConditionLetters[]={' ','P','E','D','E','E','V','W'};
62 char WaitingForOthers=0;
64 int Kmatrix_nomovie_message=0;
66 extern char MaxPowerupsAllowed[],PowerupsInMine[];
68 void kmatrix_reactor (char *message);
69 void kmatrix_phallic ();
70 void kmatrix_redraw_coop();
72 #define LHX(x) ((x)*(MenuHires?2:1))
73 #define LHY(y) ((y)*(MenuHires?2.4:1))
75 void kmatrix_draw_item( int i, int *sorted )
84 gr_printf( LHX(CENTERING_OFFSET(N_players)), y, "%s", Players[sorted[i]].callsign );
86 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
87 gr_printf (LHX(CENTERING_OFFSET(N_players)-15),y,"%c",ConditionLetters[Players[sorted[i]].connected]);
89 for (j=0; j<N_players; j++) {
91 x = LHX(70 + CENTERING_OFFSET(N_players) + j*25);
93 if (sorted[i]==sorted[j]) {
94 if (kill_matrix[sorted[i]][sorted[j]] == 0) {
95 gr_set_fontcolor( BM_XRGB(10,10,10),-1 );
96 gr_printf( x, y, "%d", kill_matrix[sorted[i]][sorted[j]] );
98 gr_set_fontcolor( BM_XRGB(25,25,25),-1 );
99 gr_printf( x, y, "-%d", kill_matrix[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]] );
106 gr_set_fontcolor( BM_XRGB(25,25,25),-1 );
107 gr_printf( x, y, "%d", kill_matrix[sorted[i]][sorted[j]] );
113 if (Players[sorted[i]].net_killed_total+Players[sorted[i]].net_kills_total==0)
116 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));
118 x = LHX(60 + CENTERING_OFFSET(N_players) + N_players*25);
119 gr_set_fontcolor( BM_XRGB(25,25,25),-1 );
120 gr_printf( x ,y,"%4d/%s",Players[sorted[i]].net_kills_total,temp);
123 void kmatrix_draw_coop_item( int i, int *sorted )
129 // Print player name.
131 gr_printf( LHX(CENTERING_OFFSET(N_players)), y, "%s", Players[sorted[i]].callsign );
132 gr_printf (LHX(CENTERING_OFFSET(N_players)-15),y,"%c",ConditionLetters[Players[sorted[i]].connected]);
137 gr_set_fontcolor( BM_XRGB(60,40,10),-1 );
138 gr_printf( x, y, "%d", Players[sorted[i]].score );
140 x = CENTERSCREEN+LHX(50);
142 gr_set_fontcolor( BM_XRGB(60,40,10),-1 );
143 gr_printf( x, y, "%d", Players[sorted[i]].net_killed_total);
147 void kmatrix_draw_names(int *sorted)
153 if (Kmatrix_nomovie_message)
155 gr_set_fontcolor( BM_XRGB(63,0,0),-1 );
156 gr_printf( CENTERSCREEN-LHX(40), LHY(20), "(Movie not played)");
159 for (j=0; j<N_players; j++) {
160 if (Game_mode & GM_TEAM)
161 color = get_team(sorted[j]);
165 x = LHX (70 + CENTERING_OFFSET(N_players) + j*25);
167 if (Players[sorted[j]].connected==0)
168 gr_set_fontcolor(gr_find_closest_color(31,31,31),-1);
170 gr_set_fontcolor(gr_getcolor(player_rgb[color].r,player_rgb[color].g,player_rgb[color].b),-1 );
172 gr_printf( x, LHY(40), "%c", Players[sorted[j]].callsign[0] );
176 x = LHX(72 + CENTERING_OFFSET(N_players) + N_players*25);
177 gr_set_fontcolor( BM_XRGB(31,31,31),-1 );
178 gr_printf( x, LHY(40), "K/E");
181 void kmatrix_draw_coop_names(int *sorted)
185 if (Kmatrix_nomovie_message)
187 gr_set_fontcolor( BM_XRGB(63,0,0),-1 );
188 gr_printf( CENTERSCREEN-LHX(40), LHY(20), "(Movie not played)");
191 gr_set_fontcolor( BM_XRGB(63,31,31),-1 );
192 gr_printf( CENTERSCREEN, LHY(40), "SCORE");
194 gr_set_fontcolor( BM_XRGB(63,31,31),-1 );
195 gr_printf( CENTERSCREEN+LHX(50), LHY(40), "DEATHS");
199 void kmatrix_draw_deaths(int *sorted)
202 char reactor_message[50];
206 y = LHY(55 + 72 + 35);
213 gr_set_fontcolor(gr_find_closest_color(63,20,0),-1);
214 gr_get_string_size("P-Playing E-Escaped D-Died", &sw, &sh, &aw);
216 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
217 gr_printf( CENTERSCREEN-(sw/2), y,"P-Playing E-Escaped D-Died");
220 gr_get_string_size("V-Viewing scores W-Waiting", &sw, &sh, &aw);
222 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
223 gr_printf( CENTERSCREEN-(sw/2), y,"V-Viewing scores W-Waiting");
231 gr_set_fontcolor(gr_find_closest_color(63,63,63),-1);
233 if (Players[Player_num].connected==7)
235 gr_get_string_size("Waiting for other players...",&sw, &sh, &aw);
236 gr_printf( CENTERSCREEN-(sw/2), y,"Waiting for other players...");
240 gr_get_string_size(TXT_PRESS_ANY_KEY2, &sw, &sh, &aw);
241 gr_printf( CENTERSCREEN-(sw/2), y, TXT_PRESS_ANY_KEY2);
245 if (Countdown_seconds_left <=0)
246 kmatrix_reactor(TXT_REACTOR_EXPLODED);
249 sprintf((char *)&reactor_message, "%s: %d %s ", TXT_TIME_REMAINING, Countdown_seconds_left, TXT_SECONDS);
250 kmatrix_reactor ((char *)&reactor_message);
253 if (Game_mode & GM_HOARD)
257 void kmatrix_draw_coop_deaths(int *sorted)
260 char reactor_message[50];
262 y = LHY(55 + N_players * 9);
264 // gr_set_fontcolor(gr_getcolor(player_rgb[j].r,player_rgb[j].g,player_rgb[j].b),-1 );
265 gr_set_fontcolor( BM_XRGB(31,31,31),-1 );
267 x = CENTERSCREEN+LHX(50);
268 gr_printf( x, y, TXT_DEATHS );
270 for (j=0; j<N_players; j++) {
271 x = CENTERSCREEN+LHX(50);
272 gr_printf( x, y, "%d", Players[sorted[j]].net_killed_total );
275 y = LHY(55 + 72 + 35);
282 gr_set_fontcolor(gr_find_closest_color(63,20,0),-1);
283 gr_get_string_size("P-Playing E-Escaped D-Died", &sw, &sh, &aw);
285 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
286 gr_printf( CENTERSCREEN-(sw/2), y,"P-Playing E-Escaped D-Died");
290 gr_get_string_size("V-Viewing scores W-Waiting", &sw, &sh, &aw);
292 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
293 gr_printf( CENTERSCREEN-(sw/2), y,"V-Viewing scores W-Waiting");
301 gr_set_fontcolor(gr_find_closest_color(63,63,63),-1);
303 if (Players[Player_num].connected==7)
305 gr_get_string_size("Waiting for other players...",&sw, &sh, &aw);
306 gr_printf( CENTERSCREEN-(sw/2), y,"Waiting for other players...");
310 gr_get_string_size(TXT_PRESS_ANY_KEY2, &sw, &sh, &aw);
311 gr_printf( CENTERSCREEN-(sw/2), y, TXT_PRESS_ANY_KEY2);
315 if (Countdown_seconds_left <=0)
316 kmatrix_reactor(TXT_REACTOR_EXPLODED);
319 sprintf((char *)&reactor_message, "%s: %d %s ", TXT_TIME_REMAINING, Countdown_seconds_left, TXT_SECONDS);
320 kmatrix_reactor ((char *)&reactor_message);
325 void kmatrix_reactor (char *message)
327 static char oldmessage[50]={0};
330 if ((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL))
333 grd_curcanv->cv_font = SMALL_FONT;
335 if (oldmessage[0]!=0)
337 gr_set_fontcolor(gr_find_closest_color(0,0,0),-1);
338 gr_get_string_size(oldmessage, &sw, &sh, &aw);
339 // gr_printf( CENTERSCREEN-(sw/2), LHY(55+72+12), oldmessage);
341 gr_set_fontcolor(gr_find_closest_color(0,32,63),-1);
342 gr_get_string_size(message, &sw, &sh, &aw);
343 gr_printf( CENTERSCREEN-(sw/2), LHY(55+72+12), message);
345 strcpy ((char *)&oldmessage,message);
348 extern int PhallicLimit,PhallicMan;
350 void kmatrix_phallic ()
355 if (!(Game_mode & GM_HOARD))
358 if ((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL))
362 strcpy (message,"There was no record set for this level.");
364 sprintf (message,"%s had the best record at %d points.",Players[PhallicMan].callsign,PhallicLimit);
366 grd_curcanv->cv_font = SMALL_FONT;
367 gr_set_fontcolor(gr_find_closest_color(63,63,63),-1);
368 gr_get_string_size(message, &sw, &sh, &aw);
369 gr_printf( CENTERSCREEN-(sw/2), LHY(55+72+3), message);
373 void load_stars(void);
375 grs_canvas *StarBackCanvas;
378 void kmatrix_redraw()
381 int sorted[MAX_NUM_NET_PLAYERS];
382 grs_canvas *tempcanvas;
384 if (Game_mode & GM_MULTI_COOP)
386 kmatrix_redraw_coop();
390 multi_sort_kill_list();
392 tempcanvas=gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h );
394 gr_set_current_canvas (tempcanvas);
396 gr_bitmap (0,0,&StarBackCanvas->cv_bitmap);
398 grd_curcanv->cv_font = MEDIUM3_FONT;
400 gr_string( 0x8000, LHY(10), TXT_KILL_MATRIX_TITLE );
402 grd_curcanv->cv_font = SMALL_FONT;
404 multi_get_kill_list(sorted);
406 kmatrix_draw_names(sorted);
408 for (i=0; i<N_players; i++ ) {
409 // mprintf((0, "Sorted kill list pos %d = %d.\n", i+1, sorted[i]));
411 if (Game_mode & GM_TEAM)
412 color = get_team(sorted[i]);
416 if (Players[sorted[i]].connected==0)
417 gr_set_fontcolor(gr_find_closest_color(31,31,31),-1);
419 gr_set_fontcolor(gr_getcolor(player_rgb[color].r,player_rgb[color].g,player_rgb[color].b),-1 );
421 kmatrix_draw_item( i, sorted );
424 kmatrix_draw_deaths(sorted);
426 gr_set_current_canvas(NULL);
428 gr_bitmap (0,0,&tempcanvas->cv_bitmap);
430 gr_palette_load(gr_palette);
431 gr_free_canvas (tempcanvas);
434 void kmatrix_redraw_coop()
437 int sorted[MAX_NUM_NET_PLAYERS];
438 grs_canvas *tempcanvas;
440 multi_sort_kill_list();
442 tempcanvas=gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h );
443 gr_set_current_canvas (tempcanvas);
445 gr_bitmap (0,0,&StarBackCanvas->cv_bitmap);
448 grd_curcanv->cv_font = MEDIUM3_FONT;
449 gr_string( 0x8000, LHY(10), "COOPERATIVE SUMMARY" );
451 grd_curcanv->cv_font = SMALL_FONT;
453 multi_get_kill_list(sorted);
455 kmatrix_draw_coop_names(sorted);
457 for (i=0; i<N_players; i++ ) {
461 if (Players[sorted[i]].connected==0)
462 gr_set_fontcolor(gr_find_closest_color(31,31,31),-1);
464 gr_set_fontcolor(gr_getcolor(player_rgb[color].r,player_rgb[color].g,player_rgb[color].b),-1 );
466 kmatrix_draw_coop_item( i, sorted );
469 kmatrix_draw_deaths(sorted);
471 gr_set_current_canvas(NULL);
473 gr_bitmap (0,0,&tempcanvas->cv_bitmap);
475 gr_palette_load(gr_palette);
476 gr_free_canvas (tempcanvas);
479 #define MAX_VIEW_TIME F1_0*15
480 #define ENDLEVEL_IDLE_TIME F1_0*10
482 fix StartAbortMenuTime;
486 extern void load_stars_palette();
489 extern void network_endlevel_poll3( int nitems, struct newmenu_item * menus, int * key, int citem );
491 void kmatrix_view(int network)
493 int i, k, done,choice;
494 fix entry_time = timer_get_approx_seconds();
496 int oldstates[MAX_PLAYERS];
497 int previous_seconds_left=-1;
498 int num_ready,num_escaped;
500 network=Game_mode & GM_NETWORK;
502 for (i=0;i<MAX_NUM_NET_PLAYERS;i++)
503 digi_kill_sound_linked_to_object (Players[i].objnum);
505 set_screen_mode( SCREEN_MENU );
507 StarBackCanvas=gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h );
508 gr_set_current_canvas(StarBackCanvas);
510 if (virtual_memory_on) {
511 load_stars_palette(); // horrible hack to prevent too much paging when doing endlevel syncing
512 gr_clear_canvas( BM_XRGB(0, 0, 0) );
514 #endif // note link to above if/else pair
520 //@@gr_palette_fade_in( gr_palette,32, 0);
525 for (i=0;i<N_players;i++)
526 oldstates[i]=Players[i].connected;
529 network_endlevel(&key);
532 kmatrix_kills_changed = 0;
534 if (joy_get_button_down_cnt(i)>0)
538 if (Current_level_num==8)
540 Players[Player_num].connected=0;
542 network_send_endlevel_packet();
543 gr_free_canvas (StarBackCanvas);
545 Kmatrix_nomovie_message=0;
546 longjmp(LeaveGame, 0);
551 Players[Player_num].connected=7;
553 network_send_endlevel_packet();
557 if (mouse_button_down_count(i)>0)
561 if (Current_level_num==8)
563 Players[Player_num].connected=0;
565 network_send_endlevel_packet();
566 gr_free_canvas (StarBackCanvas);
568 Kmatrix_nomovie_message=0;
569 longjmp(LeaveGame, 0);
573 Players[Player_num].connected=7;
575 network_send_endlevel_packet();
579 //see if redbook song needs to be restarted
580 songs_check_redbook_repeat();
586 if ((Game_mode & GM_SERIAL) || (Game_mode & GM_MODEM))
594 if (Current_level_num==8)
596 Players[Player_num].connected=0;
598 network_send_endlevel_packet();
599 gr_free_canvas (StarBackCanvas);
601 Kmatrix_nomovie_message=0;
602 longjmp(LeaveGame, 0);
607 Players[Player_num].connected=7;
609 network_send_endlevel_packet();
612 if (Game_mode & GM_NETWORK)
614 StartAbortMenuTime=timer_get_approx_seconds();
615 choice=nm_messagebox1( NULL,network_endlevel_poll3, 2, TXT_YES, TXT_NO, TXT_ABORT_GAME );
618 choice=nm_messagebox( NULL, 2, TXT_YES, TXT_NO, TXT_ABORT_GAME );
621 Players[Player_num].connected=0;
623 network_send_endlevel_packet();
624 gr_free_canvas (StarBackCanvas);
626 Kmatrix_nomovie_message=0;
627 longjmp(LeaveGame, 0);
631 kmatrix_kills_changed=1;
635 case KEY_PRINT_SCREEN:
644 if (timer_get_approx_seconds() >= (entry_time+MAX_VIEW_TIME) && Players[Player_num].connected!=7)
648 if (Current_level_num==8)
650 Players[Player_num].connected=0;
652 network_send_endlevel_packet();
653 gr_free_canvas (StarBackCanvas);
655 Kmatrix_nomovie_message=0;
656 longjmp(LeaveGame, 0);
661 if ((Game_mode & GM_SERIAL) || (Game_mode & GM_MODEM))
666 Players[Player_num].connected=7;
668 network_send_endlevel_packet();
671 if (network && (Game_mode & GM_NETWORK))
673 network_endlevel_poll2(0, NULL, &key, 0);
675 for (num_escaped=0,num_ready=0,i=0;i<N_players;i++)
677 if (Players[i].connected && i!=Player_num)
679 // Check timeout for idle players
680 if (timer_get_approx_seconds() > LastPacketTime[i]+ENDLEVEL_IDLE_TIME)
682 mprintf((0, "idle timeout for player %d.\n", i));
683 Players[i].connected = 0;
684 network_send_endlevel_sub(i);
688 if (Players[i].connected!=oldstates[i])
690 if (ConditionLetters[Players[i].connected]!=ConditionLetters[oldstates[i]])
691 kmatrix_kills_changed=1;
692 oldstates[i]=Players[i].connected;
693 network_send_endlevel_packet();
695 if (Players[i].connected==0 || Players[i].connected==7)
698 if (Players[i].connected!=1)
702 if (num_ready>=N_players)
704 if (num_escaped>=N_players)
705 Countdown_seconds_left=-1;
707 if (previous_seconds_left != Countdown_seconds_left)
709 previous_seconds_left=Countdown_seconds_left;
710 kmatrix_kills_changed=1;
713 if ( kmatrix_kills_changed )
716 kmatrix_kills_changed=0;
722 Players[Player_num].connected=7;
725 network_send_endlevel_packet(); // make sure
728 // Restore background and exit
729 gr_palette_fade_out( gr_palette, 32, 0 );
733 gr_free_canvas (StarBackCanvas);
735 Kmatrix_nomovie_message=0;