public void Flood(Actor self) { var waveFront = Util.ExpandFootprint(cells, true) .Take(info.MaxRange) .SkipWhile(p => !self.World.Map.Contains(p) || (resourceLayer.GetResourceType(p) == resourceType && resourceLayer.IsFull(p))) .ToArray(); foreach (var cell in waveFront) { if (resourceLayer.CanSpawnResourceAt(resourceType, cell)) { cells.Add(cell); resourceLayer.AddResource(resourceType, cell, 1); } } }
void ITick.Tick(Actor self) { if (IsTraitDisabled) { Ticks = info.Interval; } if (IsTraitPaused || IsTraitDisabled) { return; } if (--Ticks < 0) { Ticks = info.Interval; Resources += info.Amount; if (Resources >= Info.Capacity) { var exit = self.Exits().RandomOrDefault(self.World.SharedRandom); var vehicle = Info.DeliveryVehicleType.Random(self.World.SharedRandom).ToLowerInvariant(); var actorInfo = self.World.Map.Rules.Actors[vehicle]; ResourceType resourceType = null; var cells = building.Info.Tiles(self.Location); foreach (var cell in cells) { if (resourceLayer.GetResourceDensity(cell) > 0) { resourceType = resourceLayer.GetResourceType(cell); } } SpawnDeliveryVehicle(self, actorInfo, exit != null ? exit.Info : null, resourceType); Resources = 0; } } }