# HG changeset patch # User sheepluva # Date 1315592270 -7200 # Node ID ea4d1fe665d7a25f17ffc97e3dab97fb476b125d # Parent 3ec95dc2b249df624df75e59e3684df24ebcc9a7 move hedgehogs out of walls diff -r 3ec95dc2b249 -r ea4d1fe665d7 hedgewars/HHHandlers.inc --- a/hedgewars/HHHandlers.inc Fri Sep 09 22:04:40 2011 +0400 +++ b/hedgewars/HHHandlers.inc Fri Sep 09 20:17:50 2011 +0200 @@ -770,6 +770,30 @@ Gear^.State:= Gear^.State and not gstMoving; exit end; + +// move hedgehogs out of walls +if hwAbs(Gear^.dX) < _0_03 then + begin + if CountCollisionsX(Gear, -1) > Gear^.Radius then + repeat + Gear^.X:= Gear^.X + _1; + if CountCollisionsX(Gear, 1) > Gear^.Radius then + begin + Gear^.X:= Gear^.X - _1; + break; + end + until CountCollisionsX(Gear, -1) <= Gear^.Radius + else if CountCollisionsX(Gear, 1) > Gear^.Radius then + repeat + Gear^.X:= Gear^. X - _1; + if CountCollisionsX(Gear, -1) > Gear^.Radius then + begin + Gear^.X:= Gear^.X + _1; + break; + end + until CountCollisionsX(Gear, 1) <= Gear^.Radius; + end; + isFalling:= (Gear^.dY.isNegative) or not TestCollisionYKick(Gear, 1); if isFalling then begin diff -r 3ec95dc2b249 -r ea4d1fe665d7 hedgewars/uCollisions.pas --- a/hedgewars/uCollisions.pas Fri Sep 09 22:04:40 2011 +0400 +++ b/hedgewars/uCollisions.pas Fri Sep 09 20:17:50 2011 +0200 @@ -44,6 +44,8 @@ function TestCollisionXKick(Gear: PGear; Dir: LongInt): boolean; function TestCollisionYKick(Gear: PGear; Dir: LongInt): boolean; +function CountCollisionsX(Gear: PGear; Dir: LongInt): LongInt; + function TestCollisionX(Gear: PGear; Dir: LongInt): boolean; function TestCollisionY(Gear: PGear; Dir: LongInt): boolean; @@ -301,6 +303,27 @@ Gear^.X:= Gear^.X - ShiftX; Gear^.Y:= Gear^.Y - int2hwFloat(ShiftY) end; + +function CountCollisionsX(Gear: PGear; Dir: LongInt): LongInt; +var x, y, i, cnt: LongInt; +begin +cnt:= 0; +x:= hwRound(Gear^.X); +if Dir < 0 then x:= x - Gear^.Radius + else x:= x + Gear^.Radius; +if (x and LAND_WIDTH_MASK) = 0 then + begin + y:= hwRound(Gear^.Y) - Gear^.Radius + 1; + i:= y + Gear^.Radius * 2 - 2; + repeat + if (y and LAND_HEIGHT_MASK) = 0 then + if Land[y, x] > 255 then inc(cnt); + inc(y) + until (y > i); + end; +CountCollisionsX:= cnt +end; + function TestCollisionX(Gear: PGear; Dir: LongInt): boolean; var x, y, i: LongInt; begin