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.
42 #define CENTERING_OFFSET(x) ((300 - (70 + (x)*25 ))/2)
43 #define CENTERSCREEN (SWIDTH/2)
44 #define MARGIN (CENTERSCREEN - LHX(160))
46 int kmatrix_kills_changed = 0;
47 char ConditionLetters[] = { ' ', 'P', 'E', 'D', 'E', 'E', 'V', 'W' };
48 char WaitingForOthers = 0;
50 int Kmatrix_nomovie_message = 0;
52 extern char MaxPowerupsAllowed[], PowerupsInMine[];
54 void kmatrix_reactor(char *message);
55 void kmatrix_phallic(void);
56 void kmatrix_redraw_coop(void);
58 #define LHX(x) ((x)*(MenuHires?2:1))
59 #define LHY(y) ((y)*(MenuHires?2.4:1))
62 void kmatrix_draw_item( int i, int *sorted )
71 gr_printf( MARGIN + LHX(CENTERING_OFFSET(N_players)), y, "%s", Players[sorted[i]].callsign );
73 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
74 gr_printf( MARGIN + LHX(CENTERING_OFFSET(N_players)-15), y, "%c", ConditionLetters[Players[sorted[i]].connected] );
76 for (j = 0; j < N_players; j++) {
78 x = MARGIN + LHX(70 + CENTERING_OFFSET(N_players) + j*25);
80 if (sorted[i] == sorted[j]) {
81 if (kill_matrix[sorted[i]][sorted[j]] == 0) {
82 gr_set_fontcolor( BM_XRGB(10,10,10), -1 );
83 gr_printf( x, y, "%d", kill_matrix[sorted[i]][sorted[j]] );
85 gr_set_fontcolor( BM_XRGB(25,25,25), -1 );
86 gr_printf( x, y, "-%d", kill_matrix[sorted[i]][sorted[j]] );
89 if (kill_matrix[sorted[i]][sorted[j]] <= 0) {
90 gr_set_fontcolor( BM_XRGB(10,10,10), -1 );
91 gr_printf( x, y, "%d", kill_matrix[sorted[i]][sorted[j]] );
93 gr_set_fontcolor( BM_XRGB(25,25,25), -1 );
94 gr_printf( x, y, "%d", kill_matrix[sorted[i]][sorted[j]] );
99 if (Players[sorted[i]].net_killed_total + Players[sorted[i]].net_kills_total == 0)
102 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));
104 x = MARGIN + LHX(60 + CENTERING_OFFSET(N_players) + N_players*25);
105 gr_set_fontcolor( BM_XRGB(25,25,25), -1 );
106 gr_printf( x, y, "%4d/%s", Players[sorted[i]].net_kills_total, temp);
110 void kmatrix_draw_coop_item( int i, int *sorted )
116 // Print player name.
118 gr_printf( MARGIN + LHX(CENTERING_OFFSET(N_players)), y, "%s", Players[sorted[i]].callsign );
119 gr_printf( MARGIN + LHX(CENTERING_OFFSET(N_players)-15), y, "%c", ConditionLetters[Players[sorted[i]].connected] );
123 gr_set_fontcolor( BM_XRGB(60,40,10), -1 );
124 gr_printf( x, y, "%d", Players[sorted[i]].score );
126 x = CENTERSCREEN + LHX(50);
128 gr_set_fontcolor( BM_XRGB(60,40,10), -1 );
129 gr_printf( x, y, "%d", Players[sorted[i]].net_killed_total );
133 void kmatrix_draw_names(int *sorted)
138 if (Kmatrix_nomovie_message) {
139 gr_set_fontcolor( BM_XRGB(63,0,0), -1 );
140 gr_printf( CENTERSCREEN - LHX(40), LHY(20), "(Movie not played)" );
143 for (j = 0; j < N_players; j++) {
144 if (Game_mode & GM_TEAM)
145 color = get_team(sorted[j]);
149 x = MARGIN + LHX(70 + CENTERING_OFFSET(N_players) + j*25);
151 if (Players[sorted[j]].connected == 0)
152 gr_set_fontcolor(gr_find_closest_color(31,31,31), -1);
154 gr_set_fontcolor(gr_getcolor(player_rgb[color].r, player_rgb[color].g, player_rgb[color].b), -1);
156 gr_printf( x, LHY(40), "%c", Players[sorted[j]].callsign[0] );
159 x = MARGIN + LHX(72 + CENTERING_OFFSET(N_players) + N_players*25);
160 gr_set_fontcolor( BM_XRGB(31,31,31), -1 );
161 gr_printf( x, LHY(40), "K/E" );
165 void kmatrix_draw_coop_names(int *sorted)
167 if (Kmatrix_nomovie_message) {
168 gr_set_fontcolor( BM_XRGB(63,0,0), -1 );
169 gr_printf( CENTERSCREEN-LHX(40), LHY(20), "(Movie not played)" );
172 gr_set_fontcolor( BM_XRGB(63,31,31), -1 );
173 gr_printf( CENTERSCREEN, LHY(40), "SCORE");
175 gr_set_fontcolor( BM_XRGB(63,31,31), -1 );
176 gr_printf( CENTERSCREEN + LHX(50), LHY(40), "DEATHS");
180 void kmatrix_draw_deaths(int *sorted)
184 char reactor_message[50];
186 y = LHY(55 + 72 + 35);
188 gr_set_fontcolor(gr_find_closest_color(63,20,0),-1);
190 gr_get_string_size("P-Playing E-Escaped D-Died", &sw, &sh, &aw);
191 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
192 gr_printf( CENTERSCREEN - (sw/2), y, "P-Playing E-Escaped D-Died" );
196 gr_get_string_size("V-Viewing scores W-Waiting", &sw, &sh, &aw);
197 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
198 gr_printf( CENTERSCREEN - (sw/2), y, "V-Viewing scores W-Waiting" );
202 gr_set_fontcolor(gr_find_closest_color(63,63,63),-1);
204 if (Players[Player_num].connected == 7) {
205 gr_get_string_size("Waiting for other players...", &sw, &sh, &aw);
206 gr_printf( CENTERSCREEN - (sw/2), y,"Waiting for other players...");
208 gr_get_string_size(TXT_PRESS_ANY_KEY2, &sw, &sh, &aw);
209 gr_printf( CENTERSCREEN - (sw/2), y, TXT_PRESS_ANY_KEY2 );
212 if (Countdown_seconds_left <= 0)
213 kmatrix_reactor(TXT_REACTOR_EXPLODED);
215 sprintf((char *)&reactor_message, "%s: %d %s ", TXT_TIME_REMAINING, Countdown_seconds_left, TXT_SECONDS);
216 kmatrix_reactor ((char *)&reactor_message);
219 if (Game_mode & GM_HOARD)
224 void kmatrix_draw_coop_deaths(int *sorted)
228 char reactor_message[50];
230 y = LHY(55 + N_players * 9);
232 // gr_set_fontcolor(gr_getcolor(player_rgb[j].r,player_rgb[j].g,player_rgb[j].b), -1);
233 gr_set_fontcolor( BM_XRGB(31,31,31), -1 );
235 x = CENTERSCREEN + LHX(50);
236 gr_printf( x, y, TXT_DEATHS );
238 for (j = 0; j < N_players; j++) {
239 x = CENTERSCREEN + LHX(50);
240 gr_printf( x, y, "%d", Players[sorted[j]].net_killed_total );
243 y = LHY(55 + 72 + 35);
245 gr_set_fontcolor(gr_find_closest_color(63,20,0), -1);
246 gr_get_string_size("P-Playing E-Escaped D-Died", &sw, &sh, &aw);
248 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
249 gr_printf( CENTERSCREEN-(sw/2), y,"P-Playing E-Escaped D-Died");
252 gr_get_string_size("V-Viewing scores W-Waiting", &sw, &sh, &aw);
254 if (!((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL)))
255 gr_printf( CENTERSCREEN - (sw/2), y, "V-Viewing scores W-Waiting" );
259 gr_set_fontcolor(gr_find_closest_color(63,63,63), -1);
261 if (Players[Player_num].connected == 7) {
262 gr_get_string_size("Waiting for other players...", &sw, &sh, &aw);
263 gr_printf( CENTERSCREEN - (sw/2), y, "Waiting for other players..." );
265 gr_get_string_size(TXT_PRESS_ANY_KEY2, &sw, &sh, &aw);
266 gr_printf( CENTERSCREEN - (sw/2), y, TXT_PRESS_ANY_KEY2 );
269 if (Countdown_seconds_left <= 0)
270 kmatrix_reactor(TXT_REACTOR_EXPLODED);
272 sprintf((char *)&reactor_message, "%s: %d %s ", TXT_TIME_REMAINING, Countdown_seconds_left, TXT_SECONDS);
273 kmatrix_reactor((char *)&reactor_message);
278 void kmatrix_reactor(char *message)
280 static char oldmessage[50] = { 0 };
283 if ((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL))
286 grd_curcanv->cv_font = SMALL_FONT;
288 if (oldmessage[0] != 0) {
289 gr_set_fontcolor(gr_find_closest_color(0,0,0), -1);
290 gr_get_string_size(oldmessage, &sw, &sh, &aw);
291 // gr_printf( CENTERSCREEN-(sw/2), LHY(55+72+12), oldmessage);
293 gr_set_fontcolor(gr_find_closest_color(0,32,63), -1);
294 gr_get_string_size(message, &sw, &sh, &aw);
295 gr_printf( CENTERSCREEN - (sw/2), LHY(55+72+12), message );
297 strcpy((char *)&oldmessage, message);
301 extern int PhallicLimit,PhallicMan;
304 void kmatrix_phallic(void)
309 if (!(Game_mode & GM_HOARD))
312 if ((Game_mode & GM_MODEM) || (Game_mode & GM_SERIAL))
315 if (PhallicMan == -1)
316 strcpy(message, "There was no record set for this level.");
318 sprintf(message,"%s had the best record at %d points.", Players[PhallicMan].callsign, PhallicLimit);
320 grd_curcanv->cv_font = SMALL_FONT;
321 gr_set_fontcolor(gr_find_closest_color(63,63,63), -1);
322 gr_get_string_size(message, &sw, &sh, &aw);
323 gr_printf( CENTERSCREEN-(sw/2), LHY(55+72+3), message);
327 void load_stars(void);
329 grs_canvas *StarBackCanvas;
332 void kmatrix_redraw(void)
335 int sorted[MAX_NUM_NET_PLAYERS];
336 grs_canvas *tempcanvas;
338 if (Game_mode & GM_MULTI_COOP) {
339 kmatrix_redraw_coop();
343 multi_sort_kill_list();
345 tempcanvas = gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h );
347 gr_set_current_canvas(tempcanvas);
349 gr_bitmap(0, 0, &StarBackCanvas->cv_bitmap);
351 grd_curcanv->cv_font = MEDIUM3_FONT;
353 gr_string( 0x8000, LHY(10), TXT_KILL_MATRIX_TITLE );
355 grd_curcanv->cv_font = SMALL_FONT;
357 multi_get_kill_list(sorted);
359 kmatrix_draw_names(sorted);
361 for (i = 0; i < N_players; i++ ) {
362 // mprintf((0, "Sorted kill list pos %d = %d.\n", i+1, sorted[i]));
364 if (Game_mode & GM_TEAM)
365 color = get_team(sorted[i]);
369 if (Players[sorted[i]].connected == 0)
370 gr_set_fontcolor(gr_find_closest_color(31,31,31), -1);
372 gr_set_fontcolor(gr_getcolor(player_rgb[color].r, player_rgb[color].g, player_rgb[color].b), -1);
374 kmatrix_draw_item( i, sorted );
377 kmatrix_draw_deaths(sorted);
379 gr_set_current_canvas(NULL);
381 gr_bitmap(0, 0, &tempcanvas->cv_bitmap);
383 gr_palette_load(gr_palette);
384 gr_free_canvas(tempcanvas);
388 void kmatrix_redraw_coop(void)
391 int sorted[MAX_NUM_NET_PLAYERS];
392 grs_canvas *tempcanvas;
394 multi_sort_kill_list();
396 tempcanvas = gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h );
397 gr_set_current_canvas(tempcanvas);
399 gr_bitmap(0, 0, &StarBackCanvas->cv_bitmap);
401 grd_curcanv->cv_font = MEDIUM3_FONT;
402 gr_string( 0x8000, LHY(10), "COOPERATIVE SUMMARY" );
404 grd_curcanv->cv_font = SMALL_FONT;
406 multi_get_kill_list(sorted);
408 kmatrix_draw_coop_names(sorted);
410 for (i = 0; i < N_players; i++ ) {
413 if (Players[sorted[i]].connected == 0)
414 gr_set_fontcolor(gr_find_closest_color(31,31,31), -1);
416 gr_set_fontcolor(gr_getcolor(player_rgb[color].r,player_rgb[color].g,player_rgb[color].b), -1);
418 kmatrix_draw_coop_item( i, sorted );
421 kmatrix_draw_deaths(sorted);
423 gr_set_current_canvas(NULL);
425 gr_bitmap(0, 0, &tempcanvas->cv_bitmap);
427 gr_palette_load(gr_palette);
428 gr_free_canvas(tempcanvas);
432 #define MAX_VIEW_TIME (F1_0*15)
433 #define ENDLEVEL_IDLE_TIME (F1_0*10)
435 fix StartAbortMenuTime;
438 extern void load_stars_palette(void);
441 extern void network_endlevel_poll3( int nitems, struct newmenu_item *menus, int *key, int citem );
444 void kmatrix_view(int network)
446 int i, k, done,choice;
447 fix entry_time = timer_get_approx_seconds();
449 int oldstates[MAX_PLAYERS];
450 int previous_seconds_left = -1;
451 int num_ready, num_escaped;
453 network = Game_mode & GM_NETWORK;
455 for (i = 0; i < MAX_NUM_NET_PLAYERS; i++)
456 digi_kill_sound_linked_to_object(Players[i].objnum);
458 set_screen_mode( SCREEN_MENU );
460 StarBackCanvas = gr_create_canvas( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h );
461 gr_set_current_canvas(StarBackCanvas);
463 if (virtual_memory_on) {
464 load_stars_palette(); // horrible hack to prevent too much paging when doing endlevel syncing
465 gr_clear_canvas( BM_XRGB(0, 0, 0) );
467 #endif // note link to above if/else pair
470 WaitingForOthers = 0;
473 //@@gr_palette_fade_in( gr_palette, 32, 0);
478 for (i = 0; i < N_players; i++)
479 oldstates[i] = Players[i].connected;
482 network_endlevel(&key);
485 kmatrix_kills_changed = 0;
486 for (i = 0; i < 4; i++ )
487 if (joy_get_button_down_cnt(i) > 0) {
488 if (is_D2_OEM && Current_level_num == 8) {
489 Players[Player_num].connected = 0;
491 network_send_endlevel_packet();
492 gr_free_canvas(StarBackCanvas);
494 Kmatrix_nomovie_message = 0;
496 longjmp(LeaveGame, 0);
500 Players[Player_num].connected = 7;
502 network_send_endlevel_packet();
506 for (i = 0; i < 3; i++ )
507 if (mouse_button_down_count(i) > 0) {
508 if (is_D2_OEM && Current_level_num == 8) {
509 Players[Player_num].connected = 0;
511 network_send_endlevel_packet();
512 gr_free_canvas(StarBackCanvas);
514 Kmatrix_nomovie_message = 0;
516 longjmp(LeaveGame, 0);
519 Players[Player_num].connected = 7;
521 network_send_endlevel_packet();
525 // see if redbook song needs to be restarted
526 songs_check_redbook_repeat();
532 if ((Game_mode & GM_SERIAL) || (Game_mode & GM_MODEM)) {
537 if (is_D2_OEM && Current_level_num == 8) {
538 Players[Player_num].connected = 0;
540 network_send_endlevel_packet();
541 gr_free_canvas (StarBackCanvas);
543 Kmatrix_nomovie_message = 0;
545 longjmp(LeaveGame, 0);
549 Players[Player_num].connected = 7;
551 network_send_endlevel_packet();
555 if (Game_mode & GM_NETWORK) {
556 StartAbortMenuTime = timer_get_approx_seconds();
557 choice = nm_messagebox1( NULL, network_endlevel_poll3, 2, TXT_YES, TXT_NO, TXT_ABORT_GAME );
559 choice = nm_messagebox( NULL, 2, TXT_YES, TXT_NO, TXT_ABORT_GAME );
561 Players[Player_num].connected = 0;
563 network_send_endlevel_packet();
564 gr_free_canvas(StarBackCanvas);
566 Kmatrix_nomovie_message = 0;
568 longjmp(LeaveGame, 0);
571 kmatrix_kills_changed = 1;
574 case KEY_PRINT_SCREEN:
583 if (timer_get_approx_seconds() >= (entry_time + MAX_VIEW_TIME) && Players[Player_num].connected != 7) {
584 if (is_D2_OEM && Current_level_num == 8) {
585 Players[Player_num].connected = 0;
587 network_send_endlevel_packet();
588 gr_free_canvas(StarBackCanvas);
590 Kmatrix_nomovie_message = 0;
592 longjmp(LeaveGame, 0);
596 if ((Game_mode & GM_SERIAL) || (Game_mode & GM_MODEM)) {
600 Players[Player_num].connected = 7;
602 network_send_endlevel_packet();
605 if (network && (Game_mode & GM_NETWORK)) {
606 network_endlevel_poll2(0, NULL, &key, 0);
608 for (num_escaped = 0, num_ready = 0, i = 0; i < N_players; i++) {
609 if (Players[i].connected && i != Player_num) {
610 // Check timeout for idle players
611 if (timer_get_approx_seconds() > LastPacketTime[i] + ENDLEVEL_IDLE_TIME) {
612 mprintf((0, "idle timeout for player %d.\n", i));
613 Players[i].connected = 0;
614 network_send_endlevel_sub(i);
618 if (Players[i].connected != oldstates[i]) {
619 if (ConditionLetters[Players[i].connected] != ConditionLetters[oldstates[i]])
620 kmatrix_kills_changed = 1;
621 oldstates[i] = Players[i].connected;
622 network_send_endlevel_packet();
624 if (Players[i].connected == 0 || Players[i].connected == 7)
627 if (Players[i].connected != 1)
631 if (num_ready >= N_players)
633 if (num_escaped >= N_players)
634 Countdown_seconds_left = -1;
636 if (previous_seconds_left != Countdown_seconds_left) {
637 previous_seconds_left = Countdown_seconds_left;
638 kmatrix_kills_changed = 1;
641 if ( kmatrix_kills_changed ) {
643 kmatrix_kills_changed = 0;
649 Players[Player_num].connected = 7;
652 network_send_endlevel_packet(); // make sure
654 // Restore background and exit
655 gr_palette_fade_out( gr_palette, 32, 0 );
659 gr_free_canvas(StarBackCanvas);
661 Kmatrix_nomovie_message = 0;