# HG changeset patch # User Urbertar@gmail.com # Date 1361890018 -7200 # Node ID 191bd86ba000c78317a704ae5244531b1bde22b5 # Parent da608f69d853319c6181d0c7917e5c6f9bd4108d Make little refactoring diff -r da608f69d853 -r 191bd86ba000 hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Tue Feb 26 16:04:35 2013 +0200 +++ b/hedgewars/GSHandlers.inc Tue Feb 26 16:46:58 2013 +0200 @@ -5125,59 +5125,13 @@ end; end; - -procedure drawIcePixel(x, y:Longint); -var - iceSurface: PSDL_Surface; - icePixels: PLongwordArray; - pictureX, pictureY: LongInt; - w, c: LongWord; -begin -// So. 3 parameters here. Ice colour, Ice opacity, and a bias on the greyscaled pixel towards lightness - c:= $7dc1ccff; - // FIXME should be a global value, not set every single pixel. Just for test purposes - c:= ($44 shl RShift) or ($97 shl GShift) or ($A9 shl BShift) or ($A0 shl AShift); - iceSurface:= SpritesData[sprIceTexture].Surface; - pictureX := x mod iceSurface^.w; - pictureY := y mod iceSurface^.h; - icePixels := iceSurface^.pixels; - w:= LandPixels[y, x]; - w:= round(((w shr RShift and $FF) * RGB_LUMINANCE_RED + - (w shr BShift and $FF) * RGB_LUMINANCE_GREEN + - (w shr GShift and $FF) * RGB_LUMINANCE_BLUE)); - if w < 128 then w:= w+128; - if w > 255 then w:= 255; - w:= (w shl RShift) or (w shl BShift) or (w shl GShift) or (LandPixels[y,x] and AMask); - //LandPixels[y, x]:= w; - LandPixels[y, x]:= addBgColor(w, c); - LandPixels[y, x]:= addBgColor(LandPixels[y, x], icePixels^[iceSurface^.w * (y mod iceSurface^.h) + (x mod iceSurface^.w)]); - - Land[y, x] := land[y, x] or lfIce; -end; - -procedure DrawIce(x, y: Longint); - const iceRadius :Longint = 32; -var - i, j: Longint; - weight: Longint; - landRect : TSDL_RECT; -begin - FillRoundInLandWithIce(x, y, iceRadius); - SetAllHHToActive; - landRect.x := min(max(x - iceRadius, 0), LAND_WIDTH - 1); - landRect.y := min(max(y - iceRadius, 0), LAND_HEIGHT - 1); - landRect.w := min(2*iceRadius, LAND_WIDTH - landRect.x - 1); - landRect.h := min(2*iceRadius, LAND_HEIGHT - landRect.y - 1); - UpdateLandTexture(landRect.x, landRect.w, landRect.y, landRect.h, true); -end; - - procedure doStepIceGun(Gear: PGear); const iceWaitCollision:Longint = 0; const iceCollideWithGround:Longint = 1; const iceWaitNextTarget:Longint = 2; const iceCollideWithHog:Longint = 4; const groundFreezingTime:Longint = 1000; +const iceRadius:Longint = 32; var HHGear: PGear; ndX, ndY: hwFloat; @@ -5239,7 +5193,8 @@ if (IceState = iceCollideWithGround) and ((GameTicks - IceTime) > groundFreezingTime) then begin - DrawIce(Target.X, Target.Y); + FillRoundInLandWithIce(Target.X, Target.Y, iceRadius); + SetAllHHToActive; IceState := iceWaitNextTarget; end; diff -r da608f69d853 -r 191bd86ba000 hedgewars/uLandGraphics.pas --- a/hedgewars/uLandGraphics.pas Tue Feb 26 16:04:35 2013 +0200 +++ b/hedgewars/uLandGraphics.pas Tue Feb 26 16:46:58 2013 +0200 @@ -247,20 +247,8 @@ end; -function isLandscapeEdge(weight:Longint):boolean; -begin - result := (weight < 8) and (weight >= 2); -end; -function isLandscape(weight:Longint):boolean; -begin - result := weight < 2; -end; -function isEmptySpace(weight:Longint):boolean; -begin - result := not isLandscape(weight) and not isLandscapeEdge(weight); -end; function getPixelWeight(x, y:Longint): Longint; var @@ -289,37 +277,38 @@ w, c: LongWord; weight: Longint; begin - weight := getPixelWeight(x, y); - if (land[y, x] and lfIce) <> 0 then - exit; - if isLandscape(weight) then - begin - // So. 3 parameters here. Ice colour, Ice opacity, and a bias on the greyscaled pixel towards lightness - c:= $7dc1ccff; - // FIXME should be a global value, not set every single pixel. Just for test purposes - c:= ($44 shl RShift) or ($97 shl GShift) or ($A9 shl BShift) or ($A0 shl AShift); - iceSurface:= SpritesData[sprIceTexture].Surface; - pictureX := x mod iceSurface^.w; - pictureY := y mod iceSurface^.h; - icePixels := iceSurface^.pixels; - w:= LandPixels[y, x]; - w:= round(((w shr RShift and $FF) * RGB_LUMINANCE_RED + - (w shr BShift and $FF) * RGB_LUMINANCE_GREEN + - (w shr GShift and $FF) * RGB_LUMINANCE_BLUE)); - if w < 128 then w:= w+128; - if w > 255 then w:= 255; - w:= (w shl RShift) or (w shl BShift) or (w shl GShift) or (LandPixels[y,x] and AMask); - //LandPixels[y, x]:= w; - LandPixels[y, x]:= addBgColor(w, c); - LandPixels[y, x]:= addBgColor(LandPixels[y, x], icePixels^[iceSurface^.w * (y mod iceSurface^.h) + (x mod iceSurface^.w)]); - Land[y, x] := land[y, x] or lfIce; - end - else if (isLandscapeEdge(weight)) then - begin - LandPixels[y, x] := $FFB2AF8A; - if Land[y, x] > 255 then Land[y, x] := Land[y, x] or lfIce; - end; - +weight := getPixelWeight(x, y); +if (land[y, x] and lfIce) <> 0 then + exit; +//pixel in landscape +if weight < 2 then + begin + // So. 3 parameters here. Ice colour, Ice opacity, and a bias on the greyscaled pixel towards lightness + c:= $7dc1ccff; + // FIXME should be a global value, not set every single pixel. Just for test purposes + c:= ($44 shl RShift) or ($97 shl GShift) or ($A9 shl BShift) or ($A0 shl AShift); + iceSurface:= SpritesData[sprIceTexture].Surface; + pictureX := x mod iceSurface^.w; + pictureY := y mod iceSurface^.h; + icePixels := iceSurface^.pixels; + w:= LandPixels[y, x]; + w:= round(((w shr RShift and $FF) * RGB_LUMINANCE_RED + + (w shr BShift and $FF) * RGB_LUMINANCE_GREEN + + (w shr GShift and $FF) * RGB_LUMINANCE_BLUE)); + if w < 128 then w:= w+128; + if w > 255 then w:= 255; + w:= (w shl RShift) or (w shl BShift) or (w shl GShift) or (LandPixels[y,x] and AMask); + //LandPixels[y, x]:= w; + LandPixels[y, x]:= addBgColor(w, c); + LandPixels[y, x]:= addBgColor(LandPixels[y, x], icePixels^[iceSurface^.w * (y mod iceSurface^.h) + (x mod iceSurface^.w)]); + Land[y, x] := land[y, x] or lfIce; + end +//pixel is on edge of lanscape +else if (weight < 8) then + begin + LandPixels[y, x] := $FFB2AF8A; + if Land[y, x] > 255 then Land[y, x] := Land[y, x] or lfIce; + end; end; function getIncrementInquarter(dx, dy, quarter: Longint): Longint; @@ -354,24 +343,31 @@ procedure FillRoundInLandWithIce(X, Y, Radius: LongInt); var dx, dy, d: LongInt; + landRect : TSDL_RECT; begin dx:= 0; dy:= Radius; d:= 3 - 2 * Radius; - while (dx < dy) do +while (dx < dy) do + begin + FillLandCircleLinesIce(x, y, dx, dy); + if (d < 0) then + d:= d + 4 * dx + 6 + else begin - FillLandCircleLinesIce(x, y, dx, dy); - if (d < 0) then - d:= d + 4 * dx + 6 - else - begin - d:= d + 4 * (dx - dy) + 10; - dec(dy) - end; - inc(dx) + d:= d + 4 * (dx - dy) + 10; + dec(dy) end; - if (dx = dy) then - FillLandCircleLinesIce(x, y, dx, dy); + inc(dx) + end; +if (dx = dy) then + FillLandCircleLinesIce(x, y, dx, dy); + +landRect.x := min(max(x - Radius, 0), LAND_WIDTH - 1); +landRect.y := min(max(y - Radius, 0), LAND_HEIGHT - 1); +landRect.w := min(2*Radius, LAND_WIDTH - landRect.x - 1); +landRect.h := min(2*Radius, LAND_HEIGHT - landRect.y - 1); +UpdateLandTexture(landRect.x, landRect.w, landRect.y, landRect.h, true); end;