# HG changeset patch # User unc0rr # Date 1451664899 -10800 # Node ID b0c34402038c3078ca314e73106b089db6fd93cc # Parent 33a0e3a14ddcb6f28a0c8c75b60be8aa51abaf76 Handle drawn maps from net diff -r 33a0e3a14ddc -r b0c34402038c hedgewars/uFLDrawnMap.pas --- a/hedgewars/uFLDrawnMap.pas Sat Dec 26 22:29:57 2015 +0300 +++ b/hedgewars/uFLDrawnMap.pas Fri Jan 01 19:14:59 2016 +0300 @@ -1,13 +1,58 @@ unit uFLDrawnMap; interface +uses SDLh; -function decodeDrawnMap(data: ansistring): ansistring; +procedure decodeDrawnMap(data: ansistring; dataSize: Longword; var mapData: PByteArray; var size: Longword); implementation -uses uUtils; +uses uUtils, zlib; + +procedure decodeDrawnMap(data: ansistring; dataSize: Longword; var mapData: PByteArray; var size: Longword); +var i, cl: Longword; + ul: uLong; + s: shortstring; + r: LongInt; + compressedBuf, uncompressedData: PByteArray; +begin + if dataSize = 0 then + begin + mapData:= nil; + size:= 0; + exit; + end; + + compressedBuf:= GetMem(dataSize * 3 div 4); + cl:= 0; + i:= 1; -function decodeDrawnMap(data: ansistring): ansistring; -begin + while i < dataSize do + begin + if dataSize - i > 240 then + s:= copy(data, i, 240) + else + s:= copy(data, i, dataSize - i + 1); + + s:= DecodeBase64(s); + Move(s[1], compressedBuf^[cl], byte(s[0])); + inc(i, 240); + inc(cl, byte(s[0])); + end; + + ul:= SDLNet_Read32(compressedBuf); + uncompressedData:= GetMem(ul); + r:= uncompress(pBytef(uncompressedData), @ul, @(compressedBuf^[4]), cl - 4); + FreeMem(compressedBuf, dataSize * 3 div 4); + + if r = Z_OK then + begin + mapData:= uncompressedData; + size:= ul + end else + begin + FreeMem(uncompressedData, ul); + mapData:= nil; + size:= 0 + end; end; end. diff -r 33a0e3a14ddc -r b0c34402038c hedgewars/uFLGameConfig.pas --- a/hedgewars/uFLGameConfig.pas Sat Dec 26 22:29:57 2015 +0300 +++ b/hedgewars/uFLGameConfig.pas Fri Jan 01 19:14:59 2016 +0300 @@ -42,7 +42,8 @@ implementation uses uFLIPC, uFLUtils, uFLTeams, uFLThemes, uFLSChemes, uFLAmmo - , uFLUICallback, uFLRunQueue, uFLNet, uUtils; + , uFLUICallback, uFLRunQueue, uFLNet, uUtils, uFLDrawnMap + , SDLh; var currentConfig: TGameConfig; @@ -55,20 +56,32 @@ procedure sendDrawnMap(config: PGameConfig); var i: Longword; + data: PByteArray; + dataLen: Longword; s: shortstring; begin - i:= 1; + decodeDrawnMap(config^.drawnData, config^.drawnDataSize, data, dataLen); - while i < config^.drawnDataSize do + i:= 0; + + s[0]:= #240; + while i < dataLen do begin - if config^.drawnDataSize - i > 240 then - s:= copy(config^.drawnData, i, 240) - else - s:= copy(config^.drawnData, i, config^.drawnDataSize - i); - system.writeln('[DRAWN MAP] ', s); - ipcToEngine('edraw ' + DecodeBase64(s)); + if dataLen - i > 240 then + begin + Move(data^[i], s[1], 240) + end else + begin + Move(data^[i], s[1], dataLen - i); + s[0]:= char(dataLen - i) + end; + + ipcToEngine('edraw ' + s); inc(i, 240) end; + + if dataLen > 0 then + FreeMem(data, dataLen); end; procedure sendConfig(config: PGameConfig);