示例#1
0
 public static IEnumerable<int2> FindTilesInCircle(this World world, int2 a, int r)
 {
     var min = world.ClampToWorld(a - new int2(r, r));
     var max = world.ClampToWorld(a + new int2(r, r));
     for (var j = min.Y; j <= max.Y; j++)
         for (var i = min.X; i <= max.X; i++)
             if (r * r >= (new int2(i, j) - a).LengthSquared)
                 yield return new int2(i, j);
 }
示例#2
0
        public static bool IsCloseEnoughToBase(this World world, Player p, string buildingName, BuildingInfo bi, int2 topLeft)
        {
            var buildingMaxBounds = bi.Dimensions;
            if( bi.Bib )
                buildingMaxBounds.Y += 1;

            var scanStart = world.ClampToWorld( topLeft - new int2( bi.Adjacent, bi.Adjacent ) );
            var scanEnd = world.ClampToWorld( topLeft + buildingMaxBounds + new int2( bi.Adjacent, bi.Adjacent ) );

            var nearnessCandidates = new List<int2>();

            for( int y = scanStart.Y ; y < scanEnd.Y ; y++ )
            {
                for( int x = scanStart.X ; x < scanEnd.X ; x++ )
                {
                    var at = world.WorldActor.traits.Get<BuildingInfluence>().GetBuildingAt( new int2( x, y ) );
                    if( at != null && at.Owner == p && at.Info.Traits.Get<BuildingInfo>().BaseNormal)
                        nearnessCandidates.Add( new int2( x, y ) );
                }
            }
            var buildingTiles = Footprint.Tiles( buildingName, bi, topLeft ).ToList();
            return nearnessCandidates
                .Any( a => buildingTiles
                    .Any( b => Math.Abs( a.X - b.X ) <= bi.Adjacent
                            && Math.Abs( a.Y - b.Y ) <= bi.Adjacent ) );
        }