diff -r d5db8f71e52e -r 3d6aae2ae698 hedgewars/uGearsUtils.pas --- a/hedgewars/uGearsUtils.pas Tue May 22 17:54:07 2018 -0400 +++ b/hedgewars/uGearsUtils.pas Wed May 23 20:45:42 2018 -0400 @@ -40,6 +40,7 @@ procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt); inline; procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt; skipProximity: boolean); +function CheckGearNear(Kind: TGearType; X, Y: hwFloat; rX, rY: LongInt): PGear; function CheckGearNear(Gear: PGear; Kind: TGearType; rX, rY: LongInt): PGear; function CheckGearDrowning(var Gear: PGear): boolean; procedure CheckCollision(Gear: PGear); inline; @@ -1025,20 +1026,48 @@ end end; -function CheckGearNear(Gear: PGear; Kind: TGearType; rX, rY: LongInt): PGear; +function CheckGearNear(Kind: TGearType; X, Y: hwFloat; rX, rY: LongInt): PGear; var t: PGear; + width: hwFloat; begin t:= GearsList; rX:= sqr(rX); rY:= sqr(rY); +width:= int2hwFloat(RightX-LeftX); + +while t <> nil do + begin + if (t^.Kind = Kind) then + if (not ((hwSqr(X - t^.X) / rX + hwSqr(Y - t^.Y) / rY) > _1)) or + ((WorldEdge = weWrap) and ( + (not ((hwSqr(X - width - t^.X) / rX + hwSqr(Y - t^.Y) / rY) > _1)) or + (not ((hwSqr(X + width - t^.X) / rX + hwSqr(Y - t^.Y) / rY) > _1)))) then + begin + CheckGearNear:= t; + exit; + end; + t:= t^.NextGear + end; + +CheckGearNear:= nil +end; + +function CheckGearNear(Gear: PGear; Kind: TGearType; rX, rY: LongInt): PGear; +var t: PGear; + width: hwFloat; +begin +t:= GearsList; +rX:= sqr(rX); +rY:= sqr(rY); +width:= int2hwFloat(RightX-LeftX); while t <> nil do begin if (t <> Gear) and (t^.Kind = Kind) then if (not ((hwSqr(Gear^.X - t^.X) / rX + hwSqr(Gear^.Y - t^.Y) / rY) > _1)) or ((WorldEdge = weWrap) and ( - (not ((hwSqr(Gear^.X - int2hwFloat(RightX-LeftX) - t^.X) / rX + hwSqr(Gear^.Y - t^.Y) / rY) > _1)) or - (not ((hwSqr(Gear^.X + int2hwFloat(RightX-LeftX) - t^.X) / rX + hwSqr(Gear^.Y - t^.Y) / rY) > _1)))) then + (not ((hwSqr(Gear^.X - width - t^.X) / rX + hwSqr(Gear^.Y - t^.Y) / rY) > _1)) or + (not ((hwSqr(Gear^.X + width - t^.X) / rX + hwSqr(Gear^.Y - t^.Y) / rY) > _1)))) then begin CheckGearNear:= t; exit; @@ -1290,6 +1319,7 @@ case Gear^.Kind of gtHedgehog, gtMine, + gtAirMine, gtSMine, gtKnife, gtTarget, @@ -1481,7 +1511,6 @@ GearsNear.ar:= @GearsNearArray end; - procedure SpawnBoxOfSmth; var t, aTot, uTot, a, h: LongInt; i: TAmmoType;