hedgewars/uGearsUtils.pas
changeset 15762 0a172cfe8840
parent 15732 7383256f8535
child 15763 8997e212be4c
--- a/hedgewars/uGearsUtils.pas	Thu Sep 10 09:30:41 2020 +0200
+++ b/hedgewars/uGearsUtils.pas	Wed Oct 07 23:06:34 2020 +0200
@@ -56,6 +56,7 @@
 function  SpawnBoxOfSmth: PGear;
 procedure PlayBoxSpawnTaunt(Gear: PGear);
 procedure ShotgunShot(Gear: PGear);
+function  CountHogsInTeam(HHGear: PGear; countHidden: boolean): LongInt;
 function  CanUseTardis(HHGear: PGear): boolean;
 
 procedure SetAllToActive;
@@ -1322,10 +1323,33 @@
     DrawExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), cShotgunRadius)
 end;
 
+// Return number of living hogs in HHGear's team
+// * HHGear: hog gear for which to count team hogs
+// * countHidden: if true, also count hidden hogs (e.g. time-travel)
+function CountHogsInTeam(HHGear: PGear; countHidden: boolean): LongInt;
+var i, j, cnt: LongInt;
+    HH: PHedgehog;
+begin
+    if HHGear = nil then
+        exit(0);
+    HH:= HHGear^.Hedgehog;
+    cnt:= 0;
+    for j:= 0 to Pred(HH^.Team^.Clan^.TeamsNumber) do
+        for i:= 0 to Pred(HH^.Team^.Clan^.Teams[j]^.HedgehogsNumber) do
+            if (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear <> nil)
+            and ((HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.State and gstDrowning) = 0)
+            and (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Health > HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Damage) then
+                inc(cnt)
+            else if countHidden and (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].GearHidden <> nil) then
+                inc(cnt);
+    CountHogsInTeam:= cnt;
+end;
+
+
 // Returns true if the given hog gear can use the tardis
 function CanUseTardis(HHGear: PGear): boolean;
 var usable: boolean;
-    i, j, cnt: LongInt;
+    cnt: LongInt;
     HH: PHedgehog;
 begin
 (*
@@ -1339,13 +1363,7 @@
     if HHGear <> nil then
     if (HHGear = nil) or (HH^.King) or (SuddenDeathActive) then
         usable:= false;
-    cnt:= 0;
-    for j:= 0 to Pred(HH^.Team^.Clan^.TeamsNumber) do
-        for i:= 0 to Pred(HH^.Team^.Clan^.Teams[j]^.HedgehogsNumber) do
-            if (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear <> nil)
-            and ((HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.State and gstDrowning) = 0)
-            and (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Health > HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Damage) then
-                inc(cnt);
+    cnt:= CountHogsInTeam(HHGear, false);
     if (cnt < 2) then
         usable:= false;
     CanUseTardis:= usable;