hedgewars/uGearsHandlersMess.pas
changeset 13399 3d6aae2ae698
parent 13381 caed04706564
child 13402 13be6de7860f
equal deleted inserted replaced
13398:d5db8f71e52e 13399:3d6aae2ae698
  1934 var i,t,targDist,tmpDist: LongWord;
  1934 var i,t,targDist,tmpDist: LongWord;
  1935     targ, tmpG: PGear;
  1935     targ, tmpG: PGear;
  1936     trackSpeed, airFriction, tX, tY: hwFloat;
  1936     trackSpeed, airFriction, tX, tY: hwFloat;
  1937     isUnderwater: Boolean;
  1937     isUnderwater: Boolean;
  1938 begin
  1938 begin
       
  1939 	if (Gear^.State and gstFrozen) <> 0 then
       
  1940 		begin
       
  1941 		if Gear^.Damage > 0 then
       
  1942 			begin
       
  1943 			doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
       
  1944 			DeleteGear(Gear)
       
  1945 			end;
       
  1946 		exit
       
  1947 		end;
  1939     isUnderwater:= CheckCoordInWater(hwRound(Gear^.X), hwRound(Gear^.Y) + Gear^.Radius);
  1948     isUnderwater:= CheckCoordInWater(hwRound(Gear^.X), hwRound(Gear^.Y) + Gear^.Radius);
  1940     if Gear^.Pos > 0 then
  1949     if Gear^.Pos > 0 then
  1941         begin
  1950         begin
  1942         airFriction:= _1;
  1951         airFriction:= _1;
  1943         if isUnderwater then
  1952         if isUnderwater then
  2043                 begin
  2052                 begin
  2044                 if targ <> nil then
  2053                 if targ <> nil then
  2045                     begin
  2054                     begin
  2046                     tX:=Gear^.X-targ^.X;
  2055                     tX:=Gear^.X-targ^.X;
  2047                     tY:=Gear^.Y-targ^.Y;
  2056                     tY:=Gear^.Y-targ^.Y;
  2048                     if (tX.Round+tY.Round < Gear^.Karma) and
  2057                     if (tX.Round+tY.Round < Gear^.Boom) and
  2049                        (hwRound(hwSqr(tX) + hwSqr(tY)) < sqr(Gear^.Karma)) then
  2058                        (hwRound(hwSqr(tX) + hwSqr(tY)) < sqr(Gear^.Boom)) then
  2050                     Gear^.State := Gear^.State or gstAttacking
  2059                     Gear^.State := Gear^.State or gstAttacking
  2051                     end
  2060                     end
  2052                 else if (Gear^.Angle > 0) and (CheckGearNear(Gear, gtHedgehog, Gear^.Karma, Gear^.Karma) <> nil) then
  2061                 else if (Gear^.Angle > 0) and (CheckGearNear(Gear, gtHedgehog, Gear^.Boom, Gear^.Boom) <> nil) then
  2053                     Gear^.State := Gear^.State or gstAttacking
  2062                     Gear^.State := Gear^.State or gstAttacking
  2054                 end
  2063                 end
  2055             end
  2064             end
  2056         else // gstAttacking <> 0
  2065         else // gstAttacking <> 0
  2057             begin
  2066             begin
  2063                 // recheck
  2072                 // recheck
  2064                 if targ <> nil then
  2073                 if targ <> nil then
  2065                     begin
  2074                     begin
  2066                     tX:=Gear^.X-targ^.X;
  2075                     tX:=Gear^.X-targ^.X;
  2067                     tY:=Gear^.Y-targ^.Y;
  2076                     tY:=Gear^.Y-targ^.Y;
  2068                     if (tX.Round+tY.Round < Gear^.Karma) and
  2077                     if (tX.Round+tY.Round < Gear^.Boom) and
  2069                        (hwRound(hwSqr(tX) + hwSqr(tY)) < sqr(Gear^.Karma)) then
  2078                        (hwRound(hwSqr(tX) + hwSqr(tY)) < sqr(Gear^.Boom)) then
  2070                         begin
  2079                         begin
  2071                         Gear^.Hedgehog:= CurrentHedgehog;
  2080                         Gear^.Hedgehog:= CurrentHedgehog;
  2072                         tmpG:= FollowGear;
  2081                         tmpG:= FollowGear;
  2073                         doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Karma, Gear^.Hedgehog, EXPLAutoSound);
  2082                         doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
  2074                         FollowGear:= tmpG;
  2083                         FollowGear:= tmpG;
  2075                         DeleteGear(Gear);
  2084                         DeleteGear(Gear);
  2076                         exit
  2085                         exit
  2077                         end
  2086                         end
  2078                     end
  2087                     end
  2079                 else if (Gear^.Angle > 0) and (CheckGearNear(Gear, gtHedgehog, Gear^.Karma, Gear^.Karma) <> nil) then
  2088                 else if (Gear^.Angle > 0) and (CheckGearNear(Gear, gtHedgehog, Gear^.Boom, Gear^.Boom) <> nil) then
  2080                     begin
  2089                     begin
  2081                     Gear^.Hedgehog:= CurrentHedgehog;
  2090                     Gear^.Hedgehog:= CurrentHedgehog;
  2082                     doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Karma, Gear^.Hedgehog, EXPLAutoSound);
  2091                     doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
  2083                     DeleteGear(Gear);
  2092                     DeleteGear(Gear);
  2084                     exit
  2093                     exit
  2085                     end;
  2094                     end;
  2086                 Gear^.State:= Gear^.State and (not gstAttacking);
  2095                 Gear^.State:= Gear^.State and (not gstAttacking);
  2087                 Gear^.Timer:= Gear^.WDTimer
  2096                 Gear^.Timer:= Gear^.WDTimer
  6142         begin
  6151         begin
  6143         HedgehogChAngle(HHGear);
  6152         HedgehogChAngle(HHGear);
  6144         ndX:= SignAs(AngleSin(HHGear^.Angle), HHGear^.dX) * _4;
  6153         ndX:= SignAs(AngleSin(HHGear^.Angle), HHGear^.dX) * _4;
  6145         ndY:= -AngleCos(HHGear^.Angle) * _4;
  6154         ndY:= -AngleCos(HHGear^.Angle) * _4;
  6146         if (ndX <> dX) or (ndY <> dY) or
  6155         if (ndX <> dX) or (ndY <> dY) or
  6147            ((Target.X <> NoPointX) and (Target.X and LAND_WIDTH_MASK = 0) and
  6156            (((Target.X <> NoPointX) and (Target.X and LAND_WIDTH_MASK = 0) and
  6148              (Target.Y and LAND_HEIGHT_MASK = 0) and ((Land[Target.Y, Target.X] = 0)) and
  6157              (Target.Y and LAND_HEIGHT_MASK = 0) and ((Land[Target.Y, Target.X] = 0)) and
  6149              (not CheckCoordInWater(Target.X, Target.Y))) then
  6158              (not CheckCoordInWater(Target.X, Target.Y))) and (CheckGearNear(gtAirMine, int2hwFloat(Target.X),int2hwFloat(Target.Y), Gear^.Radius*2, Gear^.Radius*2) = nil)) then
  6150             begin
  6159             begin
  6151             updateTarget(Gear, ndX, ndY);
  6160             updateTarget(Gear, ndX, ndY);
  6152             Timer := iceWaitCollision;
  6161             Timer := iceWaitCollision;
  6153             end
  6162             end
  6154         else
  6163         else
  6160             if Target.X = NoPointX then t:= hwRound(hwSqr(X-HHGear^.X)+hwSqr(Y-HHGear^.Y));
  6169             if Target.X = NoPointX then t:= hwRound(hwSqr(X-HHGear^.X)+hwSqr(Y-HHGear^.Y));
  6161 
  6170 
  6162             if Target.X <> NoPointX then
  6171             if Target.X <> NoPointX then
  6163                 begin
  6172                 begin
  6164                 CheckCollision(Gear);
  6173                 CheckCollision(Gear);
  6165                 if (State and gstCollision) <> 0 then
  6174                 if ((State and gstCollision) <> 0) or (CheckGearNear(gtAirMine, int2hwFloat(Target.X),int2hwFloat(Target.Y), Gear^.Radius*3, Gear^.Radius*3) <> nil) then
  6166                     begin
  6175                     begin
  6167                     if Timer = iceWaitCollision then
  6176                     if Timer = iceWaitCollision then
  6168                         begin
  6177                         begin
  6169                         Timer := iceCollideWithGround;
  6178                         Timer := iceCollideWithGround;
  6170                         Power := GameTicks;
  6179                         Power := GameTicks;
  6205                     // Freeze nearby mines/explosives/cases too
  6214                     // Freeze nearby mines/explosives/cases too
  6206                     iter := GearsList;
  6215                     iter := GearsList;
  6207                     while iter <> nil do
  6216                     while iter <> nil do
  6208                         begin
  6217                         begin
  6209                         if (iter^.State and gstFrozen = 0) and
  6218                         if (iter^.State and gstFrozen = 0) and
  6210                            ((iter^.Kind = gtExplosives) or (iter^.Kind = gtCase) or (iter^.Kind = gtMine) or (iter^.Kind = gtSMine)) and
  6219                            ((iter^.Kind = gtExplosives) or (iter^.Kind = gtAirMine) or (iter^.Kind = gtCase) or (iter^.Kind = gtMine) or (iter^.Kind = gtSMine)) and
  6211                            (abs(LongInt(iter^.X.Round) - target.x) + abs(LongInt(iter^.Y.Round) - target.y) + 2 < 2 * iceRadius)
  6220                            (abs(LongInt(iter^.X.Round) - target.x) + abs(LongInt(iter^.Y.Round) - target.y) + 2 < 2 * iceRadius)
  6212                            and (Distance(iter^.X - int2hwFloat(target.x), iter^.Y - int2hwFloat(target.y)) < int2hwFloat(iceRadius * 2)) then
  6221                            and (Distance(iter^.X - int2hwFloat(target.x), iter^.Y - int2hwFloat(target.y)) < int2hwFloat(iceRadius * 2)) then
  6213                             begin
  6222                             begin
  6214                             for t:= 0 to 5 do
  6223                             for t:= 0 to 5 do
  6215                                 begin
  6224                                 begin
  6249                                 begin
  6258                                 begin
  6250                                 DeleteCI(iter);
  6259                                 DeleteCI(iter);
  6251                                 iter^.State:= iter^.State or gstFrozen;
  6260                                 iter^.State:= iter^.State or gstFrozen;
  6252                                 AddCI(iter)
  6261                                 AddCI(iter)
  6253                                 end
  6262                                 end
       
  6263                             else if iter^.Kind = gtAirMine then
       
  6264                                 begin
       
  6265                                 AddCI(iter);
       
  6266                                 iter^.State:= iter^.State or gstFrozen
       
  6267                                 end
  6254                             else // gtExplosives
  6268                             else // gtExplosives
  6255                                 begin
  6269                                 begin
  6256                                 iter^.State:= iter^.State or gstFrozen;
  6270                                 iter^.State:= iter^.State or gstFrozen;
  6257                                 iter^.Health:= iter^.Health + cBarrelHealth
  6271                                 iter^.Health:= iter^.Health + cBarrelHealth
  6258                                 end
  6272                                 end
  6319                 begin
  6333                 begin
  6320                 Target.X:= gX;
  6334                 Target.X:= gX;
  6321                 Target.Y:= gY;
  6335                 Target.Y:= gY;
  6322                 X:= HHGear^.X;
  6336                 X:= HHGear^.X;
  6323                 Y:= HHGear^.Y
  6337                 Y:= HHGear^.Y
  6324                 end;
  6338                 end
       
  6339 			else if CheckGearNear(Gear, gtAirMine, Gear^.Radius*2, Gear^.Radius*2) <> nil then
       
  6340 				begin
       
  6341                 Target.X:= gX;
       
  6342                 Target.Y:= gY;
       
  6343                 X:= HHGear^.X;
       
  6344                 Y:= HHGear^.Y
       
  6345 				end; 
  6325             if (gX > max(LAND_WIDTH,4096)*2) or
  6346             if (gX > max(LAND_WIDTH,4096)*2) or
  6326                     (gX < -max(LAND_WIDTH,4096)) or
  6347                     (gX < -max(LAND_WIDTH,4096)) or
  6327                     (gY < -max(LAND_HEIGHT,4096)) or
  6348                     (gY < -max(LAND_HEIGHT,4096)) or
  6328                     (gY > max(LAND_HEIGHT,4096)+512) then
  6349                     (gY > max(LAND_HEIGHT,4096)+512) then
  6329                 begin
  6350                 begin