public override void Initialize() { bool hasAllResources = true; if (Resources != null) { foreach (Quantitiy <Resource.ResourceTags> resource in Resources) { if (!Creature.Inventory.HasResource(resource, AllowHeterogenous)) { hasAllResources = false; } } } else if (ResourcesToStash != null) { foreach (ResourceAmount resource in ResourcesToStash) { if (!Creature.Inventory.HasResource(resource)) { hasAllResources = false; } } } else { Tree = null; return; } if (!hasAllResources) { Stockpile nearestStockpile = Agent.Faction.GetNearestStockpile(Agent.Position, (pile) => !(pile is Graveyard)); if (ResourcesToStash == null && Resources != null) { ResourcesToStash = Agent.Faction.GetResourcesWithTags(Resources, AllowHeterogenous); } if (nearestStockpile == null || (ResourcesToStash != null && ResourcesToStash.Count == 0)) { Tree = null; return; } else { Tree = new Sequence(new Domain(() => HasResources(Agent), new GoToZoneAct(Agent, nearestStockpile)), new StashResourcesAct(Agent, ResourcesToStash), new SetBlackboardData <List <ResourceAmount> >(Agent, "ResourcesStashed", ResourcesToStash) ); } } else { Tree = new SetBlackboardData <List <ResourceAmount> >(Agent, "ResourcesStashed", ResourcesToStash); } base.Initialize(); }
public override void Initialize() { var needed = new List <ResourceApparentTypeAmount>(); foreach (var resource in OptimizeList(Resources)) { var count = Creature.Inventory.Resources.Count(i => i.Resource.TypeName == resource.Type); if (count < resource.Count) { needed.Add(new ResourceApparentTypeAmount(resource.Type, resource.Count - count)); } } if (needed.Count > 0) { var resourcesToStash = Creature.World.GetStockpilesContainingResources(needed).ToList(); if (resourcesToStash != null && resourcesToStash.Count == 0) { Tree = null; return; } else { var children = new List <Act>(); foreach (var resource in resourcesToStash.OrderBy(r => (r.Key.GetBoundingBox().Center() - Agent.Position).LengthSquared())) { children.Add(new Domain(() => HasResources(Agent, resource), new GoToZoneAct(Agent, resource.Key))); children.Add(new Sequence(new Condition(() => HasResources(Agent, resource)), new StashResourcesAct(Agent, resource.Key, resource.Value))); } children.Add(new SetBlackboardData <List <Resource> >(Agent, BlackboardEntry, resourcesToStash.Select(r => r.Value).ToList())); Tree = new Select( new Sequence(children.ToArray()), new Sequence( new Wrap(Agent.Creature.RestockAll), new Always(Status.Fail))); } } else { // In this case the dwarf already has all the resources. We have to find the resources from the inventory. var resourcesStashed = new List <Resource>(); foreach (var amount in OptimizeList(Resources)) { resourcesStashed.AddRange(Creature.Inventory.FindResourcesOfApparentType(amount)); } Tree = new SetBlackboardData <List <Resource> >(Agent, BlackboardEntry, resourcesStashed); } base.Initialize(); }
public override void Initialize() { var resource = Tags.Select(t => { var matches = Creature.Inventory.EnumerateResources(new ResourceTagAmount(t, 1)); if (matches.Count > 0) { return(matches[0]); } return(null); }).FirstOrDefault(r => r != null); if (resource == null) { var location = Creature.World.GetFirstStockpileContainingResourceWithMatchingTag(Tags); if (!location.HasValue) { Tree = null; return; } else { Tree = new Select( new Sequence( new Domain(() => HasResources(Agent, location.Value), new GoToZoneAct(Agent, location.Value.Key)), new Condition(() => HasResources(Agent, location.Value)), new StashResourcesAct(Agent, location.Value.Key, location.Value.Value), new SetBlackboardData <Resource>(Agent, BlackboardEntry, location.Value.Value)), new Sequence( new Wrap(Agent.Creature.RestockAll), new Always(Status.Fail))); } } else { Tree = new SetBlackboardData <Resource>(Agent, BlackboardEntry, resource); } base.Initialize(); }
public override void Initialize() { bool hasAllResources = true; if (Resources != null) { foreach (Quantitiy <Resource.ResourceTags> resource in Resources) { if (!Creature.Inventory.HasResource(resource)) { hasAllResources = false; } } } else if (ResourcesToStash != null) { foreach (var resource in ResourcesToStash) { if (!Creature.Inventory.HasResource(resource.Value)) { hasAllResources = false; break; } } } else { Tree = null; return; } if (!hasAllResources) { if (ResourcesToStash == null && Resources != null) { ResourcesToStash = Creature.World.GetStockpilesContainingResources(Resources).ToList(); } if (ResourcesToStash != null && ResourcesToStash.Count == 0) { Tree = null; return; } else { List <Act> children = new List <Act>(); foreach (var resource in ResourcesToStash.OrderBy(r => (r.Key.GetBoundingBox().Center() - Agent.Position).LengthSquared())) { children.Add(new Domain(() => HasResources(Agent, resource), new GoToZoneAct(Agent, resource.Key))); children.Add(new Sequence(new Condition(() => HasResources(Agent, resource)), new StashResourcesAct(Agent, resource.Key, resource.Value))); } children.Add(new SetBlackboardData <List <ResourceAmount> >(Agent, "ResourcesStashed", ResourcesToStash.Select(r => r.Value).ToList())); Tree = new Sequence(children.ToArray()) | (new Wrap(Agent.Creature.RestockAll) & false); } } else { if (ResourcesToStash == null && Resources != null) { // In this case the dwarf already has all the resources. We have to find the resources from the inventory. List <ResourceAmount> resourcesStashed = new List <ResourceAmount>(); foreach (var tag in Resources) { resourcesStashed.AddRange(Creature.Inventory.GetResources(tag, Inventory.RestockType.Any)); } Tree = new SetBlackboardData <List <ResourceAmount> >(Agent, "ResourcesStashed", resourcesStashed); } else if (ResourcesToStash != null) { Tree = new SetBlackboardData <List <ResourceAmount> >(Agent, "ResourcesStashed", ResourcesToStash.Select(r => r.Value).ToList()); } else { Tree = null; } } base.Initialize(); }