# HG changeset patch # User unc0rr # Date 1450041843 -10800 # Node ID 3c5d99013baf533800af3975017c6d88bc78b95b # Parent e7c7ca0c1556118896da118c681585b9b3459817 - Improve IPC handling in engine - Handle EM protocol command - Some fixes for net game diff -r e7c7ca0c1556 -r 3c5d99013baf hedgewars/uFLGameConfig.pas --- a/hedgewars/uFLGameConfig.pas Sat Dec 12 23:42:40 2015 +0300 +++ b/hedgewars/uFLGameConfig.pas Mon Dec 14 00:24:03 2015 +0300 @@ -68,7 +68,9 @@ ipcToEngine('e$template_filter ' + intToStr(template)); ipcToEngine('e$feature_size ' + intToStr(featureSize)); end; - gtLocal, gtNet: begin +gtLocal, gtNet: begin + if gameType = gtNet then + ipcToEngine('TN'); if script <> 'Normal' then ipcToEngine('escript ' + getScriptPath(script)); ipcToEngine('eseed ' + seed); @@ -235,6 +237,7 @@ c:= getUnusedColor; teams[i]:= team^; + teams[i].extDriven:= false; if i = 0 then hn:= 4 else hn:= teams[i - 1].hogsNumber; if hn > 48 - hedgehogsNumber then hn:= 48 - hedgehogsNumber; diff -r e7c7ca0c1556 -r 3c5d99013baf hedgewars/uFLIPC.pas --- a/hedgewars/uFLIPC.pas Sat Dec 12 23:42:40 2015 +0300 +++ b/hedgewars/uFLIPC.pas Mon Dec 14 00:24:03 2015 +0300 @@ -17,7 +17,7 @@ procedure ipcToFrontend(s: shortstring); procedure ipcToFrontendRaw(p: pointer; len: Longword); -function ipcReadFromFrontend: shortstring; +function ipcReadFromFrontend: TIPCMessage; function ipcCheckFromFrontend: boolean; procedure registerIPCCallback(p: pointer; f: TIPCCallback); @@ -212,9 +212,9 @@ ipcReadFromEngine:= ipcRead(queueFrontend) end; -function ipcReadFromFrontend: shortstring; +function ipcReadFromFrontend: TIPCMessage; begin - ipcReadFromFrontend:= ipcRead(queueEngine).str + ipcReadFromFrontend:= ipcRead(queueEngine) end; function ipcReadToNet: TIPCMessage; diff -r e7c7ca0c1556 -r 3c5d99013baf hedgewars/uFLNet.pas --- a/hedgewars/uFLNet.pas Sat Dec 12 23:42:40 2015 +0300 +++ b/hedgewars/uFLNet.pas Mon Dec 14 00:24:03 2015 +0300 @@ -221,7 +221,7 @@ @handler_SL, @handler_, @handler_S, @handler_MS, @handler_MS, @handler_SS, @handler_L, @handler_ML, @handler__i, @handler_SMS, @handler_SL, @handler_S, @handler_i, @handler_S, @handler_S, @handler_MS, @handler_i, @handler_i, - @handler_S, @handler_ML, @handler_i, @handler_L, @handler_SL, @handler_SL, + @handler_S, @handler_MS, @handler_i, @handler_L, @handler_SL, @handler_SL, @handler_MS, @handler_S, @handler_MS); procedure handleTail; diff -r e7c7ca0c1556 -r 3c5d99013baf hedgewars/uFLNetProtocol.pas --- a/hedgewars/uFLNetProtocol.pas Sat Dec 12 23:42:40 2015 +0300 +++ b/hedgewars/uFLNetProtocol.pas Mon Dec 14 00:24:03 2015 +0300 @@ -10,7 +10,7 @@ procedure ResetNetState; implementation -uses uFLNetTypes, uFLTypes, uFLUICallback, uFLNet, uFLGameConfig, uFLUtils; +uses uFLNetTypes, uFLTypes, uFLUICallback, uFLNet, uFLGameConfig, uFLUtils, uFLIPC, uUtils; type PHandler = procedure (var t: TCmdData); @@ -53,10 +53,10 @@ , @tmpTeam.hedgehogs[7].name , @tmpTeam.hedgehogs[7].hat ); + procedure handler_ADD_TEAM(var p: TCmdParam); begin teamIndex:= 0; - tmpTeam.extDriven:= true; tmpTeam.color:= 0 end; @@ -317,8 +317,19 @@ begin end; -procedure handler_EM_s(var s: TCmdParamS); +procedure handler_EM_s(var p: TCmdParamL); +var i, l: Longword; + s: shortstring; begin + i:= 1; + l:= length(p.str1); + + while i < l do + begin + s:= DecodeBase64(copy(p.str1, i, 240)); + ipcToEngineRaw(@s[0], byte(s[0])); + inc(i, 160) + end; end; procedure handler_ERROR(var p: TCmdParamL); @@ -411,7 +422,7 @@ procedure handler_PROTO(var p: TCmdParami); begin - writeln('Protocol ', p.param1) + //writeln('Protocol ', p.param1) end; procedure handler_REMOVE_TEAM(var p: TCmdParamS); diff -r e7c7ca0c1556 -r 3c5d99013baf hedgewars/uFLTeams.pas --- a/hedgewars/uFLTeams.pas Sat Dec 12 23:42:40 2015 +0300 +++ b/hedgewars/uFLTeams.pas Mon Dec 14 00:24:03 2015 +0300 @@ -51,10 +51,12 @@ with team do begin ipcToEngine('eaddteam ' + colorsSet[color] + ' ' + teamName); + if extDriven then + ipcToEngine('rdriven'); for i:= 0 to Pred(hogsNumber) do begin - ipcToEngine('eaddhh ' + inttostr(botLevel) + ' 100 hog');// + hedgehogs[i].name); - //ipcToEngine('ehat ' + hedgehogs[i].hat); + ipcToEngine('eaddhh ' + inttostr(botLevel) + ' 100 ' + hedgehogs[i].name); + ipcToEngine('ehat ' + hedgehogs[i].hat); end; end end; diff -r e7c7ca0c1556 -r 3c5d99013baf hedgewars/uIO.pas --- a/hedgewars/uIO.pas Sat Dec 12 23:42:40 2015 +0300 +++ b/hedgewars/uIO.pas Mon Dec 14 00:24:03 2015 +0300 @@ -38,7 +38,7 @@ procedure doPut(putX, putY: LongInt; fromAI: boolean); implementation -uses uConsole, uConsts, uVariables, uCommands, uUtils, uDebug, uFLIPC; +uses uFLIPC, uFLTypes, uConsole, uConsts, uVariables, uCommands, uUtils, uDebug; const cSendEmptyPacketTime = 1000; @@ -56,11 +56,12 @@ var isPonged: boolean; - + headcmd: PCmd; lastcmd: PCmd; flushDelayTicks: LongWord; + SocketString: shortstring; sendBuffer: record buf: array[0..Pred(cSendBufferSize)] of byte; count: Word; @@ -156,9 +157,37 @@ end; procedure IPCCheckSock; +var i, t: LongInt; + msg: TIPCMessage; begin while ipcCheckFromFrontend() do - ParseIPCCommand(ipcReadFromFrontend()) + begin + msg:= ipcReadFromFrontend(); + if msg.str[0] > #0 then + ParseIPCCommand(msg.str) + else begin + i:= 0; + while (i < msg.len) do + begin + if LongInt(SocketString[0]) + msg.len - i > 255 then + t:= 255 - byte(SocketString[0]) + else + t:= msg.len - i; + + Move(PByteArray(msg.buf)^[i], SocketString[byte(SocketString[0]) + 1], t); + inc(byte(SocketString[0]), t); + inc(i, t); + + while byte(SocketString[0]) > byte(SocketString[1]) do + begin + ParseIPCCommand(copy(SocketString, 2, byte(SocketString[1]))); + Delete(SocketString, 1, Succ(byte(SocketString[1]))) + end; + end; + + FreeMem(msg.buf, msg.len) + end + end end; procedure LoadRecordFromFile(fileName: shortstring); @@ -441,6 +470,7 @@ headcmd:= nil; lastcmd:= nil; isPonged:= false; + SocketString:= ''; hiTicks:= 0; flushDelayTicks:= 0; diff -r e7c7ca0c1556 -r 3c5d99013baf qmlFrontend/qml/qmlFrontend/Lobby.qml --- a/qmlFrontend/qml/qmlFrontend/Lobby.qml Sat Dec 12 23:42:40 2015 +0300 +++ b/qmlFrontend/qml/qmlFrontend/Lobby.qml Mon Dec 14 00:24:03 2015 +0300 @@ -4,10 +4,10 @@ Rectangle { ListView { id: roomsList - x: 20 - y: 0 - width: parent.width - height: parent.height - x + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: lobbyChat.top focus: true clip: true @@ -93,10 +93,11 @@ Chat { id: lobbyChat; - x: 0; - y: 300; - width: parent.width; - height: parent.height - y; + height: 300 + anchors.top: undefined + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom Connections { target: HWEngine diff -r e7c7ca0c1556 -r 3c5d99013baf tools/protocolParser.hs --- a/tools/protocolParser.hs Sat Dec 12 23:42:40 2015 +0300 +++ b/tools/protocolParser.hs Mon Dec 14 00:24:03 2015 +0300 @@ -109,7 +109,7 @@ , cmd1 "CFG~SCRIPT" SS , cmd1 "CFG~DRAWNMAP" LS , cmd2 "CFG~AMMO" SS LS - , cmd1 "CFG~FULLMAPCONFIG" $ Many [LS] + , cmd1 "CFG~FULLMAPCONFIG" $ Many [SS] ] hasMany = any isMany