# HG changeset patch # User nemo # Date 1502307365 14400 # Node ID 8b89fe2115ad0e686f07713428610e68b4007b7a # Parent ac710bb12fbbb1544d929f9ee89339bfb36ca416 So, was trying to allow spawning on level surfaces of ice but not girders, but seems to be failing. We'll call this WIP diff -r ac710bb12fbb -r 8b89fe2115ad hedgewars/uGearsUtils.pas --- a/hedgewars/uGearsUtils.pas Wed Aug 09 15:35:39 2017 -0400 +++ b/hedgewars/uGearsUtils.pas Wed Aug 09 15:36:05 2017 -0400 @@ -786,22 +786,22 @@ RecountTeamHealth(tempTeam); end; -function CountNonZeroz(x, y, r, c: LongInt; mask: LongWord): LongInt; +function CountLand(x, y, r, c: LongInt; mask, antimask: LongWord): LongInt; var i: LongInt; count: LongInt = 0; begin if (y and LAND_HEIGHT_MASK) = 0 then for i:= max(x - r, 0) to min(x + r, LAND_WIDTH - 1) do - if Land[y, i] and mask <> 0 then - begin + if (Land[y, i] and mask <> 0) and (Land[y, i] and antimask = 0) then + begin inc(count); if count = c then - begin - CountNonZeroz:= count; + begin + CountLand:= count; exit + end; end; - end; - CountNonZeroz:= count; + CountLand:= count; end; function isSteadyPosition(x, y, r, c: LongInt; mask: Longword): boolean; @@ -883,22 +883,27 @@ repeat inc(y, 2); until (y >= cWaterLine) or - ((not ignoreOverlap) and (CountNonZeroz(x, y, Gear^.Radius - 1, 1, $FFFF) = 0)) or - (ignoreOverlap and (CountNonZeroz(x, y, Gear^.Radius - 1, 1, lfLandMask and (not lfIce)) = 0)); + (ignoreOverLap and (CountLand(x, y, Gear^.Radius - 1, 1, $FF00, 0) = 0)) or + (not ignoreOverLap and (CountLand(x, y, Gear^.Radius - 1, 1, $FFFF, 0) = 0)); + sy:= y; repeat inc(y); until (y >= cWaterLine) or - ((not ignoreOverlap) and (CountNonZeroz(x, y, Gear^.Radius - 1, 1, $FFFF) <> 0)) or - (ignoreOverlap and (CountNonZeroz(x, y, Gear^.Radius - 1, 1, lfLandMask and (not lfIce)) <> 0)); + (ignoreOverlap and + ((CountLand(x, y, Gear^.Radius - 1, 1, $FFFF, lfIce) <> 0) or + (CountLand(x, y+1, Gear^.Radius - 1, Gear^.Radius + 1, lfIce, 0) > Gear^.Radius))) or + (not ignoreOverlap and + ((CountLand(x, y, Gear^.Radius - 1, 1, lfLandMask, lfIce) <> 0) or + (CountLand(x, y+1, Gear^.Radius - 1, Gear^.Radius + 1, lfIce, 0) > Gear^.Radius))); if (y - sy > Gear^.Radius * 2) and (y < cWaterLine) and (((Gear^.Kind = gtExplosives) and (ignoreNearObjects or NoGearsToAvoid(x, y - Gear^.Radius, 60, 60)) and (isSteadyPosition(x, y+1, Gear^.Radius - 1, 3, $FFFF) - or (CountNonZeroz(x, y+1, Gear^.Radius - 1, Gear^.Radius+1, $FFFF) > Gear^.Radius) + or (CountLand(x, y+1, Gear^.Radius - 1, Gear^.Radius+1, $FFFF, 0) > Gear^.Radius) )) or ((Gear^.Kind <> gtExplosives)