1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
/* $Id: network.h,v 1.24 2006-08-13 21:26:50 stpohle Exp $
* network.h file... for everything what have to do with the network stuff
*/
#include <SDL.h>
#include "flyingitems.h"
#ifndef _NETWORK_H_
#define _NETWORK_H_
#define MAX_UDPDATA 1024
#define PKG_RESENDCACHE_SIZE 64
#define PKG_IN_INDEX_NUM 512
#define RESENDCACHE_TIMEOUT 400
#define RESENDCACHE_TIMEOUT_MENU 3000
#define RESENDCACHE_RETRY 10
#define DOWNLOAD_TIMEOUT 2000
#define DYN_PKG_MAX_MISSING 4
#define DYN_PKG_MIN_MISSING 1
#define PKG_SENDSETOPT 2
#define MAX_SRVLIST 512
#define TIME_UPDATEINFO 1000
#define GT_MP_PTPM (bman.p_nr == bman.p_servnr && bman.sock >= 0)
#define GT_MP_PTPS (bman.p_nr != bman.p_servnr && bman.sock >= 0)
#define GT_MP (bman.sock > 0)
#define GT_SP (bman.sock <= 0)
#define GS_WAITRUNNING (bman.state == GS_wait || bman.state == GS_ready || bman.state == GS_running)
#define GS_RUNNING (bman.state == GS_ready || bman.state == GS_running)
/* Little / Big Endian Convert */
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
#define NTOH16(__i) s_swap16(__i)
#define HTON16(__i) s_swap16(__i)
#define NTOH32(__i) s_swap32(__i)
#define HTON32(__i) s_swap32(__i)
#else
/* intel system */
#define NTOH16(__i) (__i)
#define HTON16(__i) (__i)
#define NTOH32(__i) (__i)
#define HTON32(__i) (__i)
#endif
/* converting of float to int and other direction */
#define FTOI16(__x) ((Sint16)((float)(__x * 256.0f)))
#define FTOI32(__x) ((Sint32)((float)(__x * 4096.0f)))
#define I16TOF(__x) (((float)__x) / 256.0f)
#define I32TOF(__x) (((float)__x) / 4096.0f)
#include "udp.h"
enum _networkflags {
NETF_firewall = 1, // User Behind Firewall
NETF_local2 // Lokaler 2 Player
};
struct { // this holds the network data
char host[LEN_SERVERNAME];
char port[LEN_PORT];
struct _sockaddr sAddr;
signed char pl_nr; // pl_nr so we know it in the pkgcache.
} typedef _net_addr;
struct { /* this will hold all needed data for the packet
timeout function */
signed char send_to; // sending packet data (playermove) on 0 it will be send
signed char send_set; // start value for the packet data option (dynamic set)
int to_2sec; // how many unreached packets was send
Uint32 to_timestamp;
} typedef _net_pkgopt;
struct {
_net_addr addr; // holds the address
int pingreq; // just to send a ping and to save the number in here
int pingack; // just to wait for an ping reply.. it will show up here
Uint32 timestamp; // time of the last incoming package
signed char net_istep; // -1 gfx all is loaded
signed char net_status;
unsigned char flags; // keep some flags.. like NETF_firewall
int firstplayer; // number of the first player (only needed if NETF_local2 is set
_net_pkgopt pkgopt; // packet and network controll data
} typedef _net_player;
// network menu
extern void netmenu();
extern void network_options ();
extern void join_multiplayer_game ();
extern void host_multiplayer_game ();
extern void multiplayer_firstrun ();
extern void multiplayer_game ();
extern void network_helpscreen ();
// network.c
extern int network_server_port (char *server, char *host, int hostlen, char *port, int portlen);
extern void network_shutdown ();
extern int network_init ();
extern int network_loop ();
extern void net_send_playerid (int pl_nr);
extern void net_new_game ();
extern void net_transmit_gamedata ();
extern void net_game_send_player (int p_nr);
extern void net_game_send_playermove (int p_nr, int mustsend);
extern void net_game_send_bomb (int p, int b);
extern void net_game_send_field (int x, int y);
extern void net_game_send_special (int pl_nr, int ex_nr, int type);
extern void net_game_send_dropitems (int pl_nr, _flyingitem **fiptr, int cnt);
extern void net_game_send_respawn (int pl_nr);
extern void net_game_fillsockaddr ();
extern void net_game_send_ill (int p_nr);
extern void net_game_send_delplayer (int pl_nr);
extern void draw_netupdatestate (char st);
extern void net_send_servermode ();
extern void net_send_players ();
extern void net_send_teamdata (int team_nr);
extern int net_check_timeout (int pl_nr);
extern void net_dyn_pkgoption ();
extern void net_send_chat (char *text, signed char notigamesrv);
extern void net_send_mapinfo ();
extern void net_send_updateinfo ();
extern void send_ogc_update ();
// multiwait.c
extern void wait_for_players ();
// netsrvlist.c
extern void net_getserver ();
extern void srvlist_rebuildlist ();
/* check if we can send to the player */
#define NET_CANSEND(__pl) (!PS_IS_aiplayer (players[__pl].state) \
&& PS_IS_netplayer (players[__pl].state) \
&& (players[__pl].net.addr.host[0] != 0 && players[__pl].net.addr.port[0] != 0) \
&& __pl != bman.p_nr && __pl != bman.p2_nr \
&& (players[__pl].net.flags & NETF_local2) == 0 \
&& (( GT_MP_PTPM && (__pl != bman.p_servnr )) || ( __pl == bman.p_servnr && GT_MP_PTPS ) \
|| (((players[__pl].net.flags & NETF_firewall) == 0) \
&& !bman.firewall)))
#endif
|