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