Example #1
0
        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();
        }
Example #2
0
        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();
        }
Example #4
0
        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();
        }