public List<Task> CreateTasks() { List<Task> tasks = new List<Task>(); if(Faction.Stockpiles.Count > 0) { tasks.AddRange(Faction.GatherDesignations.Select(i => new GatherItemTask(i)).Where(g => !TaskIsAssigned(g) && IsFeasible(g, Faction.Minions))); } foreach(CreatureAI creature in Faction.Minions) { if(creature.Status.Hunger.IsUnhappy()) { Task g = new SatisfyHungerTask(); if(IsFeasible(g, Faction.Minions)) { tasks.Add(g); } } } foreach (CreatureAI creature in Faction.Minions) { if (creature.Status.Energy.IsUnhappy() && PlayState.Time.IsNight()) { Task g = new SatisfyTirednessTask(); if (IsFeasible(g, Faction.Minions)) { tasks.Add(g); } } } List<Creature> threatsToRemove = new List<Creature>(); foreach(Creature threat in Faction.Threats) { if(threat != null && !threat.IsDead) { Task g = new KillEntityTask(threat.Physics, KillEntityTask.KillType.Auto); if (!TaskIsAssigned(g) && IsFeasible(g, Faction.Minions)) { tasks.Add(g); } } else { threatsToRemove.Add(threat); } } foreach (Creature threat in threatsToRemove) { Faction.Threats.Remove(threat); } foreach(BuildOrder i in Faction.DigDesignations) { if (i == null || i.Vox == null || i.Vox.Health <= 0) { continue; } VoxelChunk chunk = PlayState.ChunkManager.ChunkData.GetVoxelChunkAtWorldLocation(i.Vox.Position); if(chunk != null) { if(chunk.IsCompletelySurrounded(i.Vox)) { continue; } } Task g = new KillVoxelTask(i.Vox); if(!TaskIsAssigned(g) && IsFeasible(g, Faction.Minions)) { tasks.Add(g); } } tasks.AddRange(Faction.GuardDesignations.Select(i => new GuardVoxelTask(i.Vox)).Where(g => !TaskIsAssigned(g) && IsFeasible(g, Faction.Minions))); tasks.AddRange(Faction.ChopDesignations.Select(i => new KillEntityTask(i, KillEntityTask.KillType.Chop)).Where(g => !TaskIsAssigned(g) && IsFeasible(g, Faction.Minions))); if(Faction.Stockpiles.Count <= 0) { return tasks; } foreach(WallBuilder put in Faction.WallBuilder.Designations) { if(Faction.HasResources(new List<ResourceAmount>() { new ResourceAmount(put.Type.ResourceToRelease) })) { Task g = (new BuildVoxelTask(put.Vox, put.Type)); if(!TaskIsAssigned(g) && IsFeasible(g, Faction.Minions)) { tasks.Add(g); } } } foreach(ShipOrder ship in Faction.ShipDesignations) { List<Body> componentsToShip = new List<Body>(); int remaining = ship.GetRemainingNumResources(); if(remaining == 0) { continue; } foreach(Stockpile s in Faction.Stockpiles) { for(int i = componentsToShip.Count; i < remaining; i++) { // TODO: Reimplement /* Body r = s.FindItemWithTag(ship.Resource.ResourceType.ResourceName, componentsToShip); if(r != null) { componentsToShip.Add(r); } */ } } foreach(Body loc in componentsToShip) { // TODO: Reimplement /* if(ship.Port.ContainsItem(loc)) { continue; } */ Task g = new PutItemInZoneTask(Item.FindItem(loc), ship.Port); if(TaskIsAssigned(g) || !IsFeasible(g, Faction.Minions)) { continue; } ship.Assignments.Add(g); tasks.Add(g); } } return tasks; }
public List <Task> CreateTasks() { List <Task> tasks = new List <Task>(); if (Faction.Stockpiles.Count > 0) { tasks.AddRange(Faction.GatherDesignations.Select(i => new GatherItemTask(i)).Where(g => !TaskIsAssigned(g) && IsFeasible(g, Faction.Minions))); } foreach (CreatureAI creature in Faction.Minions) { if (creature.Status.Hunger.IsUnhappy()) { Task g = new SatisfyHungerTask(); if (IsFeasible(g, Faction.Minions)) { tasks.Add(g); } } } foreach (CreatureAI creature in Faction.Minions) { if (creature.Status.Energy.IsUnhappy() && PlayState.Time.IsNight()) { Task g = new SatisfyTirednessTask(); if (IsFeasible(g, Faction.Minions)) { tasks.Add(g); } } } List <Creature> threatsToRemove = new List <Creature>(); foreach (Creature threat in Faction.Threats) { if (threat != null && !threat.IsDead) { Task g = new KillEntityTask(threat.Physics, KillEntityTask.KillType.Auto); if (!TaskIsAssigned(g) && IsFeasible(g, Faction.Minions)) { tasks.Add(g); } } else { threatsToRemove.Add(threat); } } foreach (Creature threat in threatsToRemove) { Faction.Threats.Remove(threat); } foreach (BuildOrder i in Faction.DigDesignations) { if (i == null || i.Vox == null || i.Vox.Health <= 0) { continue; } VoxelChunk chunk = PlayState.ChunkManager.ChunkData.GetVoxelChunkAtWorldLocation(i.Vox.Position); if (chunk != null) { if (chunk.IsCompletelySurrounded(i.Vox)) { continue; } } Task g = new KillVoxelTask(i.Vox); if (!TaskIsAssigned(g) && IsFeasible(g, Faction.Minions)) { tasks.Add(g); } } tasks.AddRange(Faction.GuardDesignations.Select(i => new GuardVoxelTask(i.Vox)).Where(g => !TaskIsAssigned(g) && IsFeasible(g, Faction.Minions))); tasks.AddRange(Faction.ChopDesignations.Select(i => new KillEntityTask(i, KillEntityTask.KillType.Chop)).Where(g => !TaskIsAssigned(g) && IsFeasible(g, Faction.Minions))); if (Faction.Stockpiles.Count <= 0) { return(tasks); } foreach (WallBuilder put in Faction.WallBuilder.Designations) { if (Faction.HasResources(new List <ResourceAmount>() { new ResourceAmount(put.Type.ResourceToRelease) })) { Task g = (new BuildVoxelTask(put.Vox, put.Type)); if (!TaskIsAssigned(g) && IsFeasible(g, Faction.Minions)) { tasks.Add(g); } } } foreach (ShipOrder ship in Faction.ShipDesignations) { List <Body> componentsToShip = new List <Body>(); int remaining = ship.GetRemainingNumResources(); if (remaining == 0) { continue; } foreach (Stockpile s in Faction.Stockpiles) { for (int i = componentsToShip.Count; i < remaining; i++) { // TODO: Reimplement /* * Body r = s.FindItemWithTag(ship.Resource.ResourceType.ResourceName, componentsToShip); * * if(r != null) * { * componentsToShip.Add(r); * } */ } } foreach (Body loc in componentsToShip) { // TODO: Reimplement /* * if(ship.Port.ContainsItem(loc)) * { * continue; * } */ Task g = new PutItemInZoneTask(Item.FindItem(loc), ship.Port); if (TaskIsAssigned(g) || !IsFeasible(g, Faction.Minions)) { continue; } ship.Assignments.Add(g); tasks.Add(g); } } return(tasks); }