# HG changeset patch # User alfadur # Date 1594240962 -10800 # Node ID 6b04399c84a73382b2e1f985b61e9bbf17f6e0c8 # Parent 88037382ae4383351ff49ce27d075b1a29048105 improve sentry spawn diff -r 88037382ae43 -r 6b04399c84a7 hedgewars/uGears.pas --- a/hedgewars/uGears.pas Wed Jul 08 22:18:02 2020 +0300 +++ b/hedgewars/uGears.pas Wed Jul 08 23:42:42 2020 +0300 @@ -58,7 +58,7 @@ uLocale, uAmmos, uStats, uVisualGears, uScript, uVariables, uCommands, uUtils, uTextures, uRenderUtils, uGearsRender, uCaptions, uGearsHedgehog, uGearsUtils, uGearsList, uGearsHandlersRope - , uVisualGearsList, uGearsHandlersMess, uAI; + , uVisualGearsList, uGearsHandlersMess, uAI, SDLh; var skipFlag: boolean; @@ -761,6 +761,62 @@ end; end; +procedure AddSentries(count: LongWord); +var i, x, y, swapIndex: LongInt; + positions: array[0..1023] of TPoint; + positionsCount, tries: LongInt; +begin + positionsCount := 0; + tries := 2048; + while (positionsCount < 1024) and (tries > 0) do + begin + x := leftX + cHHRadius + GetRandom(rightX - leftX - 2 * cHHRadius); + y := cHHRadius; + + while y < cWaterLine do + begin + repeat + inc(y, cHHRadius) + until (y >= cWaterLine) or (CountLand(x, y, cHHRadius - 1, 1, lfAll, 0) = 0); + + if y < cWaterLine then + begin + repeat + inc(y) + until (y >= cWaterLine) or (CountLand(x, y, cHHRadius - 1, 1, lfAll, 0) <> 0); + + if y < cWaterLine then + begin + swapIndex := GetRandom(positionsCount + 1); + if swapIndex = positionsCount then + begin + positions[positionsCount].X := x; + positions[positionsCount].Y := y; + end + else + begin + positions[positionsCount].X := positions[swapIndex].X; + positions[positionsCount].Y := positions[swapIndex].Y; + positions[swapIndex].X := x; + positions[swapIndex].Y := y; + end; + inc(positionsCount); + if positionsCount >= 1024 then + break; + inc(y, cHHRadius * 2) + end + else + dec(tries) + end + else + dec(tries) + end; + end; + + for i := 0 to min(count, positionsCount) - 1 do + AddGear(positions[i].X, positions[i].Y - cHHRadius, gtSentry, 0, _0, _0, 5000); +end; + procedure AddMiscGears; var p,i,j,t,h,unplaced: Longword; rx, ry: LongInt; @@ -863,20 +919,7 @@ end; if p <> 0 then DeleteGear(Gear); -i:= 0; -unplaced:= 0; -while (i < cSentries) and (unplaced < 4) do - begin - Gear:= AddGear(0, 0, gtSentry, 0, _0, _0, 0); - FindPlace(Gear, false, 0, LAND_WIDTH); - - if Gear = nil then - inc(unplaced) - else - unplaced:= 0; - - inc(i) - end; +AddSentries(cSentries); if (GameFlags and gfLowGravity) <> 0 then begin diff -r 88037382ae43 -r 6b04399c84a7 hedgewars/uGearsUtils.pas --- a/hedgewars/uGearsUtils.pas Wed Jul 08 22:18:02 2020 +0300 +++ b/hedgewars/uGearsUtils.pas Wed Jul 08 23:42:42 2020 +0300 @@ -41,6 +41,7 @@ procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt); inline; procedure FindPlace(var Gear: PGear; withFall: boolean; Left, Right: LongInt; skipProximity: boolean); +function CountLand(x, y, r, c: LongInt; mask, antimask: LongWord): LongInt; function CheckGearNear(Kind: TGearType; X, Y: hwFloat; rX, rY: LongInt): PGear; function CheckGearNear(Gear: PGear; Kind: TGearType; rX, rY: LongInt): PGear;