DEADSOFTWARE

Allow duplicated names for bots added by the 'bot_addlist' console command
[d2df-sdl.git] / src / game / g_player.pas
index 92e2902aa82105d0169cdc71664e1797e9f95906..82ce13054db7fb141c6468f3c5b01b9c74c861d3 100644 (file)
@@ -623,7 +623,7 @@ procedure g_Player_ResetAll(Force, Silent: Boolean);
 function  g_Player_Get(UID: Word): TPlayer;
 function  g_Player_GetCount(): Byte;
 function  g_Player_GetStats(): TPlayerStatArray;
-function  g_Player_ValidName(Name: String): Boolean;
+function  g_Player_ExistingName(Name: String): Boolean;
 function  g_Player_CreateCorpse(Player: TPlayer): Integer;
 procedure g_Player_CreateGibs(fX, fY: Integer; ModelName: String; fColor: TRGB);
 procedure g_Player_CreateShell(fX, fY, dX, dY: Integer; T: Byte);
@@ -857,6 +857,8 @@ begin
 
   gPlayers[a].FActualModelName := ModelName;
   gPlayers[a].SetModel(ModelName);
+  if Bot and (g_Force_Model_Get() <> 0) then
+    gPlayers[a].SetModel(g_Forced_Model_GetName());
 
 // Íåò ìîäåëè - ñîçäàíèå íå âîçìîæíî:
   if gPlayers[a].FModel = nil then
@@ -925,7 +927,11 @@ begin
 
   // create entity and load state
   if Bot then
-    gPlayers[a] := TBot.Create()
+  begin
+    gPlayers[a] := TBot.Create();
+    if (g_Force_Model_Get() <> 0) then
+      gPlayers[a].SetModel(g_Forced_Model_GetName());
+  end
   else
     gPlayers[a] := TPlayer.Create();
   gPlayers[a].FPhysics := True; // ???
@@ -1018,7 +1024,7 @@ begin
   _name := '';
   if BotNames <> nil then
     for a := 0 to High(BotNames) do
-      if g_Player_ValidName(BotNames[a]) then
+      if g_Player_ExistingName(BotNames[a]) then
       begin
         _name := BotNames[a];
         Break;
@@ -1090,26 +1096,26 @@ begin
         Team := BotList[num].team; // CTF / TDM
 
 // Âûáèðàåì íàñòðîéêè áîòà èç ñïèñêà ïî íîìåðó èëè èìåíè:
-  lName := AnsiLowerCase(lName);
-  if (num < 0) or (num > Length(BotList)-1) then
-    num := -1;
-  if (num = -1) and (lName <> '') and (BotList <> nil) then
-    for a := 0 to High(BotList) do
-      if AnsiLowerCase(BotList[a].name) = lName then
-      begin
-        num := a;
-        Break;
-      end;
-  if num = -1 then
-    Exit;
+  if lName = '' then 
+    num := Random(Length(BotList))
+  else
+  begin
+    if (num < 0) or (num > Length(BotList)-1) then
+      num := -1;
+    if (num = -1) and (BotList <> nil) then
+      lName := AnsiLowerCase(lName);
+      for a := 0 to High(BotList) do
+        if AnsiLowerCase(BotList[a].name) = lName then
+        begin
+          num := a;
+          Break;
+        end;
+    if num = -1 then
+      Exit;
+  end;
 
 // Èìÿ áîòà:
   _name := BotList[num].name;
-// Çàíÿòî - âûáèðàåì ñëó÷àéíîå:
-  if not g_Player_ValidName(_name) then
-  repeat
-    _name := Format('DFBOT%.2d', [Random(100)]);
-  until g_Player_ValidName(_name);
 
 // Ìîäåëü:
   _model := BotList[num].model;
@@ -1211,90 +1217,91 @@ var
   path: AnsiString;
 begin
   BotNames := nil;
+  BotList := nil;
 
   path := BOTNAMES_FILENAME;
-  if e_FindResource(DataDirs, path) = false then
-    Exit;
-
-// ×èòàåì âîçìîæíûå èìåíà áîòîâ èç ôàéëà:
-  AssignFile(F, path);
-  Reset(F);
-
-  while not EOF(F) do
+  if e_FindResource(DataDirs, path) then
   begin
-    ReadLn(F, s);
+    // ×èòàåì âîçìîæíûå èìåíà áîòîâ èç ôàéëà:
+    AssignFile(F, path);
+    Reset(F);
 
-    s := Trim(s);
-    if s = '' then
-      Continue;
+    while not EOF(F) do
+    begin
+      ReadLn(F, s);
 
-    SetLength(BotNames, Length(BotNames)+1);
-    BotNames[High(BotNames)] := s;
-  end;
+      s := Trim(s);
+      if s = '' then
+        Continue;
 
-  CloseFile(F);
+      SetLength(BotNames, Length(BotNames)+1);
+      BotNames[High(BotNames)] := s;
+    end;
 
-// Ïåðåìåøèâàåì èõ:
-  g_Bot_MixNames();
+    CloseFile(F);
 
-// ×èòàåì ôàéë ñ ïàðàìåòðàìè áîòîâ:
-  config := TConfig.CreateFile(path);
-  BotList := nil;
-  a := 0;
+    // Ïåðåìåøèâàåì èõ:
+    g_Bot_MixNames();
+  end;
 
-  while config.SectionExists(IntToStr(a)) do
+  path := BOTLIST_FILENAME;
+  if e_FindResource(DataDirs, path) then
   begin
-    SetLength(BotList, Length(BotList)+1);
+    // ×èòàåì ôàéë ñ ïàðàìåòðàìè áîòîâ:
+    config := TConfig.CreateFile(path);
+    a := 0;
 
-    with BotList[High(BotList)] do
+    while config.SectionExists(IntToStr(a)) do
     begin
-    // Èìÿ áîòà:
-      name := config.ReadStr(IntToStr(a), 'name', '');
-    // Ìîäåëü:
-      model := config.ReadStr(IntToStr(a), 'model', '');
-    // Êîìàíäà:
-      if config.ReadStr(IntToStr(a), 'team', 'red') = 'red' then
-        team := TEAM_RED
-      else
-        team := TEAM_BLUE;
-    // Öâåò ìîäåëè:
-      sa := parse(config.ReadStr(IntToStr(a), 'color', ''));
-      color.R := StrToIntDef(sa[0], 0);
-      color.G := StrToIntDef(sa[1], 0);
-      color.B := StrToIntDef(sa[2], 0);
-    // Âåðîÿòíîñòü ñòðåëüáû ïîä óãëîì:
-      diag_fire := config.ReadInt(IntToStr(a), 'diag_fire', 0);
-    // Âåðîÿòíîñòü îòâåòíîãî îãíÿ ïî íåâèäèìîìó ñîïåðíèêó:
-      invis_fire := config.ReadInt(IntToStr(a), 'invis_fire', 0);
-    // Òî÷íîñòü ñòðåëüáû ïîä óãëîì:
-      diag_precision := config.ReadInt(IntToStr(a), 'diag_precision', 0);
-    // Òî÷íîñòü ñòðåëüáû â ïîëåòå:
-      fly_precision := config.ReadInt(IntToStr(a), 'fly_precision', 0);
-    // Òî÷íîñòü óêëîíåíèÿ îò ñíàðÿäîâ:
-      cover := config.ReadInt(IntToStr(a), 'cover', 0);
-    // Âåðîÿòíîñòü ïðûæêà ïðè ïðèáëèæåíèè ñîïåðíèêà:
-      close_jump := config.ReadInt(IntToStr(a), 'close_jump', 0);
-    // Ïðèîðèòåòû îðóæèÿ äëÿ äàëüíåãî áîÿ:
-      sa := parse(config.ReadStr(IntToStr(a), 'w_prior1', ''));
-      if Length(sa) = 10 then
-        for b := 0 to 9 do
-          w_prior1[b] := EnsureRange(StrToInt(sa[b]), 0, 9);
-    // Ïðèîðèòåòû îðóæèÿ äëÿ áëèæíåãî áîÿ:
-      sa := parse(config.ReadStr(IntToStr(a), 'w_prior2', ''));
-      if Length(sa) = 10 then
-        for b := 0 to 9 do
-          w_prior2[b] := EnsureRange(StrToInt(sa[b]), 0, 9);
-
-      {sa := parse(config.ReadStr(IntToStr(a), 'w_prior3', ''));
-      if Length(sa) = 10 then
-        for b := 0 to 9 do
-          w_prior3[b] := EnsureRange(StrToInt(sa[b]), 0, 9);}
+      SetLength(BotList, Length(BotList)+1);
+
+      with BotList[High(BotList)] do
+      begin
+        name := config.ReadStr(IntToStr(a), 'name', '');  // Èìÿ áîòà
+        model := config.ReadStr(IntToStr(a), 'model', '');  // Ìîäåëü
+
+        // Êîìàíäà
+        if config.ReadStr(IntToStr(a), 'team', 'red') = 'red'
+          then team := TEAM_RED
+          else team := TEAM_BLUE;
+
+        // Öâåò ìîäåëè
+        sa := parse(config.ReadStr(IntToStr(a), 'color', ''));
+        color.R := StrToIntDef(sa[0], 0);
+        color.G := StrToIntDef(sa[1], 0);
+        color.B := StrToIntDef(sa[2], 0);
+
+        diag_fire := config.ReadInt(IntToStr(a), 'diag_fire', 0);  // Âåðîÿòíîñòü ñòðåëüáû ïîä óãëîì
+        invis_fire := config.ReadInt(IntToStr(a), 'invis_fire', 0);  // Âåðîÿòíîñòü îòâåòíîãî îãíÿ ïî íåâèäèìîìó ñîïåðíèêó
+        diag_precision := config.ReadInt(IntToStr(a), 'diag_precision', 0);  // Òî÷íîñòü ñòðåëüáû ïîä óãëîì
+        fly_precision := config.ReadInt(IntToStr(a), 'fly_precision', 0);  // Òî÷íîñòü ñòðåëüáû â ïîëåòå
+        cover := config.ReadInt(IntToStr(a), 'cover', 0);  // Òî÷íîñòü óêëîíåíèÿ îò ñíàðÿäîâ
+        close_jump := config.ReadInt(IntToStr(a), 'close_jump', 0);  // Âåðîÿòíîñòü ïðûæêà ïðè ïðèáëèæåíèè ñîïåðíèêà
+
+        // Ïðèîðèòåòû îðóæèÿ äëÿ äàëüíåãî áîÿ
+        sa := parse(config.ReadStr(IntToStr(a), 'w_prior1', ''));
+        if Length(sa) = 10 then
+          for b := 0 to 9 do
+            w_prior1[b] := EnsureRange(StrToInt(sa[b]), 0, 9);
+
+        // Ïðèîðèòåòû îðóæèÿ äëÿ áëèæíåãî áîÿ
+        sa := parse(config.ReadStr(IntToStr(a), 'w_prior2', ''));
+        if Length(sa) = 10 then
+          for b := 0 to 9 do
+            w_prior2[b] := EnsureRange(StrToInt(sa[b]), 0, 9);
+
+        {sa := parse(config.ReadStr(IntToStr(a), 'w_prior3', ''));
+        if Length(sa) = 10 then
+          for b := 0 to 9 do
+            w_prior3[b] := EnsureRange(StrToInt(sa[b]), 0, 9);}
+      end;
+
+      a += 1;
     end;
 
-    a := a + 1;
+    config.Free();
   end;
 
-  config.Free();
   SetLength(SavedStates, 0);
 end;
 
@@ -5547,7 +5554,7 @@ begin
             (y >= 0) and (y <= PLAYER_RECT.Height);
 end;
 
-function g_Player_ValidName(Name: string): Boolean;
+function g_Player_ExistingName(Name: string): Boolean;
 var
   a: Integer;
 begin