DEADSOFTWARE

clean up GameCVars; add sv_forwardports
[d2df-sdl.git] / src / game / g_game.pas
index 0395bf4c9f05bae2fc2a68023d795d51d2867c05..61fed94c851f31560c9bc6bdfb6d45bc2437e90e 100644 (file)
@@ -132,6 +132,7 @@ procedure g_SimpleError(Text: String);
 function  g_Game_IsTestMap(): Boolean;
 procedure g_Game_DeleteTestMap();
 procedure GameCVars(P: SSArray);
+procedure PlayerSettingsCVars(P: SSArray);
 procedure GameCommands(P: SSArray);
 procedure GameCheats(P: SSArray);
 procedure DebugCommands(P: SSArray);
@@ -5381,8 +5382,7 @@ procedure GameCVars(P: SSArray);
 var
   a, b: Integer;
   stat: TPlayerStatArray;
-  cmd, s: string;
-  config: TConfig;
+  cmd: string;
 begin
   stat := nil;
   cmd := LowerCase(P[0]);
@@ -5584,343 +5584,240 @@ begin
                  [gGameSettings.SpawnInvul]));
     g_Console_Add(_lc[I_MSG_ONMAPCHANGE]);
   end
-  else if cmd = 'net_interp' then
+  else if cmd = 'sv_intertime' then
   begin
     if (Length(P) > 1) then
-      NetInterpLevel := StrToIntDef(P[1], NetInterpLevel);
-    g_Console_Add('net_interp = ' + IntToStr(NetInterpLevel));
-    s := e_GetWriteableDir(ConfigDirs);
-    if s <> '' then
-    begin
-      config := TConfig.CreateFile(s + '/' + CONFIG_FILENAME);
-      config.WriteInt('Client', 'InterpolationSteps', NetInterpLevel);
-      config.SaveFile(s + '/' + CONFIG_FILENAME);
-      config.Free
-    end
+      gDefInterTime := Min(Max(StrToIntDef(P[1], gDefInterTime), -1), 120);
+
+    g_Console_Add(cmd + ' = ' + IntToStr(gDefInterTime));
   end
-  else if cmd = 'net_forceplayerupdate' then
+  else if cmd = 'r_showscore' then
   begin
-    if (Length(P) > 1) and ((P[1] = '1') or (P[1] = '0')) then
-      NetForcePlayerUpdate := (P[1][1] = '1');
+    if (Length(P) > 1) and
+       ((P[1] = '1') or (P[1] = '0')) then
+      gShowGoals := (P[1][1] = '1');
 
-    if NetForcePlayerUpdate then
-      g_Console_Add('net_forceplayerupdate = 1')
+    if gShowGoals then
+      g_Console_Add(_lc[I_MSG_SCORE_ON])
     else
-      g_Console_Add('net_forceplayerupdate = 0');
+      g_Console_Add(_lc[I_MSG_SCORE_OFF]);
+  end
+  else if cmd = 'r_showstat' then
+  begin
+    if (Length(P) > 1) and
+       ((P[1] = '1') or (P[1] = '0')) then
+      gShowStat := (P[1][1] = '1');
 
-    s := e_GetWriteableDir(ConfigDirs);
-    if s <> '' then
-    begin
-      config := TConfig.CreateFile(s + '/' + CONFIG_FILENAME);
-      config.WriteBool('Client', 'ForcePlayerUpdate', NetForcePlayerUpdate);
-      config.SaveFile(s + '/' + CONFIG_FILENAME);
-      config.Free
-    end
+    if gShowStat then
+      g_Console_Add(_lc[I_MSG_STATS_ON])
+    else
+      g_Console_Add(_lc[I_MSG_STATS_OFF]);
   end
-  else if cmd = 'net_predictself' then
+  else if cmd = 'r_showkillmsg' then
   begin
     if (Length(P) > 1) and
        ((P[1] = '1') or (P[1] = '0')) then
-      NetPredictSelf := (P[1][1] = '1');
+      gShowKillMsg := (P[1][1] = '1');
 
-    if NetPredictSelf then
-      g_Console_Add('net_predictself = 1')
+    if gShowKillMsg then
+      g_Console_Add(_lc[I_MSG_KILL_MSGS_ON])
     else
-      g_Console_Add('net_predictself = 0');
+      g_Console_Add(_lc[I_MSG_KILL_MSGS_OFF]);
+  end
+  else if cmd = 'r_showlives' then
+  begin
+    if (Length(P) > 1) and
+       ((P[1] = '1') or (P[1] = '0')) then
+      gShowLives := (P[1][1] = '1');
 
-    s := e_GetWriteableDir(ConfigDirs);
-    if s <> '' then
-    begin
-      config := TConfig.CreateFile(s + '/' + CONFIG_FILENAME);
-      config.WriteBool('Client', 'PredictSelf', NetPredictSelf);
-      config.SaveFile(s + '/' + CONFIG_FILENAME);
-      config.Free
-    end
+    if gShowLives then
+      g_Console_Add(_lc[I_MSG_LIVES_ON])
+    else
+      g_Console_Add(_lc[I_MSG_LIVES_OFF]);
   end
-  else if cmd = 'sv_name' then
+  else if cmd = 'r_showspect' then
   begin
-    if (Length(P) > 1) and (Length(P[1]) > 0) then
-    begin
-      NetServerName := P[1];
-      if Length(NetServerName) > 64 then
-        SetLength(NetServerName, 64);
-      g_Net_Slist_ServerRenamed();
-    end;
+    if (Length(P) > 1) and
+       ((P[1] = '1') or (P[1] = '0')) then
+      gSpectHUD := (P[1][1] = '1');
 
-    g_Console_Add(cmd + ' = "' + NetServerName + '"');
+    if gSpectHUD then
+      g_Console_Add(_lc[I_MSG_SPECT_HUD_ON])
+    else
+      g_Console_Add(_lc[I_MSG_SPECT_HUD_OFF]);
   end
-  else if cmd = 'sv_passwd' then
+  else if cmd = 'r_showping' then
   begin
-    if (Length(P) > 1) and (Length(P[1]) > 0) then
-    begin
-      NetPassword := P[1];
-      if Length(NetPassword) > 24 then
-        SetLength(NetPassword, 24);
-      g_Net_Slist_ServerRenamed();
-    end;
+    if (Length(P) > 1) and
+       ((P[1] = '1') or (P[1] = '0')) then
+      gShowPing := (P[1][1] = '1');
 
-    g_Console_Add(cmd + ' = "' + AnsiLowerCase(NetPassword) + '"');
+    if gShowPing then
+      g_Console_Add(_lc[I_MSG_PING_ON])
+    else
+      g_Console_Add(_lc[I_MSG_PING_OFF]);
   end
-  else if cmd = 'sv_maxplrs' then
+  else if (cmd = 'g_scorelimit') and not g_Game_IsClient then
   begin
-    if (Length(P) > 1) then
+    if Length(P) > 1 then
     begin
-      NetMaxClients := Min(Max(StrToIntDef(P[1], NetMaxClients), 1), NET_MAXCLIENTS);
-      if g_Game_IsServer and g_Game_IsNet then
-      begin
-        b := 0;
-        for a := 0 to High(NetClients) do
+      if StrToIntDef(P[1], gGameSettings.GoalLimit) = 0 then
+        gGameSettings.GoalLimit := 0
+      else
         begin
-          if NetClients[a].Used then
-          begin
-            Inc(b);
-            if b > NetMaxClients then
-            begin
-              s := g_Player_Get(NetClients[a].Player).Name;
-              enet_peer_disconnect(NetClients[a].Peer, NET_DISC_FULL);
-              g_Console_Add(Format(_lc[I_PLAYER_KICK], [s]));
-              MH_SEND_GameEvent(NET_EV_PLAYER_KICK, 0, s);
-            end;
-          end;
+          b := 0;
+
+          if gGameSettings.GameMode = GM_DM then
+            begin // DM
+              stat := g_Player_GetStats();
+              if stat <> nil then
+                for a := 0 to High(stat) do
+                  if stat[a].Frags > b then
+                    b := stat[a].Frags;
+            end
+          else // TDM/CTF
+            b := Max(gTeamStat[TEAM_RED].Goals, gTeamStat[TEAM_BLUE].Goals);
+
+          gGameSettings.GoalLimit := Max(StrToIntDef(P[1], gGameSettings.GoalLimit), b);
         end;
-        g_Net_Slist_ServerRenamed();
-      end;
-    end;
 
-    g_Console_Add(cmd + ' = ' + IntToStr(NetMaxClients));
-  end
-  else if cmd = 'sv_public' then
-  begin
-    if (Length(P) > 1) then
-    begin
-      NetUseMaster := StrToIntDef(P[1], Byte(NetUseMaster)) > 0;
-      if NetUseMaster then g_Net_Slist_Public() else g_Net_Slist_Private();
+      if g_Game_IsNet then MH_SEND_GameSettings;
     end;
 
-    g_Console_Add(cmd + ' = ' + IntToStr(Byte(NetUseMaster)));
+    g_Console_Add(Format(_lc[I_MSG_SCORE_LIMIT], [gGameSettings.GoalLimit]));
   end
-  else if cmd = 'sv_intertime' then
+  else if (cmd = 'g_timelimit') and not g_Game_IsClient then
   begin
-    if (Length(P) > 1) then
-      gDefInterTime := Min(Max(StrToIntDef(P[1], gDefInterTime), -1), 120);
+    if (Length(P) > 1) and (StrToIntDef(P[1], -1) >= 0) then
+      gGameSettings.TimeLimit := StrToIntDef(P[1], -1);
 
-    g_Console_Add(cmd + ' = ' + IntToStr(gDefInterTime));
+    g_Console_Add(Format(_lc[I_MSG_TIME_LIMIT],
+                         [gGameSettings.TimeLimit div 3600,
+                         (gGameSettings.TimeLimit div 60) mod 60,
+                          gGameSettings.TimeLimit mod 60]));
+    if g_Game_IsNet then MH_SEND_GameSettings;
   end
-  else if cmd = 'p1_name' then
+  else if (cmd = 'g_maxlives') and not g_Game_IsClient then
   begin
-    if (Length(P) > 1) and gGameOn then
+    if Length(P) > 1 then
     begin
-      if g_Game_IsClient then
-      begin
-        gPlayer1Settings.Name := b_Text_Unformat(P[1]);
-        MC_SEND_PlayerSettings;
-      end
+      if StrToIntDef(P[1], gGameSettings.MaxLives) = 0 then
+        gGameSettings.MaxLives := 0
       else
-        if gPlayer1 <> nil then
+      begin
+        b := 0;
+        stat := g_Player_GetStats();
+        if stat <> nil then
+          for a := 0 to High(stat) do
+            if stat[a].Lives > b then
+              b := stat[a].Lives;
+        gGameSettings.MaxLives :=
+          Max(StrToIntDef(P[1], gGameSettings.MaxLives), b);
+      end;
+    end;
+
+    g_Console_Add(Format(_lc[I_MSG_LIVES],
+                         [gGameSettings.MaxLives]));
+    if g_Game_IsNet then MH_SEND_GameSettings;
+  end;
+end;
+
+procedure PlayerSettingsCVars(P: SSArray);
+var
+  cmd: string;
+begin
+  cmd := LowerCase(P[0]);
+  case cmd of
+    'p1_name':
+      begin
+        if (Length(P) > 1) then
         begin
-          gPlayer1.Name := b_Text_Unformat(P[1]);
-          if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer1.UID);
-        end
-        else
           gPlayer1Settings.Name := b_Text_Unformat(P[1]);
-    end;
-  end
-  else if cmd = 'p2_name' then
-  begin
-    if (Length(P) > 1) and gGameOn then
-    begin
-      if g_Game_IsClient then
+          if g_Game_IsClient then
+            MC_SEND_PlayerSettings
+          else if gGameOn and (gPlayer1 <> nil) then
+          begin
+            gPlayer1.Name := b_Text_Unformat(P[1]);
+            if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer1.UID);
+          end;
+        end;
+      end;
+    'p2_name':
       begin
-        gPlayer2Settings.Name := b_Text_Unformat(P[1]);
-        MC_SEND_PlayerSettings;
-      end
-      else
-        if gPlayer2 <> nil then
+        if (Length(P) > 1) then
         begin
-          gPlayer2.Name := b_Text_Unformat(P[1]);
-          if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer2.UID);
-        end
-        else
           gPlayer2Settings.Name := b_Text_Unformat(P[1]);
-    end;
-  end
-  else if cmd = 'p1_color' then
-  begin
-    if Length(P) > 3 then
-      if g_Game_IsClient then
+          if g_Game_IsClient then
+            MC_SEND_PlayerSettings
+          else if gGameOn and (gPlayer2 <> nil) then
+          begin
+            gPlayer2.Name := b_Text_Unformat(P[1]);
+            if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer2.UID);
+          end;
+        end;
+      end;
+    'p1_color':
       begin
-        gPlayer1Settings.Color := _RGB(EnsureRange(StrToIntDef(P[1], 0), 0, 255),
-                                       EnsureRange(StrToIntDef(P[2], 0), 0, 255),
-                                       EnsureRange(StrToIntDef(P[3], 0), 0, 255));
-        MC_SEND_PlayerSettings;
-      end
-      else
-        if gPlayer1 <> nil then
+        if Length(P) > 3 then
         begin
-          gPlayer1.Model.SetColor(EnsureRange(StrToIntDef(P[1], 0), 0, 255),
-                                  EnsureRange(StrToIntDef(P[2], 0), 0, 255),
-                                  EnsureRange(StrToIntDef(P[3], 0), 0, 255));
-          if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer1.UID);
-        end
-        else
           gPlayer1Settings.Color := _RGB(EnsureRange(StrToIntDef(P[1], 0), 0, 255),
                                          EnsureRange(StrToIntDef(P[2], 0), 0, 255),
                                          EnsureRange(StrToIntDef(P[3], 0), 0, 255));
-  end
-  else if (cmd = 'p2_color') and not g_Game_IsNet then
-  begin
-    if Length(P) > 3 then
-      if g_Game_IsClient then
+          if g_Game_IsClient then
+            MC_SEND_PlayerSettings
+          else if gGameOn and (gPlayer1 <> nil) then
+          begin
+            gPlayer1.SetColor(gPlayer1Settings.Color);
+            if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer1.UID);
+          end;
+        end;
+      end;
+    'p2_color':
       begin
-        gPlayer2Settings.Color := _RGB(EnsureRange(StrToIntDef(P[1], 0), 0, 255),
-                                       EnsureRange(StrToIntDef(P[2], 0), 0, 255),
-                                       EnsureRange(StrToIntDef(P[3], 0), 0, 255));
-        MC_SEND_PlayerSettings;
-      end
-      else
-        if gPlayer2 <> nil then
+        if Length(P) > 3 then
         begin
-          gPlayer2.Model.SetColor(EnsureRange(StrToIntDef(P[1], 0), 0, 255),
-                                  EnsureRange(StrToIntDef(P[2], 0), 0, 255),
-                                  EnsureRange(StrToIntDef(P[3], 0), 0, 255));
-          if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer2.UID);
-        end
-        else
           gPlayer2Settings.Color := _RGB(EnsureRange(StrToIntDef(P[1], 0), 0, 255),
                                          EnsureRange(StrToIntDef(P[2], 0), 0, 255),
                                          EnsureRange(StrToIntDef(P[3], 0), 0, 255));
-  end
-  else if gGameSettings.GameType in [GT_CUSTOM, GT_SERVER, GT_CLIENT] then
-  begin
-    if cmd = 'r_showscore' then
-    begin
-      if (Length(P) > 1) and
-         ((P[1] = '1') or (P[1] = '0')) then
-        gShowGoals := (P[1][1] = '1');
-
-      if gShowGoals then
-        g_Console_Add(_lc[I_MSG_SCORE_ON])
-      else
-        g_Console_Add(_lc[I_MSG_SCORE_OFF]);
-    end
-    else if cmd = 'r_showstat' then
-    begin
-      if (Length(P) > 1) and
-         ((P[1] = '1') or (P[1] = '0')) then
-        gShowStat := (P[1][1] = '1');
-
-      if gShowStat then
-        g_Console_Add(_lc[I_MSG_STATS_ON])
-      else
-        g_Console_Add(_lc[I_MSG_STATS_OFF]);
-    end
-    else if cmd = 'r_showkillmsg' then
-    begin
-      if (Length(P) > 1) and
-         ((P[1] = '1') or (P[1] = '0')) then
-        gShowKillMsg := (P[1][1] = '1');
-
-      if gShowKillMsg then
-        g_Console_Add(_lc[I_MSG_KILL_MSGS_ON])
-      else
-        g_Console_Add(_lc[I_MSG_KILL_MSGS_OFF]);
-    end
-    else if cmd = 'r_showlives' then
-    begin
-      if (Length(P) > 1) and
-         ((P[1] = '1') or (P[1] = '0')) then
-        gShowLives := (P[1][1] = '1');
-
-      if gShowLives then
-        g_Console_Add(_lc[I_MSG_LIVES_ON])
-      else
-        g_Console_Add(_lc[I_MSG_LIVES_OFF]);
-    end
-    else if cmd = 'r_showspect' then
-    begin
-      if (Length(P) > 1) and
-         ((P[1] = '1') or (P[1] = '0')) then
-        gSpectHUD := (P[1][1] = '1');
-
-      if gSpectHUD then
-        g_Console_Add(_lc[I_MSG_SPECT_HUD_ON])
-      else
-        g_Console_Add(_lc[I_MSG_SPECT_HUD_OFF]);
-    end
-    else if cmd = 'r_showping' then
-    begin
-      if (Length(P) > 1) and
-         ((P[1] = '1') or (P[1] = '0')) then
-        gShowPing := (P[1][1] = '1');
-
-      if gShowPing then
-        g_Console_Add(_lc[I_MSG_PING_ON])
-      else
-        g_Console_Add(_lc[I_MSG_PING_OFF]);
-    end
-    else if (cmd = 'g_scorelimit') and not g_Game_IsClient then
-    begin
-      if Length(P) > 1 then
+          if g_Game_IsClient then
+            MC_SEND_PlayerSettings
+          else if gGameOn and (gPlayer2 <> nil) then
+          begin
+            gPlayer2.SetColor(gPlayer2Settings.Color);
+            if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer2.UID);
+          end;
+        end;
+      end;
+    'p1_model':
       begin
-        if StrToIntDef(P[1], gGameSettings.GoalLimit) = 0 then
-          gGameSettings.GoalLimit := 0
-        else
+        if (Length(P) > 1) then
+        begin
+          gPlayer1Settings.Model := P[1];
+          if g_Game_IsClient then
+            MC_SEND_PlayerSettings
+          else if gGameOn and (gPlayer1 <> nil) then
           begin
-            b := 0;
-
-            if gGameSettings.GameMode = GM_DM then
-              begin // DM
-                stat := g_Player_GetStats();
-                if stat <> nil then
-                  for a := 0 to High(stat) do
-                    if stat[a].Frags > b then
-                      b := stat[a].Frags;
-              end
-            else // TDM/CTF
-              b := Max(gTeamStat[TEAM_RED].Goals, gTeamStat[TEAM_BLUE].Goals);
-
-            gGameSettings.GoalLimit := Max(StrToIntDef(P[1], gGameSettings.GoalLimit), b);
+            gPlayer1.FActualModelName := gPlayer1Settings.Model;
+            gPlayer1.SetModel(gPlayer1Settings.Model);
+            if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer1.UID);
           end;
-
-        if g_Game_IsNet then MH_SEND_GameSettings;
+        end;
       end;
-
-      g_Console_Add(Format(_lc[I_MSG_SCORE_LIMIT], [gGameSettings.GoalLimit]));
-    end
-    else if (cmd = 'g_timelimit') and not g_Game_IsClient then
-    begin
-      if (Length(P) > 1) and (StrToIntDef(P[1], -1) >= 0) then
-        gGameSettings.TimeLimit := StrToIntDef(P[1], -1);
-
-      g_Console_Add(Format(_lc[I_MSG_TIME_LIMIT],
-                           [gGameSettings.TimeLimit div 3600,
-                           (gGameSettings.TimeLimit div 60) mod 60,
-                            gGameSettings.TimeLimit mod 60]));
-      if g_Game_IsNet then MH_SEND_GameSettings;
-    end
-    else if (cmd = 'g_maxlives') and not g_Game_IsClient then
-    begin
-      if Length(P) > 1 then
+    'p2_model':
       begin
-        if StrToIntDef(P[1], gGameSettings.MaxLives) = 0 then
-          gGameSettings.MaxLives := 0
-        else
+        if (Length(P) > 1) then
         begin
-          b := 0;
-          stat := g_Player_GetStats();
-          if stat <> nil then
-            for a := 0 to High(stat) do
-              if stat[a].Lives > b then
-                b := stat[a].Lives;
-          gGameSettings.MaxLives :=
-            Max(StrToIntDef(P[1], gGameSettings.MaxLives), b);
+          gPlayer2Settings.Model := P[1];
+          if g_Game_IsClient then
+            MC_SEND_PlayerSettings
+          else if gGameOn and (gPlayer2 <> nil) then
+          begin
+            gPlayer2.FActualModelName := gPlayer2Settings.Model;
+            gPlayer2.SetModel(gPlayer2Settings.Model);
+            if g_Game_IsNet then MH_SEND_PlayerSettings(gPlayer2.UID);
+          end;
         end;
       end;
-
-      g_Console_Add(Format(_lc[I_MSG_LIVES],
-                           [gGameSettings.MaxLives]));
-      if g_Game_IsNet then MH_SEND_GameSettings;
-    end;
   end;
 end;