Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5131 clevermous 1
/*
2
Copyright (C) 1996-1997 Id Software, Inc.
3
 
4
This program is free software; you can redistribute it and/or
5
modify it under the terms of the GNU General Public License
6
as published by the Free Software Foundation; either version 2
7
of the License, or (at your option) any later version.
8
 
9
This program is distributed in the hope that it will be useful,
10
but WITHOUT ANY WARRANTY; without even the implied warranty of
11
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
 
13
See the GNU General Public License for more details.
14
 
15
You should have received a copy of the GNU General Public License
16
along with this program; if not, write to the Free Software
17
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18
 
19
*/
20
// net_vcr.c
21
 
22
#include "quakedef.h"
23
#include "net_vcr.h"
24
 
25
extern int vcrFile;
26
 
27
// This is the playback portion of the VCR.  It reads the file produced
28
// by the recorder and plays it back to the host.  The recording contains
29
// everything necessary (events, timestamps, and data) to duplicate the game
30
// from the viewpoint of everything above the network layer.
31
 
32
static struct
33
{
34
	double	time;
35
	int		op;
36
	long	session;
37
}	next;
38
 
39
int VCR_Init (void)
40
{
41
	net_drivers[0].Init = VCR_Init;
42
 
43
	net_drivers[0].SearchForHosts = VCR_SearchForHosts;
44
	net_drivers[0].Connect = VCR_Connect;
45
	net_drivers[0].CheckNewConnections = VCR_CheckNewConnections;
46
	net_drivers[0].QGetMessage = VCR_GetMessage;
47
	net_drivers[0].QSendMessage = VCR_SendMessage;
48
	net_drivers[0].CanSendMessage = VCR_CanSendMessage;
49
	net_drivers[0].Close = VCR_Close;
50
	net_drivers[0].Shutdown = VCR_Shutdown;
51
 
52
	Sys_FileRead(vcrFile, &next, sizeof(next));
53
	return 0;
54
}
55
 
56
void VCR_ReadNext (void)
57
{
58
	if (Sys_FileRead(vcrFile, &next, sizeof(next)) == 0)
59
	{
60
		next.op = 255;
61
		Sys_Error ("=== END OF PLAYBACK===\n");
62
	}
63
	if (next.op < 1 || next.op > VCR_MAX_MESSAGE)
64
		Sys_Error ("VCR_ReadNext: bad op");
65
}
66
 
67
 
68
void VCR_Listen (qboolean state)
69
{
70
}
71
 
72
 
73
void VCR_Shutdown (void)
74
{
75
}
76
 
77
 
78
int VCR_GetMessage (qsocket_t *sock)
79
{
80
	int	ret;
81
 
82
	if (host_time != next.time || next.op != VCR_OP_GETMESSAGE || next.session != *(long *)(&sock->driverdata))
83
		Sys_Error ("VCR missmatch");
84
 
85
	Sys_FileRead(vcrFile, &ret, sizeof(int));
86
	if (ret != 1)
87
	{
88
		VCR_ReadNext ();
89
		return ret;
90
	}
91
 
92
	Sys_FileRead(vcrFile, &net_message.cursize, sizeof(int));
93
	Sys_FileRead(vcrFile, net_message.data, net_message.cursize);
94
 
95
	VCR_ReadNext ();
96
 
97
	return 1;
98
}
99
 
100
 
101
int VCR_SendMessage (qsocket_t *sock, sizebuf_t *data)
102
{
103
	int	ret;
104
 
105
	if (host_time != next.time || next.op != VCR_OP_SENDMESSAGE || next.session != *(long *)(&sock->driverdata))
106
		Sys_Error ("VCR missmatch");
107
 
108
	Sys_FileRead(vcrFile, &ret, sizeof(int));
109
 
110
	VCR_ReadNext ();
111
 
112
	return ret;
113
}
114
 
115
 
116
qboolean VCR_CanSendMessage (qsocket_t *sock)
117
{
118
	qboolean	ret;
119
 
120
	if (host_time != next.time || next.op != VCR_OP_CANSENDMESSAGE || next.session != *(long *)(&sock->driverdata))
121
		Sys_Error ("VCR missmatch");
122
 
123
	Sys_FileRead(vcrFile, &ret, sizeof(int));
124
 
125
	VCR_ReadNext ();
126
 
127
	return ret;
128
}
129
 
130
 
131
void VCR_Close (qsocket_t *sock)
132
{
133
}
134
 
135
 
136
void VCR_SearchForHosts (qboolean xmit)
137
{
138
}
139
 
140
 
141
qsocket_t *VCR_Connect (char *host)
142
{
143
	return NULL;
144
}
145
 
146
 
147
qsocket_t *VCR_CheckNewConnections (void)
148
{
149
	qsocket_t	*sock;
150
 
151
	if (host_time != next.time || next.op != VCR_OP_CONNECT)
152
		Sys_Error ("VCR missmatch");
153
 
154
	if (!next.session)
155
	{
156
		VCR_ReadNext ();
157
		return NULL;
158
	}
159
 
160
	sock = NET_NewQSocket ();
161
	*(long *)(&sock->driverdata) = next.session;
162
 
163
	Sys_FileRead (vcrFile, sock->address, NET_NAMELEN);
164
	VCR_ReadNext ();
165
 
166
	return sock;
167
}