100 lastcmd:= nil; |
98 lastcmd:= nil; |
101 dispose(tmp) |
99 dispose(tmp) |
102 end; |
100 end; |
103 |
101 |
104 procedure InitIPC; |
102 procedure InitIPC; |
105 var ipaddr: TIPAddress; |
103 begin |
106 begin |
104 // do nothing, flib initialized everything for us |
107 WriteToConsole('Init SDL_Net... '); |
|
108 SDLTry(SDLNet_Init = 0, true); |
|
109 fds:= SDLNet_AllocSocketSet(1); |
|
110 SDLTry(fds <> nil, true); |
|
111 WriteLnToConsole(msgOK); |
|
112 WriteToConsole('Establishing IPC connection to tcp 127.0.0.1:' + IntToStr(ipcPort) + ' '); |
|
113 {$HINTS OFF} |
|
114 SDLTry(SDLNet_ResolveHost(ipaddr, PChar('127.0.0.1'), ipcPort) = 0, true); |
|
115 {$HINTS ON} |
|
116 IPCSock:= SDLNet_TCP_Open(ipaddr); |
|
117 SDLTry(IPCSock <> nil, true); |
|
118 WriteLnToConsole(msgOK) |
|
119 end; |
105 end; |
120 |
106 |
121 procedure ParseChatCommand(command: shortstring; message: shortstring; |
107 procedure ParseChatCommand(command: shortstring; message: shortstring; |
122 messageStartIndex: Byte); |
108 messageStartIndex: Byte); |
123 var |
109 var |
174 AddFileLog('[IPC in] ' + sanitizeCharForLog(s[1]) + ' ticks ' + IntToStr(lastcmd^.loTime)); |
160 AddFileLog('[IPC in] ' + sanitizeCharForLog(s[1]) + ' ticks ' + IntToStr(lastcmd^.loTime)); |
175 end |
161 end |
176 end; |
162 end; |
177 |
163 |
178 procedure IPCCheckSock; |
164 procedure IPCCheckSock; |
179 var i: LongInt; |
165 begin |
180 s: shortstring; |
166 while ipcCheckFromFrontend() do |
181 begin |
167 ParseIPCCommand(ipcReadFromFrontend()) |
182 if IPCSock = nil then |
|
183 exit; |
|
184 |
|
185 fds^.numsockets:= 0; |
|
186 SDLNet_AddSocket(fds, IPCSock); |
|
187 |
|
188 while SDLNet_CheckSockets(fds, 0) > 0 do |
|
189 begin |
|
190 i:= SDLNet_TCP_Recv(IPCSock, @s[1], 255 - Length(SocketString)); |
|
191 if i > 0 then |
|
192 begin |
|
193 s[0]:= char(i); |
|
194 SocketString:= SocketString + s; |
|
195 while (Length(SocketString) > 1) and (Length(SocketString) > byte(SocketString[1])) do |
|
196 begin |
|
197 ParseIPCCommand(copy(SocketString, 2, byte(SocketString[1]))); |
|
198 Delete(SocketString, 1, Succ(byte(SocketString[1]))) |
|
199 end |
|
200 end |
|
201 else |
|
202 OutError('IPC connection lost', true) |
|
203 end; |
|
204 end; |
168 end; |
205 |
169 |
206 procedure LoadRecordFromFile(fileName: shortstring); |
170 procedure LoadRecordFromFile(fileName: shortstring); |
207 var f : File; |
171 var f : File; |
208 ss : shortstring = ''; |
172 ss : shortstring = ''; |
258 end |
222 end |
259 end; |
223 end; |
260 |
224 |
261 procedure flushBuffer(); |
225 procedure flushBuffer(); |
262 begin |
226 begin |
263 if IPCSock <> nil then |
227 |
264 begin |
|
265 SDLNet_TCP_Send(IPCSock, @sendBuffer.buf, sendBuffer.count); |
|
266 flushDelayTicks:= 0; |
|
267 sendBuffer.count:= 0 |
|
268 end |
|
269 end; |
228 end; |
270 |
229 |
271 procedure SendIPC(s: shortstring); |
230 procedure SendIPC(s: shortstring); |
272 begin |
231 begin |
273 if IPCSock <> nil then |
|
274 begin |
|
275 if s[0] > #251 then |
232 if s[0] > #251 then |
276 s[0]:= #251; |
233 s[0]:= #251; |
277 |
234 |
278 SDLNet_Write16(GameTicks, @s[Succ(byte(s[0]))]); |
235 SDLNet_Write16(GameTicks, @s[Succ(byte(s[0]))]); |
279 |
236 |
280 AddFileLog('[IPC out] '+ sanitizeCharForLog(s[1])); |
237 AddFileLog('[IPC out] '+ sanitizeCharForLog(s[1])); |
281 inc(s[0], 2); |
238 inc(s[0], 2); |
282 |
239 |
283 if isSyncedCommand(s[1]) then |
240 ipcToFrontend(s) |
284 begin |
|
285 if sendBuffer.count + byte(s[0]) >= cSendBufferSize then |
|
286 flushBuffer(); |
|
287 |
|
288 Move(s, sendBuffer.buf[sendBuffer.count], byte(s[0]) + 1); |
|
289 inc(sendBuffer.count, byte(s[0]) + 1); |
|
290 |
|
291 if (s[1] = 'N') or (s[1] = '#') then |
|
292 flushBuffer(); |
|
293 end else |
|
294 SDLNet_TCP_Send(IPCSock, @s, Succ(byte(s[0]))) |
|
295 end |
|
296 end; |
241 end; |
297 |
242 |
298 procedure SendIPCRaw(p: pointer; len: Longword); |
243 procedure SendIPCRaw(p: pointer; len: Longword); |
299 begin |
244 begin |
300 if IPCSock <> nil then |
245 { if IPCSock <> nil then |
301 begin |
246 begin |
302 SDLNet_TCP_Send(IPCSock, p, len) |
247 SDLNet_TCP_Send(IPCSock, p, len) |
303 end |
248 end} |
304 end; |
249 end; |
305 |
250 |
306 procedure SendIPCXY(cmd: char; X, Y: LongInt); |
251 procedure SendIPCXY(cmd: char; X, Y: LongInt); |
307 var s: shortstring; |
252 var s: shortstring; |
308 begin |
253 begin |
309 s[0]:= #9; |
254 s[0]:= #9; |
310 s[1]:= cmd; |
255 s[1]:= cmd; |
311 SDLNet_Write32(X, @s[2]); |
256 SDLNet_Write32(X, @s[2]); |
312 SDLNet_Write32(Y, @s[6]); |
257 SDLNet_Write32(Y, @s[6]); |
313 SendIPC(s) |
258 SendIPC(s) |
314 end; |
259 end; |
315 |
260 |
316 procedure IPCWaitPongEvent; |
261 procedure IPCWaitPongEvent; |
317 begin |
262 begin |
318 isPonged:= false; |
263 isPonged:= false; |
438 end; |
383 end; |
439 |
384 |
440 procedure chFatalError(var s: shortstring); |
385 procedure chFatalError(var s: shortstring); |
441 begin |
386 begin |
442 SendIPC('E' + s); |
387 SendIPC('E' + s); |
443 // TODO: should we try to clean more stuff here? |
388 { // TODO: should we try to clean more stuff here? |
444 SDL_Quit; |
389 SDL_Quit; |
445 |
390 |
446 if IPCSock <> nil then |
391 if IPCSock <> nil then |
447 halt(HaltFatalError) |
392 halt(HaltFatalError) |
448 else |
393 else |
449 halt(HaltFatalErrorNoIPC); |
394 halt(HaltFatalErrorNoIPC);} |
450 end; |
395 end; |
451 |
396 |
452 procedure doPut(putX, putY: LongInt; fromAI: boolean); |
397 procedure doPut(putX, putY: LongInt; fromAI: boolean); |
453 begin |
398 begin |
454 if CheckNoTeamOrHH or isPaused then |
399 if CheckNoTeamOrHH or isPaused then |
496 |
441 |
497 procedure initModule; |
442 procedure initModule; |
498 begin |
443 begin |
499 RegisterVariable('fatal', @chFatalError, true ); |
444 RegisterVariable('fatal', @chFatalError, true ); |
500 |
445 |
501 IPCSock:= nil; |
|
502 |
|
503 headcmd:= nil; |
446 headcmd:= nil; |
504 lastcmd:= nil; |
447 lastcmd:= nil; |
505 isPonged:= false; |
448 isPonged:= false; |
506 SocketString:= ''; |
|
507 |
449 |
508 hiTicks:= 0; |
450 hiTicks:= 0; |
509 flushDelayTicks:= 0; |
451 flushDelayTicks:= 0; |
510 sendBuffer.count:= 0; |
452 sendBuffer.count:= 0; |
511 end; |
453 end; |
512 |
454 |
513 procedure freeModule; |
455 procedure freeModule; |
514 begin |
456 begin |
515 while headcmd <> nil do RemoveCmd; |
457 while headcmd <> nil do RemoveCmd; |
516 SDLNet_FreeSocketSet(fds); |
|
517 SDLNet_TCP_Close(IPCSock); |
|
518 SDLNet_Quit(); |
|
519 |
|
520 end; |
458 end; |
521 |
459 |
522 end. |
460 end. |