DEADSOFTWARE

net: started master-server communication rewrite (phase 1: master i/o moved to separa...
[d2df-sdl.git] / src / game / g_game.pas
index 46251bb7d3e2684ec69a340f2ad415de97f6f821..7ad130f20a6b52c6a3029bb81de27ab5cab4c020 100644 (file)
@@ -383,7 +383,7 @@ uses
   g_triggers, g_monsters, e_sound, CONFIG,
   g_language, g_net,
   ENet, e_msg, g_netmsg, g_netmaster,
-  sfs, wadreader;
+  sfs, wadreader, g_system;
 
 
 var
@@ -894,7 +894,7 @@ begin
   gDelayedEvents[n].DENum := Num;
   gDelayedEvents[n].DEStr := Str;
   if DEType = DE_GLOBEVENT then
-    gDelayedEvents[n].Time := (GetTimer() {div 1000}) + Time
+    gDelayedEvents[n].Time := (sys_GetTicks() {div 1000}) + Time
   else
     gDelayedEvents[n].Time := gTime + Time;
   Result := n;
@@ -2126,16 +2126,15 @@ begin
 
       if NetUseMaster then
       begin
-        if gTime >= NetTimeToMaster then
+        {
+        if (gTime >= NetTimeToMaster) or g_Net_Slist_IsConnectionInProgress then
         begin
-          if (NetMHost = nil) or (NetMPeer = nil) then
-          begin
-            g_Net_Slist_Connect(false); // non-blocking connection to the master
-          end;
-
+          if (not g_Net_Slist_IsConnectionActive) then g_Net_Slist_Connect(false); // non-blocking connection to the master
           g_Net_Slist_Update;
           NetTimeToMaster := gTime + NetMasterRate;
         end;
+        }
+        g_Net_Slist_Pulse();
       end;
     end
     else if (NetMode = NET_CLIENT) then
@@ -2191,7 +2190,7 @@ begin
     KeyPress(IK_F10);
   end;
 
-  Time := GetTimer() {div 1000};
+  Time := sys_GetTicks() {div 1000};
 
 // Îáðàáîòêà îòëîæåííûõ ñîáûòèé:
   if gDelayedEvents <> nil then
@@ -2547,7 +2546,7 @@ var
 begin
   e_TextureFontGetSize(gStdFont, ww2, hh2);
 
-  g_ProcessMessages();
+  sys_HandleInput;
 
   if g_Console_Action(ACTION_SCORES) then
   begin
@@ -3736,7 +3735,7 @@ var
 begin
   if gExit = EXIT_QUIT then Exit;
 
-  Time := GetTimer() {div 1000};
+  Time := sys_GetTicks() {div 1000};
   FPSCounter := FPSCounter+1;
   if Time - FPSTime >= 1000 then
   begin
@@ -4102,7 +4101,7 @@ begin
     g_Game_DeleteTestMap();
 
   gExit := EXIT_QUIT;
-  PushExitEvent();
+  sys_RequestQuit;
 end;
 
 procedure g_FatalError(Text: String);
@@ -4160,7 +4159,7 @@ end;
 
 procedure g_Game_ChangeResolution(newWidth, newHeight: Word; nowFull, nowMax: Boolean);
 begin
-  g_Window_SetSize(newWidth, newHeight, nowFull);
+  sys_SetDisplayMode(newWidth, newHeight, gBPP, nowFull);
 end;
 
 procedure g_Game_AddPlayer(Team: Byte = TEAM_NONE);
@@ -4198,7 +4197,10 @@ begin
       gPlayer1.Respawn(False, True);
 
       if g_Game_IsNet and NetUseMaster then
-        g_Net_Slist_Update;
+      begin
+        //g_Net_Slist_Update;
+        g_Net_Slist_Pulse();
+      end;
     end;
 
     Exit;
@@ -4230,7 +4232,10 @@ begin
       gPlayer2.Respawn(False, True);
 
       if g_Game_IsNet and NetUseMaster then
-        g_Net_Slist_Update;
+      begin
+        //g_Net_Slist_Update;
+        g_Net_Slist_Pulse();
+      end;
     end;
 
     Exit;
@@ -4255,7 +4260,10 @@ begin
       g_Player_Remove(Pl.UID);
 
       if g_Game_IsNet and NetUseMaster then
-        g_Net_Slist_Update;
+      begin
+        //g_Net_Slist_Update;
+        g_Net_Slist_Pulse();
+      end;
     end else
       gPlayer2 := nil;
     Exit;
@@ -4271,7 +4279,10 @@ begin
       g_Player_Remove(Pl.UID);
 
       if g_Game_IsNet and NetUseMaster then
-        g_Net_Slist_Update;
+      begin
+        //g_Net_Slist_Update;
+        g_Net_Slist_Pulse();
+      end;
     end else
     begin
       gPlayer1 := nil;
@@ -4610,6 +4621,10 @@ begin
   NetState := NET_STATE_AUTH;
 
   g_Game_SetLoadingText(_lc[I_LOAD_CONNECT], 0, False);
+
+  // create (or update) map/resource databases
+  g_Res_CreateDatabases(true);
+
 // Ñòàðòóåì êëèåíò
   if not g_Net_Connect(Addr, Port) then
   begin
@@ -4663,10 +4678,10 @@ begin
           gGameSettings.Options := InMsg.ReadLongWord();
           T := InMsg.ReadLongWord();
 
-          newResPath := g_Res_SearchSameWAD(MapsDir, WadName, gWADHash);
-          if newResPath = '' then
+          //newResPath := g_Res_SearchSameWAD(MapsDir, WadName, gWADHash);
+          //if newResPath = '' then
           begin
-            g_Game_SetLoadingText(_lc[I_LOAD_DL_RES], 0, False);
+            //g_Game_SetLoadingText(_lc[I_LOAD_DL_RES], 0, False);
             newResPath := g_Res_DownloadMapWAD(WadName, gWADHash);
             if newResPath = '' then
             begin
@@ -4675,6 +4690,7 @@ begin
               NetState := NET_STATE_NONE;
               Exit;
             end;
+            e_LogWritefln('using downloaded map wad [%s] for [%s]`', [newResPath, WadName], TMsgType.Notify);
           end;
           newResPath := ExtractRelativePath(MapsDir, newResPath);
 
@@ -4824,7 +4840,7 @@ begin
       end
       else
       begin
-        gWADHash := MD5File(nws);
+        if (g_Game_IsNet) then gWADHash := MD5File(nws);
         //writeln('********: nws=', nws, ' : Map=', Map, ' : nw=', NewWAD, ' : resname=', ResName);
         g_Game_LoadWAD(NewWAD);
       end;
@@ -4906,12 +4922,11 @@ begin
   // Ìàñòåðñåðâåð
     if NetUseMaster then
     begin
-      if (NetMHost = nil) or (NetMPeer = nil) then
-      begin
-        // let the connection be blocking here, why not?
-        g_Net_Slist_Connect();
-      end;
+      {
+      if (not g_Net_Slist_IsConnectionActive) then g_Net_Slist_Connect(false);  // non-blocking connection to the master
       g_Net_Slist_Update;
+      }
+      g_Net_Slist_Pulse();
     end;
 
     if NetClients <> nil then
@@ -5010,12 +5025,26 @@ end;
 
 procedure g_Game_ClientWAD(NewWAD: String; const WHash: TMD5Digest);
 var
-  gWAD: String;
+  gWAD, xwad: String;
 begin
-  if LowerCase(NewWAD) = LowerCase(gGameSettings.WAD) then
-    Exit;
-  if not g_Game_IsClient then
+  if not g_Game_IsClient then Exit;
+  //e_LogWritefln('*** g_Game_ClientWAD: `%s`', [NewWAD]);
+
+  gWAD := g_Res_DownloadMapWAD(ExtractFileName(NewWAD), WHash);
+  if gWAD = '' then
+  begin
+    g_Game_Free();
+    g_FatalError(Format(_lc[I_GAME_ERROR_MAP_WAD], [ExtractFileName(NewWAD)]));
     Exit;
+  end;
+
+  xwad := ExtractRelativePath(MapsDir, gWAD);
+  e_LogWritefln('using downloaded client map wad [%s] for [%s]`', [xwad, NewWAD], TMsgType.Notify);
+  NewWAD := xwad;
+  g_Game_LoadWAD(NewWAD);
+
+  {
+  if LowerCase(NewWAD) = LowerCase(gGameSettings.WAD) then Exit;
   gWAD := g_Res_SearchSameWAD(MapsDir, ExtractFileName(NewWAD), WHash);
   if gWAD = '' then
   begin
@@ -5030,6 +5059,7 @@ begin
   end;
   NewWAD := ExtractRelativePath(MapsDir, gWAD);
   g_Game_LoadWAD(NewWAD);
+  }
 end;
 
 procedure g_Game_RestartRound(NoMapRestart: Boolean = False);
@@ -5468,7 +5498,10 @@ begin
       if Length(NetServerName) > 64 then
         SetLength(NetServerName, 64);
       if g_Game_IsServer and g_Game_IsNet and NetUseMaster then
-        g_Net_Slist_Update;
+      begin
+        //g_Net_Slist_Update;
+        g_Net_Slist_Pulse();
+      end;
     end;
 
     g_Console_Add(cmd + ' = "' + NetServerName + '"');
@@ -5481,7 +5514,10 @@ begin
       if Length(NetPassword) > 24 then
         SetLength(NetPassword, 24);
       if g_Game_IsServer and g_Game_IsNet and NetUseMaster then
-        g_Net_Slist_Update;
+      begin
+        //g_Net_Slist_Update;
+        g_Net_Slist_Pulse();
+      end;
     end;
 
     g_Console_Add(cmd + ' = "' + AnsiLowerCase(NetPassword) + '"');
@@ -5507,7 +5543,10 @@ begin
             end;
           end;
         if NetUseMaster then
-          g_Net_Slist_Update;
+        begin
+          //g_Net_Slist_Update;
+          g_Net_Slist_Pulse();
+        end;
       end;
     end;
 
@@ -5519,14 +5558,21 @@ begin
     begin
       NetUseMaster := StrToIntDef(P[1], Byte(NetUseMaster)) > 0;
       if g_Game_IsServer and g_Game_IsNet then
+      begin
         if NetUseMaster then
         begin
-          if NetMPeer = nil then g_Net_Slist_Connect();
+          {
+          if (not g_Net_Slist_IsConnectionActive) then g_Net_Slist_Connect(false);  // non-blocking connection to the master
           g_Net_Slist_Update();
+          }
+          g_Net_Slist_Pulse();
         end
         else
-          if NetMPeer <> nil then
-            g_Net_Slist_Disconnect();
+        begin
+          //if (not g_Net_Slist_IsConnectionActive) then g_Net_Slist_Disconnect();
+          g_Net_Slist_Private();
+        end;
+      end;
     end;
 
     g_Console_Add(cmd + ' = ' + IntToStr(Byte(NetUseMaster)));
@@ -6182,7 +6228,10 @@ begin
         g_Console_Add(Format(_lc[I_PLAYER_KICK], [s]));
         MH_SEND_GameEvent(NET_EV_PLAYER_KICK, 0, s);
         if NetUseMaster then
-          g_Net_Slist_Update;
+        begin
+          //g_Net_Slist_Update;
+          g_Net_Slist_Pulse();
+        end;
       end else if gPlayers <> nil then
         for a := Low(gPlayers) to High(gPlayers) do
           if gPlayers[a] <> nil then
@@ -6196,7 +6245,10 @@ begin
               g_Console_Add(Format(_lc[I_PLAYER_LEAVE], [gPlayers[a].Name]), True);
               g_Player_Remove(gPlayers[a].UID);
               if NetUseMaster then
-                g_Net_Slist_Update;
+              begin
+                //g_Net_Slist_Update;
+                g_Net_Slist_Pulse();
+              end;
               // Åñëè íå ïåðåìåøàòü, ïðè äîáàâëåíèè íîâûõ áîòîâ ïîÿâÿòñÿ ñòàðûå
               g_Bot_MixNames();
             end;
@@ -6228,7 +6280,10 @@ begin
           g_Console_Add(Format(_lc[I_PLAYER_KICK], [s]));
           MH_SEND_GameEvent(NET_EV_PLAYER_KICK, 0, s);
           if NetUseMaster then
-            g_Net_Slist_Update;
+          begin
+            //g_Net_Slist_Update;
+            g_Net_Slist_Pulse();
+          end;
         end;
       end;
     end else
@@ -6258,7 +6313,10 @@ begin
         g_Console_Add(Format(_lc[I_PLAYER_BAN], [s]));
         MH_SEND_GameEvent(NET_EV_PLAYER_BAN, 0, s);
         if NetUseMaster then
-          g_Net_Slist_Update;
+        begin
+          //g_Net_Slist_Update;
+          g_Net_Slist_Pulse();
+        end;
       end else
         g_Console_Add(Format(_lc[I_NET_ERR_NAME404], [P[1]]));
     end else
@@ -6289,7 +6347,10 @@ begin
           g_Console_Add(Format(_lc[I_PLAYER_BAN], [s]));
           MH_SEND_GameEvent(NET_EV_PLAYER_BAN, 0, s);
           if NetUseMaster then
-            g_Net_Slist_Update;
+          begin
+            //g_Net_Slist_Update;
+            g_Net_Slist_Pulse();
+          end;
         end;
     end else
       g_Console_Add(_lc[I_MSG_SERVERONLY]);
@@ -6319,7 +6380,10 @@ begin
         g_Console_Add(Format(_lc[I_PLAYER_BAN], [s]));
         MH_SEND_GameEvent(NET_EV_PLAYER_BAN, 0, s);
         if NetUseMaster then
-          g_Net_Slist_Update;
+        begin
+          //g_Net_Slist_Update;
+          g_Net_Slist_Pulse();
+        end;
       end else
         g_Console_Add(Format(_lc[I_NET_ERR_NAME404], [P[1]]));
     end else
@@ -6351,7 +6415,10 @@ begin
           g_Console_Add(Format(_lc[I_PLAYER_BAN], [s]));
           MH_SEND_GameEvent(NET_EV_PLAYER_BAN, 0, s);
           if NetUseMaster then
-            g_Net_Slist_Update;
+          begin
+            //g_Net_Slist_Update;
+            g_Net_Slist_Pulse();
+          end;
         end;
     end else
       g_Console_Add(_lc[I_MSG_SERVERONLY]);