diff -r 28e90e4541ce -r 27b0ec683572 hedgewars/uCollisions.pas --- a/hedgewars/uCollisions.pas Sat Jun 26 16:00:40 2010 +0200 +++ b/hedgewars/uCollisions.pas Sat Jun 26 19:30:16 2010 +0200 @@ -321,31 +321,39 @@ var ldx, ldy, rdx, rdy: LongInt; i, j, mx, my, li, ri, jfr, jto, tmpo : ShortInt; tmpx, tmpy: LongWord; - dx, dy: hwFloat; + dx, dy, s: hwFloat; offset: Array[0..7,0..1] of ShortInt; begin dx:= Gear^.dX; dy:= Gear^.dY; - // we start searching from the direction the gear center is at + // we start searching from the direction the gear came from + if (dx.QWordValue > _0_995.QWordValue ) + or (dy.QWordValue > _0_995.QWordValue ) then + begin // scale + s := _1 / Distance(dx,dy); + dx := s * dx; + dy := s * dy; + end; + mx:= hwRound(Gear^.X-dx) - hwRound(Gear^.X); my:= hwRound(Gear^.Y-dy) - hwRound(Gear^.Y); li:= -1; ri:= -1; - + // go around collision pixel, checking for first/last collisions // this will determinate what angles will be tried to crawl along for i:= 0 to 7 do begin offset[i,0]:= mx; offset[i,1]:= my; - + tmpx:= collisionX + mx; tmpy:= collisionY + my; - if (((tmpy) and LAND_HEIGHT_MASK) = 0) and (((tmpx) and LAND_WIDTH_MASK) = 0) then + if (((tmpy) and LAND_HEIGHT_MASK) = 0) and (((tmpx) and LAND_WIDTH_MASK) = 0) then if (Land[tmpy,tmpx] > TestWord) then begin // remember the index belonging to the first and last collision (if in 1st half)