1 /* $Id: kmatrix.c,v 1.7 2004-08-28 23:17:45 schaffner 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.
35 #include "pa_enabl.h" //$$POLY_ACC
66 #define CENTERING_OFFSET(x) ((300 - (70 + (x)*25 ))/2)
67 #define CENTERSCREEN (MenuHires?320:160)
69 int kmatrix_kills_changed = 0;
70 char ConditionLetters[]={' ','P','E','D','E','E','V','W'};
71 char WaitingForOthers=0;
73 int Kmatrix_nomovie_message=0;
75 extern char MaxPowerupsAllowed[],PowerupsInMine[];
77 void kmatrix_reactor (char *message);
78 void kmatrix_phallic ();
79 void kmatrix_redraw_coop();
81 #define LHX(x) ((x)*(MenuHires?2:1))
82 #define LHY(y) ((y)*(MenuHires?2.4:1))
84 void kmatrix_draw_item( int i, int *sorted )
93 gr_printf( LHX(CENTERING_OFFSET(N_players)), y, "%s", Players[sorted[i]].callsign );
95 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
96 gr_printf (LHX(CENTERING_OFFSET(N_players)-15),y,"%c",ConditionLetters[Players[sorted[i]].connected]);
98 for (j=0; j<N_players; j++) {
100 x = LHX(70 + CENTERING_OFFSET(N_players) + j*25);
102 if (sorted[i]==sorted[j]) {
103 if (kill_matrix[sorted[i]][sorted[j]] == 0) {
104 gr_set_fontcolor( BM_XRGB(10,10,10),-1 );
105 gr_printf( x, y, "%d", kill_matrix[sorted[i]][sorted[j]] );
107 gr_set_fontcolor( BM_XRGB(25,25,25),-1 );
108 gr_printf( x, y, "-%d", kill_matrix[sorted[i]][sorted[j]] );
111 if (kill_matrix[sorted[i]][sorted[j]] <= 0) {
112 gr_set_fontcolor( BM_XRGB(10,10,10),-1 );
113 gr_printf( x, y, "%d", kill_matrix[sorted[i]][sorted[j]] );
115 gr_set_fontcolor( BM_XRGB(25,25,25),-1 );
116 gr_printf( x, y, "%d", kill_matrix[sorted[i]][sorted[j]] );
122 if (Players[sorted[i]].net_killed_total+Players[sorted[i]].net_kills_total==0)
125 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));
127 x = LHX(60 + CENTERING_OFFSET(N_players) + N_players*25);
128 gr_set_fontcolor( BM_XRGB(25,25,25),-1 );
129 gr_printf( x ,y,"%4d/%s",Players[sorted[i]].net_kills_total,temp);
132 void kmatrix_draw_coop_item( int i, int *sorted )
138 // Print player name.
140 gr_printf( LHX(CENTERING_OFFSET(N_players)), y, "%s", Players[sorted[i]].callsign );
141 gr_printf (LHX(CENTERING_OFFSET(N_players)-15),y,"%c",ConditionLetters[Players[sorted[i]].connected]);
146 gr_set_fontcolor( BM_XRGB(60,40,10),-1 );
147 gr_printf( x, y, "%d", Players[sorted[i]].score );
149 x = CENTERSCREEN+LHX(50);
151 gr_set_fontcolor( BM_XRGB(60,40,10),-1 );
152 gr_printf( x, y, "%d", Players[sorted[i]].net_killed_total);
156 void kmatrix_draw_names(int *sorted)
162 if (Kmatrix_nomovie_message)
164 gr_set_fontcolor( BM_XRGB(63,0,0),-1 );
165 gr_printf( CENTERSCREEN-LHX(40), LHY(20), "(Movie not played)");
168 for (j=0; j<N_players; j++) {
169 if (Game_mode & GM_TEAM)
170 color = get_team(sorted[j]);
174 x = LHX (70 + CENTERING_OFFSET(N_players) + j*25);
176 if (Players[sorted[j]].connected==0)
177 gr_set_fontcolor(gr_find_closest_color(31,31,31),-1);
179 gr_set_fontcolor(gr_getcolor(player_rgb[color].r,player_rgb[color].g,player_rgb[color].b),-1 );
181 gr_printf( x, LHY(40), "%c", Players[sorted[j]].callsign[0] );
185 x = LHX(72 + CENTERING_OFFSET(N_players) + N_players*25);
186 gr_set_fontcolor( BM_XRGB(31,31,31),-1 );
187 gr_printf( x, LHY(40), "K/E");
190 void kmatrix_draw_coop_names(int *sorted)
194 if (Kmatrix_nomovie_message)
196 gr_set_fontcolor( BM_XRGB(63,0,0),-1 );
197 gr_printf( CENTERSCREEN-LHX(40), LHY(20), "(Movie not played)");
200 gr_set_fontcolor( BM_XRGB(63,31,31),-1 );
201 gr_printf( CENTERSCREEN, LHY(40), "SCORE");
203 gr_set_fontcolor( BM_XRGB(63,31,31),-1 );
204 gr_printf( CENTERSCREEN+LHX(50), LHY(40), "DEATHS");
208 void kmatrix_draw_deaths(int *sorted)
211 char reactor_message[50];
215 y = LHY(55 + 72 + 35);
222 gr_set_fontcolor(gr_find_closest_color(63,20,0),-1);
223 gr_get_string_size("P-Playing E-Escaped D-Died", &sw, &sh, &aw);
225 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
226 gr_printf( CENTERSCREEN-(sw/2), y,"P-Playing E-Escaped D-Died");
229 gr_get_string_size("V-Viewing scores W-Waiting", &sw, &sh, &aw);
231 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
232 gr_printf( CENTERSCREEN-(sw/2), y,"V-Viewing scores W-Waiting");
240 gr_set_fontcolor(gr_find_closest_color(63,63,63),-1);
242 if (Players[Player_num].connected==7)
244 gr_get_string_size("Waiting for other players...",&sw, &sh, &aw);
245 gr_printf( CENTERSCREEN-(sw/2), y,"Waiting for other players...");
249 gr_get_string_size(TXT_PRESS_ANY_KEY2, &sw, &sh, &aw);
250 gr_printf( CENTERSCREEN-(sw/2), y, TXT_PRESS_ANY_KEY2);
254 if (Countdown_seconds_left <=0)
255 kmatrix_reactor(TXT_REACTOR_EXPLODED);
258 sprintf((char *)&reactor_message, "%s: %d %s ", TXT_TIME_REMAINING, Countdown_seconds_left, TXT_SECONDS);
259 kmatrix_reactor ((char *)&reactor_message);
262 if (Game_mode & GM_HOARD)
266 void kmatrix_draw_coop_deaths(int *sorted)
269 char reactor_message[50];
271 y = LHY(55 + N_players * 9);
273 // gr_set_fontcolor(gr_getcolor(player_rgb[j].r,player_rgb[j].g,player_rgb[j].b),-1 );
274 gr_set_fontcolor( BM_XRGB(31,31,31),-1 );
276 x = CENTERSCREEN+LHX(50);
277 gr_printf( x, y, TXT_DEATHS );
279 for (j=0; j<N_players; j++) {
280 x = CENTERSCREEN+LHX(50);
281 gr_printf( x, y, "%d", Players[sorted[j]].net_killed_total );
284 y = LHY(55 + 72 + 35);
291 gr_set_fontcolor(gr_find_closest_color(63,20,0),-1);
292 gr_get_string_size("P-Playing E-Escaped D-Died", &sw, &sh, &aw);
294 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
295 gr_printf( CENTERSCREEN-(sw/2), y,"P-Playing E-Escaped D-Died");
299 gr_get_string_size("V-Viewing scores W-Waiting", &sw, &sh, &aw);
301 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
302 gr_printf( CENTERSCREEN-(sw/2), y,"V-Viewing scores W-Waiting");
310 gr_set_fontcolor(gr_find_closest_color(63,63,63),-1);
312 if (Players[Player_num].connected==7)
314 gr_get_string_size("Waiting for other players...",&sw, &sh, &aw);
315 gr_printf( CENTERSCREEN-(sw/2), y,"Waiting for other players...");
319 gr_get_string_size(TXT_PRESS_ANY_KEY2, &sw, &sh, &aw);
320 gr_printf( CENTERSCREEN-(sw/2), y, TXT_PRESS_ANY_KEY2);
324 if (Countdown_seconds_left <=0)
325 kmatrix_reactor(TXT_REACTOR_EXPLODED);
328 sprintf((char *)&reactor_message, "%s: %d %s ", TXT_TIME_REMAINING, Countdown_seconds_left, TXT_SECONDS);
329 kmatrix_reactor ((char *)&reactor_message);
334 void kmatrix_reactor (char *message)
336 static char oldmessage[50]={0};
339 if ((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL))
342 grd_curcanv->cv_font = SMALL_FONT;
344 if (oldmessage[0]!=0)
346 gr_set_fontcolor(gr_find_closest_color(0,0,0),-1);
347 gr_get_string_size(oldmessage, &sw, &sh, &aw);
348 // gr_printf( CENTERSCREEN-(sw/2), LHY(55+72+12), oldmessage);
350 gr_set_fontcolor(gr_find_closest_color(0,32,63),-1);
351 gr_get_string_size(message, &sw, &sh, &aw);
352 gr_printf( CENTERSCREEN-(sw/2), LHY(55+72+12), message);
354 strcpy ((char *)&oldmessage,message);
357 extern int PhallicLimit,PhallicMan;
359 void kmatrix_phallic ()
364 if (!(Game_mode & GM_HOARD))
367 if ((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL))
371 strcpy (message,"There was no record set for this level.");
373 sprintf (message,"%s had the best record at %d points.",Players[PhallicMan].callsign,PhallicLimit);
375 grd_curcanv->cv_font = SMALL_FONT;
376 gr_set_fontcolor(gr_find_closest_color(63,63,63),-1);
377 gr_get_string_size(message, &sw, &sh, &aw);
378 gr_printf( CENTERSCREEN-(sw/2), LHY(55+72+3), message);
382 void load_stars(void);
384 WINDOS(dd_grs_canvas *StarBackCanvas,
385 grs_canvas *StarBackCanvas
389 void kmatrix_redraw()
392 int sorted[MAX_NUM_NET_PLAYERS];
394 dd_grs_canvas *tempcanvas,
395 grs_canvas *tempcanvas
398 if (Game_mode & GM_MULTI_COOP)
400 kmatrix_redraw_coop();
404 multi_sort_kill_list();
407 tempcanvas=dd_gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h ),
408 tempcanvas=gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h )
412 dd_gr_set_current_canvas(tempcanvas),
413 gr_set_current_canvas (tempcanvas)
417 dd_gr_blt_notrans(StarBackCanvas, 0,0,0,0, tempcanvas,0,0,0,0),
418 gr_bitmap (0,0,&StarBackCanvas->cv_bitmap)
421 WIN(DDGRLOCK(dd_grd_curcanv));
422 grd_curcanv->cv_font = MEDIUM3_FONT;
424 gr_string( 0x8000, LHY(10), TXT_KILL_MATRIX_TITLE );
426 grd_curcanv->cv_font = SMALL_FONT;
428 multi_get_kill_list(sorted);
430 kmatrix_draw_names(sorted);
432 for (i=0; i<N_players; i++ ) {
433 // mprintf((0, "Sorted kill list pos %d = %d.\n", i+1, sorted[i]));
435 if (Game_mode & GM_TEAM)
436 color = get_team(sorted[i]);
440 if (Players[sorted[i]].connected==0)
441 gr_set_fontcolor(gr_find_closest_color(31,31,31),-1);
443 gr_set_fontcolor(gr_getcolor(player_rgb[color].r,player_rgb[color].g,player_rgb[color].b),-1 );
445 kmatrix_draw_item( i, sorted );
448 kmatrix_draw_deaths(sorted);
449 WIN(DDGRUNLOCK(dd_grd_curcanv));
452 dd_gr_set_current_canvas(NULL),
453 gr_set_current_canvas(NULL)
456 #if defined(POLY_ACC)
458 pa_update_clut(gr_palette, 0, 256, 0);
461 PA_DFX (pa_set_frontbuffer_current());
464 dd_gr_blt_notrans(tempcanvas, 0,0,0,0, dd_grd_curcanv, 0,0,0,0),
465 gr_bitmap (0,0,&tempcanvas->cv_bitmap)
468 PA_DFX (pa_set_backbuffer_current());
470 #if defined(POLY_ACC)
474 gr_palette_load(gr_palette);
476 dd_gr_free_canvas(tempcanvas),
477 gr_free_canvas (tempcanvas)
481 void kmatrix_redraw_coop()
484 int sorted[MAX_NUM_NET_PLAYERS];
487 dd_grs_canvas *tempcanvas,
488 grs_canvas *tempcanvas
491 multi_sort_kill_list();
494 tempcanvas=dd_gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h ),
495 tempcanvas=gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h )
498 dd_gr_set_current_canvas(tempcanvas),
499 gr_set_current_canvas (tempcanvas)
503 dd_gr_blt_notrans(StarBackCanvas, 0,0,0,0, tempcanvas,0,0,0,0),
504 gr_bitmap (0,0,&StarBackCanvas->cv_bitmap)
509 WIN(DDGRLOCK(dd_grd_curcanv));
510 grd_curcanv->cv_font = MEDIUM3_FONT;
511 gr_string( 0x8000, LHY(10), "COOPERATIVE SUMMARY" );
513 grd_curcanv->cv_font = SMALL_FONT;
515 multi_get_kill_list(sorted);
517 kmatrix_draw_coop_names(sorted);
519 for (i=0; i<N_players; i++ ) {
523 if (Players[sorted[i]].connected==0)
524 gr_set_fontcolor(gr_find_closest_color(31,31,31),-1);
526 gr_set_fontcolor(gr_getcolor(player_rgb[color].r,player_rgb[color].g,player_rgb[color].b),-1 );
528 kmatrix_draw_coop_item( i, sorted );
531 kmatrix_draw_deaths(sorted);
532 WIN(DDGRUNLOCK(dd_grd_curcanv));
535 dd_gr_set_current_canvas(NULL),
536 gr_set_current_canvas(NULL)
539 #if defined(POLY_ACC)
541 pa_update_clut(gr_palette, 0, 256, 0);
544 PA_DFX (pa_set_frontbuffer_current());
547 dd_gr_blt_notrans(tempcanvas, 0,0,0,0, dd_grd_curcanv, 0,0,0,0),
548 gr_bitmap (0,0,&tempcanvas->cv_bitmap)
551 PA_DFX (pa_set_backbuffer_current());
553 #if defined(POLY_ACC)
557 gr_palette_load(gr_palette);
559 dd_gr_free_canvas(tempcanvas),
560 gr_free_canvas (tempcanvas)
564 #define MAX_VIEW_TIME F1_0*15
565 #define ENDLEVEL_IDLE_TIME F1_0*10
567 fix StartAbortMenuTime;
571 extern void load_stars_palette();
574 extern void network_endlevel_poll3( int nitems, struct newmenu_item * menus, int * key, int citem );
576 void kmatrix_view(int network)
578 int i, k, done,choice;
579 fix entry_time = timer_get_approx_seconds();
581 int oldstates[MAX_PLAYERS];
582 int previous_seconds_left=-1;
583 int num_ready,num_escaped;
585 network=Game_mode & GM_NETWORK;
587 for (i=0;i<MAX_NUM_NET_PLAYERS;i++)
588 digi_kill_sound_linked_to_object (Players[i].objnum);
590 set_screen_mode( SCREEN_MENU );
593 StarBackCanvas=dd_gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h ),
594 StarBackCanvas=gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h )
597 dd_gr_set_current_canvas(StarBackCanvas),
598 gr_set_current_canvas(StarBackCanvas)
601 if (virtual_memory_on) {
602 load_stars_palette(); // horrible hack to prevent too much paging when doing endlevel syncing
603 gr_clear_canvas( BM_XRGB(0, 0, 0) );
605 #endif // note link to above if/else pair
611 //@@gr_palette_fade_in( gr_palette,32, 0);
616 for (i=0;i<N_players;i++)
617 oldstates[i]=Players[i].connected;
620 network_endlevel(&key);
626 DoMessageStuff(&msg);
632 kmatrix_kills_changed = 0;
634 if (joy_get_button_down_cnt(i)>0)
638 if (Current_level_num==8)
640 Players[Player_num].connected=0;
642 network_send_endlevel_packet();
644 dd_gr_free_canvas(StarBackCanvas),
645 gr_free_canvas (StarBackCanvas)
648 Kmatrix_nomovie_message=0;
649 longjmp(LeaveGame, 0);
654 Players[Player_num].connected=7;
656 network_send_endlevel_packet();
660 if (mouse_button_down_count(i)>0)
664 if (Current_level_num==8)
666 Players[Player_num].connected=0;
668 network_send_endlevel_packet();
670 dd_gr_free_canvas(StarBackCanvas),
671 gr_free_canvas (StarBackCanvas)
674 Kmatrix_nomovie_message=0;
675 longjmp(LeaveGame, 0);
679 Players[Player_num].connected=7;
681 network_send_endlevel_packet();
685 //see if redbook song needs to be restarted
686 songs_check_redbook_repeat();
692 if ((Game_mode & GM_SERIAL) || (Game_mode & GM_MODEM))
700 if (Current_level_num==8)
702 Players[Player_num].connected=0;
704 network_send_endlevel_packet();
706 dd_gr_free_canvas(StarBackCanvas),
707 gr_free_canvas (StarBackCanvas)
710 Kmatrix_nomovie_message=0;
711 longjmp(LeaveGame, 0);
716 Players[Player_num].connected=7;
718 network_send_endlevel_packet();
721 if (Game_mode & GM_NETWORK)
723 StartAbortMenuTime=timer_get_approx_seconds();
724 choice=nm_messagebox1( NULL,network_endlevel_poll3, 2, TXT_YES, TXT_NO, TXT_ABORT_GAME );
727 choice=nm_messagebox( NULL, 2, TXT_YES, TXT_NO, TXT_ABORT_GAME );
730 Players[Player_num].connected=0;
732 network_send_endlevel_packet();
734 dd_gr_free_canvas(StarBackCanvas),
735 gr_free_canvas (StarBackCanvas)
738 Kmatrix_nomovie_message=0;
739 longjmp(LeaveGame, 0);
743 kmatrix_kills_changed=1;
747 case KEY_PRINT_SCREEN:
756 if (timer_get_approx_seconds() >= (entry_time+MAX_VIEW_TIME) && Players[Player_num].connected!=7)
760 if (Current_level_num==8)
762 Players[Player_num].connected=0;
764 network_send_endlevel_packet();
766 dd_gr_free_canvas(StarBackCanvas),
767 gr_free_canvas (StarBackCanvas)
770 Kmatrix_nomovie_message=0;
771 longjmp(LeaveGame, 0);
776 if ((Game_mode & GM_SERIAL) || (Game_mode & GM_MODEM))
781 Players[Player_num].connected=7;
783 network_send_endlevel_packet();
786 if (network && (Game_mode & GM_NETWORK))
788 network_endlevel_poll2(0, NULL, &key, 0);
790 for (num_escaped=0,num_ready=0,i=0;i<N_players;i++)
792 if (Players[i].connected && i!=Player_num)
794 // Check timeout for idle players
795 if (timer_get_approx_seconds() > LastPacketTime[i]+ENDLEVEL_IDLE_TIME)
797 mprintf((0, "idle timeout for player %d.\n", i));
798 Players[i].connected = 0;
799 network_send_endlevel_sub(i);
803 if (Players[i].connected!=oldstates[i])
805 if (ConditionLetters[Players[i].connected]!=ConditionLetters[oldstates[i]])
806 kmatrix_kills_changed=1;
807 oldstates[i]=Players[i].connected;
808 network_send_endlevel_packet();
810 if (Players[i].connected==0 || Players[i].connected==7)
813 if (Players[i].connected!=1)
817 if (num_ready>=N_players)
819 if (num_escaped>=N_players)
820 Countdown_seconds_left=-1;
822 if (previous_seconds_left != Countdown_seconds_left)
824 previous_seconds_left=Countdown_seconds_left;
825 kmatrix_kills_changed=1;
828 if ( kmatrix_kills_changed )
831 kmatrix_kills_changed=0;
837 Players[Player_num].connected=7;
840 network_send_endlevel_packet(); // make sure
843 // Restore background and exit
844 gr_palette_fade_out( gr_palette, 32, 0 );
849 dd_gr_free_canvas(StarBackCanvas),
850 gr_free_canvas (StarBackCanvas)
853 Kmatrix_nomovie_message=0;