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 static char rcsid[] = "$Id: kmatrix.c,v 1.2 2001-01-20 13:49:16 bradleyb Exp $";
33 #include "pa_enabl.h" //$$POLY_ACC
64 #define CENTERING_OFFSET(x) ((300 - (70 + (x)*25 ))/2)
65 #define CENTERSCREEN (MenuHires?320:160)
67 int kmatrix_kills_changed = 0;
68 char ConditionLetters[]={' ','P','E','D','E','E','V','W'};
69 char WaitingForOthers=0;
71 int Kmatrix_nomovie_message=0;
73 extern char MaxPowerupsAllowed[],PowerupsInMine[];
75 void kmatrix_reactor (char *message);
76 void kmatrix_phallic ();
77 void kmatrix_redraw_coop();
79 #define LHX(x) ((x)*(MenuHires?2:1))
80 #define LHY(y) ((y)*(MenuHires?2.4:1))
82 void kmatrix_draw_item( int i, int *sorted )
91 gr_printf( LHX(CENTERING_OFFSET(N_players)), y, "%s", Players[sorted[i]].callsign );
93 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
94 gr_printf (LHX(CENTERING_OFFSET(N_players)-15),y,"%c",ConditionLetters[Players[sorted[i]].connected]);
96 for (j=0; j<N_players; j++) {
98 x = LHX(70 + CENTERING_OFFSET(N_players) + j*25);
100 if (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]] );
109 if (kill_matrix[sorted[i]][sorted[j]] <= 0) {
110 gr_set_fontcolor( BM_XRGB(10,10,10),-1 );
111 gr_printf( x, y, "%d", kill_matrix[sorted[i]][sorted[j]] );
113 gr_set_fontcolor( BM_XRGB(25,25,25),-1 );
114 gr_printf( x, y, "%d", kill_matrix[sorted[i]][sorted[j]] );
120 if (Players[sorted[i]].net_killed_total+Players[sorted[i]].net_kills_total==0)
123 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 x = LHX(60 + CENTERING_OFFSET(N_players) + N_players*25);
126 gr_set_fontcolor( BM_XRGB(25,25,25),-1 );
127 gr_printf( x ,y,"%4d/%s",Players[sorted[i]].net_kills_total,temp);
130 void kmatrix_draw_coop_item( int i, int *sorted )
136 // Print player name.
138 gr_printf( LHX(CENTERING_OFFSET(N_players)), y, "%s", Players[sorted[i]].callsign );
139 gr_printf (LHX(CENTERING_OFFSET(N_players)-15),y,"%c",ConditionLetters[Players[sorted[i]].connected]);
144 gr_set_fontcolor( BM_XRGB(60,40,10),-1 );
145 gr_printf( x, y, "%d", Players[sorted[i]].score );
147 x = CENTERSCREEN+LHX(50);
149 gr_set_fontcolor( BM_XRGB(60,40,10),-1 );
150 gr_printf( x, y, "%d", Players[sorted[i]].net_killed_total);
154 void kmatrix_draw_names(int *sorted)
160 if (Kmatrix_nomovie_message)
162 gr_set_fontcolor( BM_XRGB(63,0,0),-1 );
163 gr_printf( CENTERSCREEN-LHX(40), LHY(20), "(Movie not played)");
166 for (j=0; j<N_players; j++) {
167 if (Game_mode & GM_TEAM)
168 color = get_team(sorted[j]);
172 x = LHX (70 + CENTERING_OFFSET(N_players) + j*25);
174 if (Players[sorted[j]].connected==0)
175 gr_set_fontcolor(gr_find_closest_color(31,31,31),-1);
177 gr_set_fontcolor(gr_getcolor(player_rgb[color].r,player_rgb[color].g,player_rgb[color].b),-1 );
179 gr_printf( x, LHY(40), "%c", Players[sorted[j]].callsign[0] );
183 x = LHX(72 + CENTERING_OFFSET(N_players) + N_players*25);
184 gr_set_fontcolor( BM_XRGB(31,31,31),-1 );
185 gr_printf( x, LHY(40), "K/E");
188 void kmatrix_draw_coop_names(int *sorted)
192 if (Kmatrix_nomovie_message)
194 gr_set_fontcolor( BM_XRGB(63,0,0),-1 );
195 gr_printf( CENTERSCREEN-LHX(40), LHY(20), "(Movie not played)");
198 gr_set_fontcolor( BM_XRGB(63,31,31),-1 );
199 gr_printf( CENTERSCREEN, LHY(40), "SCORE");
201 gr_set_fontcolor( BM_XRGB(63,31,31),-1 );
202 gr_printf( CENTERSCREEN+LHX(50), LHY(40), "DEATHS");
206 void kmatrix_draw_deaths(int *sorted)
209 char reactor_message[50];
213 y = LHY(55 + 72 + 35);
220 gr_set_fontcolor(gr_find_closest_color(63,20,0),-1);
221 gr_get_string_size("P-Playing E-Escaped D-Died", &sw, &sh, &aw);
223 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
224 gr_printf( CENTERSCREEN-(sw/2), y,"P-Playing E-Escaped D-Died");
227 gr_get_string_size("V-Viewing scores W-Waiting", &sw, &sh, &aw);
229 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
230 gr_printf( CENTERSCREEN-(sw/2), y,"V-Viewing scores W-Waiting");
238 gr_set_fontcolor(gr_find_closest_color(63,63,63),-1);
240 if (Players[Player_num].connected==7)
242 gr_get_string_size("Waiting for other players...",&sw, &sh, &aw);
243 gr_printf( CENTERSCREEN-(sw/2), y,"Waiting for other players...");
247 gr_get_string_size(TXT_PRESS_ANY_KEY2, &sw, &sh, &aw);
248 gr_printf( CENTERSCREEN-(sw/2), y, TXT_PRESS_ANY_KEY2);
252 if (Countdown_seconds_left <=0)
253 kmatrix_reactor(TXT_REACTOR_EXPLODED);
256 sprintf((char *)&reactor_message, "%s: %d %s ", TXT_TIME_REMAINING, Countdown_seconds_left, TXT_SECONDS);
257 kmatrix_reactor ((char *)&reactor_message);
260 if (Game_mode & GM_HOARD)
264 void kmatrix_draw_coop_deaths(int *sorted)
267 char reactor_message[50];
269 y = LHY(55 + N_players * 9);
271 // gr_set_fontcolor(gr_getcolor(player_rgb[j].r,player_rgb[j].g,player_rgb[j].b),-1 );
272 gr_set_fontcolor( BM_XRGB(31,31,31),-1 );
274 x = CENTERSCREEN+LHX(50);
275 gr_printf( x, y, TXT_DEATHS );
277 for (j=0; j<N_players; j++) {
278 x = CENTERSCREEN+LHX(50);
279 gr_printf( x, y, "%d", Players[sorted[j]].net_killed_total );
282 y = LHY(55 + 72 + 35);
289 gr_set_fontcolor(gr_find_closest_color(63,20,0),-1);
290 gr_get_string_size("P-Playing E-Escaped D-Died", &sw, &sh, &aw);
292 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
293 gr_printf( CENTERSCREEN-(sw/2), y,"P-Playing E-Escaped D-Died");
297 gr_get_string_size("V-Viewing scores W-Waiting", &sw, &sh, &aw);
299 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
300 gr_printf( CENTERSCREEN-(sw/2), y,"V-Viewing scores W-Waiting");
308 gr_set_fontcolor(gr_find_closest_color(63,63,63),-1);
310 if (Players[Player_num].connected==7)
312 gr_get_string_size("Waiting for other players...",&sw, &sh, &aw);
313 gr_printf( CENTERSCREEN-(sw/2), y,"Waiting for other players...");
317 gr_get_string_size(TXT_PRESS_ANY_KEY2, &sw, &sh, &aw);
318 gr_printf( CENTERSCREEN-(sw/2), y, TXT_PRESS_ANY_KEY2);
322 if (Countdown_seconds_left <=0)
323 kmatrix_reactor(TXT_REACTOR_EXPLODED);
326 sprintf((char *)&reactor_message, "%s: %d %s ", TXT_TIME_REMAINING, Countdown_seconds_left, TXT_SECONDS);
327 kmatrix_reactor ((char *)&reactor_message);
332 void kmatrix_reactor (char *message)
334 static char oldmessage[50]={0};
337 if ((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL))
340 grd_curcanv->cv_font = SMALL_FONT;
342 if (oldmessage[0]!=0)
344 gr_set_fontcolor(gr_find_closest_color(0,0,0),-1);
345 gr_get_string_size(oldmessage, &sw, &sh, &aw);
346 // gr_printf( CENTERSCREEN-(sw/2), LHY(55+72+12), oldmessage);
348 gr_set_fontcolor(gr_find_closest_color(0,32,63),-1);
349 gr_get_string_size(message, &sw, &sh, &aw);
350 gr_printf( CENTERSCREEN-(sw/2), LHY(55+72+12), message);
352 strcpy ((char *)&oldmessage,message);
355 extern int PhallicLimit,PhallicMan;
357 void kmatrix_phallic ()
362 if (!(Game_mode & GM_HOARD))
365 if ((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL))
369 strcpy (message,"There was no record set for this level.");
371 sprintf (message,"%s had the best record at %d points.",Players[PhallicMan].callsign,PhallicLimit);
373 grd_curcanv->cv_font = SMALL_FONT;
374 gr_set_fontcolor(gr_find_closest_color(63,63,63),-1);
375 gr_get_string_size(message, &sw, &sh, &aw);
376 gr_printf( CENTERSCREEN-(sw/2), LHY(55+72+3), message);
380 void load_stars(void);
382 WINDOS(dd_grs_canvas *StarBackCanvas,
383 grs_canvas *StarBackCanvas
387 void kmatrix_redraw()
390 int sorted[MAX_NUM_NET_PLAYERS];
392 dd_grs_canvas *tempcanvas,
393 grs_canvas *tempcanvas
396 if (Game_mode & GM_MULTI_COOP)
398 kmatrix_redraw_coop();
402 multi_sort_kill_list();
405 tempcanvas=dd_gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h ),
406 tempcanvas=gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h )
410 dd_gr_set_current_canvas(tempcanvas),
411 gr_set_current_canvas (tempcanvas)
415 dd_gr_blt_notrans(StarBackCanvas, 0,0,0,0, tempcanvas,0,0,0,0),
416 gr_bitmap (0,0,&StarBackCanvas->cv_bitmap)
419 WIN(DDGRLOCK(dd_grd_curcanv));
420 grd_curcanv->cv_font = MEDIUM3_FONT;
422 gr_string( 0x8000, LHY(10), TXT_KILL_MATRIX_TITLE );
424 grd_curcanv->cv_font = SMALL_FONT;
426 multi_get_kill_list(sorted);
428 kmatrix_draw_names(sorted);
430 for (i=0; i<N_players; i++ ) {
431 // mprintf((0, "Sorted kill list pos %d = %d.\n", i+1, sorted[i]));
433 if (Game_mode & GM_TEAM)
434 color = get_team(sorted[i]);
438 if (Players[sorted[i]].connected==0)
439 gr_set_fontcolor(gr_find_closest_color(31,31,31),-1);
441 gr_set_fontcolor(gr_getcolor(player_rgb[color].r,player_rgb[color].g,player_rgb[color].b),-1 );
443 kmatrix_draw_item( i, sorted );
446 kmatrix_draw_deaths(sorted);
447 WIN(DDGRUNLOCK(dd_grd_curcanv));
450 dd_gr_set_current_canvas(NULL),
451 gr_set_current_canvas(NULL)
454 #if defined(POLY_ACC)
456 pa_update_clut(gr_palette, 0, 256, 0);
459 PA_DFX (pa_set_frontbuffer_current());
462 dd_gr_blt_notrans(tempcanvas, 0,0,0,0, dd_grd_curcanv, 0,0,0,0),
463 gr_bitmap (0,0,&tempcanvas->cv_bitmap)
466 PA_DFX (pa_set_backbuffer_current());
468 #if defined(POLY_ACC)
472 gr_palette_load(gr_palette);
474 dd_gr_free_canvas(tempcanvas),
475 gr_free_canvas (tempcanvas)
479 void kmatrix_redraw_coop()
482 int sorted[MAX_NUM_NET_PLAYERS];
485 dd_grs_canvas *tempcanvas,
486 grs_canvas *tempcanvas
489 multi_sort_kill_list();
492 tempcanvas=dd_gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h ),
493 tempcanvas=gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h )
496 dd_gr_set_current_canvas(tempcanvas),
497 gr_set_current_canvas (tempcanvas)
501 dd_gr_blt_notrans(StarBackCanvas, 0,0,0,0, tempcanvas,0,0,0,0),
502 gr_bitmap (0,0,&StarBackCanvas->cv_bitmap)
507 WIN(DDGRLOCK(dd_grd_curcanv));
508 grd_curcanv->cv_font = MEDIUM3_FONT;
509 gr_string( 0x8000, LHY(10), "COOPERATIVE SUMMARY" );
511 grd_curcanv->cv_font = SMALL_FONT;
513 multi_get_kill_list(sorted);
515 kmatrix_draw_coop_names(sorted);
517 for (i=0; i<N_players; i++ ) {
521 if (Players[sorted[i]].connected==0)
522 gr_set_fontcolor(gr_find_closest_color(31,31,31),-1);
524 gr_set_fontcolor(gr_getcolor(player_rgb[color].r,player_rgb[color].g,player_rgb[color].b),-1 );
526 kmatrix_draw_coop_item( i, sorted );
529 kmatrix_draw_deaths(sorted);
530 WIN(DDGRUNLOCK(dd_grd_curcanv));
533 dd_gr_set_current_canvas(NULL),
534 gr_set_current_canvas(NULL)
537 #if defined(POLY_ACC)
539 pa_update_clut(gr_palette, 0, 256, 0);
542 PA_DFX (pa_set_frontbuffer_current());
545 dd_gr_blt_notrans(tempcanvas, 0,0,0,0, dd_grd_curcanv, 0,0,0,0),
546 gr_bitmap (0,0,&tempcanvas->cv_bitmap)
549 PA_DFX (pa_set_backbuffer_current());
551 #if defined(POLY_ACC)
555 gr_palette_load(gr_palette);
557 dd_gr_free_canvas(tempcanvas),
558 gr_free_canvas (tempcanvas)
562 #define MAX_VIEW_TIME F1_0*15
563 #define ENDLEVEL_IDLE_TIME F1_0*10
565 fix StartAbortMenuTime;
569 extern void load_stars_palette();
572 extern void network_endlevel_poll3( int nitems, struct newmenu_item * menus, int * key, int citem );
574 void kmatrix_view(int network)
576 int i, k, done,choice;
577 fix entry_time = timer_get_approx_seconds();
579 int oldstates[MAX_PLAYERS];
580 int previous_seconds_left=-1;
581 int num_ready,num_escaped;
583 network=Game_mode & GM_NETWORK;
585 for (i=0;i<MAX_NUM_NET_PLAYERS;i++)
586 digi_kill_sound_linked_to_object (Players[i].objnum);
588 set_screen_mode( SCREEN_MENU );
591 StarBackCanvas=dd_gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h ),
592 StarBackCanvas=gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h )
595 dd_gr_set_current_canvas(StarBackCanvas),
596 gr_set_current_canvas(StarBackCanvas)
599 if (virtual_memory_on) {
600 load_stars_palette(); // horrible hack to prevent too much paging when doing endlevel syncing
601 gr_clear_canvas( BM_XRGB(0, 0, 0) );
603 #endif // note link to above if/else pair
609 //@@gr_palette_fade_in( gr_palette,32, 0);
614 for (i=0;i<N_players;i++)
615 oldstates[i]=Players[i].connected;
618 network_endlevel(&key);
624 DoMessageStuff(&msg);
630 kmatrix_kills_changed = 0;
632 if (joy_get_button_down_cnt(i)>0)
635 if (Current_level_num==8)
637 Players[Player_num].connected=0;
639 network_send_endlevel_packet();
641 dd_gr_free_canvas(StarBackCanvas),
642 gr_free_canvas (StarBackCanvas)
645 Kmatrix_nomovie_message=0;
646 longjmp(LeaveGame, 0);
651 Players[Player_num].connected=7;
653 network_send_endlevel_packet();
657 if (mouse_button_down_count(i)>0)
660 if (Current_level_num==8)
662 Players[Player_num].connected=0;
664 network_send_endlevel_packet();
666 dd_gr_free_canvas(StarBackCanvas),
667 gr_free_canvas (StarBackCanvas)
670 Kmatrix_nomovie_message=0;
671 longjmp(LeaveGame, 0);
675 Players[Player_num].connected=7;
677 network_send_endlevel_packet();
681 //see if redbook song needs to be restarted
682 songs_check_redbook_repeat();
688 if ((Game_mode & GM_SERIAL) || (Game_mode & GM_MODEM))
695 if (Current_level_num==8)
697 Players[Player_num].connected=0;
699 network_send_endlevel_packet();
701 dd_gr_free_canvas(StarBackCanvas),
702 gr_free_canvas (StarBackCanvas)
705 Kmatrix_nomovie_message=0;
706 longjmp(LeaveGame, 0);
711 Players[Player_num].connected=7;
713 network_send_endlevel_packet();
716 if (Game_mode & GM_NETWORK)
718 StartAbortMenuTime=timer_get_approx_seconds();
719 choice=nm_messagebox1( NULL,network_endlevel_poll3, 2, TXT_YES, TXT_NO, TXT_ABORT_GAME );
722 choice=nm_messagebox( NULL, 2, TXT_YES, TXT_NO, TXT_ABORT_GAME );
725 Players[Player_num].connected=0;
727 network_send_endlevel_packet();
729 dd_gr_free_canvas(StarBackCanvas),
730 gr_free_canvas (StarBackCanvas)
733 Kmatrix_nomovie_message=0;
734 longjmp(LeaveGame, 0);
738 kmatrix_kills_changed=1;
742 case KEY_PRINT_SCREEN:
751 if (timer_get_approx_seconds() >= (entry_time+MAX_VIEW_TIME) && Players[Player_num].connected!=7)
754 if (Current_level_num==8)
756 Players[Player_num].connected=0;
758 network_send_endlevel_packet();
760 dd_gr_free_canvas(StarBackCanvas),
761 gr_free_canvas (StarBackCanvas)
764 Kmatrix_nomovie_message=0;
765 longjmp(LeaveGame, 0);
770 if ((Game_mode & GM_SERIAL) || (Game_mode & GM_MODEM))
775 Players[Player_num].connected=7;
777 network_send_endlevel_packet();
780 if (network && (Game_mode & GM_NETWORK))
782 network_endlevel_poll2(0, NULL, &key, 0);
784 for (num_escaped=0,num_ready=0,i=0;i<N_players;i++)
786 if (Players[i].connected && i!=Player_num)
788 // Check timeout for idle players
789 if (timer_get_approx_seconds() > LastPacketTime[i]+ENDLEVEL_IDLE_TIME)
791 mprintf((0, "idle timeout for player %d.\n", i));
792 Players[i].connected = 0;
793 network_send_endlevel_sub(i);
797 if (Players[i].connected!=oldstates[i])
799 if (ConditionLetters[Players[i].connected]!=ConditionLetters[oldstates[i]])
800 kmatrix_kills_changed=1;
801 oldstates[i]=Players[i].connected;
802 network_send_endlevel_packet();
804 if (Players[i].connected==0 || Players[i].connected==7)
807 if (Players[i].connected!=1)
811 if (num_ready>=N_players)
813 if (num_escaped>=N_players)
814 Countdown_seconds_left=-1;
816 if (previous_seconds_left != Countdown_seconds_left)
818 previous_seconds_left=Countdown_seconds_left;
819 kmatrix_kills_changed=1;
822 if ( kmatrix_kills_changed )
825 kmatrix_kills_changed=0;
831 Players[Player_num].connected=7;
834 network_send_endlevel_packet(); // make sure
837 // Restore background and exit
838 gr_palette_fade_out( gr_palette, 32, 0 );
843 dd_gr_free_canvas(StarBackCanvas),
844 gr_free_canvas (StarBackCanvas)
847 Kmatrix_nomovie_message=0;