# HG changeset patch # User nemo # Date 1401653627 14400 # Node ID ea57f2f2b98d906ef0584b6383ea06b6d4ffeb04 # Parent 814e137625f7496fd4e07ac4fcba15dbc41a940e allow teleporting outside Land[] diff -r 814e137625f7 -r ea57f2f2b98d hedgewars/uGearsHandlersMess.pas --- a/hedgewars/uGearsHandlersMess.pas Sun Jun 01 15:26:03 2014 +0200 +++ b/hedgewars/uGearsHandlersMess.pas Sun Jun 01 16:13:47 2014 -0400 @@ -2594,7 +2594,7 @@ HHGear := Gear^.Hedgehog^.Gear; if not TryPlaceOnLand(Gear^.Target.X - SpritesData[sprHHTelepMask].Width div 2, Gear^.Target.Y - SpritesData[sprHHTelepMask].Height div 2, - sprHHTelepMask, 0, false, false) then + sprHHTelepMask, 0, false, false, not hasBorder, 0) then begin HHGear^.Message := HHGear^.Message and (not gmAttack); HHGear^.State := HHGear^.State and (not gstAttacking); diff -r 814e137625f7 -r ea57f2f2b98d hedgewars/uLandGraphics.pas --- a/hedgewars/uLandGraphics.pas Sun Jun 01 15:26:03 2014 +0200 +++ b/hedgewars/uLandGraphics.pas Sun Jun 01 16:13:47 2014 -0400 @@ -49,6 +49,7 @@ procedure DrawIceBreak(x, y, iceRadius, iceHeight: Longint); function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace, indestructible: boolean): boolean; inline; function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace, indestructible: boolean; LandFlags: Word): boolean; +function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace, indestructible, outOfMap: boolean; LandFlags: Word): boolean; function GetPlaceCollisionTex(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt): PTexture; implementation @@ -607,10 +608,15 @@ function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace, indestructible: boolean): boolean; inline; begin -TryPlaceOnLand:= TryPlaceOnLand(cpX, cpY, Obj, Frame, doPlace, indestructible, 0); +TryPlaceOnLand:= TryPlaceOnLand(cpX, cpY, Obj, Frame, doPlace, indestructible, false, 0); end; function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace, indestructible: boolean; LandFlags: Word): boolean; +begin +TryPlaceOnLand:= TryPlaceOnLand(cpX, cpY, Obj, Frame, doPlace, indestructible, false, LandFlags); +end; + +function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace, indestructible, outOfMap: boolean; LandFlags: Word): boolean; var X, Y, bpp, h, w, row, col, gx, gy, numFramesFirstCol: LongInt; p: PByteArray; Image: PSDL_Surface; @@ -618,6 +624,8 @@ TryPlaceOnLand:= false; numFramesFirstCol:= SpritesData[Obj].imageHeight div SpritesData[Obj].Height; +if outOfMap then doPlace:= false; // just using for a check + TryDo(SpritesData[Obj].Surface <> nil, 'Assert SpritesData[Obj].Surface failed', true); Image:= SpritesData[Obj].Surface; w:= SpritesData[Obj].Width; @@ -637,13 +645,20 @@ begin for x:= 0 to Pred(w) do if ((PLongword(@(p^[x * 4]))^) and AMask) <> 0 then - if ((cpY + y) <= Longint(topY)) or ((cpY + y) >= LAND_HEIGHT) or - ((cpX + x) <= Longint(leftX)) or ((cpX + x) >= Longint(rightX)) or (Land[cpY + y, cpX + x] <> 0) then - begin - if SDL_MustLock(Image) then - SDL_UnlockSurface(Image); - exit; - end; + if (outOfMap and + ((cpY + y) < LAND_HEIGHT) and ((cpY + y) >= 0) and + ((cpX + x) < LAND_WIDTH) and ((cpX + x) >= 0) and + (Land[cpY + y, cpX + x] <> 0)) or + + (not outOfMap and + (((cpY + y) <= Longint(topY)) or ((cpY + y) >= LAND_HEIGHT) or + ((cpX + x) <= Longint(leftX)) or ((cpX + x) >= Longint(rightX)) or + (Land[cpY + y, cpX + x] <> 0))) then + begin + if SDL_MustLock(Image) then + SDL_UnlockSurface(Image); + exit + end; p:= PByteArray(@(p^[Image^.pitch])); end; end;