2006-03-20 17:12:09 +00:00
/*
THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
SOFTWARE CORPORATION ( " PARALLAX " ) . PARALLAX , IN DISTRIBUTING THE CODE TO
END - USERS , AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN , GRANTS A
ROYALTY - FREE , PERPETUAL LICENSE TO SUCH END - USERS FOR USE BY SUCH END - USERS
IN USING , DISPLAYING , AND CREATING DERIVATIVE WORKS THEREOF , SO LONG AS
SUCH USE , DISPLAY OR CREATION IS FOR NON - COMMERCIAL , ROYALTY OR REVENUE
FREE PURPOSES . IN NO EVENT SHALL THE END - USER USE THE COMPUTER CODE
CONTAINED HEREIN FOR REVENUE - BEARING PURPOSES . THE END - USER UNDERSTANDS
AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE .
COPYRIGHT 1993 - 1999 PARALLAX SOFTWARE CORPORATION . ALL RIGHTS RESERVED .
*/
/*
*
* Kill matrix displayed at end of level .
*
*/
# ifdef HAVE_CONFIG_H
# include <conf.h>
# endif
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <ctype.h>
# include <stdarg.h>
# include "error.h"
# include "pstypes.h"
# include "gr.h"
# include "key.h"
# include "palette.h"
# include "game.h"
# include "gamefont.h"
# include "u_mem.h"
# include "newmenu.h"
# include "menu.h"
# include "player.h"
# include "screens.h"
# include "gamefont.h"
# include "cntrlcen.h"
# include "mouse.h"
# include "joy.h"
# include "timer.h"
# include "text.h"
# include "songs.h"
# include "multi.h"
# include "kmatrix.h"
# include "gauges.h"
# include "pcx.h"
# include "network.h"
2007-03-22 11:32:22 +00:00
# ifdef OGL
# include "ogl_init.h"
# endif
2006-03-20 17:12:09 +00:00
# define CENTERING_OFFSET(x) ((300 - (70 + (x)*25 )) / 2)
2007-01-12 14:21:05 +00:00
# define CENTERSCREEN (SWIDTH / 2)
2006-03-20 17:12:09 +00:00
int kmatrix_kills_changed = 0 ;
char ConditionLetters [ ] = { ' ' , ' P ' , ' E ' , ' D ' , ' E ' , ' E ' , ' V ' , ' W ' } ;
char WaitingForOthers = 0 ;
int Kmatrix_nomovie_message = 0 ;
extern char MaxPowerupsAllowed [ ] , PowerupsInMine [ ] ;
2007-10-06 14:51:30 +00:00
extern void newmenu_close ( ) ;
2006-03-20 17:12:09 +00:00
void kmatrix_reactor ( char * message ) ;
void kmatrix_phallic ( ) ;
void kmatrix_redraw_coop ( ) ;
void kmatrix_draw_item ( int i , int * sorted )
{
2007-01-12 14:21:05 +00:00
int j , x , y ;
char temp [ 10 ] ;
2008-02-24 14:41:27 +00:00
y = FSPACY ( 50 + i * 9 ) ;
2007-01-12 14:21:05 +00:00
// Print player name.
2008-02-24 14:41:27 +00:00
gr_printf ( FSPACX ( CENTERING_OFFSET ( N_players ) ) , y , " %s " , Players [ sorted [ i ] ] . callsign ) ;
2007-01-12 14:21:05 +00:00
2008-02-24 14:41:27 +00:00
gr_printf ( FSPACX ( CENTERING_OFFSET ( N_players ) - 15 ) , y , " %c " , ConditionLetters [ Players [ sorted [ i ] ] . connected ] ) ;
2007-01-12 14:21:05 +00:00
for ( j = 0 ; j < N_players ; j + + ) {
2008-02-24 14:41:27 +00:00
x = FSPACX ( 70 + CENTERING_OFFSET ( N_players ) + j * 25 ) ;
2007-01-12 14:21:05 +00:00
if ( sorted [ i ] = = sorted [ j ] ) {
if ( kill_matrix [ sorted [ i ] ] [ sorted [ j ] ] = = 0 ) {
gr_set_fontcolor ( BM_XRGB ( 10 , 10 , 10 ) , - 1 ) ;
gr_printf ( x , y , " %d " , kill_matrix [ sorted [ i ] ] [ sorted [ j ] ] ) ;
} else {
gr_set_fontcolor ( BM_XRGB ( 25 , 25 , 25 ) , - 1 ) ;
gr_printf ( x , y , " -%d " , kill_matrix [ sorted [ i ] ] [ sorted [ j ] ] ) ;
}
} else {
if ( kill_matrix [ sorted [ i ] ] [ sorted [ j ] ] < = 0 ) {
gr_set_fontcolor ( BM_XRGB ( 10 , 10 , 10 ) , - 1 ) ;
gr_printf ( x , y , " %d " , kill_matrix [ sorted [ i ] ] [ sorted [ j ] ] ) ;
} else {
gr_set_fontcolor ( BM_XRGB ( 25 , 25 , 25 ) , - 1 ) ;
gr_printf ( x , y , " %d " , kill_matrix [ sorted [ i ] ] [ sorted [ j ] ] ) ;
}
}
}
2006-03-20 17:12:09 +00:00
if ( Players [ sorted [ i ] ] . net_killed_total + Players [ sorted [ i ] ] . net_kills_total = = 0 )
2007-01-12 14:21:05 +00:00
sprintf ( temp , " NA " ) ;
2006-03-20 17:12:09 +00:00
else
2007-01-12 14:21:05 +00:00
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 ) ) ;
2008-02-24 14:41:27 +00:00
x = FSPACX ( 60 + CENTERING_OFFSET ( N_players ) + N_players * 25 ) ;
2007-01-12 14:21:05 +00:00
gr_set_fontcolor ( BM_XRGB ( 25 , 25 , 25 ) , - 1 ) ;
gr_printf ( x , y , " %4d/%s " , Players [ sorted [ i ] ] . net_kills_total , temp ) ;
2006-03-20 17:12:09 +00:00
}
void kmatrix_draw_coop_item ( int i , int * sorted )
{
2007-01-12 14:21:05 +00:00
int x , y ;
2006-03-20 17:12:09 +00:00
2008-02-24 14:41:27 +00:00
y = FSPACY ( 50 + i * 9 ) ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
// Print player name.
2006-03-20 17:12:09 +00:00
2008-02-24 14:41:27 +00:00
gr_printf ( FSPACX ( CENTERING_OFFSET ( N_players ) ) , y , " %s " , Players [ sorted [ i ] ] . callsign ) ;
gr_printf ( FSPACX ( CENTERING_OFFSET ( N_players ) - 15 ) , y , " %c " , ConditionLetters [ Players [ sorted [ i ] ] . connected ] ) ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
x = CENTERSCREEN ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
gr_set_fontcolor ( BM_XRGB ( 60 , 40 , 10 ) , - 1 ) ;
gr_printf ( x , y , " %d " , Players [ sorted [ i ] ] . score ) ;
2006-03-20 17:12:09 +00:00
2008-02-24 14:41:27 +00:00
x = CENTERSCREEN + FSPACX ( 50 ) ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
gr_set_fontcolor ( BM_XRGB ( 60 , 40 , 10 ) , - 1 ) ;
gr_printf ( x , y , " %d " , Players [ sorted [ i ] ] . net_killed_total ) ;
2006-03-20 17:12:09 +00:00
}
void kmatrix_draw_names ( int * sorted )
{
2007-01-12 14:21:05 +00:00
int j , x , color ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
if ( Kmatrix_nomovie_message )
{
gr_set_fontcolor ( BM_XRGB ( 63 , 0 , 0 ) , - 1 ) ;
2008-02-24 14:41:27 +00:00
gr_printf ( CENTERSCREEN - FSPACX ( 40 ) , FSPACY ( 20 ) , " (Movie not played) " ) ;
2007-01-12 14:21:05 +00:00
}
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
for ( j = 0 ; j < N_players ; j + + ) {
if ( Game_mode & GM_TEAM )
color = get_team ( sorted [ j ] ) ;
else
color = sorted [ j ] ;
2006-03-20 17:12:09 +00:00
2008-02-24 14:41:27 +00:00
x = FSPACX ( 70 + CENTERING_OFFSET ( N_players ) + j * 25 ) ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
if ( Players [ sorted [ j ] ] . connected = = 0 )
gr_set_fontcolor ( gr_find_closest_color ( 31 , 31 , 31 ) , - 1 ) ;
else
2008-02-24 14:41:27 +00:00
gr_set_fontcolor ( BM_XRGB ( player_rgb [ color ] . r , player_rgb [ color ] . g , player_rgb [ color ] . b ) , - 1 ) ;
2006-03-20 17:12:09 +00:00
2008-02-24 14:41:27 +00:00
gr_printf ( x , FSPACY ( 40 ) , " %c " , Players [ sorted [ j ] ] . callsign [ 0 ] ) ;
2007-01-12 14:21:05 +00:00
}
2006-03-20 17:12:09 +00:00
2008-02-24 14:41:27 +00:00
x = FSPACX ( 72 + CENTERING_OFFSET ( N_players ) + N_players * 25 ) ;
2007-01-12 14:21:05 +00:00
gr_set_fontcolor ( BM_XRGB ( 31 , 31 , 31 ) , - 1 ) ;
2008-02-24 14:41:27 +00:00
gr_printf ( x , FSPACY ( 40 ) , " K/E " ) ;
2006-03-20 17:12:09 +00:00
}
2007-01-12 14:21:05 +00:00
2006-03-20 17:12:09 +00:00
void kmatrix_draw_coop_names ( int * sorted )
{
2007-01-12 14:21:05 +00:00
sorted = sorted ;
if ( Kmatrix_nomovie_message )
{
gr_set_fontcolor ( BM_XRGB ( 63 , 0 , 0 ) , - 1 ) ;
2008-02-24 14:41:27 +00:00
gr_printf ( CENTERSCREEN - FSPACX ( 40 ) , FSPACY ( 20 ) , " (Movie not played) " ) ;
2007-01-12 14:21:05 +00:00
}
gr_set_fontcolor ( BM_XRGB ( 63 , 31 , 31 ) , - 1 ) ;
2008-02-24 14:41:27 +00:00
gr_printf ( CENTERSCREEN , FSPACY ( 40 ) , " SCORE " ) ;
2007-01-12 14:21:05 +00:00
gr_set_fontcolor ( BM_XRGB ( 63 , 31 , 31 ) , - 1 ) ;
2008-02-24 14:41:27 +00:00
gr_printf ( CENTERSCREEN + FSPACX ( 50 ) , FSPACY ( 40 ) , " DEATHS " ) ;
2006-03-20 17:12:09 +00:00
}
void kmatrix_draw_deaths ( int * sorted )
{
2007-01-12 14:21:05 +00:00
int y , x ;
char reactor_message [ 50 ] ;
sorted = sorted ;
2008-02-24 14:41:27 +00:00
y = FSPACY ( 55 + 72 + 35 ) ;
x = FSPACX ( 35 ) ;
2007-01-12 14:21:05 +00:00
{
int sw , sh , aw ;
gr_set_fontcolor ( gr_find_closest_color ( 63 , 20 , 0 ) , - 1 ) ;
gr_get_string_size ( " P-Playing E-Escaped D-Died " , & sw , & sh , & aw ) ;
2007-12-29 14:18:49 +00:00
gr_printf ( CENTERSCREEN - ( sw / 2 ) , y , " P-Playing E-Escaped D-Died " ) ;
2007-01-12 14:21:05 +00:00
y + = ( sh + 5 ) ;
gr_get_string_size ( " V-Viewing scores W-Waiting " , & sw , & sh , & aw ) ;
2007-12-29 14:18:49 +00:00
gr_printf ( CENTERSCREEN - ( sw / 2 ) , y , " V-Viewing scores W-Waiting " ) ;
2007-01-12 14:21:05 +00:00
}
2008-02-24 14:41:27 +00:00
y + = FSPACY ( 20 ) ;
2007-01-12 14:21:05 +00:00
{
int sw , sh , aw ;
gr_set_fontcolor ( gr_find_closest_color ( 63 , 63 , 63 ) , - 1 ) ;
2009-02-08 12:49:27 +00:00
if ( Players [ Player_num ] . connected = = CONNECT_KMATRIX_WAITING )
2007-01-12 14:21:05 +00:00
{
gr_get_string_size ( " Waiting for other players... " , & sw , & sh , & aw ) ;
gr_printf ( CENTERSCREEN - ( sw / 2 ) , y , " Waiting for other players... " ) ;
}
else
{
gr_get_string_size ( TXT_PRESS_ANY_KEY2 , & sw , & sh , & aw ) ;
gr_printf ( CENTERSCREEN - ( sw / 2 ) , y , TXT_PRESS_ANY_KEY2 ) ;
}
}
2006-03-20 17:12:09 +00:00
if ( Countdown_seconds_left < = 0 )
2007-01-12 14:21:05 +00:00
kmatrix_reactor ( TXT_REACTOR_EXPLODED ) ;
2006-03-20 17:12:09 +00:00
else
2007-01-12 14:21:05 +00:00
{
sprintf ( ( char * ) & reactor_message , " %s: %d %s " , TXT_TIME_REMAINING , Countdown_seconds_left , TXT_SECONDS ) ;
kmatrix_reactor ( ( char * ) & reactor_message ) ;
}
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
if ( Game_mode & GM_HOARD )
kmatrix_phallic ( ) ;
2006-03-20 17:12:09 +00:00
}
2007-01-12 14:21:05 +00:00
2006-03-20 17:12:09 +00:00
void kmatrix_draw_coop_deaths ( int * sorted )
{
2007-01-12 14:21:05 +00:00
int j , x , y ;
char reactor_message [ 50 ] ;
2008-02-24 14:41:27 +00:00
y = FSPACY ( 55 + N_players * 9 ) ;
2007-01-12 14:21:05 +00:00
gr_set_fontcolor ( BM_XRGB ( 31 , 31 , 31 ) , - 1 ) ;
2008-02-24 14:41:27 +00:00
x = CENTERSCREEN + FSPACX ( 50 ) ;
2007-01-12 14:21:05 +00:00
gr_printf ( x , y , TXT_DEATHS ) ;
for ( j = 0 ; j < N_players ; j + + ) {
2008-02-24 14:41:27 +00:00
x = CENTERSCREEN + FSPACX ( 50 ) ;
2007-01-12 14:21:05 +00:00
gr_printf ( x , y , " %d " , Players [ sorted [ j ] ] . net_killed_total ) ;
}
2008-02-24 14:41:27 +00:00
y = FSPACY ( 55 + 72 + 35 ) ;
x = FSPACX ( 35 ) ;
2007-01-12 14:21:05 +00:00
{
int sw , sh , aw ;
gr_set_fontcolor ( gr_find_closest_color ( 63 , 20 , 0 ) , - 1 ) ;
gr_get_string_size ( " P-Playing E-Escaped D-Died " , & sw , & sh , & aw ) ;
2007-12-29 14:18:49 +00:00
gr_printf ( CENTERSCREEN - ( sw / 2 ) , y , " P-Playing E-Escaped D-Died " ) ;
2007-01-12 14:21:05 +00:00
y + = ( sh + 5 ) ;
gr_get_string_size ( " V-Viewing scores W-Waiting " , & sw , & sh , & aw ) ;
2007-12-29 14:18:49 +00:00
gr_printf ( CENTERSCREEN - ( sw / 2 ) , y , " V-Viewing scores W-Waiting " ) ;
2007-01-12 14:21:05 +00:00
}
2008-02-24 14:41:27 +00:00
y + = FSPACY ( 20 ) ;
2007-01-12 14:21:05 +00:00
{
int sw , sh , aw ;
gr_set_fontcolor ( gr_find_closest_color ( 63 , 63 , 63 ) , - 1 ) ;
2009-02-08 12:49:27 +00:00
if ( Players [ Player_num ] . connected = = CONNECT_KMATRIX_WAITING )
2007-01-12 14:21:05 +00:00
{
gr_get_string_size ( " Waiting for other players... " , & sw , & sh , & aw ) ;
gr_printf ( CENTERSCREEN - ( sw / 2 ) , y , " Waiting for other players... " ) ;
}
else
{
gr_get_string_size ( TXT_PRESS_ANY_KEY2 , & sw , & sh , & aw ) ;
gr_printf ( CENTERSCREEN - ( sw / 2 ) , y , TXT_PRESS_ANY_KEY2 ) ;
}
}
2006-03-20 17:12:09 +00:00
if ( Countdown_seconds_left < = 0 )
2007-01-12 14:21:05 +00:00
kmatrix_reactor ( TXT_REACTOR_EXPLODED ) ;
2006-03-20 17:12:09 +00:00
else
2007-01-12 14:21:05 +00:00
{
sprintf ( ( char * ) & reactor_message , " %s: %d %s " , TXT_TIME_REMAINING , Countdown_seconds_left , TXT_SECONDS ) ;
kmatrix_reactor ( ( char * ) & reactor_message ) ;
}
2006-03-20 17:12:09 +00:00
}
void kmatrix_reactor ( char * message )
2007-01-12 14:21:05 +00:00
{
2006-03-20 17:12:09 +00:00
static char oldmessage [ 50 ] = { 0 } ;
int sw , sh , aw ;
2008-02-24 14:41:27 +00:00
grd_curcanv - > cv_font = GAME_FONT ;
2006-03-20 17:12:09 +00:00
if ( oldmessage [ 0 ] ! = 0 )
2007-01-12 14:21:05 +00:00
{
2006-03-20 17:12:09 +00:00
gr_set_fontcolor ( gr_find_closest_color ( 0 , 0 , 0 ) , - 1 ) ;
gr_get_string_size ( oldmessage , & sw , & sh , & aw ) ;
2007-01-12 14:21:05 +00:00
}
2006-03-20 17:12:09 +00:00
gr_set_fontcolor ( gr_find_closest_color ( 0 , 32 , 63 ) , - 1 ) ;
gr_get_string_size ( message , & sw , & sh , & aw ) ;
2008-02-24 14:41:27 +00:00
gr_printf ( CENTERSCREEN - ( sw / 2 ) , FSPACY ( 55 + 72 + 12 ) , message ) ;
2006-03-20 17:12:09 +00:00
strcpy ( ( char * ) & oldmessage , message ) ;
2007-01-12 14:21:05 +00:00
}
2006-03-20 17:12:09 +00:00
extern int PhallicLimit , PhallicMan ;
void kmatrix_phallic ( )
2007-01-12 14:21:05 +00:00
{
2006-03-20 17:12:09 +00:00
int sw , sh , aw ;
char message [ 80 ] ;
if ( ! ( Game_mode & GM_HOARD ) )
2007-01-12 14:21:05 +00:00
return ;
2006-03-20 17:12:09 +00:00
if ( PhallicMan = = - 1 )
2007-01-12 14:21:05 +00:00
strcpy ( message , " There was no record set for this level. " ) ;
2006-03-20 17:12:09 +00:00
else
2007-01-12 14:21:05 +00:00
sprintf ( message , " %s had the best record at %d points. " , Players [ PhallicMan ] . callsign , PhallicLimit ) ;
2006-03-20 17:12:09 +00:00
2008-02-24 14:41:27 +00:00
grd_curcanv - > cv_font = GAME_FONT ;
2006-03-20 17:12:09 +00:00
gr_set_fontcolor ( gr_find_closest_color ( 63 , 63 , 63 ) , - 1 ) ;
gr_get_string_size ( message , & sw , & sh , & aw ) ;
2008-02-24 14:41:27 +00:00
gr_printf ( CENTERSCREEN - ( sw / 2 ) , FSPACY ( 55 + 72 + 3 ) , message ) ;
2007-01-12 14:21:05 +00:00
}
2006-03-20 17:12:09 +00:00
void load_stars ( void ) ;
void kmatrix_redraw ( )
{
2008-03-20 23:23:46 +00:00
int i , pcx_error , color ;
2007-01-12 14:21:05 +00:00
int sorted [ MAX_NUM_NET_PLAYERS ] ;
2006-03-20 17:12:09 +00:00
2008-06-04 19:30:43 +00:00
pcx_error = pcx_read_fullscr ( STARS_BACKGROUND , gr_palette ) ;
2008-03-20 23:23:46 +00:00
Assert ( pcx_error = = PCX_ERROR_NONE ) ;
2007-01-22 11:34:03 +00:00
2007-01-12 14:21:05 +00:00
if ( Game_mode & GM_MULTI_COOP )
{
kmatrix_redraw_coop ( ) ;
return ;
}
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
multi_sort_kill_list ( ) ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
gr_set_current_canvas ( NULL ) ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
grd_curcanv - > cv_font = MEDIUM3_FONT ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
if ( Game_mode & GM_CAPTURE )
2008-02-24 14:41:27 +00:00
gr_string ( 0x8000 , FSPACY ( 10 ) , " CAPTURE THE FLAG SUMMARY " ) ;
2007-01-12 14:21:05 +00:00
else if ( Game_mode & GM_HOARD )
2008-02-24 14:41:27 +00:00
gr_string ( 0x8000 , FSPACY ( 10 ) , " HOARD SUMMARY " ) ;
2007-01-12 14:21:05 +00:00
else
2008-02-24 14:41:27 +00:00
gr_string ( 0x8000 , FSPACY ( 10 ) , TXT_KILL_MATRIX_TITLE ) ;
2006-03-20 17:12:09 +00:00
2008-02-24 14:41:27 +00:00
grd_curcanv - > cv_font = GAME_FONT ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
multi_get_kill_list ( sorted ) ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
kmatrix_draw_names ( sorted ) ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
for ( i = 0 ; i < N_players ; i + + ) {
if ( Game_mode & GM_TEAM )
color = get_team ( sorted [ i ] ) ;
else
color = sorted [ i ] ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
if ( Players [ sorted [ i ] ] . connected = = 0 )
gr_set_fontcolor ( gr_find_closest_color ( 31 , 31 , 31 ) , - 1 ) ;
else
2008-02-24 14:41:27 +00:00
gr_set_fontcolor ( BM_XRGB ( player_rgb [ color ] . r , player_rgb [ color ] . g , player_rgb [ color ] . b ) , - 1 ) ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
kmatrix_draw_item ( i , sorted ) ;
}
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
kmatrix_draw_deaths ( sorted ) ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
gr_palette_load ( gr_palette ) ;
2006-03-20 17:12:09 +00:00
}
void kmatrix_redraw_coop ( )
{
2007-01-12 14:21:05 +00:00
int i , color ;
int sorted [ MAX_NUM_NET_PLAYERS ] ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
multi_sort_kill_list ( ) ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
gr_set_current_canvas ( NULL ) ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
grd_curcanv - > cv_font = MEDIUM3_FONT ;
2008-02-24 14:41:27 +00:00
gr_string ( 0x8000 , FSPACY ( 10 ) , " COOPERATIVE SUMMARY " ) ;
2006-03-20 17:12:09 +00:00
2008-02-24 14:41:27 +00:00
grd_curcanv - > cv_font = GAME_FONT ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
multi_get_kill_list ( sorted ) ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
kmatrix_draw_coop_names ( sorted ) ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
for ( i = 0 ; i < N_players ; i + + ) {
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
color = sorted [ i ] ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
if ( Players [ sorted [ i ] ] . connected = = 0 )
gr_set_fontcolor ( gr_find_closest_color ( 31 , 31 , 31 ) , - 1 ) ;
else
2008-02-24 14:41:27 +00:00
gr_set_fontcolor ( BM_XRGB ( player_rgb [ color ] . r , player_rgb [ color ] . g , player_rgb [ color ] . b ) , - 1 ) ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
kmatrix_draw_coop_item ( i , sorted ) ;
}
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
kmatrix_draw_deaths ( sorted ) ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
gr_palette_load ( gr_palette ) ;
2006-03-20 17:12:09 +00:00
}
2007-01-12 14:21:05 +00:00
# define MAX_VIEW_TIME F1_0*15
# define ENDLEVEL_IDLE_TIME F1_0*10
2006-03-20 17:12:09 +00:00
fix StartAbortMenuTime ;
extern void network_endlevel_poll3 ( int nitems , struct newmenu_item * menus , int * key , int citem ) ;
void kmatrix_view ( int network )
2007-01-12 14:21:05 +00:00
{
int i , k , done , choice ;
fix entry_time = timer_get_approx_seconds ( ) ;
int key ;
int oldstates [ MAX_PLAYERS ] ;
int previous_seconds_left = - 1 ;
int num_ready , num_escaped ;
network = Game_mode & GM_NETWORK ;
for ( i = 0 ; i < MAX_NUM_NET_PLAYERS ; i + + )
digi_kill_sound_linked_to_object ( Players [ i ] . objnum ) ;
set_screen_mode ( SCREEN_MENU ) ;
2009-02-15 19:12:16 +00:00
2007-01-12 14:21:05 +00:00
WaitingForOthers = 0 ;
game_flush_inputs ( ) ;
done = 0 ;
for ( i = 0 ; i < N_players ; i + + )
2006-03-20 17:12:09 +00:00
oldstates [ i ] = Players [ i ] . connected ;
2007-01-12 14:21:05 +00:00
if ( network )
network_endlevel ( & key ) ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
while ( ! done )
{
2008-06-04 19:30:43 +00:00
timer_delay2 ( 50 ) ;
2007-03-22 11:32:22 +00:00
kmatrix_redraw ( ) ;
2006-03-20 17:12:09 +00:00
kmatrix_kills_changed = 0 ;
2007-01-12 14:21:05 +00:00
//see if redbook song needs to be restarted
songs_check_redbook_repeat ( ) ;
k = key_inkey ( ) ;
switch ( k ) {
case KEY_ENTER :
case KEY_SPACEBAR :
if ( is_D2_OEM )
{
if ( Current_level_num = = 8 )
{
Players [ Player_num ] . connected = 0 ;
if ( network )
network_send_endlevel_packet ( ) ;
multi_leave_game ( ) ;
Kmatrix_nomovie_message = 0 ;
longjmp ( LeaveGame , 0 ) ;
return ;
}
}
2009-02-08 12:49:27 +00:00
Players [ Player_num ] . connected = CONNECT_KMATRIX_WAITING ;
2007-01-12 14:21:05 +00:00
if ( network )
network_send_endlevel_packet ( ) ;
break ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
case KEY_ESC :
if ( Game_mode & GM_NETWORK )
{
StartAbortMenuTime = timer_get_approx_seconds ( ) ;
choice = nm_messagebox1 ( NULL , network_endlevel_poll3 , 2 , TXT_YES , TXT_NO , TXT_ABORT_GAME ) ;
}
else
choice = nm_messagebox ( NULL , 2 , TXT_YES , TXT_NO , TXT_ABORT_GAME ) ;
if ( choice = = 0 )
{
Players [ Player_num ] . connected = 0 ;
if ( network )
network_send_endlevel_packet ( ) ;
multi_leave_game ( ) ;
Kmatrix_nomovie_message = 0 ;
longjmp ( LeaveGame , 0 ) ;
return ;
}
else
kmatrix_kills_changed = 1 ;
break ;
case KEY_PRINT_SCREEN :
save_screen_shot ( 0 ) ;
break ;
case KEY_BACKSP :
Int3 ( ) ;
break ;
default :
break ;
}
2009-02-08 12:49:27 +00:00
if ( timer_get_approx_seconds ( ) > = ( entry_time + MAX_VIEW_TIME ) & & Players [ Player_num ] . connected ! = CONNECT_KMATRIX_WAITING )
2007-01-12 14:21:05 +00:00
{
if ( is_D2_OEM )
{
if ( Current_level_num = = 8 )
2006-03-20 17:12:09 +00:00
{
2007-01-12 14:21:05 +00:00
Players [ Player_num ] . connected = 0 ;
if ( network )
network_send_endlevel_packet ( ) ;
multi_leave_game ( ) ;
Kmatrix_nomovie_message = 0 ;
longjmp ( LeaveGame , 0 ) ;
return ;
2006-03-20 17:12:09 +00:00
}
2007-01-12 14:21:05 +00:00
}
2006-03-20 17:12:09 +00:00
2009-02-08 12:49:27 +00:00
Players [ Player_num ] . connected = CONNECT_KMATRIX_WAITING ;
2007-01-12 14:21:05 +00:00
if ( network )
network_send_endlevel_packet ( ) ;
}
if ( network & & ( Game_mode & GM_NETWORK ) )
{
network_endlevel_poll2 ( 0 , NULL , & key , 0 ) ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
for ( num_escaped = 0 , num_ready = 0 , i = 0 ; i < N_players ; i + + )
{
if ( Players [ i ] . connected & & i ! = Player_num )
{
// Check timeout for idle players
if ( timer_get_approx_seconds ( ) > LastPacketTime [ i ] + ENDLEVEL_IDLE_TIME )
2006-03-20 17:12:09 +00:00
{
2007-01-12 14:21:05 +00:00
Players [ i ] . connected = 0 ;
network_send_endlevel_sub ( i ) ;
}
}
2006-03-20 17:12:09 +00:00
2009-02-08 12:49:27 +00:00
// Important: Make sure we keep connected state CONNECT_KMATRIX_WAITING even if player exits kmatrix loop which will change to CONNECT_WAITING! If we don't get all palyer packets in sync and order this condition is very handy to keep all connections alive!
2009-02-15 19:12:16 +00:00
if ( ( oldstates [ i ] = = CONNECT_END_MENU | | oldstates [ i ] = = CONNECT_KMATRIX_WAITING ) & & ( Players [ i ] . connected ! = 0 | | Players [ i ] . connected ! = CONNECT_END_MENU | | Players [ i ] . connected ! = CONNECT_KMATRIX_WAITING ) )
2009-02-08 12:49:27 +00:00
Players [ i ] . connected = CONNECT_KMATRIX_WAITING ;
2007-01-12 14:21:05 +00:00
if ( Players [ i ] . connected ! = oldstates [ i ] )
{
if ( ConditionLetters [ Players [ i ] . connected ] ! = ConditionLetters [ oldstates [ i ] ] )
kmatrix_kills_changed = 1 ;
oldstates [ i ] = Players [ i ] . connected ;
network_send_endlevel_packet ( ) ;
}
2006-03-20 17:12:09 +00:00
2009-02-08 12:49:27 +00:00
if ( Players [ i ] . connected = = 0 | | Players [ i ] . connected = = CONNECT_KMATRIX_WAITING )
2007-01-12 14:21:05 +00:00
num_ready + + ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
if ( Players [ i ] . connected ! = 1 )
num_escaped + + ;
}
if ( num_ready > = N_players )
done = 1 ;
if ( num_escaped > = N_players )
Countdown_seconds_left = - 1 ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
if ( previous_seconds_left ! = Countdown_seconds_left )
{
previous_seconds_left = Countdown_seconds_left ;
kmatrix_kills_changed = 1 ;
}
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
if ( kmatrix_kills_changed )
{
kmatrix_redraw ( ) ;
kmatrix_kills_changed = 0 ;
}
}
2007-03-22 11:32:22 +00:00
gr_flip ( ) ;
2007-01-12 14:21:05 +00:00
}
2006-03-20 17:12:09 +00:00
2009-02-08 12:49:27 +00:00
Players [ Player_num ] . connected = CONNECT_KMATRIX_WAITING ;
2007-01-12 14:21:05 +00:00
if ( network )
network_send_endlevel_packet ( ) ; // make sure
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
game_flush_inputs ( ) ;
2006-03-20 17:12:09 +00:00
2007-01-12 14:21:05 +00:00
Kmatrix_nomovie_message = 0 ;
2007-10-06 14:51:30 +00:00
newmenu_close ( ) ;
2006-03-20 17:12:09 +00:00
}