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; } }
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; } } }
static void SetArea(EnvironmentObject env, IntGrid3 area, TileData data) { foreach (var p in area.Range()) { env.SetTileData(p, data); } }
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()); }
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)); } }
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); } }
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); } }
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); } } }
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); } } } }
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; } }
static void SetArea(EnvironmentObject env, IntGrid3 area, TileData data) { foreach (var p in area.Range()) env.SetTileData(p, data); }
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(); }
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); }
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); } } }
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); } } }
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); } }