DEADSOFTWARE

net: slightly better detection of "map change" event in resource downloader
[d2df-sdl.git] / src / game / g_net.pas
index 251e06bb213071c07a958e9d2f0a4741b3b4cedd..7dcffd78c8c27caf1eb32bc59cd80e2db2057eea 100644 (file)
@@ -90,6 +90,7 @@ type
     lastAckTime: Int64; // msecs; if not "in progress", we're waiting for the first ack
     inProgress: Boolean;
     diskBuffer: PChar; // of `chunkSize` bytes
+    resumed: Boolean;
   end;
 
   TNetClient = record
@@ -181,7 +182,7 @@ var
 
   NetDumpFile: TStream;
 
-  g_Res_received_map_start: Boolean = false; // set if we received "map change" event
+  g_Res_received_map_start: Integer = 0; // set if we received "map change" event
 
 
 function  g_Net_Init(): Boolean;
@@ -1602,7 +1603,7 @@ begin
                 //e_LogWritefln('g_Net_Wait_MapInfo: skip message from non-transfer channel', []);
                 freePacket := false;
                 g_Net_Client_HandlePacket(ev.packet, g_Net_ClientLightMsgHandler);
-                if (g_Res_received_map_start) then begin result := -666; exit; end;
+                if (g_Res_received_map_start < 0) then begin result := -666; exit; end;
               end
               else
               begin
@@ -1767,7 +1768,7 @@ begin
                 //e_LogWriteln('g_Net_Wait_Event: skip message from non-transfer channel');
                 freePacket := false;
                 g_Net_Client_HandlePacket(ev.packet, g_Net_ClientLightMsgHandler);
-                if (g_Res_received_map_start) then begin result := -666; exit; end;
+                if (g_Res_received_map_start < 0) then begin result := -666; exit; end;
               end
               else
               begin
@@ -1885,17 +1886,28 @@ var
   chunk: Integer;
   csize: Integer;
   buf: PChar = nil;
+  resumed: Boolean;
   //stx: Int64;
 begin
+  tf.resumed := false;
+  e_LogWritefln('file `%s`, size=%d (%d)', [tf.diskName, Integer(strm.size), tf.size], TMsgType.Notify);
+  // check if we should resume downloading
+  resumed := (strm.size > tf.chunkSize) and (strm.size < tf.size);
   // send request
   trans_omsg.Clear();
   trans_omsg.Write(Byte(NTF_CLIENT_START));
-  trans_omsg.Write(LongInt(0));
+  if resumed then chunk := strm.size div tf.chunkSize else chunk := 0;
+  trans_omsg.Write(LongInt(chunk));
   if not ftransSendClientMsg(trans_omsg) then begin result := -1; exit; end;
 
+  strm.Seek(chunk*tf.chunkSize, soFromBeginning);
   chunkTotal := (tf.size+tf.chunkSize-1) div tf.chunkSize;
   e_LogWritefln('receiving file `%s` (%d chunks)', [tf.diskName, chunkTotal], TMsgType.Notify);
   g_Game_SetLoadingText('downloading "'+ExtractFileName(tf.diskName)+'"', chunkTotal, False);
+  tf.resumed := resumed;
+
+  if (chunk > 0) then g_Game_StepLoading(chunk);
+  nextChunk := chunk;
 
   // wait for reply data
   FillChar(ev, SizeOf(ev), 0);
@@ -1935,7 +1947,7 @@ begin
                 //e_LogWritefln('g_Net_Wait_Event: skip message from non-transfer channel', []);
                 freePacket := false;
                 g_Net_Client_HandlePacket(ev.packet, g_Net_ClientLightMsgHandler);
-                if (g_Res_received_map_start) then begin result := -666; exit; end;
+                if (g_Res_received_map_start < 0) then begin result := -666; exit; end;
               end
               else
               begin