hedgewars/GSHandlers.inc
changeset 1133 5d5a912d6fc2
parent 1132 b4c0698fbb6b
child 1142 2c522c1ded31
equal deleted inserted replaced
1132:b4c0698fbb6b 1133:5d5a912d6fc2
    19 procedure doStepDrowningGear(Gear: PGear); forward;
    19 procedure doStepDrowningGear(Gear: PGear); forward;
    20 
    20 
    21 function CheckGearDrowning(Gear: PGear): boolean;
    21 function CheckGearDrowning(Gear: PGear): boolean;
    22 begin
    22 begin
    23 if cWaterLine < hwRound(Gear^.Y) + Gear^.Radius then
    23 if cWaterLine < hwRound(Gear^.Y) + Gear^.Radius then
    24    begin
    24 	begin
    25    CheckGearDrowning:= true;
    25 	CheckGearDrowning:= true;
    26    Gear^.State:= gstDrowning;
    26 	Gear^.State:= gstDrowning;
    27    Gear^.doStep:= @doStepDrowningGear;
    27 	Gear^.doStep:= @doStepDrowningGear;
    28    PlaySound(sndSplash, false)
    28 	PlaySound(sndSplash, false)
    29    end else
    29 	end else
    30    CheckGearDrowning:= false
    30 	CheckGearDrowning:= false
    31 end;
    31 end;
    32 
    32 
    33 procedure CheckCollision(Gear: PGear);
    33 procedure CheckCollision(Gear: PGear);
    34 begin
    34 begin
    35 if TestCollisionXwithGear(Gear, hwSign(Gear^.X)) or TestCollisionYwithGear(Gear, hwSign(Gear^.Y))
    35 if TestCollisionXwithGear(Gear, hwSign(Gear^.X)) or TestCollisionYwithGear(Gear, hwSign(Gear^.Y))
    36    then Gear^.State:= Gear^.State or      gstCollision
    36 	then Gear^.State:= Gear^.State or      gstCollision
    37    else Gear^.State:= Gear^.State and not gstCollision
    37 	else Gear^.State:= Gear^.State and not gstCollision
    38 end;
    38 end;
    39 
    39 
    40 procedure CheckHHDamage(Gear: PGear);
    40 procedure CheckHHDamage(Gear: PGear);
    41 var dmg: Longword;
    41 var dmg: Longword;
    42 begin
    42 begin
    57 ////////////////////////////////////////////////////////////////////////////////
    57 ////////////////////////////////////////////////////////////////////////////////
    58 procedure CalcRotationDirAngle(Gear: PGear);
    58 procedure CalcRotationDirAngle(Gear: PGear);
    59 var dAngle: real;
    59 var dAngle: real;
    60 begin
    60 begin
    61 dAngle:= (hwAbs(Gear^.dX) + hwAbs(Gear^.dY)).QWordValue / $80000000;
    61 dAngle:= (hwAbs(Gear^.dX) + hwAbs(Gear^.dY)).QWordValue / $80000000;
    62 if not Gear^.dX.isNegative then Gear^.DirAngle:= Gear^.DirAngle + dAngle
    62 if not Gear^.dX.isNegative then
    63                 else Gear^.DirAngle:= Gear^.DirAngle - dAngle;
    63 	Gear^.DirAngle:= Gear^.DirAngle + dAngle
       
    64 else
       
    65 	Gear^.DirAngle:= Gear^.DirAngle - dAngle;
       
    66 
    64 if Gear^.DirAngle < 0 then Gear^.DirAngle:= Gear^.DirAngle + 360
    67 if Gear^.DirAngle < 0 then Gear^.DirAngle:= Gear^.DirAngle + 360
    65 else if 360 < Gear^.DirAngle then Gear^.DirAngle:= Gear^.DirAngle - 360
    68 else if 360 < Gear^.DirAngle then Gear^.DirAngle:= Gear^.DirAngle - 360
    66 end;
    69 end;
    67 
    70 
    68 ////////////////////////////////////////////////////////////////////////////////
    71 ////////////////////////////////////////////////////////////////////////////////
    78 var isFalling: boolean;
    81 var isFalling: boolean;
    79 begin
    82 begin
    80 Gear^.State:= Gear^.State and not gstCollision;
    83 Gear^.State:= Gear^.State and not gstCollision;
    81 
    84 
    82 if Gear^.dY.isNegative then
    85 if Gear^.dY.isNegative then
    83    begin
    86 	begin
    84    isFalling:= true;
    87 	isFalling:= true;
    85    if TestCollisionYwithGear(Gear, -1) then
    88 	if TestCollisionYwithGear(Gear, -1) then
    86       begin
    89 		begin
    87       Gear^.dX:=   Gear^.dX * Gear^.Friction;
    90 		Gear^.dX:=   Gear^.dX * Gear^.Friction;
    88       Gear^.dY:= - Gear^.dY * Gear^.Elasticity;
    91 		Gear^.dY:= - Gear^.dY * Gear^.Elasticity;
    89       Gear^.State:= Gear^.State or gstCollision
    92 		Gear^.State:= Gear^.State or gstCollision
    90       end
    93 		end
    91    end else
    94 	end else
    92    if TestCollisionYwithGear(Gear, 1) then
    95 	if TestCollisionYwithGear(Gear, 1) then
    93       begin
    96 		begin
    94       isFalling:= false;
    97 		isFalling:= false;
    95       Gear^.dX:=   Gear^.dX * Gear^.Friction;
    98 		Gear^.dX:=   Gear^.dX * Gear^.Friction;
    96       Gear^.dY:= - Gear^.dY * Gear^.Elasticity;
    99 		Gear^.dY:= - Gear^.dY * Gear^.Elasticity;
    97       Gear^.State:= Gear^.State or gstCollision
   100 		Gear^.State:= Gear^.State or gstCollision
    98       end else isFalling:= true;
   101 		end else isFalling:= true;
    99 
   102 
   100 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then
   103 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then
   101    begin
   104 	begin
   102    Gear^.dX:= - Gear^.dX * Gear^.Elasticity;
   105 	Gear^.dX:= - Gear^.dX * Gear^.Elasticity;
   103    Gear^.dY:=   Gear^.dY * Gear^.Elasticity;
   106 	Gear^.dY:=   Gear^.dY * Gear^.Elasticity;
   104    Gear^.State:= Gear^.State or gstCollision
   107 	Gear^.State:= Gear^.State or gstCollision
   105    end;
   108 	end;
   106 
   109 
   107 if isFalling then Gear^.dY:= Gear^.dY + cGravity;
   110 if isFalling then Gear^.dY:= Gear^.dY + cGravity;
   108 
   111 
   109 Gear^.X:= Gear^.X + Gear^.dX;
   112 Gear^.X:= Gear^.X + Gear^.dX;
   110 Gear^.Y:= Gear^.Y + Gear^.dY;
   113 Gear^.Y:= Gear^.Y + Gear^.dY;
   111 CheckGearDrowning(Gear);
   114 CheckGearDrowning(Gear);
   112 if (hwSqr(Gear^.dX) + hwSqr(Gear^.dY) < _0_0002) and
   115 if (hwSqr(Gear^.dX) + hwSqr(Gear^.dY) < _0_0002) and
   113    (not isFalling) then Gear^.State:= Gear^.State and not gstMoving
   116 	(not isFalling) then
   114                    else Gear^.State:= Gear^.State or      gstMoving
   117 	Gear^.State:= Gear^.State and not gstMoving
       
   118 else
       
   119 	Gear^.State:= Gear^.State or      gstMoving
   115 end;
   120 end;
   116 
   121 
   117 ////////////////////////////////////////////////////////////////////////////////
   122 ////////////////////////////////////////////////////////////////////////////////
   118 procedure doStepBomb(Gear: PGear);
   123 procedure doStepBomb(Gear: PGear);
   119 var i: LongInt;
   124 var i: LongInt;
   121 begin
   126 begin
   122 AllInactive:= false;
   127 AllInactive:= false;
   123 doStepFallingGear(Gear);
   128 doStepFallingGear(Gear);
   124 dec(Gear^.Timer);
   129 dec(Gear^.Timer);
   125 if Gear^.Timer = 0 then
   130 if Gear^.Timer = 0 then
   126    begin
   131 	begin
   127    case Gear^.Kind of
   132 	case Gear^.Kind of
   128         gtAmmo_Bomb: doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound);
   133 		gtAmmo_Bomb: doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound);
   129       gtClusterBomb: begin
   134 		gtClusterBomb: begin
   130                      doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 20, EXPLAutoSound);
   135 				doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 20, EXPLAutoSound);
   131                      for i:= 0 to 4 do
   136 				for i:= 0 to 4 do
   132                          begin
   137 					begin
   133                          dX:= rndSign(GetRandom * _0_1);
   138 					dX:= rndSign(GetRandom * _0_1);
   134                          dY:= (GetRandom - _3) * _0_08;
   139 					dY:= (GetRandom - _3) * _0_08;
   135                          AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtCluster, 0, dX, dY, 0);
   140 					AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtCluster, 0, dX, dY, 0);
   136                          end
   141 					end
   137                      end
   142 				end
   138         end;
   143 		end;
   139    DeleteGear(Gear);
   144 	DeleteGear(Gear);
   140    exit
   145 	exit
   141    end;
   146 	end;
   142 CalcRotationDirAngle(Gear);
   147 CalcRotationDirAngle(Gear);
   143 if (Gear^.State and (gstCollision or gstMoving)) = (gstCollision or gstMoving) then PlaySound(sndGrenadeImpact, false)
   148 if (Gear^.State and (gstCollision or gstMoving)) = (gstCollision or gstMoving) then PlaySound(sndGrenadeImpact, false)
   144 end;
   149 end;
   145 
   150 
   146 procedure doStepCluster(Gear: PGear);
   151 procedure doStepCluster(Gear: PGear);
   147 begin
   152 begin
   148 AllInactive:= false;
   153 AllInactive:= false;
   149 doStepFallingGear(Gear);
   154 doStepFallingGear(Gear);
   150 if (Gear^.State and gstCollision) <> 0 then
   155 if (Gear^.State and gstCollision) <> 0 then
   151    begin
   156 	begin
   152    doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 25, EXPLAutoSound);
   157 	doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 25, EXPLAutoSound);
   153    DeleteGear(Gear);
   158 	DeleteGear(Gear);
   154    exit
   159 	exit
   155    end;
   160 	end;
   156 if (GameTicks and $1F) = 0 then
   161 if (GameTicks and $1F) = 0 then
   157    AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0)
   162 	AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0)
   158 end;
   163 end;
   159 
   164 
   160 ////////////////////////////////////////////////////////////////////////////////
   165 ////////////////////////////////////////////////////////////////////////////////
   161 procedure doStepGrenade(Gear: PGear);
   166 procedure doStepGrenade(Gear: PGear);
   162 begin
   167 begin
   163 AllInactive:= false;
   168 AllInactive:= false;
   164 Gear^.dX:= Gear^.dX + cWindSpeed;
   169 Gear^.dX:= Gear^.dX + cWindSpeed;
   165 doStepFallingGear(Gear);
   170 doStepFallingGear(Gear);
   166 if (Gear^.State and gstCollision) <> 0 then
   171 if (Gear^.State and gstCollision) <> 0 then
   167    begin
   172 	begin
   168    doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound);
   173 	doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound);
   169    DeleteGear(Gear);
   174 	DeleteGear(Gear);
   170    exit
   175 	exit
   171    end;
   176 	end;
   172 if (GameTicks and $3F) = 0 then
   177 if (GameTicks and $3F) = 0 then
   173    AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0)
   178 	AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0)
   174 end;
   179 end;
   175 
   180 
   176 ////////////////////////////////////////////////////////////////////////////////
   181 ////////////////////////////////////////////////////////////////////////////////
   177 procedure doStepHealthTagWork(Gear: PGear);
   182 procedure doStepHealthTagWork(Gear: PGear);
   178 begin
   183 begin
   179 if Gear^.Kind = gtHealthTag then
   184 if Gear^.Kind = gtHealthTag then
   180    AllInactive:= false;
   185    AllInactive:= false;
   181 dec(Gear^.Timer);
   186 dec(Gear^.Timer);
   182 Gear^.Y:= Gear^.Y + Gear^.dY;
   187 Gear^.Y:= Gear^.Y + Gear^.dY;
   183 if Gear^.Timer = 0 then
   188 if Gear^.Timer = 0 then
   184    begin
   189 	begin
   185    if Gear^.Kind = gtHealthTag then
   190 	if Gear^.Kind = gtHealthTag then
   186       PHedgehog(Gear^.Hedgehog)^.Gear^.Active:= true; // to let current hh die
   191 		PHedgehog(Gear^.Hedgehog)^.Gear^.Active:= true; // to let current hh die
   187    DeleteGear(Gear)
   192 	DeleteGear(Gear)
   188    end
   193 	end
   189 end;
   194 end;
   190 
   195 
   191 procedure doStepHealthTagWorkUnderWater(Gear: PGear);
   196 procedure doStepHealthTagWorkUnderWater(Gear: PGear);
   192 begin
   197 begin
   193 AllInactive:= false;
   198 AllInactive:= false;
   775 ////////////////////////////////////////////////////////////////////////////////
   780 ////////////////////////////////////////////////////////////////////////////////
   776 procedure doStepSmokeTrace(Gear: PGear);
   781 procedure doStepSmokeTrace(Gear: PGear);
   777 begin
   782 begin
   778 inc(Gear^.Timer);
   783 inc(Gear^.Timer);
   779 if Gear^.Timer > 64 then
   784 if Gear^.Timer > 64 then
   780    begin
   785 	begin
   781    Gear^.Timer:= 0;
   786 	Gear^.Timer:= 0;
   782    dec(Gear^.State)
   787 	dec(Gear^.State)
   783    end;
   788 	end;
   784 Gear^.dX:= Gear^.dX + cWindSpeed;
   789 Gear^.dX:= Gear^.dX + cWindSpeed;
   785 Gear^.X:= Gear^.X + Gear^.dX;
   790 Gear^.X:= Gear^.X + Gear^.dX;
   786 if Gear^.State = 0 then DeleteGear(Gear)
   791 if Gear^.State = 0 then DeleteGear(Gear)
   787 end;
   792 end;
   788 
   793 
   789 ////////////////////////////////////////////////////////////////////////////////
   794 ////////////////////////////////////////////////////////////////////////////////
   790 procedure doStepExplosionWork(Gear: PGear);
   795 procedure doStepExplosionWork(Gear: PGear);
   791 begin
   796 begin
   792 inc(Gear^.Timer);
   797 inc(Gear^.Timer);
   793 if Gear^.Timer > 75 then
   798 if Gear^.Timer > 75 then
   794    begin
   799 	begin
   795    inc(Gear^.State);
   800 	inc(Gear^.State);
   796    Gear^.Timer:= 0;
   801 	Gear^.Timer:= 0;
   797    if Gear^.State > 5 then DeleteGear(Gear)
   802 	if Gear^.State > 5 then DeleteGear(Gear)
   798    end;
   803 	end;
   799 end;
   804 end;
   800 
   805 
   801 procedure doStepExplosion(Gear: PGear);
   806 procedure doStepExplosion(Gear: PGear);
   802 var i: LongWord;
   807 var i: LongWord;
   803 begin
   808 begin
   825 	end else
   830 	end else
   826 	if ((GameTicks and $3F) = 25) then
   831 	if ((GameTicks and $3F) = 25) then
   827 		doStepFallingGear(Gear);
   832 		doStepFallingGear(Gear);
   828 
   833 
   829 if ((Gear^.State and gsttmpFlag) <> 0) then
   834 if ((Gear^.State and gsttmpFlag) <> 0) then
   830    if ((Gear^.State and gstAttacking) = 0) then
   835 	if ((Gear^.State and gstAttacking) = 0) then
   831       begin
   836 		begin
   832       if ((GameTicks and $1F) = 0) then
   837 		if ((GameTicks and $1F) = 0) then
   833          if CheckGearNear(Gear, gtHedgehog, 46, 32) <> nil then Gear^.State:= Gear^.State or gstAttacking
   838 			if CheckGearNear(Gear, gtHedgehog, 46, 32) <> nil then Gear^.State:= Gear^.State or gstAttacking
   834       end else // gstAttacking <> 0
   839 		end else // gstAttacking <> 0
   835       begin
   840 		begin
   836       AllInactive:= false;
   841 		AllInactive:= false;
   837       if (Gear^.Timer and $FF) = 0 then PlaySound(sndMineTick, false);
   842 		if (Gear^.Timer and $FF) = 0 then PlaySound(sndMineTick, false);
   838       if Gear^.Timer = 0 then
   843 		if Gear^.Timer = 0 then
   839          begin
   844 			begin
   840          doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound);
   845 			doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound);
   841          DeleteGear(Gear);
   846 			DeleteGear(Gear);
   842          exit
   847 			exit
   843          end;
   848 			end;
   844       dec(Gear^.Timer);
   849 		dec(Gear^.Timer);
   845       end else // gsttmpFlag = 0
   850 		end else // gsttmpFlag = 0
   846    if TurnTimeLeft = 0 then Gear^.State:= Gear^.State or gsttmpFlag;
   851 	if TurnTimeLeft = 0 then Gear^.State:= Gear^.State or gsttmpFlag;
   847 end;
   852 end;
   848 
   853 
   849 ////////////////////////////////////////////////////////////////////////////////
   854 ////////////////////////////////////////////////////////////////////////////////
   850 procedure doStepDynamite(Gear: PGear);
   855 procedure doStepDynamite(Gear: PGear);
   851 begin
   856 begin
   852 doStepFallingGear(Gear);
   857 doStepFallingGear(Gear);
   853 AllInactive:= false;
   858 AllInactive:= false;
   854 if Gear^.Timer mod 166 = 0 then inc(Gear^.Tag);
   859 if Gear^.Timer mod 166 = 0 then inc(Gear^.Tag);
   855 if Gear^.Timer = 0 then
   860 if Gear^.Timer = 0 then
   856    begin
   861 	begin
   857    doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 75, EXPLAutoSound);
   862 	doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 75, EXPLAutoSound);
   858    DeleteGear(Gear);
   863 	DeleteGear(Gear);
   859    exit
   864 	exit
   860    end;
   865 	end;
   861 dec(Gear^.Timer);
   866 dec(Gear^.Timer);
   862 end;
   867 end;
   863 
   868 
   864 ///////////////////////////////////////////////////////////////////////////////
   869 ///////////////////////////////////////////////////////////////////////////////
   865 procedure doStepCase(Gear: PGear);
   870 procedure doStepCase(Gear: PGear);
   866 var i, x, y: LongInt;
   871 var i, x, y: LongInt;
   867 begin
   872 begin
   868 if (Gear^.Message and gm_Destroy) > 0 then
   873 if (Gear^.Message and gm_Destroy) > 0 then
   869    begin
   874 	begin
   870    DeleteGear(Gear);
   875 	DeleteGear(Gear);
   871    FreeActionsList;
   876 	FreeActionsList;
   872    SetAllToActive; // something (hh, mine, etc...) could be on top of the case
   877 	SetAllToActive; // something (hh, mine, etc...) could be on top of the case
   873    with CurrentHedgehog^ do
   878 	with CurrentHedgehog^ do
   874      if Gear <> nil then Gear^.Message:= Gear^.Message and not (gm_LJump or gm_HJump);
   879 		if Gear <> nil then Gear^.Message:= Gear^.Message and not (gm_LJump or gm_HJump);
   875    exit
   880 	exit
   876    end;
   881 	end;
   877 
   882 
   878 if Gear^.Damage > 0 then
   883 if Gear^.Damage > 0 then
   879    begin
   884 	begin
   880    x:= hwRound(Gear^.X);
   885 	x:= hwRound(Gear^.X);
   881    y:= hwRound(Gear^.Y);
   886 	y:= hwRound(Gear^.Y);
   882    DeleteGear(Gear);
   887 	DeleteGear(Gear);
   883    if Gear^.Kind = gtCase then
   888 	if Gear^.Kind = gtCase then
   884       begin
   889 		begin
   885       doMakeExplosion(x, y, 25, EXPLAutoSound);
   890 		doMakeExplosion(x, y, 25, EXPLAutoSound);
   886       for i:= 0 to 63 do
   891 		for i:= 0 to 63 do
   887           AddGear(x, y, gtFlame, 0, _0, _0, 0);
   892 			AddGear(x, y, gtFlame, 0, _0, _0, 0);
   888       end;
   893 		end;
   889    exit
   894 	exit
   890    end;
   895 	end;
   891 
   896 
   892 if (Gear^.dY.QWordValue <> 0) or (not TestCollisionYwithGear(Gear, 1)) then
   897 if (Gear^.dY.QWordValue <> 0) or (not TestCollisionYwithGear(Gear, 1)) then
   893    begin
   898 	begin
   894    AllInactive:= false;
   899 	AllInactive:= false;
   895    Gear^.dY:= Gear^.dY + cGravity;
   900 	Gear^.dY:= Gear^.dY + cGravity;
   896    Gear^.Y:= Gear^.Y + Gear^.dY;
   901 	Gear^.Y:= Gear^.Y + Gear^.dY;
   897    if (Gear^.dY.isNegative) and TestCollisionYwithGear(Gear, -1) then Gear^.dY:= _0 else
   902 	if (Gear^.dY.isNegative) and TestCollisionYwithGear(Gear, -1) then Gear^.dY:= _0 else
   898    if (not Gear^.dY.isNegative) and TestCollisionYwithGear(Gear, 1) then
   903 	if (not Gear^.dY.isNegative) and TestCollisionYwithGear(Gear, 1) then
   899       begin
   904 		begin
   900       Gear^.dY:= - Gear^.dY * Gear^.Elasticity;
   905 		Gear^.dY:= - Gear^.dY * Gear^.Elasticity;
   901       if Gear^.dY > - _0_001 then Gear^.dY:= _0
   906 		if Gear^.dY > - _0_001 then Gear^.dY:= _0
   902          else if Gear^.dY < - _0_03 then PlaySound(sndGraveImpact, false);
   907 			else if Gear^.dY < - _0_03 then PlaySound(sndGraveImpact, false);
   903       end;
   908 		end;
   904    CheckGearDrowning(Gear);
   909 	CheckGearDrowning(Gear);
   905    end;
   910 	end;
   906 
   911 
   907 if (Gear^.dY.QWordValue = 0) then AddGearCI(Gear)
   912 if (Gear^.dY.QWordValue = 0) then AddGearCI(Gear)
   908    else if (Gear^.dY.QWordValue <> 0) then DeleteCI(Gear)
   913 	else if (Gear^.dY.QWordValue <> 0) then DeleteCI(Gear)
   909 end;
   914 end;
   910 
   915 
   911 ////////////////////////////////////////////////////////////////////////////////
   916 ////////////////////////////////////////////////////////////////////////////////
   912 const cSorterWorkTime = 640;
   917 const cSorterWorkTime = 640;
   913 var thexchar: array[0..cMaxTeams] of
   918 var thexchar: array[0..cMaxTeams] of
   914                              record
   919 			record
   915                              dy, ny, dw: LongInt;
   920 			dy, ny, dw: LongInt;
   916                              team: PTeam;
   921 			team: PTeam;
   917                              SortFactor: QWord;
   922 			SortFactor: QWord;
   918                              end;
   923 			end;
   919     currsorter: PGear = nil;
   924     currsorter: PGear = nil;
   920 
   925 
   921 procedure doStepTeamHealthSorterWork(Gear: PGear);
   926 procedure doStepTeamHealthSorterWork(Gear: PGear);
   922 var i: LongInt;
   927 var i: LongInt;
   923 begin
   928 begin
   924 AllInactive:= false;
   929 AllInactive:= false;
   925 dec(Gear^.Timer);
   930 dec(Gear^.Timer);
   926 if (Gear^.Timer and 15) = 0 then
   931 if (Gear^.Timer and 15) = 0 then
   927    for i:= 0 to Pred(TeamsCount) do
   932 	for i:= 0 to Pred(TeamsCount) do
   928        with thexchar[i] do
   933 		with thexchar[i] do
   929             begin
   934 			begin
   930             {$WARNINGS OFF}
   935 			{$WARNINGS OFF}
   931             team^.DrawHealthY:= ny + dy * Gear^.Timer div 640;
   936 			team^.DrawHealthY:= ny + dy * Gear^.Timer div 640;
   932             team^.TeamHealthBarWidth:= team^.NewTeamHealthBarWidth + dw * Gear^.Timer div cSorterWorkTime;
   937 			team^.TeamHealthBarWidth:= team^.NewTeamHealthBarWidth + dw * Gear^.Timer div cSorterWorkTime;
   933             {$WARNINGS ON}
   938 			{$WARNINGS ON}
   934             end;
   939 			end;
       
   940 
   935 if (Gear^.Timer = 0) or (currsorter <> Gear) then
   941 if (Gear^.Timer = 0) or (currsorter <> Gear) then
   936    begin
   942 	begin
   937    if currsorter = Gear then currsorter:= nil;
   943 	if currsorter = Gear then currsorter:= nil;
   938    DeleteGear(Gear)
   944 	DeleteGear(Gear)
   939    end
   945 	end
   940 end;
   946 end;
   941 
   947 
   942 procedure doStepTeamHealthSorter(Gear: PGear);
   948 procedure doStepTeamHealthSorter(Gear: PGear);
   943 var i, t: Longword;
   949 var i: Longword;
   944     b: boolean;
   950 	b: boolean;
       
   951 	t: LongInt;
   945 begin
   952 begin
   946 AllInactive:= false;
   953 AllInactive:= false;
   947 
   954 
   948 for t:= 0 to Pred(TeamsCount) do
   955 for t:= 0 to Pred(TeamsCount) do
   949   with thexchar[t] do
   956 	with thexchar[t] do
   950       begin
   957 		begin
   951       dy:= TeamsArray[t]^.DrawHealthY;
   958 		dy:= TeamsArray[t]^.DrawHealthY;
   952       dw:= TeamsArray[t]^.TeamHealthBarWidth - TeamsArray[t]^.NewTeamHealthBarWidth;
   959 		dw:= TeamsArray[t]^.TeamHealthBarWidth - TeamsArray[t]^.NewTeamHealthBarWidth;
   953       team:= TeamsArray[t];
   960 		team:= TeamsArray[t];
   954       SortFactor:= TeamsArray[t]^.Clan^.ClanHealth;
   961 		SortFactor:= TeamsArray[t]^.Clan^.ClanHealth;
   955       SortFactor:= (SortFactor shl  3) + TeamsArray[t]^.Clan^.ClanIndex;
   962 		SortFactor:= (SortFactor shl  3) + TeamsArray[t]^.Clan^.ClanIndex;
   956       SortFactor:= (SortFactor shl 30) + TeamsArray[t]^.TeamHealth;
   963 		SortFactor:= (SortFactor shl 30) + TeamsArray[t]^.TeamHealth;
   957       end;
   964 		end;
   958 
   965 
   959 if TeamsCount > 1 then
   966 if TeamsCount > 1 then
   960   repeat
   967 	repeat
   961     b:= true;
   968 	b:= true;
   962     for t:= 0 to TeamsCount - 2 do
   969 	for t:= 0 to TeamsCount - 2 do
   963         if (thexchar[t].SortFactor > thexchar[Succ(t)].SortFactor) then
   970 		if (thexchar[t].SortFactor > thexchar[Succ(t)].SortFactor) then
   964            begin
   971 			begin
   965            thexchar[cMaxTeams]:= thexchar[t];
   972 			thexchar[cMaxTeams]:= thexchar[t];
   966            thexchar[t]:= thexchar[Succ(t)];
   973 			thexchar[t]:= thexchar[Succ(t)];
   967            thexchar[Succ(t)]:= thexchar[cMaxTeams];
   974 			thexchar[Succ(t)]:= thexchar[cMaxTeams];
   968            b:= false
   975 			b:= false
   969            end
   976 			end
   970   until b;
   977 	until b;
   971 
   978 
   972 t:= - 4;
   979 t:= - 4;
   973 for i:= 0 to Pred(TeamsCount) do
   980 for i:= 0 to Pred(TeamsCount) do
   974     with thexchar[i] do
   981 	with thexchar[i] do
   975          begin
   982 		begin
   976          dec(t, team^.HealthTex^.h + 2);
   983 		dec(t, team^.HealthTex^.h + 2);
   977          ny:= t;
   984 		ny:= t;
   978          dy:= dy - ny
   985 		dy:= dy - ny
   979          end;
   986 		end;
   980 
   987 
   981 Gear^.Timer:= cSorterWorkTime;
   988 Gear^.Timer:= cSorterWorkTime;
   982 Gear^.doStep:= @doStepTeamHealthSorterWork;
   989 Gear^.doStep:= @doStepTeamHealthSorterWork;
   983 currsorter:= Gear
   990 currsorter:= Gear
   984 end;
   991 end;
  1032 ////////////////////////////////////////////////////////////////////////////////
  1039 ////////////////////////////////////////////////////////////////////////////////
  1033 procedure doStepFlame(Gear: PGear);
  1040 procedure doStepFlame(Gear: PGear);
  1034 begin
  1041 begin
  1035 AllInactive:= false;
  1042 AllInactive:= false;
  1036 if not TestCollisionYwithGear(Gear, 1) then
  1043 if not TestCollisionYwithGear(Gear, 1) then
  1037    begin
  1044 	begin
  1038    Gear^.dX:= Gear^.dX + cWindSpeed;
  1045 	Gear^.dX:= Gear^.dX + cWindSpeed;
  1039    Gear^.dY:= Gear^.dY + cGravity;
  1046 	Gear^.dY:= Gear^.dY + cGravity;
  1040    if hwAbs(Gear^.dX) > _0_1 then Gear^.dX:= Gear^.dX * _0_5;
  1047 	if hwAbs(Gear^.dX) > _0_1 then Gear^.dX:= Gear^.dX * _0_5;
  1041    if Gear^.dY > _0_1 then Gear^.dY:= Gear^.dY * _0_995;
  1048 	if Gear^.dY > _0_1 then Gear^.dY:= Gear^.dY * _0_995;
  1042    Gear^.X:= Gear^.X + Gear^.dX;
  1049 	Gear^.X:= Gear^.X + Gear^.dX;
  1043    Gear^.Y:= Gear^.Y + Gear^.dY;
  1050 	Gear^.Y:= Gear^.Y + Gear^.dY;
  1044    if not (Gear^.Y < _1024) then
  1051 	if not (Gear^.Y < _1024) then
  1045       begin
  1052 		begin
  1046       DeleteGear(Gear);
  1053 		DeleteGear(Gear);
  1047       exit
  1054 		exit
  1048       end
  1055 		end
  1049    end else begin
  1056 	end else begin
  1050    if Gear^.Timer > 0 then dec(Gear^.Timer)
  1057 	if Gear^.Timer > 0 then dec(Gear^.Timer)
  1051       else begin
  1058 		else begin
  1052 //      doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 2, 0);
  1059 //		doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 2, 0);
  1053       dec(Gear^.Health);
  1060 		dec(Gear^.Health);
  1054       Gear^.Timer:= 1250 - Gear^.Angle * 12
  1061 		Gear^.Timer:= 1250 - Gear^.Angle * 12
  1055       end
  1062 		end
  1056    end;
  1063 	end;
  1057 
  1064 
  1058 if (((GameTicks div 8) mod 64) = Gear^.Angle) then
  1065 if (((GameTicks div 8) mod 64) = Gear^.Angle) then
  1059    AmmoFlameWork(Gear);
  1066 	AmmoFlameWork(Gear);
  1060 
  1067 
  1061 if Gear^.Health = 0 then
  1068 if Gear^.Health = 0 then
  1062    DeleteGear(Gear)
  1069 	DeleteGear(Gear)
  1063 end;
  1070 end;
  1064 
  1071 
  1065 ////////////////////////////////////////////////////////////////////////////////
  1072 ////////////////////////////////////////////////////////////////////////////////
  1066 procedure doStepFirePunchWork(Gear: PGear);
  1073 procedure doStepFirePunchWork(Gear: PGear);
  1067 var HHGear: PGear;
  1074 var HHGear: PGear;
  1068 begin
  1075 begin
  1069 AllInactive:= false;
  1076 AllInactive:= false;
  1070 if ((Gear^.Message and gm_Destroy) <> 0) then
  1077 if ((Gear^.Message and gm_Destroy) <> 0) then
  1071    begin
  1078 	begin
  1072    DeleteGear(Gear);
  1079 	DeleteGear(Gear);
  1073    AfterAttack;
  1080 	AfterAttack;
  1074    exit
  1081 	exit
  1075    end;
  1082 	end;
  1076 
  1083 
  1077 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
  1084 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
  1078 if hwRound(HHGear^.Y) <= Gear^.Tag - 2 then
  1085 if hwRound(HHGear^.Y) <= Gear^.Tag - 2 then
  1079    begin
  1086 	begin
  1080    Gear^.Tag:= hwRound(HHGear^.Y);
  1087 	Gear^.Tag:= hwRound(HHGear^.Y);
  1081    DrawTunnel(HHGear^.X - int2hwFloat(cHHRadius), HHGear^.Y - _1, _0_5, _0, cHHRadius * 4, 2);
  1088 	DrawTunnel(HHGear^.X - int2hwFloat(cHHRadius), HHGear^.Y - _1, _0_5, _0, cHHRadius * 4, 2);
  1082    HHGear^.State:= HHGear^.State or gstNoDamage;
  1089 	HHGear^.State:= HHGear^.State or gstNoDamage;
  1083    Gear^.Y:= HHGear^.Y;
  1090 	Gear^.Y:= HHGear^.Y;
  1084    AmmoShove(Gear, 30, 40);
  1091 	AmmoShove(Gear, 30, 40);
  1085    HHGear^.State:= HHGear^.State and not gstNoDamage
  1092 	HHGear^.State:= HHGear^.State and not gstNoDamage
  1086    end;
  1093 	end;
  1087 
  1094 
  1088 HHGear^.dY:= HHGear^.dY + cGravity;
  1095 HHGear^.dY:= HHGear^.dY + cGravity;
  1089 if not (HHGear^.dY.isNegative) then
  1096 if not (HHGear^.dY.isNegative) then
  1090    begin
  1097 	begin
  1091    HHGear^.State:= HHGear^.State or gstMoving;
  1098 	HHGear^.State:= HHGear^.State or gstMoving;
  1092    DeleteGear(Gear);
  1099 	DeleteGear(Gear);
  1093    AfterAttack;
  1100 	AfterAttack;
  1094    exit
  1101 	exit
  1095    end;
  1102 	end;
  1096 HHGear^.Y:= HHGear^.Y + HHGear^.dY
  1103 HHGear^.Y:= HHGear^.Y + HHGear^.dY
  1097 end;
  1104 end;
  1098 
  1105 
  1099 procedure doStepFirePunch(Gear: PGear);
  1106 procedure doStepFirePunch(Gear: PGear);
  1100 var HHGear: PGear;
  1107 var HHGear: PGear;
  1122 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
  1129 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
  1123 
  1130 
  1124 inc(Gear^.Timer);
  1131 inc(Gear^.Timer);
  1125 
  1132 
  1126 if TestCollisionYwithGear(HHGear, 1)
  1133 if TestCollisionYwithGear(HHGear, 1)
  1127    or ((HHGear^.State and gstHHDriven) = 0)
  1134 	or ((HHGear^.State and gstHHDriven) = 0)
  1128    or CheckGearDrowning(HHGear)
  1135 	or CheckGearDrowning(HHGear)
  1129    or ((Gear^.Message and gm_Attack) <> 0) then
  1136 	or ((Gear^.Message and gm_Attack) <> 0) then
  1130    begin
  1137 	begin
  1131    with HHGear^ do
  1138 	with HHGear^ do
  1132         begin
  1139 		begin
  1133         Message:= 0;
  1140 		Message:= 0;
  1134         SetLittle(dX);
  1141 		SetLittle(dX);
  1135         dY:= _0;
  1142 		dY:= _0;
  1136         State:= State or gstMoving;
  1143 		State:= State or gstMoving;
  1137         end;
  1144 		end;
  1138    DeleteGear(Gear);
  1145 	DeleteGear(Gear);
  1139    exit
  1146 	exit
  1140    end;
  1147 	end;
  1141 
  1148 
  1142 if not TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then
  1149 if not TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then
  1143    HHGear^.X:= HHGear^.X + cWindSpeed * 200;
  1150 	HHGear^.X:= HHGear^.X + cWindSpeed * 200;
  1144 
  1151 
  1145 if (Gear^.Message and gm_Left) <> 0 then HHGear^.X:= HHGear^.X - cMaxWindSpeed * 40
  1152 if (Gear^.Message and gm_Left) <> 0 then HHGear^.X:= HHGear^.X - cMaxWindSpeed * 40
  1146 else if (Gear^.Message and gm_Right) <> 0 then HHGear^.X:= HHGear^.X + cMaxWindSpeed * 40;
  1153 else if (Gear^.Message and gm_Right) <> 0 then HHGear^.X:= HHGear^.X + cMaxWindSpeed * 40;
  1147 if (Gear^.Message and gm_Up) <> 0 then HHGear^.Y:= HHGear^.Y - cGravity * 40
  1154 if (Gear^.Message and gm_Up) <> 0 then HHGear^.Y:= HHGear^.Y - cGravity * 40
  1148 else if (Gear^.Message and gm_Down) <> 0 then HHGear^.Y:= HHGear^.Y + cGravity * 40;
  1155 else if (Gear^.Message and gm_Down) <> 0 then HHGear^.Y:= HHGear^.Y + cGravity * 40;
  1202 Gear^.X:= _1024 - _2048 * Gear^.Tag;
  1209 Gear^.X:= _1024 - _2048 * Gear^.Tag;
  1203 Gear^.Y:= -_300;
  1210 Gear^.Y:= -_300;
  1204 Gear^.dX:= int2hwFloat(TargetPoint.X - 5 * Gear^.Tag * 15);
  1211 Gear^.dX:= int2hwFloat(TargetPoint.X - 5 * Gear^.Tag * 15);
  1205 
  1212 
  1206 if int2hwFloat(TargetPoint.Y) - Gear^.Y > _0 then
  1213 if int2hwFloat(TargetPoint.Y) - Gear^.Y > _0 then
  1207    Gear^.dX:= Gear^.dX - cBombsSpeed * hwSqrt((int2hwFloat(TargetPoint.Y) - Gear^.Y) * 2 / cGravity) * Gear^.Tag;
  1214 	Gear^.dX:= Gear^.dX - cBombsSpeed * hwSqrt((int2hwFloat(TargetPoint.Y) - Gear^.Y) * 2 / cGravity) * Gear^.Tag;
  1208 
  1215 
  1209 Gear^.Health:= 6;
  1216 Gear^.Health:= 6;
  1210 Gear^.doStep:= @doStepAirAttackWork;
  1217 Gear^.doStep:= @doStepAirAttackWork;
  1211 PlaySound(sndIncoming, false)
  1218 PlaySound(sndIncoming, false)
  1212 end;
  1219 end;
  1216 procedure doStepAirBomb(Gear: PGear);
  1223 procedure doStepAirBomb(Gear: PGear);
  1217 begin
  1224 begin
  1218 AllInactive:= false;
  1225 AllInactive:= false;
  1219 doStepFallingGear(Gear);
  1226 doStepFallingGear(Gear);
  1220 if (Gear^.State and gstCollision) <> 0 then
  1227 if (Gear^.State and gstCollision) <> 0 then
  1221    begin
  1228 	begin
  1222    doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 30, EXPLAutoSound);
  1229 	doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 30, EXPLAutoSound);
  1223    DeleteGear(Gear);
  1230 	DeleteGear(Gear);
  1224    exit
  1231 	exit
  1225    end;
  1232 	end;
  1226 if (GameTicks and $3F) = 0 then
  1233 if (GameTicks and $3F) = 0 then
  1227    AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0)
  1234 	AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0)
  1228 end;
  1235 end;
  1229 
  1236 
  1230 ////////////////////////////////////////////////////////////////////////////////
  1237 ////////////////////////////////////////////////////////////////////////////////
  1231 
  1238 
  1232 procedure doStepGirder(Gear: PGear);
  1239 procedure doStepGirder(Gear: PGear);
  1236 
  1243 
  1237 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
  1244 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
  1238 if not TryPlaceOnLand(TargetPoint.X - SpritesData[sprAmGirder].Width div 2,
  1245 if not TryPlaceOnLand(TargetPoint.X - SpritesData[sprAmGirder].Width div 2,
  1239                       TargetPoint.Y - SpritesData[sprAmGirder].Height div 2,
  1246                       TargetPoint.Y - SpritesData[sprAmGirder].Height div 2,
  1240                       sprAmGirder, Gear^.State, true) then
  1247                       sprAmGirder, Gear^.State, true) then
  1241         begin
  1248 	begin
  1242         HHGear^.Message:= HHGear^.Message and not gm_Attack;
  1249 	HHGear^.Message:= HHGear^.Message and not gm_Attack;
  1243         HHGear^.State:= HHGear^.State and not gstAttacking;
  1250 	HHGear^.State:= HHGear^.State and not gstAttacking;
  1244         HHGear^.State:= HHGear^.State or gstHHChooseTarget;
  1251 	HHGear^.State:= HHGear^.State or gstHHChooseTarget;
  1245         DeleteGear(Gear);
  1252 	DeleteGear(Gear);
  1246         isCursorVisible:= true
  1253 	isCursorVisible:= true
  1247         end
  1254 	end
  1248    else begin
  1255 else begin
  1249         DeleteGear(Gear);
  1256 	DeleteGear(Gear);
  1250         AfterAttack
  1257 	AfterAttack
  1251         end;
  1258 	end;
  1252 TargetPoint.X:= NoPointX
  1259 TargetPoint.X:= NoPointX
  1253 end;
  1260 end;
  1254 
  1261 
  1255 ////////////////////////////////////////////////////////////////////////////////
  1262 ////////////////////////////////////////////////////////////////////////////////
  1256 procedure doStepTeleportAfter(Gear: PGear);
  1263 procedure doStepTeleportAfter(Gear: PGear);
  1258 begin
  1265 begin
  1259 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
  1266 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
  1260 HHGear^.Y:= HHGear^.Y + HHGear^.dY; // hedgehog falling to collect cases
  1267 HHGear^.Y:= HHGear^.Y + HHGear^.dY; // hedgehog falling to collect cases
  1261 HHGear^.dY:= HHGear^.dY + cGravity;
  1268 HHGear^.dY:= HHGear^.dY + cGravity;
  1262 if TestCollisionYwithGear(HHGear, 1)
  1269 if TestCollisionYwithGear(HHGear, 1)
  1263    or CheckGearDrowning(HHGear) then
  1270 	or CheckGearDrowning(HHGear) then
  1264    begin
  1271 	begin
  1265    DeleteGear(Gear);
  1272 	DeleteGear(Gear);
  1266    AfterAttack
  1273 	AfterAttack
  1267    end
  1274 	end
  1268 end;
  1275 end;
  1269 
  1276 
  1270 procedure doStepTeleportAnim(Gear: PGear);
  1277 procedure doStepTeleportAnim(Gear: PGear);
  1271 begin
  1278 begin
  1272 inc(Gear^.Timer);
  1279 inc(Gear^.Timer);
  1314     Msg, State: Longword;
  1321     Msg, State: Longword;
  1315 begin
  1322 begin
  1316 AllInactive:= false;
  1323 AllInactive:= false;
  1317 
  1324 
  1318 if ((Gear^.Message and not gm_Switch) <> 0) or (TurnTimeLeft = 0) then
  1325 if ((Gear^.Message and not gm_Switch) <> 0) or (TurnTimeLeft = 0) then
  1319    begin
  1326 	begin
  1320    HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
  1327 	HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
  1321    Msg:= Gear^.Message and not gm_Switch;
  1328 	Msg:= Gear^.Message and not gm_Switch;
  1322    DeleteGear(Gear);
  1329 	DeleteGear(Gear);
  1323    OnUsedAmmo(PHedgehog(HHGear^.Hedgehog)^);
  1330 	OnUsedAmmo(PHedgehog(HHGear^.Hedgehog)^);
  1324    ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^);
  1331 	ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^);
  1325 
  1332 
  1326    HHGear:= CurrentHedgehog^.Gear;
  1333 	HHGear:= CurrentHedgehog^.Gear;
  1327    ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^);
  1334 	ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^);
  1328    HHGear^.Message:= Msg;
  1335 	HHGear^.Message:= Msg;
  1329    exit
  1336 	exit
  1330    end;
  1337 	end;
  1331 
  1338 
  1332 if (Gear^.Message and gm_Switch) <> 0 then
  1339 if (Gear^.Message and gm_Switch) <> 0 then
  1333    begin
  1340 	begin
  1334    HHGear:= CurrentHedgehog^.Gear;
  1341 	HHGear:= CurrentHedgehog^.Gear;
  1335    HHGear^.Message:= HHGear^.Message and not gm_Switch;
  1342 	HHGear^.Message:= HHGear^.Message and not gm_Switch;
  1336    Gear^.Message:= Gear^.Message and not gm_Switch;
  1343 	Gear^.Message:= Gear^.Message and not gm_Switch;
  1337    State:= HHGear^.State;
  1344 	State:= HHGear^.State;
  1338    HHGear^.State:= 0;
  1345 	HHGear^.State:= 0;
  1339    HHGear^.Active:= false;
  1346 	HHGear^.Active:= false;
  1340    HHGear^.Z:= cHHZ;
  1347 	HHGear^.Z:= cHHZ;
  1341    RemoveGearFromList(HHGear);
  1348 	RemoveGearFromList(HHGear);
  1342    InsertGearToList(HHGear);
  1349 	InsertGearToList(HHGear);
  1343 
  1350 
  1344    repeat
  1351 	repeat
  1345      CurrentTeam^.CurrHedgehog:= Succ(CurrentTeam^.CurrHedgehog) mod (CurrentTeam^.HedgehogsNumber);
  1352 		CurrentTeam^.CurrHedgehog:= Succ(CurrentTeam^.CurrHedgehog) mod (CurrentTeam^.HedgehogsNumber);
  1346    until (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil);
  1353 	until (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil);
  1347 
  1354 
  1348    CurrentHedgehog:= @CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog];
  1355 	CurrentHedgehog:= @CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog];
  1349 
  1356 
  1350    HHGear:= CurrentHedgehog^.Gear;
  1357 	HHGear:= CurrentHedgehog^.Gear;
  1351    HHGear^.State:= State;
  1358 	HHGear^.State:= State;
  1352    HHGear^.Active:= true;
  1359 	HHGear^.Active:= true;
  1353    FollowGear:= HHGear;
  1360 	FollowGear:= HHGear;
  1354    HHGear^.Z:= cCurrHHZ;
  1361 	HHGear^.Z:= cCurrHHZ;
  1355    RemoveGearFromList(HHGear);
  1362 	RemoveGearFromList(HHGear);
  1356    InsertGearToList(HHGear);
  1363 	InsertGearToList(HHGear);
  1357    Gear^.X:= HHGear^.X;
  1364 	Gear^.X:= HHGear^.X;
  1358    Gear^.Y:= HHGear^.Y
  1365 	Gear^.Y:= HHGear^.Y
  1359    end;
  1366 	end;
  1360 end;
  1367 end;
  1361 
  1368 
  1362 procedure doStepSwitcher(Gear: PGear);
  1369 procedure doStepSwitcher(Gear: PGear);
  1363 var HHGear: PGear;
  1370 var HHGear: PGear;
  1364 begin
  1371 begin
  1365 Gear^.doStep:= @doStepSwitcherWork;
  1372 Gear^.doStep:= @doStepSwitcherWork;
  1366 
  1373 
  1367 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
  1374 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
  1368 with HHGear^ do
  1375 with HHGear^ do
  1369      begin
  1376 	begin
  1370      State:= State and not gstAttacking;
  1377 	State:= State and not gstAttacking;
  1371      Message:= Message and not gm_Attack
  1378 	Message:= Message and not gm_Attack
  1372      end
  1379 	end
  1373 end;
  1380 end;
  1374 
  1381 
  1375 ////////////////////////////////////////////////////////////////////////////////
  1382 ////////////////////////////////////////////////////////////////////////////////
  1376 procedure doStepMortar(Gear: PGear);
  1383 procedure doStepMortar(Gear: PGear);
  1377 var dX, dY: hwFloat;
  1384 var dX, dY: hwFloat;
  1506 AfterAttack;
  1513 AfterAttack;
  1507 DeleteGear(Gear)
  1514 DeleteGear(Gear)
  1508 end;
  1515 end;
  1509 
  1516 
  1510 procedure doStepCakeDown(Gear: PGear);
  1517 procedure doStepCakeDown(Gear: PGear);
  1511 var i: Longword;
  1518 var gi: PGear;
  1512     gi: PGear;
  1519 	dmg: LongInt;
  1513     dmg: LongInt;
       
  1514 begin
  1520 begin
  1515 AllInactive:= false;
  1521 AllInactive:= false;
  1516 
  1522 
  1517 inc(Gear^.Tag);
  1523 inc(Gear^.Tag);
  1518 if Gear^.Tag < 100 then exit;
  1524 if Gear^.Tag < 100 then exit;
  1540 	da: LongInt;
  1546 	da: LongInt;
  1541 	tdx, tdy: hwFloat;
  1547 	tdx, tdy: hwFloat;
  1542 
  1548 
  1543 	procedure PrevAngle;
  1549 	procedure PrevAngle;
  1544 	begin
  1550 	begin
  1545 	Gear^.Angle:= (Gear^.Angle + 4 - dA) mod 4
  1551 	Gear^.Angle:= (LongInt(Gear^.Angle) + 4 - dA) mod 4
  1546 	end;
  1552 	end;
  1547 	
  1553 	
  1548 	procedure NextAngle;
  1554 	procedure NextAngle;
  1549 	begin
  1555 	begin
  1550 	Gear^.Angle:= (Gear^.Angle + 4 + dA) mod 4
  1556 	Gear^.Angle:= (LongInt(Gear^.Angle) + 4 + dA) mod 4
  1551 	end;
  1557 	end;
  1552 	
  1558 	
  1553 begin
  1559 begin
  1554 inc(Gear^.Tag);
  1560 inc(Gear^.Tag);
  1555 if Gear^.Tag < 7 then exit;
  1561 if Gear^.Tag < 7 then exit;
  1556 
  1562 
  1557 dA:= hwSign(Gear^.dX);
  1563 dA:= hwSign(Gear^.dX);
  1558 xx:= dirs[Gear^.Angle].x;
  1564 xx:= dirs[Gear^.Angle].x;
  1559 yy:= dirs[Gear^.Angle].y;
  1565 yy:= dirs[Gear^.Angle].y;
  1560 xxn:= dirs[(Gear^.Angle + 4 + dA) mod 4].x;
  1566 xxn:= dirs[(LongInt(Gear^.Angle) + 4 + dA) mod 4].x;
  1561 yyn:= dirs[(Gear^.Angle + 4 + dA) mod 4].y;
  1567 yyn:= dirs[(LongInt(Gear^.Angle) + 4 + dA) mod 4].y;
  1562 
  1568 
  1563 
  1569 
  1564 if (xx = 0) then
  1570 if (xx = 0) then
  1565 	if TestCollisionYwithGear(Gear, yy) then
  1571 	if TestCollisionYwithGear(Gear, yy) then
  1566 		PrevAngle
  1572 		PrevAngle