summaryrefslogtreecommitdiff
path: root/apps/plugins/sdl/progs/quake/net.h
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2018-02-11 15:34:30 -0500
committerFranklin Wei <git@fwei.tk>2019-07-19 22:37:40 -0400
commit5d05b9d3e920a6aa5fcb553758e98ed0da8c91e4 (patch)
tree84406e21639529a185556a33e5de7f43cffc277b /apps/plugins/sdl/progs/quake/net.h
parentb70fecf21ddc21877ec1ae7888d9c18a979e37ad (diff)
downloadrockbox-5d05b9d3e920a6aa5fcb553758e98ed0da8c91e4.tar.gz
rockbox-5d05b9d3e920a6aa5fcb553758e98ed0da8c91e4.zip
Quake!
This ports id Software's Quake to run on the SDL plugin runtime. The source code originated from id under the GPLv2 license. I used https://github.com/ahefner/sdlquake as the base of my port. Performance is, unsurprisingly, not on par with what you're probably used to on PC. I average about 10FPS on ipod6g, but it's still playable. Sound works well enough, but in-game music is not supported. I've written ARM assembly routines for the inner sound loop. Make sure you turn the "brightness" all the way down, or colors will look funky. To run, extract Quake's data files to /.rockbox/quake. Have fun! Change-Id: I4285036e967d7f0722802d43cf2096c808ca5799
Diffstat (limited to 'apps/plugins/sdl/progs/quake/net.h')
-rw-r--r--apps/plugins/sdl/progs/quake/net.h337
1 files changed, 337 insertions, 0 deletions
diff --git a/apps/plugins/sdl/progs/quake/net.h b/apps/plugins/sdl/progs/quake/net.h
new file mode 100644
index 0000000000..af461256b6
--- /dev/null
+++ b/apps/plugins/sdl/progs/quake/net.h
@@ -0,0 +1,337 @@
1/*
2Copyright (C) 1996-1997 Id Software, Inc.
3
4This program is free software; you can redistribute it and/or
5modify it under the terms of the GNU General Public License
6as published by the Free Software Foundation; either version 2
7of the License, or (at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
13See the GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
16along with this program; if not, write to the Free Software
17Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
19*/
20// net.h -- quake's interface to the networking layer
21
22struct qsockaddr
23{
24 short sa_family;
25 unsigned char sa_data[14];
26};
27
28
29#define NET_NAMELEN 64
30
31#define NET_MAXMESSAGE 8192
32#define NET_HEADERSIZE (2 * sizeof(unsigned int))
33#define NET_DATAGRAMSIZE (MAX_DATAGRAM + NET_HEADERSIZE)
34
35// NetHeader flags
36#define NETFLAG_LENGTH_MASK 0x0000ffff
37#define NETFLAG_DATA 0x00010000
38#define NETFLAG_ACK 0x00020000
39#define NETFLAG_NAK 0x00040000
40#define NETFLAG_EOM 0x00080000
41#define NETFLAG_UNRELIABLE 0x00100000
42#define NETFLAG_CTL 0x80000000
43
44
45#define NET_PROTOCOL_VERSION 3
46
47// This is the network info/connection protocol. It is used to find Quake
48// servers, get info about them, and connect to them. Once connected, the
49// Quake game protocol (documented elsewhere) is used.
50//
51//
52// General notes:
53// game_name is currently always "QUAKE", but is there so this same protocol
54// can be used for future games as well; can you say Quake2?
55//
56// CCREQ_CONNECT
57// string game_name "QUAKE"
58// byte net_protocol_version NET_PROTOCOL_VERSION
59//
60// CCREQ_SERVER_INFO
61// string game_name "QUAKE"
62// byte net_protocol_version NET_PROTOCOL_VERSION
63//
64// CCREQ_PLAYER_INFO
65// byte player_number
66//
67// CCREQ_RULE_INFO
68// string rule
69//
70//
71//
72// CCREP_ACCEPT
73// long port
74//
75// CCREP_REJECT
76// string reason
77//
78// CCREP_SERVER_INFO
79// string server_address
80// string host_name
81// string level_name
82// byte current_players
83// byte max_players
84// byte protocol_version NET_PROTOCOL_VERSION
85//
86// CCREP_PLAYER_INFO
87// byte player_number
88// string name
89// long colors
90// long frags
91// long connect_time
92// string address
93//
94// CCREP_RULE_INFO
95// string rule
96// string value
97
98// note:
99// There are two address forms used above. The short form is just a
100// port number. The address that goes along with the port is defined as
101// "whatever address you receive this reponse from". This lets us use
102// the host OS to solve the problem of multiple host addresses (possibly
103// with no routing between them); the host will use the right address
104// when we reply to the inbound connection request. The long from is
105// a full address and port in a string. It is used for returning the
106// address of a server that is not running locally.
107
108#define CCREQ_CONNECT 0x01
109#define CCREQ_SERVER_INFO 0x02
110#define CCREQ_PLAYER_INFO 0x03
111#define CCREQ_RULE_INFO 0x04
112
113#define CCREP_ACCEPT 0x81
114#define CCREP_REJECT 0x82
115#define CCREP_SERVER_INFO 0x83
116#define CCREP_PLAYER_INFO 0x84
117#define CCREP_RULE_INFO 0x85
118
119typedef struct qsocket_s
120{
121 struct qsocket_s *next;
122 double connecttime;
123 double lastMessageTime;
124 double lastSendTime;
125
126 qboolean disconnected;
127 qboolean canSend;
128 qboolean sendNext;
129
130 int driver;
131 int landriver;
132 int socket;
133 void *driverdata;
134
135 unsigned int ackSequence;
136 unsigned int sendSequence;
137 unsigned int unreliableSendSequence;
138 int sendMessageLength;
139 byte sendMessage [NET_MAXMESSAGE];
140
141 unsigned int receiveSequence;
142 unsigned int unreliableReceiveSequence;
143 int receiveMessageLength;
144 byte receiveMessage [NET_MAXMESSAGE];
145
146 struct qsockaddr addr;
147 char address[NET_NAMELEN];
148
149} qsocket_t;
150
151extern qsocket_t *net_activeSockets;
152extern qsocket_t *net_freeSockets;
153extern int net_numsockets;
154
155typedef struct
156{
157 char *name;
158 qboolean initialized;
159 int controlSock;
160 int (*Init) (void);
161 void (*Shutdown) (void);
162 void (*Listen) (qboolean state);
163 int (*OpenSocket) (int port);
164 int (*CloseSocket) (int socket);
165 int (*Connect) (int socket, struct qsockaddr *addr);
166 int (*CheckNewConnections) (void);
167 int (*Read) (int socket, byte *buf, int len, struct qsockaddr *addr);
168 int (*Write) (int socket, byte *buf, int len, struct qsockaddr *addr);
169 int (*Broadcast) (int socket, byte *buf, int len);
170 char * (*AddrToString) (struct qsockaddr *addr);
171 int (*StringToAddr) (char *string, struct qsockaddr *addr);
172 int (*GetSocketAddr) (int socket, struct qsockaddr *addr);
173 int (*GetNameFromAddr) (struct qsockaddr *addr, char *name);
174 int (*GetAddrFromName) (char *name, struct qsockaddr *addr);
175 int (*AddrCompare) (struct qsockaddr *addr1, struct qsockaddr *addr2);
176 int (*GetSocketPort) (struct qsockaddr *addr);
177 int (*SetSocketPort) (struct qsockaddr *addr, int port);
178} net_landriver_t;
179
180#define MAX_NET_DRIVERS 8
181extern int net_numlandrivers;
182extern net_landriver_t net_landrivers[MAX_NET_DRIVERS];
183
184typedef struct
185{
186 char *name;
187 qboolean initialized;
188 int (*Init) (void);
189 void (*Listen) (qboolean state);
190 void (*SearchForHosts) (qboolean xmit);
191 qsocket_t *(*Connect) (char *host);
192 qsocket_t *(*CheckNewConnections) (void);
193 int (*QGetMessage) (qsocket_t *sock);
194 int (*QSendMessage) (qsocket_t *sock, sizebuf_t *data);
195 int (*SendUnreliableMessage) (qsocket_t *sock, sizebuf_t *data);
196 qboolean (*CanSendMessage) (qsocket_t *sock);
197 qboolean (*CanSendUnreliableMessage) (qsocket_t *sock);
198 void (*Close) (qsocket_t *sock);
199 void (*Shutdown) (void);
200 int controlSock;
201} net_driver_t;
202
203extern int net_numdrivers;
204extern net_driver_t net_drivers[MAX_NET_DRIVERS];
205
206extern int DEFAULTnet_hostport;
207extern int net_hostport;
208
209extern int net_driverlevel;
210extern cvar_t hostname;
211extern char playername[];
212extern int playercolor;
213
214extern int messagesSent;
215extern int messagesReceived;
216extern int unreliableMessagesSent;
217extern int unreliableMessagesReceived;
218
219qsocket_t *NET_NewQSocket (void);
220void NET_FreeQSocket(qsocket_t *);
221double SetNetTime(void);
222
223
224#define HOSTCACHESIZE 8
225
226typedef struct
227{
228 char name[16];
229 char map[16];
230 char cname[32];
231 int users;
232 int maxusers;
233 int driver;
234 int ldriver;
235 struct qsockaddr addr;
236} hostcache_t;
237
238extern int hostCacheCount;
239extern hostcache_t hostcache[HOSTCACHESIZE];
240
241#if !defined(_WIN32 ) && !defined (__linux__) && !defined (__sun__)
242#ifndef htonl
243extern unsigned long htonl (unsigned long hostlong);
244#endif
245#ifndef htons
246extern unsigned short htons (unsigned short hostshort);
247#endif
248#ifndef ntohl
249extern unsigned long ntohl (unsigned long netlong);
250#endif
251#ifndef ntohs
252extern unsigned short ntohs (unsigned short netshort);
253#endif
254#endif
255
256#ifdef IDGODS
257qboolean IsID(struct qsockaddr *addr);
258#endif
259
260//============================================================================
261//
262// public network functions
263//
264//============================================================================
265
266extern double net_time;
267extern sizebuf_t net_message;
268extern int net_activeconnections;
269
270void NET_Init (void);
271void NET_Shutdown (void);
272
273struct qsocket_s *NET_CheckNewConnections (void);
274// returns a new connection number if there is one pending, else -1
275
276struct qsocket_s *NET_Connect (char *host);
277// called by client to connect to a host. Returns -1 if not able to
278
279qboolean NET_CanSendMessage (qsocket_t *sock);
280// Returns true or false if the given qsocket can currently accept a
281// message to be transmitted.
282
283int NET_GetMessage (struct qsocket_s *sock);
284// returns data in net_message sizebuf
285// returns 0 if no data is waiting
286// returns 1 if a message was received
287// returns 2 if an unreliable message was received
288// returns -1 if the connection died
289
290int NET_SendMessage (struct qsocket_s *sock, sizebuf_t *data);
291int NET_SendUnreliableMessage (struct qsocket_s *sock, sizebuf_t *data);
292// returns 0 if the message connot be delivered reliably, but the connection
293// is still considered valid
294// returns 1 if the message was sent properly
295// returns -1 if the connection died
296
297int NET_SendToAll(sizebuf_t *data, int blocktime);
298// This is a reliable *blocking* send to all attached clients.
299
300
301void NET_Close (struct qsocket_s *sock);
302// if a dead connection is returned by a get or send function, this function
303// should be called when it is convenient
304
305// Server calls when a client is kicked off for a game related misbehavior
306// like an illegal protocal conversation. Client calls when disconnecting
307// from a server.
308// A netcon_t number will not be reused until this function is called for it
309
310void NET_Poll(void);
311
312
313typedef struct _PollProcedure
314{
315 struct _PollProcedure *next;
316 double nextTime;
317 void (*procedure)();
318 void *arg;
319} PollProcedure;
320
321void SchedulePollProcedure(PollProcedure *pp, double timeOffset);
322
323extern qboolean serialAvailable;
324extern qboolean ipxAvailable;
325extern qboolean tcpipAvailable;
326extern char my_ipx_address[NET_NAMELEN];
327extern char my_tcpip_address[NET_NAMELEN];
328extern void (*GetComPortConfig) (int portNumber, int *port, int *irq, int *baud, qboolean *useModem);
329extern void (*SetComPortConfig) (int portNumber, int port, int irq, int baud, qboolean useModem);
330extern void (*GetModemConfig) (int portNumber, char *dialType, char *clear, char *init, char *hangup);
331extern void (*SetModemConfig) (int portNumber, char *dialType, char *clear, char *init, char *hangup);
332
333extern qboolean slistInProgress;
334extern qboolean slistSilent;
335extern qboolean slistLocal;
336
337void NET_Slist_f (void);