X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_res_downloader.pas;h=d67dc4c52db84c01abb20d58eb8f3ccae120908b;hb=4d7452d2a7340e4c245f5de3eec3c4d4a7e98fe2;hp=438cd58357c6a1a0ecde23a83ffe62f4cc12c2ed;hpb=986383de4f166773e41335f5b0fec5ee5c0128f0;p=d2df-sdl.git diff --git a/src/game/g_res_downloader.pas b/src/game/g_res_downloader.pas index 438cd58..d67dc4c 100644 --- a/src/game/g_res_downloader.pas +++ b/src/game/g_res_downloader.pas @@ -30,7 +30,7 @@ function g_Res_DownloadMapWAD (FileName: AnsiString; const mapHash: TMD5Digest): function g_Res_FindReplacementWad (oldname: AnsiString): AnsiString; // call this somewhere in startup sequence -procedure g_Res_CreateDatabases (); +procedure g_Res_CreateDatabases (allowRescan: Boolean=false); implementation @@ -97,40 +97,52 @@ end; // g_Res_CreateDatabases // //========================================================================== -procedure g_Res_CreateDatabases (); +procedure g_Res_CreateDatabases (allowRescan: Boolean=false); var st: TStream; + upmap: Boolean; + upres: Boolean; + forcesave: Boolean; begin - // create and load a know map database, if necessary - knownMaps.Free; - knownMaps := TFileHashDB.Create(GameDir+'/maps/'); - knownRes := TFileHashDB.Create(GameDir+'/wads/'); - saveDBsToDiskEnabled := true; - // load map database - st := nil; - try - st := openDiskFileRO(GameDir+'/data/maphash.db'); - knownMaps.loadFrom(st); - e_LogWriteln('loaded map database'); - except - end; - st.Free; - // load resource database - st := nil; - try - st := openDiskFileRO(GameDir+'/data/reshash.db'); - knownRes.loadFrom(st); - e_LogWriteln('loaded resource database'); - except + if not assigned(knownMaps) then + begin + // create and load a know map database, if necessary + knownMaps := TFileHashDB.Create(GameDir+'/maps/'); + knownRes := TFileHashDB.Create(GameDir+'/wads/'); + saveDBsToDiskEnabled := true; + // load map database + st := nil; + try + st := openDiskFileRO(GameDir+'/data/maphash.db'); + knownMaps.loadFrom(st); + e_LogWriteln('loaded map database'); + except + end; + st.Free; + // load resource database + st := nil; + try + st := openDiskFileRO(GameDir+'/data/reshash.db'); + knownRes.loadFrom(st); + e_LogWriteln('loaded resource database'); + except + end; + st.Free; + forcesave := true; + end + else + begin + if (not allowRescan) then exit; + forcesave := false; end; - st.Free; // rescan dirs e_LogWriteln('refreshing map database'); - knownMaps.scanFiles(); + upmap := knownMaps.scanFiles(); e_LogWriteln('refreshing resource database'); - knownRes.scanFiles(); + upres := knownRes.scanFiles(); // save databases - saveDatabases(true, true); + if (forcesave) then begin upmap := true; upres := true; end; + if upmap or upres then saveDatabases(upmap, upres); end; @@ -346,6 +358,7 @@ var begin result := ''; clearReplacementWads(); + g_Res_CreateDatabases(); try g_Res_received_map_start := 1; @@ -378,17 +391,18 @@ begin end; fname := GameDir+'/maps/downloads/'+generateFileName(FileName, mapHash); tf.diskName := fname; + e_LogWritefln('map disk file for `%s` is `%s`', [FileName, fname], TMsgType.Fatal); try strm := openDiskFileRW(fname); except - e_WriteLog('cannot create map file `'+FileName+'`', TMsgType.Fatal); + e_WriteLog('cannot create map file `'+fname+'`', TMsgType.Fatal); result := ''; exit; end; try res := g_Net_ReceiveResourceFile(-1{map}, tf, strm); except - e_WriteLog('error downloading map file `'+FileName+'`', TMsgType.Fatal); + e_WriteLog('error downloading map file (exception) `'+FileName+'`', TMsgType.Fatal); strm.Free; result := ''; exit; @@ -396,7 +410,7 @@ begin strm.Free; if (res <> 0) then begin - e_WriteLog('error downloading map file `'+FileName+'`', TMsgType.Fatal); + e_LogWritefln('error downloading map `%s` (res=%d)', [FileName, res], TMsgType.Fatal); result := ''; exit; end; @@ -412,7 +426,7 @@ begin DeleteFile(fname); strm := createDiskFile(fname); except - e_WriteLog('cannot create map file `'+fname+'`', TMsgType.Fatal); + e_WriteLog('cannot create map file `'+fname+'` (exception)', TMsgType.Fatal); result := ''; exit; end; @@ -427,7 +441,7 @@ begin strm.Free; if (res <> 0) then begin - e_WriteLog('error downloading map file `'+FileName+'`', TMsgType.Fatal); + e_LogWritefln('error downloading map `%s` (res=%d)', [FileName, res], TMsgType.Fatal); result := ''; exit; end;