-
Notifications
You must be signed in to change notification settings - Fork 1
/
NET_VCR.C
148 lines (104 loc) · 2.71 KB
/
NET_VCR.C
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
146
147
148
// net_vcr.c
#include "quakedef.h"
#include "net_vcr.h"
extern int vcrFile;
// This is the playback portion of the VCR. It reads the file produced
// by the recorder and plays it back to the host. The recording contains
// everything necessary (events, timestamps, and data) to duplicate the game
// from the viewpoint of everything above the network layer.
static struct
{
double time;
int op;
long session;
} next;
int VCR_Init (void)
{
net_drivers[0].Init = VCR_Init;
net_drivers[0].SearchForHosts = VCR_SearchForHosts;
net_drivers[0].Connect = VCR_Connect;
net_drivers[0].CheckNewConnections = VCR_CheckNewConnections;
net_drivers[0].QGetMessage = VCR_GetMessage;
net_drivers[0].QSendMessage = VCR_SendMessage;
net_drivers[0].CanSendMessage = VCR_CanSendMessage;
net_drivers[0].Close = VCR_Close;
net_drivers[0].Shutdown = VCR_Shutdown;
Sys_FileRead(vcrFile, &next, sizeof(next));
return 0;
}
void VCR_ReadNext (void)
{
if (Sys_FileRead(vcrFile, &next, sizeof(next)) == 0)
{
next.op = 255;
Sys_Error ("=== END OF PLAYBACK===\n");
}
if (next.op < 1 || next.op > VCR_MAX_MESSAGE)
Sys_Error ("VCR_ReadNext: bad op");
}
void VCR_Listen (qboolean state)
{
}
void VCR_Shutdown (void)
{
}
int VCR_GetMessage (qsocket_t *sock)
{
int ret;
if (host_time != next.time || next.op != VCR_OP_GETMESSAGE || next.session != *(long *)(&sock->driverdata))
Sys_Error ("VCR missmatch");
Sys_FileRead(vcrFile, &ret, sizeof(int));
if (ret != 1)
{
VCR_ReadNext ();
return ret;
}
Sys_FileRead(vcrFile, &net_message.cursize, sizeof(int));
Sys_FileRead(vcrFile, net_message.data, net_message.cursize);
VCR_ReadNext ();
return 1;
}
int VCR_SendMessage (qsocket_t *sock, sizebuf_t *data)
{
int ret;
if (host_time != next.time || next.op != VCR_OP_SENDMESSAGE || next.session != *(long *)(&sock->driverdata))
Sys_Error ("VCR missmatch");
Sys_FileRead(vcrFile, &ret, sizeof(int));
VCR_ReadNext ();
return ret;
}
qboolean VCR_CanSendMessage (qsocket_t *sock)
{
qboolean ret;
if (host_time != next.time || next.op != VCR_OP_CANSENDMESSAGE || next.session != *(long *)(&sock->driverdata))
Sys_Error ("VCR missmatch");
Sys_FileRead(vcrFile, &ret, sizeof(int));
VCR_ReadNext ();
return ret;
}
void VCR_Close (qsocket_t *sock)
{
}
void VCR_SearchForHosts (qboolean xmit)
{
}
qsocket_t *VCR_Connect (char *host)
{
return NULL;
}
qsocket_t *VCR_CheckNewConnections (void)
{
qsocket_t *sock;
if (host_time != next.time || next.op != VCR_OP_CONNECT)
Sys_Error ("VCR missmatch");
if (!next.session)
{
VCR_ReadNext ();
return NULL;
}
sock = NET_NewQSocket ();
*(long *)(&sock->driverdata) = next.session;
Sys_FileRead (vcrFile, sock->address, NET_NAMELEN);
VCR_ReadNext ();
return sock;
}