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 .
*/
/*
*
* Defines and exported variables for multi . c
*
*/
# ifndef _MULTI_H
# define _MULTI_H
2009-04-09 07:41:30 +00:00
# include "gameseq.h"
# include "piggy.h"
# include "newmenu.h"
2012-11-11 00:12:17 +00:00
# include "powerup.h"
2009-11-29 16:46:13 +00:00
# ifdef USE_UDP
2009-03-20 12:10:38 +00:00
# ifdef _WIN32
2011-04-05 00:24:34 +00:00
# ifdef _WIN32_WINNT
# undef _WIN32_WINNT
# endif
# define _WIN32_WINNT 0x0501 // for get/freeaddrinfo()
# include <winsock2.h>
# include <ws2tcpip.h>
2009-11-24 09:48:53 +00:00
# include <io.h>
2009-03-20 12:10:38 +00:00
# else
2009-11-24 09:48:53 +00:00
# include <sys/socket.h>
# include <netinet/in.h>
# include <netdb.h>
# include <arpa/inet.h>
# include <unistd.h>
2010-09-02 00:07:37 +00:00
# include <stdint.h>
2009-11-24 09:48:53 +00:00
# include <sys/time.h>
2009-03-20 12:10:38 +00:00
# endif
2012-11-11 22:12:51 +00:00
# ifdef __cplusplus
2009-03-20 12:10:38 +00:00
# ifdef IPv6
2009-11-24 09:48:53 +00:00
# define _sockaddr sockaddr_in6
# define _af AF_INET6
# define _pf PF_INET6
2009-03-20 12:10:38 +00:00
# else
2009-11-24 09:48:53 +00:00
# define _sockaddr sockaddr_in
# define _af AF_INET
# define _pf PF_INET
2009-03-20 12:10:38 +00:00
# endif
2009-11-29 16:46:13 +00:00
# endif
2006-03-20 17:12:09 +00:00
2009-04-09 07:41:30 +00:00
// PROTOCOL VARIABLES AND DEFINES
extern int multi_protocol ; // set and determinate used protocol
2011-09-13 23:15:32 +00:00
# define MULTI_PROTO_UDP 1 // UDP protocol
2009-03-20 12:10:38 +00:00
2012-05-10 17:10:49 +00:00
// What version of the multiplayer protocol is this? Increment each time something drastic changes in Multiplayer without the version number changes. Can be reset to 0 each time the version of the game changes
2013-12-14 01:53:45 +00:00
# define MULTI_PROTO_VERSION 10
2009-04-09 07:41:30 +00:00
// PROTOCOL VARIABLES AND DEFINES - END
2006-03-20 17:12:09 +00:00
2013-12-09 13:25:32 +00:00
// limits for Packets (i.e. positional updates) per sec
# define MIN_PPS 5
# define MAX_PPS 40
2006-03-20 17:12:09 +00:00
2009-04-09 07:41:30 +00:00
# define MAX_MESSAGE_LEN 35
2006-03-20 17:12:09 +00:00
2013-06-09 21:28:55 +00:00
# define define_multiplayer_command(NAME,SIZE) NAME,
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_I) || defined(DXX_BUILD_DESCENT_II)
2013-06-09 21:28:55 +00:00
# define for_each_multiplayer_command(BEFORE,VALUE,AFTER) \
BEFORE \
VALUE ( MULTI_POSITION , 25 ) \
VALUE ( MULTI_REAPPEAR , 4 ) \
2013-11-23 13:02:19 +00:00
VALUE ( MULTI_FIRE , 18 ) \
VALUE ( MULTI_FIRE_TRACK , 21 ) \
VALUE ( MULTI_FIRE_BOMB , 20 ) \
2013-06-09 21:28:55 +00:00
VALUE ( MULTI_KILL , 5 ) \
VALUE ( MULTI_REMOVE_OBJECT , 4 ) \
VALUE ( MULTI_MESSAGE , 37 ) /* (MAX_MESSAGE_LENGTH = 40) */ \
VALUE ( MULTI_QUIT , 2 ) \
VALUE ( MULTI_PLAY_SOUND , 4 ) \
VALUE ( MULTI_CONTROLCEN , 4 ) \
VALUE ( MULTI_ROBOT_CLAIM , 5 ) \
VALUE ( MULTI_END_SYNC , 4 ) \
VALUE ( MULTI_CLOAK , 2 ) \
VALUE ( MULTI_ENDLEVEL_START , 3 ) \
VALUE ( MULTI_CREATE_EXPLOSION , 2 ) \
VALUE ( MULTI_CONTROLCEN_FIRE , 16 ) \
VALUE ( MULTI_CREATE_POWERUP , 19 ) \
VALUE ( MULTI_DECLOAK , 2 ) \
VALUE ( MULTI_MENU_CHOICE , 2 ) \
VALUE ( MULTI_ROBOT_POSITION , 5 + sizeof ( shortpos ) ) \
2013-03-03 01:03:33 +00:00
VALUE ( MULTI_PLAYER_EXPLODE , DXX_MP_SIZE_PLAYER_RELATED ) \
VALUE ( MULTI_BEGIN_SYNC , DXX_MP_SIZE_BEGIN_SYNC ) \
VALUE ( MULTI_DOOR_OPEN , DXX_MP_SIZE_DOOR_OPEN ) \
VALUE ( MULTI_PLAYER_DROP , DXX_MP_SIZE_PLAYER_RELATED ) \
VALUE ( MULTI_ROBOT_EXPLODE , DXX_MP_SIZE_ROBOT_EXPLODE ) \
2013-06-09 21:28:55 +00:00
VALUE ( MULTI_ROBOT_RELEASE , 5 ) \
VALUE ( MULTI_ROBOT_FIRE , 18 ) \
VALUE ( MULTI_SCORE , 6 ) \
VALUE ( MULTI_CREATE_ROBOT , 6 ) \
VALUE ( MULTI_TRIGGER , 3 ) \
VALUE ( MULTI_BOSS_ACTIONS , 10 ) \
VALUE ( MULTI_CREATE_ROBOT_POWERUPS , 27 ) \
VALUE ( MULTI_HOSTAGE_DOOR , 7 ) \
VALUE ( MULTI_SAVE_GAME , 2 + 24 ) /* (ubyte slot, uint id, char name[20]) */ \
VALUE ( MULTI_RESTORE_GAME , 2 + 4 ) /* (ubyte slot, uint id) */ \
VALUE ( MULTI_HEARTBEAT , 5 ) \
VALUE ( MULTI_KILLGOALS , 9 ) \
VALUE ( MULTI_POWCAP_UPDATE , MAX_POWERUP_TYPES + 1 ) \
VALUE ( MULTI_DO_BOUNTY , 2 ) \
VALUE ( MULTI_TYPING_STATE , 3 ) \
VALUE ( MULTI_GMODE_UPDATE , 3 ) \
VALUE ( MULTI_KILL_HOST , 7 ) \
VALUE ( MULTI_KILL_CLIENT , 5 ) \
VALUE ( MULTI_RANK , 3 ) \
2013-03-03 01:03:33 +00:00
D2X_MP_COMMANDS ( BEFORE , VALUE , AFTER ) \
AFTER
# if defined(DXX_BUILD_DESCENT_I)
# define MAX_NET_CREATE_OBJECTS 20
# define MAX_MULTI_MESSAGE_LEN 90 //didn't change it, just moved it up
# define DXX_MP_SIZE_PLAYER_RELATED 57
# define DXX_MP_SIZE_BEGIN_SYNC 37
# define DXX_MP_SIZE_DOOR_OPEN 4
# define DXX_MP_SIZE_ROBOT_EXPLODE 8
# define D2X_MP_COMMANDS(BEFORE,VALUE,AFTER)
# elif defined(DXX_BUILD_DESCENT_II)
# define MAX_NET_CREATE_OBJECTS 40
# define MAX_MULTI_MESSAGE_LEN 120
# define DXX_MP_SIZE_PLAYER_RELATED (97+9)
# define DXX_MP_SIZE_BEGIN_SYNC 41
# define DXX_MP_SIZE_DOOR_OPEN 5
# define DXX_MP_SIZE_ROBOT_EXPLODE 9
# define D2X_MP_COMMANDS(BEFORE,VALUE,AFTER) \
2013-06-09 21:28:55 +00:00
VALUE ( MULTI_MARKER , 55 ) \
VALUE ( MULTI_DROP_WEAPON , 12 ) \
VALUE ( MULTI_GUIDED , 3 + sizeof ( shortpos ) ) \
VALUE ( MULTI_STOLEN_ITEMS , 11 ) \
VALUE ( MULTI_WALL_STATUS , 6 ) /* send to new players */ \
VALUE ( MULTI_SEISMIC , 9 ) \
VALUE ( MULTI_LIGHT , 18 ) \
VALUE ( MULTI_START_TRIGGER , 2 ) \
VALUE ( MULTI_FLAGS , 6 ) \
VALUE ( MULTI_DROP_BLOB , 2 ) \
VALUE ( MULTI_SOUND_FUNCTION , 4 ) \
VALUE ( MULTI_CAPTURE_BONUS , 2 ) \
VALUE ( MULTI_GOT_FLAG , 2 ) \
VALUE ( MULTI_DROP_FLAG , 12 ) \
VALUE ( MULTI_FINISH_GAME , 2 ) \
VALUE ( MULTI_MODEM_PING , 1 ) \
VALUE ( MULTI_MODEM_PING_RETURN , 1 ) \
VALUE ( MULTI_ORB_BONUS , 3 ) \
VALUE ( MULTI_GOT_ORB , 2 ) \
2006-03-20 17:12:09 +00:00
2013-03-03 01:03:33 +00:00
# endif
for_each_multiplayer_command ( enum { , define_multiplayer_command , } ) ;
# endif
2006-03-20 17:12:09 +00:00
2009-11-24 09:48:53 +00:00
# define NETGAME_ANARCHY 0
# define NETGAME_TEAM_ANARCHY 1
# define NETGAME_ROBOT_ANARCHY 2
# define NETGAME_COOPERATIVE 3
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2009-11-24 09:48:53 +00:00
# define NETGAME_CAPTURE_FLAG 4
# define NETGAME_HOARD 5
# define NETGAME_TEAM_HOARD 6
2013-03-03 01:03:33 +00:00
# endif
2011-01-19 01:19:17 +00:00
# define NETGAME_BOUNTY 7
2009-11-24 09:48:53 +00:00
2009-03-20 12:10:38 +00:00
# define NETSTAT_MENU 0
# define NETSTAT_PLAYING 1
# define NETSTAT_BROWSING 2
# define NETSTAT_WAITING 3
# define NETSTAT_STARTING 4
# define NETSTAT_ENDLEVEL 5
# define CONNECT_DISCONNECTED 0
# define CONNECT_PLAYING 1
# define CONNECT_WAITING 2
# define CONNECT_DIED_IN_MINE 3
# define CONNECT_FOUND_SECRET 4
# define CONNECT_ESCAPE_TUNNEL 5
# define CONNECT_END_MENU 6
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2009-03-20 12:10:38 +00:00
# define CONNECT_KMATRIX_WAITING 7 // Like CONNECT_WAITING but used especially in kmatrix.c to seperate "escaped" and "waiting"
2013-03-03 01:03:33 +00:00
# endif
2009-03-20 12:10:38 +00:00
2009-11-24 09:48:53 +00:00
// reasons for a packet with type PID_DUMP
# define DUMP_CLOSED 0 // no new players allowed after game started
# define DUMP_FULL 1 // player cound maxed out
# define DUMP_ENDLEVEL 2
# define DUMP_DORK 3
# define DUMP_ABORTED 4
# define DUMP_CONNECTED 5 // never used
# define DUMP_LEVEL 6
# define DUMP_KICKED 7
2011-09-19 11:01:11 +00:00
# define DUMP_PKTTIMEOUT 8
2009-11-24 09:48:53 +00:00
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_I) || defined(DXX_BUILD_DESCENT_II)
2013-06-09 21:28:55 +00:00
# define for_each_netflag_value(VALUE) \
2013-06-22 02:26:08 +00:00
VALUE ( NETFLAG_DOLASER , " Laser upgrade " ) \
VALUE ( NETFLAG_DOQUAD , " Quad Lasers " ) \
VALUE ( NETFLAG_DOVULCAN , " Vulcan cannon " ) \
VALUE ( NETFLAG_DOSPREAD , " Spreadfire cannon " ) \
VALUE ( NETFLAG_DOPLASMA , " Plasma cannon " ) \
VALUE ( NETFLAG_DOFUSION , " Fusion cannon " ) \
VALUE ( NETFLAG_DOHOMING , " Homing Missiles " ) \
VALUE ( NETFLAG_DOPROXIM , " Proximity Bombs " ) \
VALUE ( NETFLAG_DOSMART , " Smart Missiles " ) \
VALUE ( NETFLAG_DOMEGA , " Mega Missiles " ) \
VALUE ( NETFLAG_DOCLOAK , " Cloaking " ) \
VALUE ( NETFLAG_DOINVUL , " Invulnerability " ) \
2013-03-03 01:03:33 +00:00
D2X_MP_NETFLAGS ( VALUE ) \
# define MULTI_GAME_TYPE_COUNT 8
# if defined(DXX_BUILD_DESCENT_I)
# define MULTI_GAME_NAME_LENGTH 13
2013-11-28 02:09:30 +00:00
# define MULTI_ALLOW_POWERUP_TEXT_LENGTH 18
2013-03-03 01:03:33 +00:00
# define MULTI_ALLOW_POWERUP_MAX 12
# define D2X_MP_NETFLAGS(VALUE)
# elif defined(DXX_BUILD_DESCENT_II)
# define MULTI_GAME_NAME_LENGTH 17
2013-11-28 02:09:30 +00:00
# define MULTI_ALLOW_POWERUP_TEXT_LENGTH 21
2013-03-03 01:03:33 +00:00
# define MULTI_ALLOW_POWERUP_MAX 26
# define D2X_MP_NETFLAGS(VALUE) \
2013-06-22 02:26:08 +00:00
VALUE ( NETFLAG_DOSUPERLASER , " Super lasers " ) \
VALUE ( NETFLAG_DOGAUSS , " Gauss cannon " ) \
VALUE ( NETFLAG_DOHELIX , " Helix cannon " ) \
VALUE ( NETFLAG_DOPHOENIX , " Phoenix cannon " ) \
VALUE ( NETFLAG_DOOMEGA , " Omega cannon " ) \
VALUE ( NETFLAG_DOFLASH , " Flash Missiles " ) \
VALUE ( NETFLAG_DOGUIDED , " Guided Missiles " ) \
VALUE ( NETFLAG_DOSMARTMINE , " Smart Mines " ) \
VALUE ( NETFLAG_DOMERCURY , " Mercury Missiles " ) \
VALUE ( NETFLAG_DOSHAKER , " EarthShaker Missiles " ) \
VALUE ( NETFLAG_DOAFTERBURNER , " Afterburners " ) \
VALUE ( NETFLAG_DOAMMORACK , " Ammo rack " ) \
VALUE ( NETFLAG_DOCONVERTER , " Energy Converter " ) \
VALUE ( NETFLAG_DOHEADLIGHT , " Headlight " ) \
2013-03-03 01:03:33 +00:00
# endif
# endif
2013-06-22 02:26:08 +00:00
# define define_netflag_bit_enum(NAME,STR) BIT_##NAME,
# define define_netflag_bit_mask(NAME,STR) NAME = (1 << BIT_##NAME),
# define define_netflag_powerup_mask(NAME,STR) | (NAME)
2013-06-09 21:28:55 +00:00
enum { for_each_netflag_value ( define_netflag_bit_enum ) } ;
2009-03-20 12:10:38 +00:00
// Bitmask for netgame_info->AllowedItems to set allowed items in Netgame
2013-06-09 21:28:55 +00:00
enum { for_each_netflag_value ( define_netflag_bit_mask ) } ;
enum { NETFLAG_DOPOWERUP = 0 for_each_netflag_value ( define_netflag_powerup_mask ) } ;
2009-03-20 12:10:38 +00:00
2013-12-13 21:47:46 +00:00
enum msgsend_state_t {
msgsend_none ,
msgsend_typing ,
} ;
2013-11-28 02:09:30 +00:00
extern const char multi_allow_powerup_text [ MULTI_ALLOW_POWERUP_MAX ] [ MULTI_ALLOW_POWERUP_TEXT_LENGTH ] ;
2013-06-08 22:24:17 +00:00
extern const char GMNames [ MULTI_GAME_TYPE_COUNT ] [ MULTI_GAME_NAME_LENGTH ] ;
extern const char GMNamesShrt [ MULTI_GAME_TYPE_COUNT ] [ 8 ] ;
2007-10-31 00:49:45 +00:00
2006-03-20 17:12:09 +00:00
// Exported functions
2009-04-09 07:41:30 +00:00
extern int GetMyNetRanking ( ) ;
2009-11-24 09:48:53 +00:00
extern void ClipRank ( ubyte * rank ) ;
2006-03-20 17:12:09 +00:00
int objnum_remote_to_local ( int remote_obj , int owner ) ;
int objnum_local_to_remote ( int local_obj , sbyte * owner ) ;
void map_objnum_local_to_remote ( int local , int remote , int owner ) ;
void map_objnum_local_to_local ( int objnum ) ;
void reset_network_objects ( ) ;
2009-04-09 07:41:30 +00:00
int multi_objnum_is_past ( int objnum ) ;
void multi_do_ping_frame ( ) ;
2006-03-20 17:12:09 +00:00
void multi_init_objects ( void ) ;
void multi_show_player_list ( void ) ;
2009-03-20 12:10:38 +00:00
void multi_do_protocol_frame ( int force , int listen ) ;
2006-03-20 17:12:09 +00:00
void multi_do_frame ( void ) ;
2013-08-09 15:21:03 +00:00
void multi_send_fire ( int laser_gun , int laser_level , int laser_flags , int laser_fired , short laser_track , int is_bomb_objnum ) ;
2006-03-20 17:12:09 +00:00
void multi_send_destroy_controlcen ( int objnum , int player ) ;
void multi_send_endlevel_start ( int ) ;
void multi_send_player_explode ( char type ) ;
void multi_send_message ( void ) ;
void multi_send_position ( int objnum ) ;
void multi_send_reappear ( ) ;
void multi_send_kill ( int objnum ) ;
void multi_send_remobj ( int objnum ) ;
void multi_send_quit ( int why ) ;
void multi_send_door_open ( int segnum , int side , ubyte flag ) ;
void multi_send_create_explosion ( int player_num ) ;
void multi_send_controlcen_fire ( vms_vector * to_target , int gun_num , int objnum ) ;
void multi_send_cloak ( void ) ;
void multi_send_decloak ( void ) ;
void multi_send_create_powerup ( int powerup_type , int segnum , int objnum , vms_vector * pos ) ;
void multi_send_play_sound ( int sound_num , fix volume ) ;
void multi_send_score ( void ) ;
void multi_send_trigger ( int trigger ) ;
void multi_send_hostage_door_status ( int wallnum ) ;
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2012-11-11 00:14:30 +00:00
extern char Multi_is_guided ;
2013-03-03 01:03:33 +00:00
void multi_send_flags ( char ) ;
2006-03-20 17:12:09 +00:00
void multi_send_drop_weapon ( int objnum , int seed ) ;
void multi_send_drop_marker ( int player , vms_vector position , char messagenum , char text [ ] ) ;
2012-06-10 09:26:29 +00:00
void multi_send_markers ( ) ;
2006-03-20 17:12:09 +00:00
void multi_send_guided_info ( object * miss , char ) ;
2013-03-03 01:03:33 +00:00
void multi_send_orb_bonus ( char pnum ) ;
void multi_send_got_orb ( char pnum ) ;
# endif
2012-11-11 00:14:30 +00:00
void multi_add_lifetime_kills ( void ) ;
2011-01-19 01:19:17 +00:00
void multi_send_bounty ( void ) ;
2006-03-20 17:12:09 +00:00
void multi_endlevel_score ( void ) ;
2009-11-24 09:48:53 +00:00
void multi_consistency_error ( int reset ) ;
2006-03-20 17:12:09 +00:00
void multi_prep_level ( void ) ;
2009-04-09 07:41:30 +00:00
int multi_level_sync ( void ) ;
2006-03-20 17:12:09 +00:00
int multi_endlevel ( int * secret ) ;
2013-12-04 22:45:33 +00:00
int multi_endlevel_poll1 ( newmenu * menu , d_event * event , unused_newmenu_userdata_t * userdata ) ;
int multi_endlevel_poll2 ( newmenu * menu , d_event * event , unused_newmenu_userdata_t * userdata ) ;
2009-04-09 07:41:30 +00:00
void multi_send_endlevel_packet ( ) ;
2006-03-20 17:12:09 +00:00
void multi_leave_game ( void ) ;
2013-03-30 19:41:33 +00:00
void multi_process_data ( const ubyte * dat , int len ) ;
2013-06-09 23:06:53 +00:00
void multi_process_bigdata ( const ubyte * buf , unsigned len ) ;
2006-03-20 17:12:09 +00:00
void multi_do_death ( int objnum ) ;
void multi_send_message_dialog ( void ) ;
int multi_delete_extra_objects ( void ) ;
void multi_make_ghost_player ( int objnum ) ;
void multi_make_player_ghost ( int objnum ) ;
2011-02-09 11:58:32 +00:00
void multi_reset_player_object ( object * objp ) ;
2006-03-20 17:12:09 +00:00
void multi_define_macro ( int key ) ;
void multi_send_macro ( int key ) ;
int multi_get_kill_list ( int * plist ) ;
void multi_new_game ( void ) ;
void multi_sort_kill_list ( void ) ;
void multi_reset_stuff ( void ) ;
2013-03-30 19:41:33 +00:00
void multi_send_data ( const ubyte * buf , int len , int priority ) ;
2006-03-20 17:12:09 +00:00
int get_team ( int pnum ) ;
2011-01-14 18:48:48 +00:00
int multi_maybe_disable_friendly_fire ( object * killer ) ;
2011-02-09 11:58:32 +00:00
void multi_initiate_save_game ( ) ;
void multi_initiate_restore_game ( ) ;
void multi_disconnect_player ( int pnum ) ;
2010-12-22 00:17:59 +00:00
void multi_object_to_object_rw ( object * obj , object_rw * obj_rw ) ;
void multi_object_rw_to_object ( object_rw * obj_rw , object * obj ) ;
2006-03-20 17:12:09 +00:00
2013-09-21 23:34:05 +00:00
# if defined(DXX_BUILD_DESCENT_I)
static inline void multi_send_got_flag ( char a ) { ( void ) a ; }
# elif defined(DXX_BUILD_DESCENT_II)
void multi_send_got_flag ( char ) ;
# endif
2006-03-20 17:12:09 +00:00
2009-04-09 07:41:30 +00:00
// Exported variables
2006-03-20 17:12:09 +00:00
2009-03-20 12:10:38 +00:00
extern int Network_status ;
2012-11-11 00:14:30 +00:00
extern grs_bitmap Orb_icons [ 2 ] ;
2009-04-09 07:41:30 +00:00
// IMPORTANT: These variables needed for player rejoining done by protocol-specific code
extern int Network_send_objects ;
2009-11-24 09:48:53 +00:00
extern int Network_send_object_mode ;
2009-04-09 07:41:30 +00:00
extern int Network_send_objnum ;
2009-03-20 12:10:38 +00:00
extern int Network_rejoined ;
2009-11-24 09:48:53 +00:00
extern int Network_sending_extras ;
2010-11-22 21:44:03 +00:00
extern int VerifyPlayerJoined ;
2009-11-24 09:48:53 +00:00
extern int Player_joining_extras ;
extern int Network_player_added ;
2006-03-20 17:12:09 +00:00
2013-03-30 19:41:33 +00:00
extern ubyte multibuf [ MAX_MULTI_MESSAGE_LEN + 4 ] ;
2006-03-20 17:12:09 +00:00
extern int who_killed_controlcen ;
extern int Net_create_objnums [ MAX_NET_CREATE_OBJECTS ] ;
extern int Net_create_loc ;
2012-04-15 13:32:48 +00:00
extern short kill_matrix [ MAX_PLAYERS ] [ MAX_PLAYERS ] ;
2006-03-20 17:12:09 +00:00
extern short team_kills [ 2 ] ;
extern int multi_goto_secret ;
2009-03-20 12:10:38 +00:00
extern ushort my_segments_checksum ;
2006-03-20 17:12:09 +00:00
//do we draw the kill list on the HUD?
extern int Show_kill_list ;
extern int Show_reticle_name ;
extern fix Show_kill_list_timer ;
// Used to send network messages
extern char Network_message [ MAX_MESSAGE_LEN ] ;
extern int Network_message_reciever ;
// Which player 'owns' each local object for network purposes
extern sbyte object_owner [ MAX_OBJECTS ] ;
extern int multi_quit_game ;
2013-12-13 21:47:46 +00:00
extern msgsend_state_t multi_sending_message [ MAX_PLAYERS ] ;
2006-03-20 17:12:09 +00:00
extern int multi_defining_message ;
2010-03-31 09:18:28 +00:00
extern int multi_message_input_sub ( int key ) ;
2006-03-20 17:12:09 +00:00
extern void multi_send_message_start ( ) ;
2011-01-14 13:29:08 +00:00
extern int multi_powerup_is_4pack ( int ) ;
2006-03-20 17:12:09 +00:00
2009-04-09 07:41:30 +00:00
extern int PhallicLimit , PhallicMan ;
2011-01-19 01:19:17 +00:00
extern int Bounty_target ;
2009-04-09 07:41:30 +00:00
2012-04-15 13:32:48 +00:00
extern bitmap_index multi_player_textures [ MAX_PLAYERS ] [ N_PLAYER_SHIP_TEXTURES ] ;
2006-03-20 17:12:09 +00:00
2013-11-28 02:08:54 +00:00
extern const char RankStrings [ 10 ] [ 14 ] ;
2012-11-11 00:12:17 +00:00
extern char PowerupsInMine [ MAX_POWERUP_TYPES ] ,
MaxPowerupsAllowed [ MAX_POWERUP_TYPES ] ;
2009-04-09 07:41:30 +00:00
2009-11-24 09:48:53 +00:00
// Globals for protocol-bound Refuse-functions
extern char RefuseThisPlayer , WaitForRefuseAnswer , RefuseTeam , RefusePlayerName [ 12 ] ;
2010-12-10 23:18:17 +00:00
extern fix64 RefuseTimeLimit ;
2009-11-24 09:48:53 +00:00
# define REFUSE_INTERVAL (F1_0*8)
2013-08-24 16:33:51 +00:00
typedef struct {
unsigned closed : 1 ;
unsigned : 1 ;
unsigned show_on_map : 1 ;
/*
* These # define are written to . NGP files and to the network .
* Changing them breaks ABI compatibility .
* The bit flags need not match in value , and are converted below in
* pack_game_flags / unpack_game_flags .
*/
2006-03-20 17:12:09 +00:00
# define NETGAME_FLAG_CLOSED 1
# define NETGAME_FLAG_SHOW_MAP 4
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2013-08-24 16:33:51 +00:00
unsigned hoard : 1 ;
unsigned team_hoard : 1 ;
unsigned endlevel : 1 ;
unsigned forming : 1 ;
2006-03-20 17:12:09 +00:00
# define NETGAME_FLAG_HOARD 8
# define NETGAME_FLAG_TEAM_HOARD 16
# define NETGAME_FLAG_REALLY_ENDLEVEL 32
# define NETGAME_FLAG_REALLY_FORMING 64
2013-03-03 01:03:33 +00:00
# endif
2013-08-24 16:33:51 +00:00
} __pack__ bit_game_flags ;
typedef struct
{
unsigned char value ;
} packed_game_flags ;
static inline bit_game_flags unpack_game_flags ( const packed_game_flags * p )
{
bit_game_flags flags ;
flags . closed = ! ! ( p - > value & NETGAME_FLAG_CLOSED ) ;
flags . show_on_map = ! ! ( p - > value & NETGAME_FLAG_SHOW_MAP ) ;
# if defined(DXX_BUILD_DESCENT_II)
flags . hoard = ! ! ( p - > value & NETGAME_FLAG_HOARD ) ;
flags . team_hoard = ! ! ( p - > value & NETGAME_FLAG_TEAM_HOARD ) ;
flags . endlevel = ! ! ( p - > value & NETGAME_FLAG_REALLY_ENDLEVEL ) ;
flags . forming = ! ! ( p - > value & NETGAME_FLAG_REALLY_FORMING ) ;
# endif
return flags ;
}
static inline packed_game_flags pack_game_flags ( const bit_game_flags * flags )
{
packed_game_flags p ;
p . value =
( flags - > closed ? NETGAME_FLAG_CLOSED : 0 ) |
( flags - > show_on_map ? NETGAME_FLAG_SHOW_MAP : 0 ) |
# if defined(DXX_BUILD_DESCENT_II)
( flags - > hoard ? NETGAME_FLAG_HOARD : 0 ) |
( flags - > team_hoard ? NETGAME_FLAG_TEAM_HOARD : 0 ) |
( flags - > endlevel ? NETGAME_FLAG_REALLY_ENDLEVEL : 0 ) |
( flags - > forming ? NETGAME_FLAG_REALLY_FORMING : 0 ) |
# endif
0 ;
return p ;
}
2006-03-20 17:12:09 +00:00
# define NETGAME_NAME_LEN 15
extern struct netgame_info Netgame ;
2009-04-09 07:41:30 +00:00
int multi_i_am_master ( void ) ;
int multi_who_is_master ( void ) ;
2006-03-20 17:12:09 +00:00
void change_playernum_to ( int new_pnum ) ;
2011-01-14 13:29:08 +00:00
// Multiplayer powerup capping
extern void multi_powcap_count_powerups_in_mine ( void ) ;
extern void multi_powcap_cap_objects ( ) ;
extern void multi_do_powcap_update ( ) ;
extern void multi_send_powcap_update ( ) ;
2013-01-03 15:33:57 +00:00
extern void multi_send_kill_goal_counts ( ) ;
2012-11-11 00:14:30 +00:00
void multi_check_for_killgoal_winner ( ) ;
2013-08-09 15:21:03 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2013-03-03 01:03:33 +00:00
extern void multi_send_stolen_items ( ) ;
2013-01-03 15:33:57 +00:00
extern void multi_send_trigger_specific ( char pnum , char trig ) ;
extern void multi_send_door_open_specific ( int pnum , int segnum , int side , ubyte flag ) ;
extern void multi_send_wall_status_specific ( int pnum , int wallnum , ubyte type , ubyte flags , ubyte state ) ;
extern void multi_send_light_specific ( int pnum , int segnum , ubyte val ) ;
2012-11-11 00:14:30 +00:00
void multi_send_capture_bonus ( char pnum ) ;
int multi_all_players_alive ( ) ;
void multi_send_seismic ( fix64 , fix64 ) ;
void multi_send_drop_blobs ( char ) ;
void multi_send_sound_function ( char , char ) ;
void DropFlag ( ) ;
int multi_powerup_is_allowed ( int ) ;
void multi_send_finish_game ( ) ;
void init_hoard_data ( ) ;
void multi_apply_goal_textures ( ) ;
2011-01-14 13:29:08 +00:00
2009-11-24 09:48:53 +00:00
int HoardEquipped ( ) ;
2006-10-02 13:29:04 +00:00
# ifdef EDITOR
void save_hoard_data ( void ) ;
# endif
2013-03-03 01:03:33 +00:00
# endif
2006-10-02 13:29:04 +00:00
2013-08-09 15:21:03 +00:00
//how to encode missiles & flares in weapon packets
# define MISSILE_ADJUST 100
# define FLARE_ADJUST 127
2009-03-20 12:10:38 +00:00
/*
* The Network Players structure
2011-09-13 23:15:32 +00:00
* Contains protocol - specific data with designated prefixes and general player - related data .
2009-03-20 12:10:38 +00:00
* Note that not all of these infos will be sent to other users - some are used and / or set locally , only .
*/
typedef struct netplayer_info
{
2011-09-13 23:15:32 +00:00
# if defined(USE_UDP)
2009-03-20 12:10:38 +00:00
union
{
2009-11-29 16:46:13 +00:00
# ifdef USE_UDP
2009-03-20 12:10:38 +00:00
struct
{
struct _sockaddr addr ; // IP address of this peer
2009-11-24 09:48:53 +00:00
ubyte isyou ; // This flag is set true while sending info to tell player his designated (re)join position
2009-03-20 12:10:38 +00:00
} udp ;
2009-11-29 16:46:13 +00:00
# endif
2009-03-20 12:10:38 +00:00
} protocol ;
2009-11-29 16:46:13 +00:00
# endif
2009-03-20 12:10:38 +00:00
char callsign [ CALLSIGN_LEN + 1 ] ;
sbyte connected ;
ubyte rank ;
2009-04-09 07:41:30 +00:00
fix ping ;
2010-12-10 23:18:17 +00:00
fix64 LastPacketTime ;
2009-03-20 12:10:38 +00:00
} __pack__ netplayer_info ;
/*
* The Network Game structure
2011-09-13 23:15:32 +00:00
* Contains protocol - specific data with designated prefixes and general game - related data .
2009-03-20 12:10:38 +00:00
* Note that not all of these infos will be sent to clients - some are used and / or set locally , only .
*/
typedef struct netgame_info
{
2011-09-13 23:15:32 +00:00
# if defined(USE_UDP)
2009-03-20 12:10:38 +00:00
union
{
2009-11-29 16:46:13 +00:00
# ifdef USE_UDP
2009-03-20 12:10:38 +00:00
struct
{
2011-05-04 22:16:37 +00:00
struct _sockaddr addr ; // IP address of this netgame's host
2011-11-02 00:04:42 +00:00
short program_iver [ 4 ] ; // IVER of program for version checking
2009-11-24 09:48:53 +00:00
sbyte valid ; // Status of Netgame info: -1 = Failed, Wrong version; 0 = No info, yet; 1 = Success
2010-12-22 13:55:26 +00:00
fix GameID ;
2009-03-20 12:10:38 +00:00
} udp ;
2009-11-29 16:46:13 +00:00
# endif
2009-03-20 12:10:38 +00:00
} protocol ;
2009-11-29 16:46:13 +00:00
# endif
2011-05-04 22:16:37 +00:00
struct netplayer_info players [ MAX_PLAYERS + 4 ] ;
2009-03-20 12:10:38 +00:00
char game_name [ NETGAME_NAME_LEN + 1 ] ;
char mission_title [ MISSION_NAME_LEN + 1 ] ;
char mission_name [ 9 ] ;
int levelnum ;
ubyte gamemode ;
ubyte RefusePlayers ;
ubyte difficulty ;
ubyte game_status ;
ubyte numplayers ;
ubyte max_numplayers ;
ubyte numconnected ;
2013-08-24 16:33:51 +00:00
bit_game_flags game_flag ;
2009-03-20 12:10:38 +00:00
ubyte team_vector ;
u_int32_t AllowedItems ;
2013-03-03 01:03:33 +00:00
/*
* Only used in Descent II , but defined in both for historical
* reasons
*/
2009-11-24 09:48:53 +00:00
short Allow_marker_view ;
short AlwaysLighting ;
2013-03-03 01:03:33 +00:00
/* End Descent II */
2011-05-04 22:16:37 +00:00
short ShowEnemyNames ;
2009-11-24 09:48:53 +00:00
short BrightPlayers ;
short InvulAppear ;
2009-03-20 12:10:38 +00:00
char team_name [ 2 ] [ CALLSIGN_LEN + 1 ] ;
2011-05-04 22:16:37 +00:00
int locations [ MAX_PLAYERS ] ;
2009-03-20 12:10:38 +00:00
short kills [ MAX_PLAYERS ] [ MAX_PLAYERS ] ;
ushort segments_checksum ;
short team_kills [ 2 ] ;
short killed [ MAX_PLAYERS ] ;
short player_kills [ MAX_PLAYERS ] ;
2011-05-04 22:16:37 +00:00
int KillGoal ;
fix PlayTimeAllowed ;
fix level_time ;
int control_invul_time ;
int monitor_vector ;
int player_score [ MAX_PLAYERS ] ;
2009-03-20 12:10:38 +00:00
ubyte player_flags [ MAX_PLAYERS ] ;
short PacketsPerSec ;
2009-11-29 16:46:13 +00:00
ubyte PacketLossPrevention ;
2011-01-14 18:48:48 +00:00
ubyte NoFriendlyFire ;
2011-04-05 00:24:34 +00:00
# ifdef USE_TRACKER
ubyte Tracker ;
# endif
2009-03-20 12:10:38 +00:00
} __pack__ netgame_info ;
2012-11-11 22:12:51 +00:00
# endif
2006-03-20 17:12:09 +00:00
# endif /* _MULTI_H */