662 isDirH:= false; |
662 isDirH:= false; |
663 |
663 |
664 if WorldEdge = weSea then |
664 if WorldEdge = weSea then |
665 begin |
665 begin |
666 tmp:= dist2Water; |
666 tmp:= dist2Water; |
667 dist2Water:= min(dist2Water, min(X - Gear^.Radius - LongInt(leftX), LongInt(rightX) - (X + Gear^.Radius))); |
667 dist2Water:= min(dist2Water, min(X - Gear^.Radius - leftX, rightX - (X + Gear^.Radius))); |
668 // if water on sides is closer than on bottom -> horizontal direction |
668 // if water on sides is closer than on bottom -> horizontal direction |
669 isDirH:= tmp <> dist2Water; |
669 isDirH:= tmp <> dist2Water; |
670 end; |
670 end; |
671 |
671 |
672 isImpact:= false; |
672 isImpact:= false; |
933 ignoreNearObjects:= false; // try not skipping proximity at first |
933 ignoreNearObjects:= false; // try not skipping proximity at first |
934 ignoreOverlap:= false; // this not only skips proximity, but allows overlapping objects (barrels, mines, hogs, crates). Saving it for a 3rd pass. With this active, winning AI Survival goes back to virtual impossibility |
934 ignoreOverlap:= false; // this not only skips proximity, but allows overlapping objects (barrels, mines, hogs, crates). Saving it for a 3rd pass. With this active, winning AI Survival goes back to virtual impossibility |
935 tryAgain:= true; |
935 tryAgain:= true; |
936 if WorldEdge <> weNone then |
936 if WorldEdge <> weNone then |
937 begin |
937 begin |
938 Left:= max(Left, LongInt(leftX) + Gear^.Radius); |
938 Left:= max(Left, leftX + Gear^.Radius); |
939 Right:= min(Right,rightX-Gear^.Radius) |
939 Right:= min(Right,rightX-Gear^.Radius) |
940 end; |
940 end; |
941 while tryAgain do |
941 while tryAgain do |
942 begin |
942 begin |
943 delta:= LAND_WIDTH div 16; |
943 delta:= LAND_WIDTH div 16; |
1746 function WorldWrap(var Gear: PGear): boolean; |
1746 function WorldWrap(var Gear: PGear): boolean; |
1747 //var tdx: hwFloat; |
1747 //var tdx: hwFloat; |
1748 begin |
1748 begin |
1749 WorldWrap:= false; |
1749 WorldWrap:= false; |
1750 if WorldEdge = weNone then exit(false); |
1750 if WorldEdge = weNone then exit(false); |
1751 if (hwRound(Gear^.X) < LongInt(leftX)) or |
1751 if (hwRound(Gear^.X) < leftX) or |
1752 (hwRound(Gear^.X) > LongInt(rightX)) then |
1752 (hwRound(Gear^.X) > rightX) then |
1753 begin |
1753 begin |
1754 if WorldEdge = weWrap then |
1754 if WorldEdge = weWrap then |
1755 begin |
1755 begin |
1756 if (hwRound(Gear^.X) < LongInt(leftX)) then |
1756 if (hwRound(Gear^.X) < leftX) then |
1757 Gear^.X:= Gear^.X + int2hwfloat(rightX - leftX) |
1757 Gear^.X:= Gear^.X + int2hwfloat(rightX - leftX) |
1758 else Gear^.X:= Gear^.X - int2hwfloat(rightX - leftX); |
1758 else Gear^.X:= Gear^.X - int2hwfloat(rightX - leftX); |
1759 LeftImpactTimer:= 150; |
1759 LeftImpactTimer:= 150; |
1760 RightImpactTimer:= 150 |
1760 RightImpactTimer:= 150 |
1761 end |
1761 end |
1762 else if WorldEdge = weBounce then |
1762 else if WorldEdge = weBounce then |
1763 begin |
1763 begin |
1764 if (hwRound(Gear^.X) - Gear^.Radius < LongInt(leftX)) then |
1764 if (hwRound(Gear^.X) - Gear^.Radius < leftX) then |
1765 begin |
1765 begin |
1766 LeftImpactTimer:= 333; |
1766 LeftImpactTimer:= 333; |
1767 Gear^.dX.isNegative:= false; |
1767 Gear^.dX.isNegative:= false; |
1768 Gear^.X:= int2hwfloat(LongInt(leftX) + Gear^.Radius) |
1768 Gear^.X:= int2hwfloat(leftX + Gear^.Radius) |
1769 end |
1769 end |
1770 else |
1770 else |
1771 begin |
1771 begin |
1772 RightImpactTimer:= 333; |
1772 RightImpactTimer:= 333; |
1773 Gear^.dX.isNegative:= true; |
1773 Gear^.dX.isNegative:= true; |