hedgewars/GSHandlers.inc
changeset 5706 4454aa0523e7
parent 5695 f1015857deb8
child 5710 0fec06ac8776
--- a/hedgewars/GSHandlers.inc	Tue Aug 30 12:32:33 2011 -0400
+++ b/hedgewars/GSHandlers.inc	Wed Aug 31 00:58:48 2011 -0400
@@ -1226,21 +1226,21 @@
     b := false;
 
     if abs(LongInt(HHGear^.Angle) - BTPrevAngle) > 7  then
-    begin
+        begin
         Gear^.dX := SignAs(AngleSin(HHGear^.Angle) * _0_5, HHGear^.dX);
         Gear^.dY := AngleCos(HHGear^.Angle) * ( - _0_5);
         BTPrevAngle := HHGear^.Angle;
         b := true
-    end;
+        end;
 
     if ((HHGear^.State and gstMoving) <> 0) then
-    begin
+        begin
         doStepHedgehogMoving(HHGear);
         if (HHGear^.State and gstHHDriven) = 0 then Gear^.Timer := 0
-    end;
+        end;
 
     if Gear^.Timer mod cHHStepTicks = 0 then
-    begin
+        begin
         b := true;
         if Gear^.dX.isNegative then
             HHGear^.Message := (HHGear^.Message and (gmAttack or gmUp or gmDown)) or gmLeft
@@ -1248,7 +1248,7 @@
             HHGear^.Message := (HHGear^.Message and (gmAttack or gmUp or gmDown)) or gmRight;
 
         if ((HHGear^.State and gstMoving) = 0) then
-        begin
+            begin
             HHGear^.State := HHGear^.State and not gstAttacking;
             prevX := hwRound(HHGear^.X);
 
@@ -1261,24 +1261,24 @@
                CheckLandValue(hwRound(HHGear^.X + SignAs(_6, HHGear^.dX)), hwRound(HHGear^.Y),
                lfIndestructible) then HHGear^.X := HHGear^.X + SignAs(_1, HHGear^.dX);
             HHGear^.State := HHGear^.State or gstAttacking
-        end;
+            end;
 
         inc(BTSteps);
         if BTSteps = 7 then
-        begin
+            begin
             BTSteps := 0;
             if CheckLandValue(hwRound(HHGear^.X + Gear^.dX * (cHHRadius + cBlowTorchC) + SignAs(_6,
                Gear^.dX)), hwRound(HHGear^.Y + Gear^.dY * (cHHRadius + cBlowTorchC)),
                lfIndestructible) then
-            begin
+                begin
                 Gear^.X := HHGear^.X + Gear^.dX * (cHHRadius + cBlowTorchC);
                 Gear^.Y := HHGear^.Y + Gear^.dY * (cHHRadius + cBlowTorchC);
-            end;
+                end;
             HHGear^.State := HHGear^.State or gstNoDamage;
             AmmoShove(Gear, 2, 15);
             HHGear^.State := HHGear^.State and not gstNoDamage
+            end;
         end;
-    end;
 
     if b then
         DrawTunnel(HHGear^.X - Gear^.dX * cHHRadius, HHGear^.Y - _4 - Gear^.dY * cHHRadius + hwAbs(
@@ -1287,12 +1287,12 @@
         cHHRadius * 5, cHHRadius * 2 + 7);
 
     if (Gear^.Timer = 0) or ((HHGear^.Message and gmAttack) <> 0) then
-    begin
+        begin
         HHGear^.Message := 0;
         HHGear^.State := HHGear^.State and (not gstNotKickable);
         DeleteGear(Gear);
         AfterAttack
-    end
+        end
 end;
 
 procedure doStepBlowTorch(Gear: PGear);
@@ -2949,10 +2949,8 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 procedure doStepSeductionWork(Gear: PGear);
-var 
-    x, y, i: LongInt;
+var i: LongInt;
     hogs: TPGearArray;
-    d: hwFloat;
 begin
     AllInactive := false;
     hogs := GearsNear(Gear^.X, Gear^.Y, gtHedgehog, Gear^.Radius);
@@ -3678,10 +3676,10 @@
     AllInactive := false;
     FollowGear := HHGear;
     with HHGear^ do
-    begin
+        begin
         State := State and not gstAttacking;
         Message := Message and not (gmAttack or gmUp or gmPrecise or gmLeft or gmRight)
-    end
+        end
 end;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -4902,47 +4900,127 @@
 end;
 
 ////////////////////////////////////////////////////////////////////////////////
-procedure doStepTardis(Gear: PGear);
-(*var 
-    i, x, y: LongInt;
-    dX, dY: hwFloat;
-    Fire: PGear;
-    vg: PVisualGear;*)
+(*
+ TARDIS needs 
+ Warp in.  Pos = 1
+ Pause.    Pos = 2
+ Hide gear  (TARDIS hedgehog was nil)
+ Warp out. Pos = 3
+ ... idle active for some time period ...  Pos = 4
+ Warp in.  Pos = 1
+ Pause.    Pos = 2
+ Restore gear  (TARDIS hedgehog was not nil)
+ Warp out. Pos = 3
+*)
+
+procedure doStepTardisWarp(Gear: PGear);
+var HH: PHedgehog;
+    i,j,cnt: LongWord;
 begin
-    if (Gear^.State and gstTmpFlag) = 0 then dec(Gear^.Timer);
-    if (Gear^.Timer = 0) and (CurAmmoGear = Gear) then
+
+HH:= Gear^.Hedgehog;
+if Gear^.Pos = 2 then
+    begin
+    if (Gear^.Timer = 0) then
         begin
-        if (CurrentHedgehog = nil) or (CurrentHedgehog^.Gear = nil) then 
+        if HH^.Gear <> nil then
             begin
-            DeleteGear(Gear);
-            exit
+            if Gear = CurAmmoGear then CurAmmoGear := nil;
+            DeleteCI(HH^.Gear);
+            RemoveGearFromList(HH^.Gear);
+            HH^.Gear^.Z := cHHZ;
+            HH^.Gear^.Active := false;
+            HH^.Gear^.State:= HH^.Gear^.State and not (gstHHDriven or gstAttacking);
+            HH^.GearHidden:= HH^.Gear;
+            HH^.Gear:= nil
+            end
+        else if HH^.GearHidden <> nil then
+            begin
+            HH^.Gear:= HH^.GearHidden;
+            HH^.GearHidden:= nil;
+            InsertGearToList(HH^.Gear);
+            HH^.Gear^.State:= (HH^.Gear^.State or gstAttacked) and not gstHHDriven;
+            AddGearCI(HH^.Gear);
+            HH^.Gear^.Active:= true
             end;
-        if Gear = CurAmmoGear then CurAmmoGear := nil;
-        Gear^.Hedgehog:= CurrentHedgehog;
-        RemoveGearFromList(CurrentHedgehog^.Gear);
-        CurrentHedgehog^.Gear^.Z := cHHZ;
-        CurrentHedgehog^.Gear^.Active := false;
-        CurrentHedgehog^.Gear^.State:= CurrentHedgehog^.Gear^.State and not gstHHDriven;
-        CurrentHedgehog^.GearHidden:= CurrentHedgehog^.Gear;
-        CurrentHedgehog^.Gear:= nil;
-        Gear^.State:= Gear^.State or gstTmpFlag;
-        Gear^.Timer:= GameTicks + GetRandom(cHedgehogTurnTime*TeamsCount)+cHedgehogTurnTime;
-        end
-    else if (((Gear^.State and gstTmpFlag) <> 0) and (Gear^.Timer = GameTicks)) or SuddenDeath then
+        end;
+
+    inc(Gear^.Timer);
+    if (Gear^.Timer > 2000) and ((GameTicks mod 2000) = 1000) then
+        begin
+        Gear^.Pos:= 3;
+        end;
+    end;
+
+if (Gear^.Pos = 1) and (GameTicks and $1F = 0) and (Gear^.Power < 255) then inc(Gear^.Power);
+if (Gear^.Pos = 3) and (GameTicks and $1F = 0) and (Gear^.Power > 0) then dec(Gear^.Power);
+if (Gear^.Pos = 1) and (Gear^.Power = 255) and ((GameTicks mod 2000) = 1000) then Gear^.Pos:= 2;
+if (Gear^.Pos = 3) and (Gear^.Power = 0) then
+    begin
+    Gear^.Pos:= 4;
+    // This condition might need tweaking
+    Gear^.Timer:= GetRandom(cHedgehogTurnTime*TeamsCount)+cHedgehogTurnTime
+    end;
+
+if (Gear^.Pos = 4) then
+    begin
+    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);
+    if (cnt = 0) or SuddenDeathDmg or (Gear^.Timer = 0) then
         begin
-        if Gear^.Hedgehog <> nil then
+        Gear^.Pos:= 1;
+        Gear^.Power:= 0;
+        Gear^.Timer:= 0;
+        FindPlace(HH^.GearHidden, false, 0, LAND_WIDTH,true);
+        if HH^.GearHidden <> nil then 
             begin
-            Gear^.Hedgehog^.Gear:= Gear^.Hedgehog^.GearHidden;
-            Gear^.Hedgehog^.GearHidden:= nil;
-            FindPlace(Gear^.Hedgehog^.Gear, false, 0, LAND_WIDTH,true);
-            InsertGearToList(Gear^.Hedgehog^.Gear);
-            Gear^.Hedgehog^.Gear^.State:= (Gear^.Hedgehog^.Gear^.State or gstTmpFlag or gstAttacked) and not gstHHDriven;
-            Gear^.Hedgehog^.Gear^.Timer:= $FF;
-            Gear^.Hedgehog^.Gear^.doStep:= @doStepHedgehogReturn;
-            SetAllHHToActive;
-            end;
-            DeleteGear(Gear)
+            Gear^.X:= HH^.GearHidden^.X;
+            Gear^.Y:= HH^.GearHidden^.Y;
+            end
         end
+    else dec(Gear^.Timer);
+    end;
+
+end;
+
+procedure doStepTardis(Gear: PGear);
+var i,j,cnt: LongWord;
+    HH: PHedgehog;
+begin
+(*
+    Conditions for not activating.
+    1. Hog is last of his clan
+    2. Sudden Death is in play
+    3. Hog is a king
+*)
+    HH:= Gear^.Hedgehog;
+    if (HH^.Gear = nil) or (HH^.King) or (SuddenDeathDmg) then
+        begin
+        DeleteGear(gear);
+        exit
+        end;
+    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);
+    if cnt < 2 then
+        begin
+        DeleteGear(gear);
+        exit
+        end;
+    with HH^.Gear^ do
+        begin
+        Message := Message and not gmAttack
+        end;
+    Gear^.doStep:= @doStepTardisWarp
 end;
 
 ////////////////////////////////////////////////////////////////////////////////