# HG changeset patch # User unC0Rr # Date 1670570330 -3600 # Node ID 046182f1080b78d54bbd17a2ecdd11a0d6bda596 # Parent 7f3d7f015aa571e097123683bf4721d2f98f5b7a Optimize doStepSnowflake a bit, losing backwards compatibility diff -r 7f3d7f015aa5 -r 046182f1080b hedgewars/uGearsHandlersMess.pas --- a/hedgewars/uGearsHandlersMess.pas Thu Dec 01 14:23:48 2022 +0100 +++ b/hedgewars/uGearsHandlersMess.pas Fri Dec 09 08:18:50 2022 +0100 @@ -834,13 +834,14 @@ s: PSDL_Surface; p: PLongwordArray; lf: LongWord; + oldY: hwFloat; begin -inc(Gear^.Pos); gun:= (Gear^.State and gstTmpFlag) <> 0; move:= false; draw:= false; if gun then begin + inc(Gear^.Pos); Gear^.State:= Gear^.State and (not gstInvisible); doStepFallingGear(Gear); CheckCollision(Gear); @@ -857,12 +858,13 @@ end end else if GameTicks and $7 = 0 then - begin with Gear^ do begin + inc(Pos, 8); State:= State and (not gstInvisible); + oldY:= Y; X:= X + cWindSpeed * 3200 + dX; - Y:= Y + dY + cGravity * vobFallSpeed * 8; // using same value as flakes to try and get similar results + Y:= Y + dY + cGravity * (vobFallSpeed * 8); // using same value as flakes to try and get similar results xx:= hwRound(X); yy:= hwRound(Y); if vobVelocity <> 0 then @@ -878,7 +880,7 @@ move:= true else if (xx > snowRight) or (xx < snowLeft) then move:=true - else if (cGravity < _0) and (yy < LAND_HEIGHT-1200) then + else if (cGravity.isNegative) and (yy < LAND_HEIGHT-1200) then move:=true // Solid pixel encountered else if ((yy and LAND_HEIGHT_MASK) = 0) and ((xx and LAND_WIDTH_MASK) = 0) and (Land[yy, xx] <> 0) then @@ -891,33 +893,40 @@ X:= X - cWindSpeed * 1600 - dX; end // If there's room below, on the sides, fill the gaps - else if (((yy-1) and LAND_HEIGHT_MASK) = 0) and (((xx-(1*hwSign(cWindSpeed))) and LAND_WIDTH_MASK) = 0) and (Land[yy-1, (xx-(1*hwSign(cWindSpeed)))] = 0) then - begin - X:= X - _0_8 * hwSign(cWindSpeed); - Y:= Y - dY - cGravity * vobFallSpeed * 8; - end - else if (((yy-1) and LAND_HEIGHT_MASK) = 0) and (((xx-(2*hwSign(cWindSpeed))) and LAND_WIDTH_MASK) = 0) and (Land[yy-1, (xx-(2*hwSign(cWindSpeed)))] = 0) then - begin - X:= X - _0_8 * 2 * hwSign(cWindSpeed); - Y:= Y - dY - cGravity * vobFallSpeed * 8; - end - else if (((yy-1) and LAND_HEIGHT_MASK) = 0) and (((xx+(1*hwSign(cWindSpeed))) and LAND_WIDTH_MASK) = 0) and (Land[yy-1, (xx+(1*hwSign(cWindSpeed)))] = 0) then - begin - X:= X + _0_8 * hwSign(cWindSpeed); - Y:= Y - dY - cGravity * vobFallSpeed * 8; - end - else if (((yy-1) and LAND_HEIGHT_MASK) = 0) and (((xx+(2*hwSign(cWindSpeed))) and LAND_WIDTH_MASK) = 0) and (Land[yy-1, (xx+(2*hwSign(cWindSpeed)))] = 0) then - begin - X:= X + _0_8 * 2 * hwSign(cWindSpeed); - Y:= Y - dY - cGravity * vobFallSpeed * 8; - end + else if (((yy-1) and LAND_HEIGHT_MASK) = 0) then + begin + if (((xx - 1) and LAND_WIDTH_MASK) = 0) and (Land[yy - 1, (xx - 1)] = 0) then + begin + X:= X - _0_8; + Y:= oldY; + end + else if (((xx - 2) and LAND_WIDTH_MASK) = 0) and (Land[yy - 1, (xx - 2)] = 0) then + begin + X:= X - _1_6; + Y:= oldY; + end + else if (((xx + 1) and LAND_WIDTH_MASK) = 0) and (Land[yy - 1, (xx + 1)] = 0) then + begin + X:= X + _0_8; + Y:= oldY; + end + else if (((xx + 2) and LAND_WIDTH_MASK) = 0) and (Land[yy - 1, (xx + 2)] = 0) then + begin + X:= X + _1_6; + Y:= oldY; + end else + if ((((yy+1) and LAND_HEIGHT_MASK) = 0) and ((Land[yy + 1, xx] and $FF) <> 0)) then + move:=true + else + draw:= true + end // if there's an hog/object below do nothing else if ((((yy+1) and LAND_HEIGHT_MASK) = 0) and ((Land[yy+1, xx] and $FF) <> 0)) then move:=true else draw:= true end - end - end; + end; + if draw then with Gear^ do begin @@ -926,7 +935,6 @@ if (Pos > 20) and ((CurAmmoGear = nil) or (CurAmmoGear^.Kind <> gtRope)) then begin -////////////////////////////////// TODO - ASK UNC0RR FOR A GOOD HOME FOR THIS //////////////////////////////////// if not gun then begin dec(yy,3); @@ -969,9 +977,6 @@ p:= PLongWordArray(@(p^[s^.pitch shr 2])) end; - // Why is this here. For one thing, there's no test on +1 being safe. - //Land[py, px+1]:= lfBasic; - if allpx then UpdateLandTexture(xx, Pred(s^.h), yy, Pred(s^.w), true) else @@ -983,7 +988,6 @@ min(LAND_HEIGHT - yy, Pred(s^.h)), false // could this be true without unnecessarily creating blanks? ); end; -////////////////////////////////// TODO - ASK UNC0RR FOR A GOOD HOME FOR THIS //////////////////////////////////// end end; @@ -996,7 +1000,7 @@ end; Gear^.Pos:= 0; Gear^.X:= int2hwFloat(LongInt(GetRandom(snowRight - snowLeft)) + snowLeft); - if (cGravity < _0) and (yy < LAND_HEIGHT-1200) then + if (cGravity.isNegative) and (yy < LAND_HEIGHT-1200) then Gear^.Y:= int2hwFloat(LAND_HEIGHT - 50 - LongInt(GetRandom(50))) else Gear^.Y:= int2hwFloat(LAND_HEIGHT + LongInt(GetRandom(50)) - 1250); Gear^.State:= Gear^.State or gstInvisible;