Пример #1
0
        public void AddArea(IntGrid3 area, DesignationType type)
        {
            int origCount = m_map.Count;

            var locations = area.Range().Where(this.Environment.Contains);

            foreach (var p in locations)
            {
                if (GetTileValid(p, type) == false)
                    continue;

                DesignationData oldData;

                if (m_map.TryGetValue(p, out oldData))
                {
                    if (oldData.Type == type)
                        continue;

                    RemoveJob(p);
                }

                var data = new DesignationData(type);
                data.Reachable = GetTileReachable(p, type);
                m_map[p] = data;

                this.Environment.OnTileExtraChanged(p);
            }

            if (origCount == 0 && m_map.Count > 0)
            {
                this.Environment.MapTileTerrainChanged += OnEnvironmentMapTileTerrainChanged;
                this.Environment.World.TickStarting += OnTickStartEvent;
            }
        }
Пример #2
0
        public static void Calculate3(IntVector3 viewerLocation, int visionRange, VisionMap visibilityMap, IntSize3 mapSize,
				Func<IntVector3, bool> blockerDelegate)
        {
            visibilityMap.Clear();

            if (blockerDelegate(viewerLocation) == true)
                return;

            var g = new IntGrid3(new IntVector3(), mapSize);
            g = g.Offset(-viewerLocation.X, -viewerLocation.Y, -viewerLocation.Z);
            var vr = new IntVector3(visionRange, visionRange, visionRange);
            g = g.Intersect(new IntGrid3(vr, -vr));

            int visionRangeSquared = (visionRange + 1) * (visionRange + 1);	// +1 to get a bit bigger view area

            foreach (var dst in g.Range())
            {
                if (dst.LengthSquared > visionRangeSquared)
                    continue;

                bool vis = FindLos3(viewerLocation, dst, blockerDelegate);
                visibilityMap[dst] = vis;

                // XXX Cheat a bit so that the floor will be visible
                if (vis && dst.Z == 0 && viewerLocation.Z > 1)
                {
                    visibilityMap[dst.SetZ(dst.Z - 1)] = true;
                }
            }
        }
Пример #3
0
 static void SetArea(EnvironmentObject env, IntGrid3 area, TileData data)
 {
     foreach (var p in area.Range())
     {
         env.SetTileData(p, data);
     }
 }
Пример #4
0
        IEnumerable <IntVector3> GetVisibleLocationsSimpleFOV()
        {
            var g = new IntGrid3(this.Location - this.VisionRange, this.Location + this.VisionRange);

            g = g.Intersect(new IntGrid3(this.Environment.Size));

            return(g.Range());
        }
Пример #5
0
        void AddNewJobs()
        {
            var c = this.SubJobs.Count;

            m_locs = m_area.Range().Where(p => !m_jobs.Any(i => i.Item1 == p) && m_environment.GetTileData(p).HasFellableTree).Take(3 - c);

            foreach (var p in m_locs)
            {
                var job = new AssignmentGroups.MoveFellTreeAssignment(this, m_environment, p);
                AddSubJob(job);
                m_jobs.Add(new Tuple <IntVector3, IJob>(p, job));
            }
        }
Пример #6
0
        void NotifyTileObjectChanges(IntGrid3 oldGrid, IntGrid3 newGrid)
        {
            if (m_environment == null)
            {
                m_objects.Clear();
                return;
            }

            var rm = oldGrid.Range().Except(newGrid.Range())
                     .SelectMany(p => m_environment.GetContents(p));

            foreach (var ob in rm)
            {
                m_objects.Remove(ob);
            }

            var add = newGrid.Range().Except(oldGrid.Range())
                      .SelectMany(p => m_environment.GetContents(p));

            foreach (var ob in add)
            {
                m_objects.Add(ob);
            }
        }
Пример #7
0
        void NotifyTileObjectChanges()
        {
            m_objects.Clear();

            if (m_environment == null)
            {
                return;
            }

            var obs = m_adjustedBox.Range().
                      SelectMany(m_environment.GetContents);

            foreach (var ob in obs)
            {
                m_objects.Add(ob);
            }
        }
Пример #8
0
        public void SetTerrains(IntGrid3 bounds, ulong[] tileData)
        {
            this.Version += 1;

            m_tileGrid.Grow(bounds.Corner2);

            //Trace.TraceError("Recv {0}", bounds.Z);

            m_tileGrid.SetTileDataRange(tileData, bounds);

            if (this.MapTileTerrainChanged != null)
            {
                foreach (var p in bounds.Range())
                {
                    MapTileTerrainChanged(p);
                }
            }
        }
Пример #9
0
        static void CreateOreSphere(TerrainData terrain, Random random, IntVector3 center, int r, MaterialID oreMaterialID, double probIn, double probOut)
        {
            // adjust r, so that r == 1 gives sphere of one tile
            r -= 1;

            // XXX split the sphere into 8 parts, and mirror

            var bb = new IntGrid3(center.X - r, center.Y - r, center.Z - r, r * 2 + 1, r * 2 + 1, r * 2 + 1);

            var rs = MyMath.Square(r);

            foreach (var p in bb.Range())
            {
                var y = p.Y;
                var x = p.X;
                var z = p.Z;

                var v = MyMath.Square(x - center.X) + MyMath.Square(y - center.Y) + MyMath.Square(z - center.Z);

                if (rs >= v)
                {
                    var rr = Math.Sqrt(v);

                    double rel;

                    if (r == 0)
                    {
                        rel = 1;
                    }
                    else
                    {
                        rel = 1 - rr / r;
                    }

                    var prob = (probIn - probOut) * rel + probOut;

                    if (random.NextDouble() <= prob)
                    {
                        CreateOre(terrain, p, oreMaterialID);
                    }
                }
            }
        }
Пример #10
0
        public void AddArea(IntGrid3 area, DesignationType type)
        {
            int origCount = m_map.Count;

            var locations = area.Range().Where(this.Environment.Contains);

            foreach (var p in locations)
            {
                if (GetTileValid(p, type) == false)
                {
                    continue;
                }

                DesignationData oldData;

                if (m_map.TryGetValue(p, out oldData))
                {
                    if (oldData.Type == type)
                    {
                        continue;
                    }

                    RemoveJob(p);
                }

                var data = new DesignationData(type);
                data.ReachableSimple = GetTileReachableSimple(p, type);
                m_map[p]             = data;

                this.Environment.OnTileExtraChanged(p);
            }

            if (origCount == 0 && m_map.Count > 0)
            {
                this.Environment.MapTileTerrainChanged += OnEnvironmentMapTileTerrainChanged;
                this.Environment.World.TickStarted     += OnTickStartEvent;
            }
        }
Пример #11
0
 static void SetArea(EnvironmentObject env, IntGrid3 area, TileData data)
 {
     foreach (var p in area.Range())
         env.SetTileData(p, data);
 }
Пример #12
0
        IEnumerable<IntVector3> GetVisibleLocationsSimpleFOV()
        {
            var g = new IntGrid3(this.Location - this.VisionRange, this.Location + this.VisionRange);
            g = g.Intersect(new IntGrid3(this.Environment.Size));

            return g.Range();
        }
Пример #13
0
        void NotifyTileObjectChanges(IntGrid3 oldGrid, IntGrid3 newGrid)
        {
            if (this.Environment == null)
            {
                m_objects.Clear();
                return;
            }

            var rm = oldGrid.Range().Except(newGrid.Range())
                .SelectMany(p => this.Environment.GetContents(p));

            foreach (var ob in rm)
                m_objects.Remove(ob);

            var add = newGrid.Range().Except(oldGrid.Range())
                .SelectMany(p => this.Environment.GetContents(p));

            foreach (var ob in add)
                m_objects.Add(ob);
        }
Пример #14
0
        void ReadAndSetTileData(Stream stream, IntGrid3 bounds)
        {
            using (var reader = new BinaryReader(stream))
            {
                TileData td = new TileData();

                foreach (IntPoint3 p in bounds.Range())
                {
                    td.Raw = reader.ReadUInt64();

                    m_tileGrid.SetTileData(p, td);

                    if (MapTileTerrainChanged != null)
                        MapTileTerrainChanged(p);
                }
            }
        }
Пример #15
0
        void CreateOreSphere(IntPoint3 center, int r, MaterialID oreMaterialID, double probIn, double probOut)
        {
            // adjust r, so that r == 1 gives sphere of one tile
            r -= 1;

            // XXX split the sphere into 8 parts, and mirror

            var bb = new IntGrid3(center.X - r, center.Y - r, center.Z - r, r * 2 + 1, r * 2 + 1, r * 2 + 1);

            var rs = MyMath.Square(r);

            foreach (var p in bb.Range())
            {
                var y = p.Y;
                var x = p.X;
                var z = p.Z;

                var v = MyMath.Square(x - center.X) + MyMath.Square(y - center.Y) + MyMath.Square(z - center.Z);

                if (rs >= v)
                {
                    var rr = Math.Sqrt(v);

                    double rel;

                    if (r == 0)
                        rel = 1;
                    else
                        rel = 1 - rr / r;

                    var prob = (probIn - probOut) * rel + probOut;

                    if (GetRandomDouble() <= prob)
                        CreateOre(p, oreMaterialID);
                }
            }
        }
Пример #16
0
        public void SetTerrains(IntGrid3 bounds, ulong[] tileData)
        {
            this.Version += 1;

            m_tileGrid.Grow(bounds.Corner2);

            //Trace.TraceError("Recv {0}", bounds.Z);

            m_tileGrid.SetTileDataRange(tileData, bounds);

            if (this.MapTileTerrainChanged != null)
            {
                foreach (var p in bounds.Range())
                    MapTileTerrainChanged(p);
            }
        }