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.
19 static char rcsid[] = "$Id: kmatrix.c,v 1.3 2001-01-31 15:17:54 bradleyb Exp $";
34 #include "pa_enabl.h" //$$POLY_ACC
65 #define CENTERING_OFFSET(x) ((300 - (70 + (x)*25 ))/2)
66 #define CENTERSCREEN (MenuHires?320:160)
68 int kmatrix_kills_changed = 0;
69 char ConditionLetters[]={' ','P','E','D','E','E','V','W'};
70 char WaitingForOthers=0;
72 int Kmatrix_nomovie_message=0;
74 extern char MaxPowerupsAllowed[],PowerupsInMine[];
76 void kmatrix_reactor (char *message);
77 void kmatrix_phallic ();
78 void kmatrix_redraw_coop();
80 #define LHX(x) ((x)*(MenuHires?2:1))
81 #define LHY(y) ((y)*(MenuHires?2.4:1))
83 void kmatrix_draw_item( int i, int *sorted )
92 gr_printf( LHX(CENTERING_OFFSET(N_players)), y, "%s", Players[sorted[i]].callsign );
94 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
95 gr_printf (LHX(CENTERING_OFFSET(N_players)-15),y,"%c",ConditionLetters[Players[sorted[i]].connected]);
97 for (j=0; j<N_players; j++) {
99 x = LHX(70 + CENTERING_OFFSET(N_players) + j*25);
101 if (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]] );
110 if (kill_matrix[sorted[i]][sorted[j]] <= 0) {
111 gr_set_fontcolor( BM_XRGB(10,10,10),-1 );
112 gr_printf( x, y, "%d", kill_matrix[sorted[i]][sorted[j]] );
114 gr_set_fontcolor( BM_XRGB(25,25,25),-1 );
115 gr_printf( x, y, "%d", kill_matrix[sorted[i]][sorted[j]] );
121 if (Players[sorted[i]].net_killed_total+Players[sorted[i]].net_kills_total==0)
124 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));
126 x = LHX(60 + CENTERING_OFFSET(N_players) + N_players*25);
127 gr_set_fontcolor( BM_XRGB(25,25,25),-1 );
128 gr_printf( x ,y,"%4d/%s",Players[sorted[i]].net_kills_total,temp);
131 void kmatrix_draw_coop_item( int i, int *sorted )
137 // Print player name.
139 gr_printf( LHX(CENTERING_OFFSET(N_players)), y, "%s", Players[sorted[i]].callsign );
140 gr_printf (LHX(CENTERING_OFFSET(N_players)-15),y,"%c",ConditionLetters[Players[sorted[i]].connected]);
145 gr_set_fontcolor( BM_XRGB(60,40,10),-1 );
146 gr_printf( x, y, "%d", Players[sorted[i]].score );
148 x = CENTERSCREEN+LHX(50);
150 gr_set_fontcolor( BM_XRGB(60,40,10),-1 );
151 gr_printf( x, y, "%d", Players[sorted[i]].net_killed_total);
155 void kmatrix_draw_names(int *sorted)
161 if (Kmatrix_nomovie_message)
163 gr_set_fontcolor( BM_XRGB(63,0,0),-1 );
164 gr_printf( CENTERSCREEN-LHX(40), LHY(20), "(Movie not played)");
167 for (j=0; j<N_players; j++) {
168 if (Game_mode & GM_TEAM)
169 color = get_team(sorted[j]);
173 x = LHX (70 + CENTERING_OFFSET(N_players) + j*25);
175 if (Players[sorted[j]].connected==0)
176 gr_set_fontcolor(gr_find_closest_color(31,31,31),-1);
178 gr_set_fontcolor(gr_getcolor(player_rgb[color].r,player_rgb[color].g,player_rgb[color].b),-1 );
180 gr_printf( x, LHY(40), "%c", Players[sorted[j]].callsign[0] );
184 x = LHX(72 + CENTERING_OFFSET(N_players) + N_players*25);
185 gr_set_fontcolor( BM_XRGB(31,31,31),-1 );
186 gr_printf( x, LHY(40), "K/E");
189 void kmatrix_draw_coop_names(int *sorted)
193 if (Kmatrix_nomovie_message)
195 gr_set_fontcolor( BM_XRGB(63,0,0),-1 );
196 gr_printf( CENTERSCREEN-LHX(40), LHY(20), "(Movie not played)");
199 gr_set_fontcolor( BM_XRGB(63,31,31),-1 );
200 gr_printf( CENTERSCREEN, LHY(40), "SCORE");
202 gr_set_fontcolor( BM_XRGB(63,31,31),-1 );
203 gr_printf( CENTERSCREEN+LHX(50), LHY(40), "DEATHS");
207 void kmatrix_draw_deaths(int *sorted)
210 char reactor_message[50];
214 y = LHY(55 + 72 + 35);
221 gr_set_fontcolor(gr_find_closest_color(63,20,0),-1);
222 gr_get_string_size("P-Playing E-Escaped D-Died", &sw, &sh, &aw);
224 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
225 gr_printf( CENTERSCREEN-(sw/2), y,"P-Playing E-Escaped D-Died");
228 gr_get_string_size("V-Viewing scores W-Waiting", &sw, &sh, &aw);
230 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
231 gr_printf( CENTERSCREEN-(sw/2), y,"V-Viewing scores W-Waiting");
239 gr_set_fontcolor(gr_find_closest_color(63,63,63),-1);
241 if (Players[Player_num].connected==7)
243 gr_get_string_size("Waiting for other players...",&sw, &sh, &aw);
244 gr_printf( CENTERSCREEN-(sw/2), y,"Waiting for other players...");
248 gr_get_string_size(TXT_PRESS_ANY_KEY2, &sw, &sh, &aw);
249 gr_printf( CENTERSCREEN-(sw/2), y, TXT_PRESS_ANY_KEY2);
253 if (Countdown_seconds_left <=0)
254 kmatrix_reactor(TXT_REACTOR_EXPLODED);
257 sprintf((char *)&reactor_message, "%s: %d %s ", TXT_TIME_REMAINING, Countdown_seconds_left, TXT_SECONDS);
258 kmatrix_reactor ((char *)&reactor_message);
261 if (Game_mode & GM_HOARD)
265 void kmatrix_draw_coop_deaths(int *sorted)
268 char reactor_message[50];
270 y = LHY(55 + N_players * 9);
272 // gr_set_fontcolor(gr_getcolor(player_rgb[j].r,player_rgb[j].g,player_rgb[j].b),-1 );
273 gr_set_fontcolor( BM_XRGB(31,31,31),-1 );
275 x = CENTERSCREEN+LHX(50);
276 gr_printf( x, y, TXT_DEATHS );
278 for (j=0; j<N_players; j++) {
279 x = CENTERSCREEN+LHX(50);
280 gr_printf( x, y, "%d", Players[sorted[j]].net_killed_total );
283 y = LHY(55 + 72 + 35);
290 gr_set_fontcolor(gr_find_closest_color(63,20,0),-1);
291 gr_get_string_size("P-Playing E-Escaped D-Died", &sw, &sh, &aw);
293 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
294 gr_printf( CENTERSCREEN-(sw/2), y,"P-Playing E-Escaped D-Died");
298 gr_get_string_size("V-Viewing scores W-Waiting", &sw, &sh, &aw);
300 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
301 gr_printf( CENTERSCREEN-(sw/2), y,"V-Viewing scores W-Waiting");
309 gr_set_fontcolor(gr_find_closest_color(63,63,63),-1);
311 if (Players[Player_num].connected==7)
313 gr_get_string_size("Waiting for other players...",&sw, &sh, &aw);
314 gr_printf( CENTERSCREEN-(sw/2), y,"Waiting for other players...");
318 gr_get_string_size(TXT_PRESS_ANY_KEY2, &sw, &sh, &aw);
319 gr_printf( CENTERSCREEN-(sw/2), y, TXT_PRESS_ANY_KEY2);
323 if (Countdown_seconds_left <=0)
324 kmatrix_reactor(TXT_REACTOR_EXPLODED);
327 sprintf((char *)&reactor_message, "%s: %d %s ", TXT_TIME_REMAINING, Countdown_seconds_left, TXT_SECONDS);
328 kmatrix_reactor ((char *)&reactor_message);
333 void kmatrix_reactor (char *message)
335 static char oldmessage[50]={0};
338 if ((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL))
341 grd_curcanv->cv_font = SMALL_FONT;
343 if (oldmessage[0]!=0)
345 gr_set_fontcolor(gr_find_closest_color(0,0,0),-1);
346 gr_get_string_size(oldmessage, &sw, &sh, &aw);
347 // gr_printf( CENTERSCREEN-(sw/2), LHY(55+72+12), oldmessage);
349 gr_set_fontcolor(gr_find_closest_color(0,32,63),-1);
350 gr_get_string_size(message, &sw, &sh, &aw);
351 gr_printf( CENTERSCREEN-(sw/2), LHY(55+72+12), message);
353 strcpy ((char *)&oldmessage,message);
356 extern int PhallicLimit,PhallicMan;
358 void kmatrix_phallic ()
363 if (!(Game_mode & GM_HOARD))
366 if ((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL))
370 strcpy (message,"There was no record set for this level.");
372 sprintf (message,"%s had the best record at %d points.",Players[PhallicMan].callsign,PhallicLimit);
374 grd_curcanv->cv_font = SMALL_FONT;
375 gr_set_fontcolor(gr_find_closest_color(63,63,63),-1);
376 gr_get_string_size(message, &sw, &sh, &aw);
377 gr_printf( CENTERSCREEN-(sw/2), LHY(55+72+3), message);
381 void load_stars(void);
383 WINDOS(dd_grs_canvas *StarBackCanvas,
384 grs_canvas *StarBackCanvas
388 void kmatrix_redraw()
391 int sorted[MAX_NUM_NET_PLAYERS];
393 dd_grs_canvas *tempcanvas,
394 grs_canvas *tempcanvas
397 if (Game_mode & GM_MULTI_COOP)
399 kmatrix_redraw_coop();
403 multi_sort_kill_list();
406 tempcanvas=dd_gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h ),
407 tempcanvas=gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h )
411 dd_gr_set_current_canvas(tempcanvas),
412 gr_set_current_canvas (tempcanvas)
416 dd_gr_blt_notrans(StarBackCanvas, 0,0,0,0, tempcanvas,0,0,0,0),
417 gr_bitmap (0,0,&StarBackCanvas->cv_bitmap)
420 WIN(DDGRLOCK(dd_grd_curcanv));
421 grd_curcanv->cv_font = MEDIUM3_FONT;
423 gr_string( 0x8000, LHY(10), TXT_KILL_MATRIX_TITLE );
425 grd_curcanv->cv_font = SMALL_FONT;
427 multi_get_kill_list(sorted);
429 kmatrix_draw_names(sorted);
431 for (i=0; i<N_players; i++ ) {
432 // mprintf((0, "Sorted kill list pos %d = %d.\n", i+1, sorted[i]));
434 if (Game_mode & GM_TEAM)
435 color = get_team(sorted[i]);
439 if (Players[sorted[i]].connected==0)
440 gr_set_fontcolor(gr_find_closest_color(31,31,31),-1);
442 gr_set_fontcolor(gr_getcolor(player_rgb[color].r,player_rgb[color].g,player_rgb[color].b),-1 );
444 kmatrix_draw_item( i, sorted );
447 kmatrix_draw_deaths(sorted);
448 WIN(DDGRUNLOCK(dd_grd_curcanv));
451 dd_gr_set_current_canvas(NULL),
452 gr_set_current_canvas(NULL)
455 #if defined(POLY_ACC)
457 pa_update_clut(gr_palette, 0, 256, 0);
460 PA_DFX (pa_set_frontbuffer_current());
463 dd_gr_blt_notrans(tempcanvas, 0,0,0,0, dd_grd_curcanv, 0,0,0,0),
464 gr_bitmap (0,0,&tempcanvas->cv_bitmap)
467 PA_DFX (pa_set_backbuffer_current());
469 #if defined(POLY_ACC)
473 gr_palette_load(gr_palette);
475 dd_gr_free_canvas(tempcanvas),
476 gr_free_canvas (tempcanvas)
480 void kmatrix_redraw_coop()
483 int sorted[MAX_NUM_NET_PLAYERS];
486 dd_grs_canvas *tempcanvas,
487 grs_canvas *tempcanvas
490 multi_sort_kill_list();
493 tempcanvas=dd_gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h ),
494 tempcanvas=gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h )
497 dd_gr_set_current_canvas(tempcanvas),
498 gr_set_current_canvas (tempcanvas)
502 dd_gr_blt_notrans(StarBackCanvas, 0,0,0,0, tempcanvas,0,0,0,0),
503 gr_bitmap (0,0,&StarBackCanvas->cv_bitmap)
508 WIN(DDGRLOCK(dd_grd_curcanv));
509 grd_curcanv->cv_font = MEDIUM3_FONT;
510 gr_string( 0x8000, LHY(10), "COOPERATIVE SUMMARY" );
512 grd_curcanv->cv_font = SMALL_FONT;
514 multi_get_kill_list(sorted);
516 kmatrix_draw_coop_names(sorted);
518 for (i=0; i<N_players; i++ ) {
522 if (Players[sorted[i]].connected==0)
523 gr_set_fontcolor(gr_find_closest_color(31,31,31),-1);
525 gr_set_fontcolor(gr_getcolor(player_rgb[color].r,player_rgb[color].g,player_rgb[color].b),-1 );
527 kmatrix_draw_coop_item( i, sorted );
530 kmatrix_draw_deaths(sorted);
531 WIN(DDGRUNLOCK(dd_grd_curcanv));
534 dd_gr_set_current_canvas(NULL),
535 gr_set_current_canvas(NULL)
538 #if defined(POLY_ACC)
540 pa_update_clut(gr_palette, 0, 256, 0);
543 PA_DFX (pa_set_frontbuffer_current());
546 dd_gr_blt_notrans(tempcanvas, 0,0,0,0, dd_grd_curcanv, 0,0,0,0),
547 gr_bitmap (0,0,&tempcanvas->cv_bitmap)
550 PA_DFX (pa_set_backbuffer_current());
552 #if defined(POLY_ACC)
556 gr_palette_load(gr_palette);
558 dd_gr_free_canvas(tempcanvas),
559 gr_free_canvas (tempcanvas)
563 #define MAX_VIEW_TIME F1_0*15
564 #define ENDLEVEL_IDLE_TIME F1_0*10
566 fix StartAbortMenuTime;
570 extern void load_stars_palette();
573 extern void network_endlevel_poll3( int nitems, struct newmenu_item * menus, int * key, int citem );
575 void kmatrix_view(int network)
577 int i, k, done,choice;
578 fix entry_time = timer_get_approx_seconds();
580 int oldstates[MAX_PLAYERS];
581 int previous_seconds_left=-1;
582 int num_ready,num_escaped;
584 network=Game_mode & GM_NETWORK;
586 for (i=0;i<MAX_NUM_NET_PLAYERS;i++)
587 digi_kill_sound_linked_to_object (Players[i].objnum);
589 set_screen_mode( SCREEN_MENU );
592 StarBackCanvas=dd_gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h ),
593 StarBackCanvas=gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h )
596 dd_gr_set_current_canvas(StarBackCanvas),
597 gr_set_current_canvas(StarBackCanvas)
600 if (virtual_memory_on) {
601 load_stars_palette(); // horrible hack to prevent too much paging when doing endlevel syncing
602 gr_clear_canvas( BM_XRGB(0, 0, 0) );
604 #endif // note link to above if/else pair
610 //@@gr_palette_fade_in( gr_palette,32, 0);
615 for (i=0;i<N_players;i++)
616 oldstates[i]=Players[i].connected;
619 network_endlevel(&key);
625 DoMessageStuff(&msg);
631 kmatrix_kills_changed = 0;
633 if (joy_get_button_down_cnt(i)>0)
636 if (Current_level_num==8)
638 Players[Player_num].connected=0;
640 network_send_endlevel_packet();
642 dd_gr_free_canvas(StarBackCanvas),
643 gr_free_canvas (StarBackCanvas)
646 Kmatrix_nomovie_message=0;
647 longjmp(LeaveGame, 0);
652 Players[Player_num].connected=7;
654 network_send_endlevel_packet();
658 if (mouse_button_down_count(i)>0)
661 if (Current_level_num==8)
663 Players[Player_num].connected=0;
665 network_send_endlevel_packet();
667 dd_gr_free_canvas(StarBackCanvas),
668 gr_free_canvas (StarBackCanvas)
671 Kmatrix_nomovie_message=0;
672 longjmp(LeaveGame, 0);
676 Players[Player_num].connected=7;
678 network_send_endlevel_packet();
682 //see if redbook song needs to be restarted
683 songs_check_redbook_repeat();
689 if ((Game_mode & GM_SERIAL) || (Game_mode & GM_MODEM))
696 if (Current_level_num==8)
698 Players[Player_num].connected=0;
700 network_send_endlevel_packet();
702 dd_gr_free_canvas(StarBackCanvas),
703 gr_free_canvas (StarBackCanvas)
706 Kmatrix_nomovie_message=0;
707 longjmp(LeaveGame, 0);
712 Players[Player_num].connected=7;
714 network_send_endlevel_packet();
717 if (Game_mode & GM_NETWORK)
719 StartAbortMenuTime=timer_get_approx_seconds();
720 choice=nm_messagebox1( NULL,network_endlevel_poll3, 2, TXT_YES, TXT_NO, TXT_ABORT_GAME );
723 choice=nm_messagebox( NULL, 2, TXT_YES, TXT_NO, TXT_ABORT_GAME );
726 Players[Player_num].connected=0;
728 network_send_endlevel_packet();
730 dd_gr_free_canvas(StarBackCanvas),
731 gr_free_canvas (StarBackCanvas)
734 Kmatrix_nomovie_message=0;
735 longjmp(LeaveGame, 0);
739 kmatrix_kills_changed=1;
743 case KEY_PRINT_SCREEN:
752 if (timer_get_approx_seconds() >= (entry_time+MAX_VIEW_TIME) && Players[Player_num].connected!=7)
755 if (Current_level_num==8)
757 Players[Player_num].connected=0;
759 network_send_endlevel_packet();
761 dd_gr_free_canvas(StarBackCanvas),
762 gr_free_canvas (StarBackCanvas)
765 Kmatrix_nomovie_message=0;
766 longjmp(LeaveGame, 0);
771 if ((Game_mode & GM_SERIAL) || (Game_mode & GM_MODEM))
776 Players[Player_num].connected=7;
778 network_send_endlevel_packet();
781 if (network && (Game_mode & GM_NETWORK))
783 network_endlevel_poll2(0, NULL, &key, 0);
785 for (num_escaped=0,num_ready=0,i=0;i<N_players;i++)
787 if (Players[i].connected && i!=Player_num)
789 // Check timeout for idle players
790 if (timer_get_approx_seconds() > LastPacketTime[i]+ENDLEVEL_IDLE_TIME)
792 mprintf((0, "idle timeout for player %d.\n", i));
793 Players[i].connected = 0;
794 network_send_endlevel_sub(i);
798 if (Players[i].connected!=oldstates[i])
800 if (ConditionLetters[Players[i].connected]!=ConditionLetters[oldstates[i]])
801 kmatrix_kills_changed=1;
802 oldstates[i]=Players[i].connected;
803 network_send_endlevel_packet();
805 if (Players[i].connected==0 || Players[i].connected==7)
808 if (Players[i].connected!=1)
812 if (num_ready>=N_players)
814 if (num_escaped>=N_players)
815 Countdown_seconds_left=-1;
817 if (previous_seconds_left != Countdown_seconds_left)
819 previous_seconds_left=Countdown_seconds_left;
820 kmatrix_kills_changed=1;
823 if ( kmatrix_kills_changed )
826 kmatrix_kills_changed=0;
832 Players[Player_num].connected=7;
835 network_send_endlevel_packet(); // make sure
838 // Restore background and exit
839 gr_palette_fade_out( gr_palette, 32, 0 );
844 dd_gr_free_canvas(StarBackCanvas),
845 gr_free_canvas (StarBackCanvas)
848 Kmatrix_nomovie_message=0;