1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127:
| uses Zlib;
function GetNumFromBuffer(src,numbytes, i : integer) : integer; var j : integer; begin case numbytes of 1 : j := ord(outbuf[i]); 2 : j := ord(outbuf[i]) + 256* ord(outbuf[i+1]); 3 : j := ord(outbuf[i]) + 256* ord(outbuf[i+1])+ 256*256*ord(outbuf[i+2]); 4 : begin if (ord(outbuf[i]) = 255) and (ord(outbuf[i+1]) = 255) and (ord(outbuf[i+2]) = 255) and (ord(outbuf[i+3]) = 255) then j := -1 else begin j := ord(outbuf[i]) + 256* ord(outbuf[i+1]) + 256*256*(ord(outbuf[i+2])); j := j + 256*256*256* ord(outbuf[i+3]); end; end; end; Result := j end;
procedure TUserMap.DecompressSave(var s : string); var ffile : file; attr,i,j,fsize,app : integer; ok,isAddon : boolean; t,temp : string; InputStream, OutputStream : TFileStream; DeCompressionStream : TDeCompressionStream; Buffer : array[0..65535] of char; q : integer;
procedure GetGameFlag; var i,j : integer; begin IsSpecSave :=false; i := 0; j := GetNumFromBuffer(1,4, i); if j = 6619218 then IsSpecSave := true; end;
procedure RemoveHeader; var j : integer; v : string; begin AssignFile(ffile,s); Reset(ffile, 1); fSize := FileSize(ffile); if fSize > High(inbuf) then SetLength(inbuf, fSize); BlockRead(ffile,inbuf[0],fSize); CloseFile(ffile); j := 0; GetGameFlag; if IsSpecSave then begin Memo1.Lines.Add('Special file - removed header blocks'); j := 1048; IsAddon := true; end else begin BufMoveTo(1,50,'ZZZZ',j); isAddon := (j>1); end; temp := ChangeFileExt(s,'.tmp'); AssignFile(ffile,temp); Rewrite(ffile,1); if isAddon then begin app := 0; if IsSpecSave then begin BufMoveTo(1,fsize,'<m_NetIsHost>',app); app := app - 556; BlockWrite(ffile,inbuf[j+8],app-j-8,app); Memo1.Lines.Add('Version 1.02 save - removed uncompressed bytes'); end else begin BufMoveTo(1,fsize,'<m_NetIsHost>',app); BlockWrite(ffile,inbuf[j+8],app-j-8,app); Memo1.Lines.Add('Version 1.02 save - removed uncompressed bytes'); end; end else begin Memo1.Lines.Add('Version 1.00/01 save - removed header bytes'); BlockWrite(ffile,inbuf[j+8],fsize-j-8,i); end; CloseFile(ffile); end;
procedure AppendRest; var l : integer; begin AssignFile(ffile,t); Reset(ffile, 1); l := FileSize(ffile); Seek(ffile,l); BlockWrite(ffile,inbuf[app],fsize-app,i); CloseFile(ffile); Memo1.Lines.Add('Version 1.02 save - added uncompressed bytes'); end;
begin RemoveHeader; Memo1.Lines.Add('Decompressing file...'); t := ExtractFileName(s); t := ChangeFileExt(t,'.txt'); t := DataPath + t; ok := true; try InputStream := TFileStream.Create(temp, fmOpenRead); OutputStream := TFileStream.Create(t, fmCreate); DecompressionStream := TDecompressionStream.Create(InputStream); i := DecompressionStream.Read(Buffer,SizeOf(Buffer)); q := 0; while (i > 0) do begin OutputStream.Write(Buffer,i); inc(q); i := DecompressionStream.Read(Buffer,SizeOf(Buffer)); '+inttostr(q)); end; except ok := false; end; if ok then Memo1.Lines.Add('File: '+t+' created') else Memo1.Lines.Add('File: '+t+' failed decompression'); DecompressionStream.Free; OutputStream.Free; InputStream.Free; DeleteFile(temp); // remove temp file if IsAddon then AppendRest; if ok then s := t else s := ''; end; |