author  unc0rr 
Wed, 18 Mar 2009 15:48:43 +0000  
changeset 1899  5763f46d7486 
parent 1888  e76274ce7365 
child 2017  7845c77c8d31 
permissions  rwrr 
4  1 
(* 
1066  2 
* Hedgewars, a free turn based strategy game 
883  3 
* Copyright (c) 2004, 2005, 2007, 2008 Andrey Korotaev <unC0Rr@gmail.com> 
4  4 
* 
183  5 
* This program is free software; you can redistribute it and/or modify 
6 
* it under the terms of the GNU General Public License as published by 

7 
* the Free Software Foundation; version 2 of the License 

4  8 
* 
183  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. See the 

12 
* GNU General Public License for more details. 

4  13 
* 
183  14 
* You should have received a copy of the GNU General Public License 
15 
* along with this program; if not, write to the Free Software 

16 
* Foundation, Inc., 59 Temple Place  Suite 330, Boston, MA 021111307, USA 

4  17 
*) 
18 

19 
unit uIO; 

20 
interface 

21 
uses SDLh; 

22 
{$INCLUDE options.inc} 

23 

24 
const ipcPort: Word = 0; 

25 

26 
procedure SendIPC(s: shortstring); 

154
5667e6f38704
Network protocol uses integers in network byte order
unc0rr
parents:
112
diff
changeset

27 
procedure SendIPCXY(cmd: char; X, Y: SmallInt); 
155
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
154
diff
changeset

28 
procedure SendIPCRaw(p: pointer; len: Longword); 
4  29 
procedure SendIPCAndWaitReply(s: shortstring); 
649
26166c87dc75
 Use 2 bytes for timestamp in net protocol, thus decreasing average packet size from 6 to 4
unc0rr
parents:
648
diff
changeset

30 
procedure SendIPCTimeInc; 
1888
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

31 
procedure LoadRecordFromFile(fileName: shortstring); 
159  32 
procedure IPCWaitPongEvent; 
4  33 
procedure IPCCheckSock; 
34 
procedure InitIPC; 

35 
procedure CloseIPC; 

36 
procedure NetGetNextCmd; 

37 

656
6d6d9d7b1054
Fix network game bug caused by recent protocol changes
unc0rr
parents:
650
diff
changeset

38 
var hiTicks: Word = 0; 
6d6d9d7b1054
Fix network game bug caused by recent protocol changes
unc0rr
parents:
650
diff
changeset

39 

4  40 
implementation 
1351
aa7aefec5c1b
Add partial implementation of handling disconnects while playing via network
unc0rr
parents:
1066
diff
changeset

41 
uses uConsole, uConsts, uWorld, uMisc, uLand, uChat, uTeams; 
4  42 
const isPonged: boolean = false; 
648
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

43 

fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

44 
type PCmd = ^TCmd; 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

45 
TCmd = packed record 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

46 
Next: PCmd; 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

47 
Time: LongWord; 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

48 
case byte of 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

49 
1: (len: byte; 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

50 
cmd: Char; 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

51 
X, Y: SmallInt); 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

52 
2: (str: shortstring); 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

53 
end; 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

54 

49  55 
var IPCSock: PTCPSocket = nil; 
4  56 
fds: PSDLNet_SocketSet; 
57 

648
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

58 
headcmd: PCmd = nil; 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

59 
lastcmd: PCmd = nil; 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

60 

fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

61 
function AddCmd(Time: Longword; str: shortstring): PCmd; 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

62 
var Result: PCmd; 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

63 
begin 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

64 
new(Result); 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

65 
FillChar(Result^, sizeof(TCmd), 0); 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

66 
Result^.Time:= Time; 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

67 
Result^.str:= str; 
1351
aa7aefec5c1b
Add partial implementation of handling disconnects while playing via network
unc0rr
parents:
1066
diff
changeset

68 
if Result^.cmd <> 'F' then dec(Result^.len, 2); // cut timestamp 
648
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

69 
if headcmd = nil then 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

70 
begin 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

71 
headcmd:= Result; 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

72 
lastcmd:= Result 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

73 
end else 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

74 
begin 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

75 
lastcmd^.Next:= Result; 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

76 
lastcmd:= Result 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

77 
end; 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

78 
AddCmd:= Result 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

79 
end; 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

80 

fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

81 
procedure RemoveCmd; 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

82 
var tmp: PCmd; 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

83 
begin 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

84 
TryDo(headcmd <> nil, 'Engine bug: headcmd = nil', true); 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

85 
tmp:= headcmd; 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

86 
headcmd:= headcmd^.Next; 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

87 
if headcmd = nil then lastcmd:= nil; 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

88 
dispose(tmp) 
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

89 
end; 
4  90 

91 
procedure InitIPC; 

92 
var ipaddr: TIPAddress; 

93 
begin 

94 
WriteToConsole('Init SDL_Net... '); 

95 
SDLTry(SDLNet_Init = 0, true); 

96 
fds:= SDLNet_AllocSocketSet(1); 

97 
SDLTry(fds <> nil, true); 

98 
WriteLnToConsole(msgOK); 

99 
WriteToConsole('Establishing IPC connection... '); 

100 
SDLTry(SDLNet_ResolveHost(ipaddr, '127.0.0.1', ipcPort) = 0, true); 

101 
IPCSock:= SDLNet_TCP_Open(ipaddr); 

102 
SDLTry(IPCSock <> nil, true); 

103 
WriteLnToConsole(msgOK) 

104 
end; 

105 

106 
procedure CloseIPC; 

107 
begin 

108 
SDLNet_FreeSocketSet(fds); 

109 
SDLNet_TCP_Close(IPCSock); 

110 
SDLNet_Quit 

111 
end; 

112 

113 
procedure ParseIPCCommand(s: shortstring); 

649
26166c87dc75
 Use 2 bytes for timestamp in net protocol, thus decreasing average packet size from 6 to 4
unc0rr
parents:
648
diff
changeset

114 
var loTicks: Word; 
4  115 
begin 
116 
case s[1] of 

22  117 
'!': begin {$IFDEF DEBUGFILE}AddFileLog('Ping? Pong!');{$ENDIF}isPonged:= true; end; 
4  118 
'?': SendIPC('!'); 
649
26166c87dc75
 Use 2 bytes for timestamp in net protocol, thus decreasing average packet size from 6 to 4
unc0rr
parents:
648
diff
changeset

119 
'#': inc(hiTicks); 
351  120 
'e': ParseCommand(copy(s, 2, Length(s)  1), true); 
4  121 
'E': OutError(copy(s, 2, Length(s)  1), true); 
122 
'W': OutError(copy(s, 2, Length(s)  1), false); 

367  123 
'M': CheckLandDigest(s); 
4  124 
'T': case s[2] of 
125 
'L': GameType:= gmtLocal; 

126 
'D': GameType:= gmtDemo; 

127 
'N': GameType:= gmtNet; 

72  128 
'S': GameType:= gmtSave; 
4  129 
else OutError(errmsgIncorrectUse + ' IPC "T" :' + s[2], true) end; 
130 
else 

649
26166c87dc75
 Use 2 bytes for timestamp in net protocol, thus decreasing average packet size from 6 to 4
unc0rr
parents:
648
diff
changeset

131 
loTicks:= SDLNet_Read16(@s[byte(s[0])  1]); 
26166c87dc75
 Use 2 bytes for timestamp in net protocol, thus decreasing average packet size from 6 to 4
unc0rr
parents:
648
diff
changeset

132 
AddCmd(hiTicks shl 16 + loTicks, s); 
648
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

133 
{$IFDEF DEBUGFILE}AddFileLog('IPC in: '+s[1]+' ticks '+inttostr(lastcmd^.Time));{$ENDIF} 
4  134 
end 
135 
end; 

136 

137 
procedure IPCCheckSock; 

138 
const ss: string = ''; 

371  139 
var i: LongInt; 
1888
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

140 
buf: array[0..255] of byte; 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

141 
s: shortstring absolute buf; 
4  142 
begin 
1888
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

143 
if IPCSock = nil then 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

144 
exit; 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

145 

351  146 
fds^.numsockets:= 0; 
4  147 
SDLNet_AddSocket(fds, IPCSock); 
148 

149 
while SDLNet_CheckSockets(fds, 0) > 0 do 

1888
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

150 
begin 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

151 
i:= SDLNet_TCP_Recv(IPCSock, @buf[1], 255  Length(ss)); 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

152 
if i > 0 then 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

153 
begin 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

154 
buf[0]:= i; 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

155 
ss:= ss + s; 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

156 
while (Length(ss) > 1)and(Length(ss) > byte(ss[1])) do 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

157 
begin 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

158 
ParseIPCCommand(copy(ss, 2, byte(ss[1]))); 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

159 
Delete(ss, 1, Succ(byte(ss[1]))) 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

160 
end 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

161 
end else OutError('IPC connection lost', true) 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

162 
end; 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

163 
end; 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

164 

e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

165 
procedure LoadRecordFromFile(fileName: shortstring); 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

166 
var f: file; 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

167 
ss: string = ''; 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

168 
i: LongInt; 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

169 
buf: array[0..255] of byte; 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

170 
s: shortstring absolute buf; 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

171 
begin 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

172 
assign(f, fileName); 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

173 

e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

174 
reset(f, 1); 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

175 

e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

176 
repeat 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

177 
BlockRead(f, buf[1], 255  Length(ss), i); 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

178 
if i > 0 then 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

179 
begin 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

180 
buf[0]:= i; 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

181 
ss:= ss + s; 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

182 
while (Length(ss) > 1)and(Length(ss) > byte(ss[1])) do 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

183 
begin 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

184 
ParseIPCCommand(copy(ss, 2, byte(ss[1]))); 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

185 
Delete(ss, 1, Succ(byte(ss[1]))) 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

186 
end 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

187 
end 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

188 
until i = 0; 
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

189 

e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

190 
close(f) 
4  191 
end; 
192 

193 
procedure SendIPC(s: shortstring); 

194 
begin 

49  195 
if IPCSock <> nil then 
196 
begin 

197 
if s[0]>#251 then s[0]:= #251; 

649
26166c87dc75
 Use 2 bytes for timestamp in net protocol, thus decreasing average packet size from 6 to 4
unc0rr
parents:
648
diff
changeset

198 
SDLNet_Write16(GameTicks, @s[Succ(byte(s[0]))]); 
1432  199 
{$IFDEF DEBUGFILE}AddFileLog('IPC send: '+s[1]);{$ENDIF} 
649
26166c87dc75
 Use 2 bytes for timestamp in net protocol, thus decreasing average packet size from 6 to 4
unc0rr
parents:
648
diff
changeset

200 
inc(s[0], 2); 
49  201 
SDLNet_TCP_Send(IPCSock, @s, Succ(byte(s[0]))) 
202 
end 

4  203 
end; 
204 

155
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
154
diff
changeset

205 
procedure SendIPCRaw(p: pointer; len: Longword); 
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
154
diff
changeset

206 
begin 
208  207 
if IPCSock <> nil then 
208 
begin 

209 
SDLNet_TCP_Send(IPCSock, p, len) 

210 
end 

155
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
154
diff
changeset

211 
end; 
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
154
diff
changeset

212 

154
5667e6f38704
Network protocol uses integers in network byte order
unc0rr
parents:
112
diff
changeset

213 
procedure SendIPCXY(cmd: char; X, Y: SmallInt); 
5667e6f38704
Network protocol uses integers in network byte order
unc0rr
parents:
112
diff
changeset

214 
var s: shortstring; 
5667e6f38704
Network protocol uses integers in network byte order
unc0rr
parents:
112
diff
changeset

215 
begin 
5667e6f38704
Network protocol uses integers in network byte order
unc0rr
parents:
112
diff
changeset

216 
s[0]:= #5; 
5667e6f38704
Network protocol uses integers in network byte order
unc0rr
parents:
112
diff
changeset

217 
s[1]:= cmd; 
5667e6f38704
Network protocol uses integers in network byte order
unc0rr
parents:
112
diff
changeset

218 
SDLNet_Write16(X, @s[2]); 
5667e6f38704
Network protocol uses integers in network byte order
unc0rr
parents:
112
diff
changeset

219 
SDLNet_Write16(Y, @s[4]); 
5667e6f38704
Network protocol uses integers in network byte order
unc0rr
parents:
112
diff
changeset

220 
SendIPC(s) 
5667e6f38704
Network protocol uses integers in network byte order
unc0rr
parents:
112
diff
changeset

221 
end; 
5667e6f38704
Network protocol uses integers in network byte order
unc0rr
parents:
112
diff
changeset

222 

649
26166c87dc75
 Use 2 bytes for timestamp in net protocol, thus decreasing average packet size from 6 to 4
unc0rr
parents:
648
diff
changeset

223 
procedure SendIPCTimeInc; 
26166c87dc75
 Use 2 bytes for timestamp in net protocol, thus decreasing average packet size from 6 to 4
unc0rr
parents:
648
diff
changeset

224 
const timeinc: shortstring = '#'; 
26166c87dc75
 Use 2 bytes for timestamp in net protocol, thus decreasing average packet size from 6 to 4
unc0rr
parents:
648
diff
changeset

225 
begin 
26166c87dc75
 Use 2 bytes for timestamp in net protocol, thus decreasing average packet size from 6 to 4
unc0rr
parents:
648
diff
changeset

226 
SendIPCRaw(@timeinc, 2) 
26166c87dc75
 Use 2 bytes for timestamp in net protocol, thus decreasing average packet size from 6 to 4
unc0rr
parents:
648
diff
changeset

227 
end; 
26166c87dc75
 Use 2 bytes for timestamp in net protocol, thus decreasing average packet size from 6 to 4
unc0rr
parents:
648
diff
changeset

228 

159  229 
procedure IPCWaitPongEvent; 
4  230 
begin 
231 
isPonged:= false; 

232 
repeat 

233 
IPCCheckSock; 

234 
SDL_Delay(1) 

235 
until isPonged 

236 
end; 

237 

159  238 
procedure SendIPCAndWaitReply(s: shortstring); 
239 
begin 

240 
SendIPC(s); 

241 
SendIPC('?'); 

242 
IPCWaitPongEvent 

243 
end; 

244 

4  245 
procedure NetGetNextCmd; 
246 
var tmpflag: boolean; 

977
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

247 
s: shortstring; 
4  248 
begin 
977
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

249 
tmpflag:= true; 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

250 

1351
aa7aefec5c1b
Add partial implementation of handling disconnects while playing via network
unc0rr
parents:
1066
diff
changeset

251 
while (headcmd <> nil) 
aa7aefec5c1b
Add partial implementation of handling disconnects while playing via network
unc0rr
parents:
1066
diff
changeset

252 
and ((GameTicks = headcmd^.Time) 
aa7aefec5c1b
Add partial implementation of handling disconnects while playing via network
unc0rr
parents:
1066
diff
changeset

253 
or (headcmd^.cmd = 's') 
aa7aefec5c1b
Add partial implementation of handling disconnects while playing via network
unc0rr
parents:
1066
diff
changeset

254 
or (headcmd^.cmd = 'F')) do 
977
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

255 
begin 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

256 
case headcmd^.cmd of 
1038  257 
'+': ; // do nothing  it's just empty packet 
977
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

258 
'L': ParseCommand('+left', true); 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

259 
'l': ParseCommand('left', true); 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

260 
'R': ParseCommand('+right', true); 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

261 
'r': ParseCommand('right', true); 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

262 
'U': ParseCommand('+up', true); 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

263 
'u': ParseCommand('up', true); 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

264 
'D': ParseCommand('+down', true); 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

265 
'd': ParseCommand('down', true); 
1639  266 
'Z': ParseCommand('+precise', true); 
267 
'z': ParseCommand('precise', true); 

977
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

268 
'A': ParseCommand('+attack', true); 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

269 
'a': ParseCommand('attack', true); 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

270 
'S': ParseCommand('switch', true); 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

271 
'j': ParseCommand('ljump', true); 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

272 
'J': ParseCommand('hjump', true); 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

273 
',': ParseCommand('skip', true); 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

274 
's': begin 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

275 
s:= copy(headcmd^.str, 2, Pred(headcmd^.len)); 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

276 
AddChatString(s); 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

277 
WriteLnToConsole(s) 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

278 
end; 
1351
aa7aefec5c1b
Add partial implementation of handling disconnects while playing via network
unc0rr
parents:
1066
diff
changeset

279 
'F': TeamGone(copy(headcmd^.str, 2, Pred(headcmd^.len))); 
977
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

280 
'N': begin 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

281 
tmpflag:= false; 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

282 
{$IFDEF DEBUGFILE}AddFileLog('got cmd "N": time '+inttostr(headcmd^.Time)){$ENDIF} 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

283 
end; 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

284 
'p': begin 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

285 
TargetPoint.X:= SmallInt(SDLNet_Read16(@(headcmd^.X))); 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

286 
TargetPoint.Y:= SmallInt(SDLNet_Read16(@(headcmd^.Y))); 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

287 
ParseCommand('put', true) 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

288 
end; 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

289 
'P': begin 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

290 
CursorPoint.X:= SmallInt(SDLNet_Read16(@(headcmd^.X)) + WorldDx); 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

291 
CursorPoint.Y:= SmallInt(SDLNet_Read16(@(headcmd^.Y)) + WorldDy); 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

292 
end; 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

293 
'w': ParseCommand('setweap ' + headcmd^.str[2], true); 
1035  294 
't': ParseCommand('taunt ' + headcmd^.str[2], true); 
1821
6b6cf3389f92
Hedgehog drops a grave on "/newgrave" command. Patch by nemo
unc0rr
parents:
1639
diff
changeset

295 
'g': ParseCommand('newgrave', true); 
977
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

296 
'1'..'5': ParseCommand('timer ' + headcmd^.cmd, true); 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

297 
#128..char(128 + cMaxSlotIndex): ParseCommand('slot ' + char(byte(headcmd^.cmd)  79), true) 
1035  298 
else 
299 
OutError('Unexpected protocol command: ' + headcmd^.cmd, True) 

977
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

300 
end; 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

301 
RemoveCmd 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

302 
end; 
351  303 

648
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

304 
if (headcmd <> nil) then 
977
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

305 
TryDo(GameTicks < headcmd^.Time, 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

306 
'oops, queue error. in buffer: ' + headcmd^.cmd + 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

307 
' (' + inttostr(GameTicks) + ' > ' + 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

308 
inttostr(headcmd^.Time) + ')', 
fdbf2a5c1ad7
Fix an oops with chat string appearing between two net commands (it's very rare and random condition, but I caught it while playing via net)
unc0rr
parents:
946
diff
changeset

309 
true); 
4  310 

1560
e140bc57ff68
Quick replay round to spectators until current move
unc0rr
parents:
1432
diff
changeset

311 
isInLag:= (headcmd = nil) and tmpflag and not CurrentTeam^.hasGone; 
e140bc57ff68
Quick replay round to spectators until current move
unc0rr
parents:
1432
diff
changeset

312 
if isInLag then fastUntilLag:= false 
4  313 
end; 
314 

315 
end. 