hedgewars/uGearsUtils.pas
changeset 14282 6015b74eea55
parent 14203 076c9fba3fa8
child 14292 1d4f1d700cdc
equal deleted inserted replaced
14281:e754b516cc35 14282:6015b74eea55
   236     // already wrapped? let's not wrap again!
   236     // already wrapped? let's not wrap again!
   237     if wrap then
   237     if wrap then
   238         break;
   238         break;
   239 
   239 
   240     // Radius + 5 because that's the actual radius the explosion changes graphically
   240     // Radius + 5 because that's the actual radius the explosion changes graphically
   241     if X + (Radius + 5) > LongInt(rightX) then
   241     if X + (Radius + 5) > rightX then
   242         begin
   242         begin
   243         dec(X, playWidth);
   243         dec(X, playWidth);
   244         wrap:= true;
   244         wrap:= true;
   245         end
   245         end
   246     else if X - (Radius + 5) < LongInt(leftX) then
   246     else if X - (Radius + 5) < leftX then
   247         begin
   247         begin
   248         inc(X, playWidth);
   248         inc(X, playWidth);
   249         wrap:= true;
   249         wrap:= true;
   250         end;
   250         end;
   251     end;
   251     end;
   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;