forgotten commit. disabled until egl is adapted.
[AROS-Contrib.git] / Games / Doom / i_net.c
blobc564330f274bf03f1ab2e248835fc84009275ec1
1 // Emacs style mode select -*- C++ -*-
2 //-----------------------------------------------------------------------------
3 //
4 // $Id$
5 //
6 // Copyright (C) 1993-1996 by id Software, Inc.
7 //
8 // This source is available for distribution and/or modification
9 // only under the terms of the DOOM Source Code License as
10 // published by id Software. All rights reserved.
12 // The source is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
15 // for more details.
17 // $Log$
18 // Revision 1.1 2000/02/29 18:21:04 stegerg
19 // Doom port based on ADoomPPC. Read README.AROS!
22 // DESCRIPTION:
24 //-----------------------------------------------------------------------------
26 static const char
27 rcsid[] = "$Id$";
29 #include <stdlib.h>
30 #include <string.h>
31 #include <stdio.h>
33 #include <sys/socket.h>
34 #include <netinet/in.h>
35 #include <arpa/inet.h>
36 #include <errno.h>
37 #include <unistd.h>
38 #include <netdb.h>
39 #include <sys/ioctl.h>
41 #include "i_system.h"
42 #include "d_event.h"
43 #include "d_net.h"
44 #include "m_argv.h"
46 #include "doomstat.h"
48 #ifdef __GNUG__
49 #pragma implementation "i_net.h"
50 #endif
51 #include "i_net.h"
57 // For some odd reason...
58 #define ntohl(x) \
59 ((unsigned long int)((((unsigned long int)(x) & 0x000000ffU) << 24) | \
60 (((unsigned long int)(x) & 0x0000ff00U) << 8) | \
61 (((unsigned long int)(x) & 0x00ff0000U) >> 8) | \
62 (((unsigned long int)(x) & 0xff000000U) >> 24)))
64 #define ntohs(x) \
65 ((unsigned short int)((((unsigned short int)(x) & 0x00ff) << 8) | \
66 (((unsigned short int)(x) & 0xff00) >> 8))) \
68 #define htonl(x) ntohl(x)
69 #define htons(x) ntohs(x)
71 void NetSend (void);
72 boolean NetListen (void);
76 // NETWORKING
79 int DOOMPORT = (IPPORT_USERRESERVED +0x1d );
81 int sendsocket;
82 int insocket;
84 struct sockaddr_in sendaddress[MAXNETNODES];
86 void (*netget) (void);
87 void (*netsend) (void);
91 // UDPsocket
93 int UDPsocket (void)
95 int s;
97 // allocate a socket
98 s = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP);
99 if (s<0)
100 I_Error ("can't create socket: %s",strerror(errno));
102 return s;
106 // BindToLocalPort
108 void
109 BindToLocalPort
110 ( int s,
111 int port )
113 int v;
114 struct sockaddr_in address;
116 memset (&address, 0, sizeof(address));
117 address.sin_family = AF_INET;
118 address.sin_addr.s_addr = INADDR_ANY;
119 address.sin_port = port;
121 v = bind (s, (void *)&address, sizeof(address));
122 if (v == -1)
123 I_Error ("BindToPort: bind: %s", strerror(errno));
128 // PacketSend
130 void PacketSend (void)
132 int c;
133 doomdata_t sw;
135 // byte swap
136 sw.checksum = htonl(netbuffer->checksum);
137 sw.player = netbuffer->player;
138 sw.retransmitfrom = netbuffer->retransmitfrom;
139 sw.starttic = netbuffer->starttic;
140 sw.numtics = netbuffer->numtics;
141 for (c=0 ; c< netbuffer->numtics ; c++)
143 sw.cmds[c].forwardmove = netbuffer->cmds[c].forwardmove;
144 sw.cmds[c].sidemove = netbuffer->cmds[c].sidemove;
145 sw.cmds[c].angleturn = htons(netbuffer->cmds[c].angleturn);
146 sw.cmds[c].consistancy = htons(netbuffer->cmds[c].consistancy);
147 sw.cmds[c].chatchar = netbuffer->cmds[c].chatchar;
148 sw.cmds[c].buttons = netbuffer->cmds[c].buttons;
151 //printf ("sending %i\n",gametic);
152 c = sendto (sendsocket , &sw, doomcom->datalength
153 ,0,(void *)&sendaddress[doomcom->remotenode]
154 ,sizeof(sendaddress[doomcom->remotenode]));
156 // if (c == -1)
157 // I_Error ("SendPacket error: %s",strerror(errno));
162 // PacketGet
164 void PacketGet (void)
166 int i;
167 int c;
168 struct sockaddr_in fromaddress;
169 int fromlen;
170 doomdata_t sw;
172 fromlen = sizeof(fromaddress);
173 c = recvfrom (insocket, &sw, sizeof(sw), 0
174 , (struct sockaddr *)&fromaddress, &fromlen );
175 if (c == -1 )
177 if (errno != EWOULDBLOCK)
178 I_Error ("GetPacket: %s",strerror(errno));
179 doomcom->remotenode = -1; // no packet
180 return;
184 static int first=1;
185 if (first)
186 printf("len=%d:p=[0x%x 0x%x] \n", c, *(int*)&sw, *((int*)&sw+1));
187 first = 0;
190 // find remote node number
191 for (i=0 ; i<doomcom->numnodes ; i++)
192 if ( fromaddress.sin_addr.s_addr == sendaddress[i].sin_addr.s_addr )
193 break;
195 if (i == doomcom->numnodes)
197 // packet is not from one of the players (new game broadcast)
198 doomcom->remotenode = -1; // no packet
199 return;
202 doomcom->remotenode = i; // good packet from a game player
203 doomcom->datalength = c;
205 // byte swap
206 netbuffer->checksum = ntohl(sw.checksum);
207 netbuffer->player = sw.player;
208 netbuffer->retransmitfrom = sw.retransmitfrom;
209 netbuffer->starttic = sw.starttic;
210 netbuffer->numtics = sw.numtics;
212 for (c=0 ; c< netbuffer->numtics ; c++)
214 netbuffer->cmds[c].forwardmove = sw.cmds[c].forwardmove;
215 netbuffer->cmds[c].sidemove = sw.cmds[c].sidemove;
216 netbuffer->cmds[c].angleturn = ntohs(sw.cmds[c].angleturn);
217 netbuffer->cmds[c].consistancy = ntohs(sw.cmds[c].consistancy);
218 netbuffer->cmds[c].chatchar = sw.cmds[c].chatchar;
219 netbuffer->cmds[c].buttons = sw.cmds[c].buttons;
225 int GetLocalAddress (void)
227 char hostname[1024];
228 struct hostent* hostentry; // host information entry
229 int v;
231 // get local address
232 v = gethostname (hostname, sizeof(hostname));
233 if (v == -1)
234 I_Error ("GetLocalAddress : gethostname: errno %d",errno);
236 hostentry = gethostbyname (hostname);
237 if (!hostentry)
238 I_Error ("GetLocalAddress : gethostbyname: couldn't get local host");
240 return *(int *)hostentry->h_addr_list[0];
245 // I_InitNetwork
247 void I_InitNetwork (void)
249 boolean trueval = true;
250 int i;
251 int p;
252 struct hostent* hostentry; // host information entry
254 doomcom = malloc (sizeof (*doomcom) );
255 memset (doomcom, 0, sizeof(*doomcom) );
257 // set up for network
258 i = M_CheckParm ("-dup");
259 if (i && i< myargc-1)
261 doomcom->ticdup = myargv[i+1][0]-'0';
262 if (doomcom->ticdup < 1)
263 doomcom->ticdup = 1;
264 if (doomcom->ticdup > 9)
265 doomcom->ticdup = 9;
267 else
268 doomcom-> ticdup = 1;
270 if (M_CheckParm ("-extratic"))
271 doomcom-> extratics = 1;
272 else
273 doomcom-> extratics = 0;
275 p = M_CheckParm ("-port");
276 if (p && p<myargc-1)
278 DOOMPORT = atoi (myargv[p+1]);
279 printf ("using alternate port %i\n",DOOMPORT);
282 // parse network game options,
283 // -net <consoleplayer> <host> <host> ...
284 i = M_CheckParm ("-net");
285 if (!i)
287 // single player game
288 netgame = false;
289 doomcom->id = DOOMCOM_ID;
290 doomcom->numplayers = doomcom->numnodes = 1;
291 doomcom->deathmatch = false;
292 doomcom->consoleplayer = 0;
293 return;
296 netsend = PacketSend;
297 netget = PacketGet;
298 netgame = true;
300 // parse player number and host list
301 doomcom->consoleplayer = myargv[i+1][0]-'1';
303 doomcom->numnodes = 1; // this node for sure
305 i++;
306 while (++i < myargc && myargv[i][0] != '-')
308 sendaddress[doomcom->numnodes].sin_family = AF_INET;
309 sendaddress[doomcom->numnodes].sin_port = htons(DOOMPORT);
310 if (myargv[i][0] == '.')
312 sendaddress[doomcom->numnodes].sin_addr.s_addr
313 = inet_addr (myargv[i]+1);
315 else
317 hostentry = gethostbyname (myargv[i]);
318 if (!hostentry)
319 I_Error ("gethostbyname: couldn't find %s", myargv[i]);
320 sendaddress[doomcom->numnodes].sin_addr.s_addr
321 = *(int *)hostentry->h_addr_list[0];
323 doomcom->numnodes++;
326 doomcom->id = DOOMCOM_ID;
327 doomcom->numplayers = doomcom->numnodes;
329 // build message to receive
330 insocket = UDPsocket ();
331 BindToLocalPort (insocket,htons(DOOMPORT));
332 ioctl (insocket, FIONBIO, &trueval);
334 sendsocket = UDPsocket ();
338 void I_NetCmd (void)
340 if (doomcom->command == CMD_SEND)
342 netsend ();
344 else if (doomcom->command == CMD_GET)
346 netget ();
348 else
349 I_Error ("Bad net cmd: %i\n",doomcom->command);