author  Periklis Ntanasis <pntanasis@gmail.com> 
Mon, 10 Jun 2013 15:18:03 +0300  
changeset 9178  c0902317c823 
parent 9175  dc3c0e44f7f3 
child 9197  e4e366013e9a 
child 9301  c5d1c8259ef4 
permissions  rwrr 
4  1 
(* 
1066  2 
* Hedgewars, a free turn based strategy game 
9080  3 
* Copyright (c) 20042013 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 

2630  19 
{$INCLUDE "options.inc"} 
20 

4  21 
unit uIO; 
22 
interface 

4376  23 
uses SDLh, uTypes; 
4  24 

3038  25 
procedure initModule; 
26 
procedure freeModule; 

2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset

27 

7026
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6982
diff
changeset

28 
procedure InitIPC; 
4  29 
procedure SendIPC(s: shortstring); 
8003  30 
procedure SendIPCXY(cmd: char; X, Y: LongInt); 
155
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
154
diff
changeset

31 
procedure SendIPCRaw(p: pointer; len: Longword); 
4  32 
procedure SendIPCAndWaitReply(s: shortstring); 
8472
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

33 
procedure FlushMessages(Lag: Longword); 
1888
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

34 
procedure LoadRecordFromFile(fileName: shortstring); 
4376  35 
procedure SendStat(sit: TStatInfoType; s: shortstring); 
159  36 
procedure IPCWaitPongEvent; 
4  37 
procedure IPCCheckSock; 
38 
procedure NetGetNextCmd; 

4414  39 
procedure doPut(putX, putY: LongInt; fromAI: boolean); 
4  40 

41 
implementation 

6247
6dfad55fd71c
unified the objc game state in a single place, which allowed some optimization to ObjcExport class (and more)
koda
parents:
5810
diff
changeset

42 
uses uConsole, uConsts, uVariables, uCommands, uUtils, uDebug; 
648
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

43 

8145
6408c0ba4ba1
Move global variables to units that use them
Joe Doyle (Ginto8) <ginto8@gmail.com>
parents:
8024
diff
changeset

44 
const 
6408c0ba4ba1
Move global variables to units that use them
Joe Doyle (Ginto8) <ginto8@gmail.com>
parents:
8024
diff
changeset

45 
cSendEmptyPacketTime = 1000; 
8472
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

46 
cSendBufferSize = 1024; 
8145
6408c0ba4ba1
Move global variables to units that use them
Joe Doyle (Ginto8) <ginto8@gmail.com>
parents:
8024
diff
changeset

47 

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

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

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

50 
Next: PCmd; 
2574
2f3e5c57359c
Fix (quite rare) spectators queue error when joining game with teams left the game.
unc0rr
parents:
2407
diff
changeset

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

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

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

54 
cmd: Char; 
8003  55 
X, Y: LongInt); 
648
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

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

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

58 

2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

59 
var IPCSock: PTCPSocket; 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

60 
fds: PSDLNet_SocketSet; 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

61 
isPonged: boolean; 
7028  62 
SocketString: shortstring; 
4  63 

2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

64 
headcmd: PCmd; 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

65 
lastcmd: PCmd; 
2382  66 

8472
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

67 
flushDelayTicks: LongWord; 
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

68 
sendBuffer: record 
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

69 
buf: array[0..Pred(cSendBufferSize)] of byte; 
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

70 
count: Word; 
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

71 
end; 
2382  72 

2574
2f3e5c57359c
Fix (quite rare) spectators queue error when joining game with teams left the game.
unc0rr
parents:
2407
diff
changeset

73 
function AddCmd(Time: Word; str: shortstring): PCmd; 
2695  74 
var command: PCmd; 
648
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

75 
begin 
2695  76 
new(command); 
77 
FillChar(command^, sizeof(TCmd), 0); 

78 
command^.loTime:= Time; 

79 
command^.str:= str; 

80 
if command^.cmd <> 'F' then dec(command^.len, 2); // cut timestamp 

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

81 
if headcmd = nil then 
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

82 
begin 
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

83 
headcmd:= command; 
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

84 
lastcmd:= command 
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

85 
end 
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

86 
else 
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

87 
begin 
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

88 
lastcmd^.Next:= command; 
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

89 
lastcmd:= command 
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

90 
end; 
2695  91 
AddCmd:= command; 
648
fc5234aa6493
Use list instead of array (no limit for network packets amount)
unc0rr
parents:
526
diff
changeset

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

93 

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

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

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

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

97 
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

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

99 
headcmd:= headcmd^.Next; 
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

100 
if headcmd = nil then 
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

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

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

103 
end; 
4  104 

105 
procedure InitIPC; 

106 
var ipaddr: TIPAddress; 

107 
begin 

4815  108 
WriteToConsole('Init SDL_Net... '); 
109 
SDLTry(SDLNet_Init = 0, true); 

110 
fds:= SDLNet_AllocSocketSet(1); 

111 
SDLTry(fds <> nil, true); 

112 
WriteLnToConsole(msgOK); 

4825  113 
WriteToConsole('Establishing IPC connection to tcp 127.0.0.1:' + IntToStr(ipcPort) + ' '); 
4815  114 
{$HINTS OFF} 
6898  115 
SDLTry(SDLNet_ResolveHost(ipaddr, PChar('127.0.0.1'), ipcPort) = 0, true); 
4815  116 
{$HINTS ON} 
117 
IPCSock:= SDLNet_TCP_Open(ipaddr); 

118 
SDLTry(IPCSock <> nil, true); 

119 
WriteLnToConsole(msgOK) 

4  120 
end; 
121 

122 
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

123 
var loTicks: Word; 
4  124 
begin 
125 
case s[1] of 

4900  126 
'!': begin AddFileLog('Ping? Pong!'); isPonged:= true; end; 
7068  127 
'?': SendIPC(_S'!'); 
351  128 
'e': ParseCommand(copy(s, 2, Length(s)  1), true); 
4  129 
'E': OutError(copy(s, 2, Length(s)  1), true); 
130 
'W': OutError(copy(s, 2, Length(s)  1), false); 

4389  131 
'M': ParseCommand('landcheck ' + s, true); 
8243  132 
'o': if fastUntilLag then ParseCommand('forcequit', true); 
4  133 
'T': case s[2] of 
134 
'L': GameType:= gmtLocal; 

135 
'D': GameType:= gmtDemo; 

136 
'N': GameType:= gmtNet; 

72  137 
'S': GameType:= gmtSave; 
7180  138 
'V': GameType:= gmtRecord; 
4  139 
else OutError(errmsgIncorrectUse + ' IPC "T" :' + s[2], true) end; 
7201
dc17ffdf0702
The first campaign commit with a lot of changes...
belphegorr <szabibibi@gmail.com>
parents:
7103
diff
changeset

140 
'V': begin 
dc17ffdf0702
The first campaign commit with a lot of changes...
belphegorr <szabibibi@gmail.com>
parents:
7103
diff
changeset

141 
if s[2] = '.' then 
dc17ffdf0702
The first campaign commit with a lot of changes...
belphegorr <szabibibi@gmail.com>
parents:
7103
diff
changeset

142 
ParseCommand('campvar ' + copy(s, 3, length(s)  2), true); 
dc17ffdf0702
The first campaign commit with a lot of changes...
belphegorr <szabibibi@gmail.com>
parents:
7103
diff
changeset

143 
end 
4  144 
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

145 
loTicks:= SDLNet_Read16(@s[byte(s[0])  1]); 
2574
2f3e5c57359c
Fix (quite rare) spectators queue error when joining game with teams left the game.
unc0rr
parents:
2407
diff
changeset

146 
AddCmd(loTicks, s); 
8498
eecadca7db50
Bring back full log strings for commands, just a bit sanitized
unc0rr
parents:
8472
diff
changeset

147 
AddFileLog('[IPC in] ' + sanitizeCharForLog(s[1]) + ' ticks ' + IntToStr(lastcmd^.loTime)); 
4  148 
end 
149 
end; 

150 

151 
procedure IPCCheckSock; 

371  152 
var i: LongInt; 
6453
11c578d30bd3
Countless imporvements to the parser and countless help to the parser in sources.
unc0rr
parents:
6247
diff
changeset

153 
s: shortstring; 
4  154 
begin 
6982  155 
if IPCSock = nil then 
156 
exit; 

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

157 

6982  158 
fds^.numsockets:= 0; 
159 
SDLNet_AddSocket(fds, IPCSock); 

4  160 

6982  161 
while SDLNet_CheckSockets(fds, 0) > 0 do 
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

162 
begin 
6982  163 
i:= SDLNet_TCP_Recv(IPCSock, @s[1], 255  Length(SocketString)); 
164 
if i > 0 then 

2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

165 
begin 
6982  166 
s[0]:= char(i); 
167 
SocketString:= SocketString + s; 

168 
while (Length(SocketString) > 1) and (Length(SocketString) > byte(SocketString[1])) do 

2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

169 
begin 
6982  170 
ParseIPCCommand(copy(SocketString, 2, byte(SocketString[1]))); 
171 
Delete(SocketString, 1, Succ(byte(SocketString[1]))) 

2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

172 
end 
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

173 
end 
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

174 
else 
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

175 
OutError('IPC connection lost', true) 
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

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

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

178 

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

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

180 
var f: file; 
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

181 
ss: shortstring = ''; 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

182 
i: LongInt; 
6453
11c578d30bd3
Countless imporvements to the parser and countless help to the parser in sources.
unc0rr
parents:
6247
diff
changeset

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

184 
begin 
2630  185 

186 
// set RDNLY on file open 

187 
filemode:= 0; 

5130
3602ede67ec5
Add a parameter for game simulation with no gui/sound enabled, just to get statistics
unc0rr
parents:
4976
diff
changeset

188 
{$I} 
1888
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

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

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

191 

5130
3602ede67ec5
Add a parameter for game simulation with no gui/sound enabled, just to get statistics
unc0rr
parents:
4976
diff
changeset

192 
tryDo(IOResult = 0, 'Error opening file ' + fileName, true); 
3602ede67ec5
Add a parameter for game simulation with no gui/sound enabled, just to get statistics
unc0rr
parents:
4976
diff
changeset

193 

3407  194 
i:= 0; // avoid compiler hints 
6453
11c578d30bd3
Countless imporvements to the parser and countless help to the parser in sources.
unc0rr
parents:
6247
diff
changeset

195 
s[0]:= #0; 
1888
e76274ce7365
Add an ability to run engine without IPC connection.
unc0rr
parents:
1821
diff
changeset

196 
repeat 
6453
11c578d30bd3
Countless imporvements to the parser and countless help to the parser in sources.
unc0rr
parents:
6247
diff
changeset

197 
BlockRead(f, s[1], 255  Length(ss), i); 
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

198 
if i > 0 then 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

199 
begin 
6453
11c578d30bd3
Countless imporvements to the parser and countless help to the parser in sources.
unc0rr
parents:
6247
diff
changeset

200 
s[0]:= char(i); 
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

201 
ss:= ss + s; 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

202 
while (Length(ss) > 1)and(Length(ss) > byte(ss[1])) do 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

203 
begin 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

204 
ParseIPCCommand(copy(ss, 2, byte(ss[1]))); 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

205 
Delete(ss, 1, Succ(byte(ss[1]))) 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

206 
end 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

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

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

209 

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

210 
close(f) 
5130
3602ede67ec5
Add a parameter for game simulation with no gui/sound enabled, just to get statistics
unc0rr
parents:
4976
diff
changeset

211 
{$I+} 
4  212 
end; 
213 

4376  214 
procedure SendStat(sit: TStatInfoType; s: shortstring); 
9178
c0902317c823
created a new sendstat type for changing the kills label
Periklis Ntanasis <pntanasis@gmail.com>
parents:
9175
diff
changeset

215 
const stc: array [TStatInfoType] of char = ('r', 'D', 'k', 'K', 'H', 'T', 'P', 's', 'S', 'B', 'c', 'g', 'p'); 
4376  216 
var buf: shortstring; 
217 
begin 

218 
buf:= 'i' + stc[sit] + s; 

219 
SendIPCRaw(@buf[0], length(buf) + 1) 

220 
end; 

221 

8472
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

222 
function isSyncedCommand(c: char): boolean; 
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

223 
begin 
8620
6787f745da50
Review the list of synced messages in isSyncedCommand. Fixes issue 546.
unc0rr
parents:
8545
diff
changeset

224 
isSyncedCommand:= (c in ['+', '#', 'L', 'l', 'R', 'r', 'U', 'u', 'D', 'd', 'Z', 'z', 'A', 'a', 'S', 'j', 'J', ',', 'c', 'N', 'p', 'P', 'w', 't', '1', '2', '3', '4', '5']) or ((c >= #128) and (c <= char(128 + cMaxSlotIndex))) 
8472
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

225 
end; 
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

226 

da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

227 
procedure flushBuffer(); 
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

228 
begin 
8645  229 
if IPCSock <> nil then 
230 
begin 

231 
SDLNet_TCP_Send(IPCSock, @sendBuffer.buf, sendBuffer.count); 

232 
flushDelayTicks:= 0; 

233 
sendBuffer.count:= 0 

234 
end 

8472
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

235 
end; 
4377  236 

4  237 
procedure SendIPC(s: shortstring); 
238 
begin 

49  239 
if IPCSock <> nil then 
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

240 
begin 
8472
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

241 
if s[0] > #251 then 
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

242 
s[0]:= #251; 
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

243 

2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

244 
SDLNet_Write16(GameTicks, @s[Succ(byte(s[0]))]); 
8498
eecadca7db50
Bring back full log strings for commands, just a bit sanitized
unc0rr
parents:
8472
diff
changeset

245 

eecadca7db50
Bring back full log strings for commands, just a bit sanitized
unc0rr
parents:
8472
diff
changeset

246 
AddFileLog('[IPC out] '+ sanitizeCharForLog(s[1])); 
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

247 
inc(s[0], 2); 
8472
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

248 

da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

249 
if isSyncedCommand(s[1]) then 
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

250 
begin 
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

251 
if sendBuffer.count + byte(s[0]) >= cSendBufferSize then 
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

252 
flushBuffer(); 
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

253 

da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

254 
Move(s, sendBuffer.buf[sendBuffer.count], byte(s[0]) + 1); 
8543  255 
inc(sendBuffer.count, byte(s[0]) + 1); 
256 

8545
1385ab7219d9
Oh, and # too to prevent occasional game hang when N is followed by #
unc0rr
parents:
8543
diff
changeset

257 
if (s[1] = 'N') or (s[1] = '#') then 
8543  258 
flushBuffer(); 
8472
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

259 
end else 
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

260 
SDLNet_TCP_Send(IPCSock, @s, Succ(byte(s[0]))) 
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

261 
end 
4  262 
end; 
263 

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

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

265 
begin 
208  266 
if IPCSock <> nil then 
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

267 
begin 
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

268 
SDLNet_TCP_Send(IPCSock, p, len) 
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

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

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

271 

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

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

274 
begin 
8024  275 
s[0]:= #9; 
154
5667e6f38704
Network protocol uses integers in network byte order
unc0rr
parents:
112
diff
changeset

276 
s[1]:= cmd; 
8003  277 
SDLNet_Write32(X, @s[2]); 
8024  278 
SDLNet_Write32(Y, @s[6]); 
154
5667e6f38704
Network protocol uses integers in network byte order
unc0rr
parents:
112
diff
changeset

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

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

281 

159  282 
procedure IPCWaitPongEvent; 
4  283 
begin 
284 
isPonged:= false; 

285 
repeat 

6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

286 
IPCCheckSock; 
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

287 
SDL_Delay(1) 
4  288 
until isPonged 
289 
end; 

290 

159  291 
procedure SendIPCAndWaitReply(s: shortstring); 
292 
begin 

293 
SendIPC(s); 

7068  294 
SendIPC(_S'?'); 
159  295 
IPCWaitPongEvent 
296 
end; 

297 

8472
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

298 
procedure FlushMessages(Lag: Longword); 
2382  299 
begin 
8472
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

300 
inc(flushDelayTicks, Lag); 
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

301 
if (flushDelayTicks >= cSendEmptyPacketTime) then 
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

302 
begin 
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

303 
if sendBuffer.count = 0 then 
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

304 
SendIPC(_S'+'); 
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

305 

da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

306 
flushBuffer() 
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

307 
end 
2382  308 
end; 
309 

4  310 
procedure NetGetNextCmd; 
311 
var tmpflag: boolean; 

2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

312 
s: shortstring; 
8003  313 
x32, y32: LongInt; 
4  314 
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

315 
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

316 

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

317 
while (headcmd <> nil) 
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

318 
and (tmpflag or (headcmd^.cmd = '#')) // '#' is the only cmd which can be sent within same tick after 'N' 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

319 
and ((GameTicks = hiTicks shl 16 + headcmd^.loTime) 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

320 
or (headcmd^.cmd = 's') // for these commands time is not specified 
4467  321 
or (headcmd^.cmd = 'h') // seems the hedgewars protocol does not allow remote synced commands 
5810  322 
or (headcmd^.cmd = '#') // must be synced for saves to work 
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

323 
or (headcmd^.cmd = 'b') 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

324 
or (headcmd^.cmd = 'F')) do 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

325 
begin 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

326 
case headcmd^.cmd of 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

327 
'+': ; // do nothing  it is just an empty packet 
5810  328 
'#': begin 
329 
AddFileLog('hiTicks increment by remote message'); 

330 
inc(hiTicks); 

331 
end; 

2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

332 
'L': ParseCommand('+left', true); 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

333 
'l': ParseCommand('left', true); 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

334 
'R': ParseCommand('+right', true); 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

335 
'r': ParseCommand('right', true); 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

336 
'U': ParseCommand('+up', true); 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

337 
'u': ParseCommand('up', true); 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

338 
'D': ParseCommand('+down', true); 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

339 
'd': ParseCommand('down', true); 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

340 
'Z': ParseCommand('+precise', true); 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

341 
'z': ParseCommand('precise', true); 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

342 
'A': ParseCommand('+attack', true); 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

343 
'a': ParseCommand('attack', true); 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

344 
'S': ParseCommand('switch', true); 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

345 
'j': ParseCommand('ljump', true); 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

346 
'J': ParseCommand('hjump', true); 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

347 
',': ParseCommand('skip', true); 
4531
4ea193b0e378
Reenable ReadyTimer using a synced message NEEDS TESTING.
nemo
parents:
4522
diff
changeset

348 
'c': begin 
4ea193b0e378
Reenable ReadyTimer using a synced message NEEDS TESTING.
nemo
parents:
4522
diff
changeset

349 
s:= copy(headcmd^.str, 2, Pred(headcmd^.len)); 
4ea193b0e378
Reenable ReadyTimer using a synced message NEEDS TESTING.
nemo
parents:
4522
diff
changeset

350 
ParseCommand('gencmd ' + s, true); 
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

351 
end; 
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

352 
's': begin 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

353 
s:= copy(headcmd^.str, 2, Pred(headcmd^.len)); 
4409  354 
ParseCommand('chatmsg ' + s, true); 
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

355 
WriteLnToConsole(s) 
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

356 
end; 
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

357 
'b': begin 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

358 
s:= copy(headcmd^.str, 2, Pred(headcmd^.len)); 
6453
11c578d30bd3
Countless imporvements to the parser and countless help to the parser in sources.
unc0rr
parents:
6247
diff
changeset

359 
ParseCommand('chatmsg ' + #4 + s, true); 
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

360 
WriteLnToConsole(s) 
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

361 
end; 
4404  362 
// TODO: deprecate 'F' 
363 
'F': ParseCommand('teamgone ' + copy(headcmd^.str, 2, Pred(headcmd^.len)), true); 

2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

364 
'N': begin 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

365 
tmpflag:= false; 
7103  366 
lastTurnChecksum:= SDLNet_Read32(@headcmd^.str[2]); 
4900  367 
AddFileLog('got cmd "N": time '+IntToStr(hiTicks shl 16 + headcmd^.loTime)) 
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

368 
end; 
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

369 
'p': begin 
8003  370 
x32:= SDLNet_Read32(@(headcmd^.X)); 
371 
y32:= SDLNet_Read32(@(headcmd^.Y)); 

372 
doPut(x32, y32, false) 

6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

373 
end; 
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

374 
'P': begin 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

375 
// these are equations solved for CursorPoint 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

376 
// SDLNet_Read16(@(headcmd^.X)) == CursorPoint.X  WorldDx; 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

377 
// SDLNet_Read16(@(headcmd^.Y)) == cScreenHeight  CursorPoint.Y  WorldDy; 
8373
209c9ba77a09
Prevent camera from moving with auto camera disabled when remote teams are targetting
nemo
parents:
8243
diff
changeset

378 
if CurrentTeam^.ExtDriven then 
2969
79024988792e
This *should* solve issue w/ cursor moving around in ammo menu while not your turn NEEDS TESTING, changing uIO makes me nervous
nemo
parents:
2948
diff
changeset

379 
begin 
8373
209c9ba77a09
Prevent camera from moving with auto camera disabled when remote teams are targetting
nemo
parents:
8243
diff
changeset

380 
TargetCursorPoint.X:= LongInt(SDLNet_Read32(@(headcmd^.X))) + WorldDx; 
209c9ba77a09
Prevent camera from moving with auto camera disabled when remote teams are targetting
nemo
parents:
8243
diff
changeset

381 
TargetCursorPoint.Y:= cScreenHeight  LongInt(SDLNet_Read32(@(headcmd^.Y)))  WorldDy; 
209c9ba77a09
Prevent camera from moving with auto camera disabled when remote teams are targetting
nemo
parents:
8243
diff
changeset

382 
if not bShowAmmoMenu and autoCameraOn then 
209c9ba77a09
Prevent camera from moving with auto camera disabled when remote teams are targetting
nemo
parents:
8243
diff
changeset

383 
CursorPoint:= TargetCursorPoint 
2969
79024988792e
This *should* solve issue w/ cursor moving around in ammo menu while not your turn NEEDS TESTING, changing uIO makes me nervous
nemo
parents:
2948
diff
changeset

384 
end 
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

385 
end; 
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

386 
'w': ParseCommand('setweap ' + headcmd^.str[2], true); 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

387 
't': ParseCommand('taunt ' + headcmd^.str[2], true); 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

388 
'h': ParseCommand('hogsay ' + copy(headcmd^.str, 2, Pred(headcmd^.len)), true); 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

389 
'1'..'5': ParseCommand('timer ' + headcmd^.cmd, true); 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

390 
else 
6876
f588dfc27da3
Unbreak build (change was only tested with pas2c parser, and was okay to it)
unc0rr
parents:
6874
diff
changeset

391 
if (headcmd^.cmd >= #128) and (headcmd^.cmd <= char(128 + cMaxSlotIndex)) then 
6874  392 
ParseCommand('slot ' + char(byte(headcmd^.cmd)  79), true) 
393 
else 

394 
OutError('Unexpected protocol command: ' + headcmd^.cmd, True) 

2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

395 
end; 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

396 
RemoveCmd 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

397 
end; 
351  398 

2574
2f3e5c57359c
Fix (quite rare) spectators queue error when joining game with teams left the game.
unc0rr
parents:
2407
diff
changeset

399 
if (headcmd <> nil) and tmpflag and (not CurrentTeam^.hasGone) then 
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

400 
TryDo(GameTicks < hiTicks shl 16 + headcmd^.loTime, 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

401 
'oops, queue error. in buffer: ' + headcmd^.cmd + 
4374  402 
' (' + IntToStr(GameTicks) + ' > ' + 
403 
IntToStr(hiTicks shl 16 + headcmd^.loTime) + ')', 

2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

404 
true); 
4  405 

2066  406 
isInLag:= (headcmd = nil) and tmpflag and (not CurrentTeam^.hasGone); 
2043
1f2b91b5e7ef
Don't accept 'team gone' command right after 'next turn' cmd
unc0rr
parents:
2017
diff
changeset

407 

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

408 
if isInLag then fastUntilLag:= false 
4  409 
end; 
410 

4403  411 
procedure chFatalError(var s: shortstring); 
412 
begin 

413 
SendIPC('E' + s); 

414 
end; 

415 

4414  416 
procedure doPut(putX, putY: LongInt; fromAI: boolean); 
417 
begin 

6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

418 
if CheckNoTeamOrHH or isPaused then 
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

419 
exit; 
4414  420 
bShowFinger:= false; 
421 
if not CurrentTeam^.ExtDriven and bShowAmmoMenu then 

422 
begin 

423 
bSelected:= true; 

424 
exit 

425 
end; 

426 

427 
with CurrentHedgehog^.Gear^, 

428 
CurrentHedgehog^ do 

429 
if (State and gstHHChooseTarget) <> 0 then 

430 
begin 

431 
isCursorVisible:= false; 

432 
if not CurrentTeam^.ExtDriven then 

433 
begin 

434 
if fromAI then 

435 
begin 

436 
TargetPoint.X:= putX; 

437 
TargetPoint.Y:= putY 

6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

438 
end 
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset

439 
else 
4414  440 
begin 
441 
TargetPoint.X:= CursorPoint.X  WorldDx; 

442 
TargetPoint.Y:= cScreenHeight  CursorPoint.Y  WorldDy; 

443 
end; 

444 
SendIPCXY('p', TargetPoint.X, TargetPoint.Y); 

445 
end 

446 
else 

447 
begin 

448 
TargetPoint.X:= putX; 

449 
TargetPoint.Y:= putY 

450 
end; 

4900  451 
AddFileLog('put: ' + inttostr(TargetPoint.X) + ', ' + inttostr(TargetPoint.Y)); 
7426
55b49cc1f33a
Changes for the benefit of pas2c. Use downto in for loops to avoid repeated calls of Random/GetRandom. Wrap nots.
nemo
parents:
7103
diff
changeset

452 
State:= State and (not gstHHChooseTarget); 
4414  453 
if (Ammoz[CurAmmoType].Ammo.Propz and ammoprop_AttackingPut) <> 0 then 
4522
0f590eefd531
Add an input mask for setting of gear messages. Intended for intercepting user messages. This is totally untested. I don't think it should desync but seriously needs a lot of testing. Esp the doPut behaviour.
nemo
parents:
4467
diff
changeset

454 
Message:= Message or (gmAttack and InputMask); 
4414  455 
end 
456 
else 

457 
if CurrentTeam^.ExtDriven then 

458 
OutError('got /put while not being in choose target mode', false) 

459 
end; 

460 

3038  461 
procedure initModule; 
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2695
diff
changeset

462 
begin 
6898  463 
RegisterVariable('fatal', @chFatalError, true ); 
4403  464 

2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

465 
IPCSock:= nil; 
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2695
diff
changeset

466 

2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

467 
headcmd:= nil; 
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

468 
lastcmd:= nil; 
6982  469 
isPonged:= false; 
470 
SocketString:= ''; 

471 

2948
3f21a9dc93d0
Replace tabs with spaces using 'expand t 4' command
unc0rr
parents:
2905
diff
changeset

472 
hiTicks:= 0; 
8472
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

473 
flushDelayTicks:= 0; 
da6b569ac930
 Collect synced packets to send within 1 second (cSendEmptyPacketTime) into buffer which is flushed each second.
unc0rr
parents:
8373
diff
changeset

474 
sendBuffer.count:= 0; 
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset

475 
end; 
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset

476 

3038  477 
procedure freeModule; 
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset

478 
begin 
7026
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6982
diff
changeset

479 
while headcmd <> nil do RemoveCmd; 
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6982
diff
changeset

480 
SDLNet_FreeSocketSet(fds); 
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6982
diff
changeset

481 
SDLNet_TCP_Close(IPCSock); 
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6982
diff
changeset

482 
SDLNet_Quit(); 
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2695
diff
changeset

483 
end; 
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2695
diff
changeset

484 

4  485 
end. 