예제 #1
0
        public override IEnumerable <Status> Run()
        {
            if (Zone == null)
            {
                Creature.DrawIndicator(IndicatorManager.StandardIndicators.Question);
                yield return(Status.Fail);

                yield break;
            }

            if (Resource.Count <= 0)
            {
                yield return(Status.Success);

                yield break;
            }

            List <GameComponent> createdItems = Creature.Inventory.RemoveAndCreate(Resource, Inventory.RestockType.RestockResource);

            if (createdItems.Count == 0)
            {
                yield return(Status.Success);
            }

            foreach (GameComponent b in createdItems)
            {
                if (Zone.AddItem(b))
                {
                    Creature.Stats.NumItemsGathered++;
                }
                else
                {
                    Creature.Inventory.AddResource(new ResourceAmount(Resource.Type, 1), Inventory.RestockType.RestockResource);
                    b.Delete();
                }
            }

            Creature.NoiseMaker.MakeNoise("Stockpile", Creature.AI.Position);
            Creature.CurrentCharacterMode = Creature.Stats.CurrentClass.AttackMode;
            Creature.Sprite.ResetAnimations(Creature.Stats.CurrentClass.AttackMode);
            Creature.Sprite.PlayAnimations(Creature.Stats.CurrentClass.AttackMode);
            while (!Creature.Sprite.AnimPlayer.IsDone())
            {
                yield return(Status.Running);
            }

            var resource = Library.GetResourceType(Resource.Type);

            if (resource.Tags.Contains(DwarfCorp.Resource.ResourceTags.Corpse))
            {
                Creature.AddThought("I laid a friend to rest.", new TimeSpan(0, 8, 0, 0), 10.0f);
            }

            yield return(Status.Running);

            Creature.CurrentCharacterMode = CharacterMode.Idle;
            yield return(Status.Success);
        }
예제 #2
0
        public override IEnumerable <Status> Run()
        {
            Creature.IsCloaked = false;
            if (Zone != null)
            {
                var resourcesToStock = Creature.Inventory.Resources.Where(a => a.MarkedForRestock && Zone is Stockpile && (Zone as Stockpile).IsAllowed(a.Resource)).ToList();
                foreach (var resource in resourcesToStock)
                {
                    List <GameComponent> createdItems = Creature.Inventory.RemoveAndCreate(new ResourceAmount(resource.Resource), Inventory.RestockType.RestockResource);

                    foreach (GameComponent b in createdItems)
                    {
                        if (Zone.AddItem(b))
                        {
                            Creature.NoiseMaker.MakeNoise("Stockpile", Creature.AI.Position);
                            Creature.Stats.NumItemsGathered++;
                            Creature.CurrentCharacterMode = Creature.Stats.CurrentClass.AttackMode;
                            Creature.Sprite.ResetAnimations(Creature.Stats.CurrentClass.AttackMode);
                            Creature.Sprite.PlayAnimations(Creature.Stats.CurrentClass.AttackMode);

                            while (!Creature.Sprite.AnimPlayer.IsDone())
                            {
                                yield return(Status.Running);
                            }

                            yield return(Status.Running);
                        }
                        else
                        {
                            Creature.Inventory.AddResource(new ResourceAmount(resource.Resource, 1), Inventory.RestockType.RestockResource);
                            b.Delete();
                        }
                    }
                }
            }

            Timer waitTimer = new Timer(1.0f, true);
            bool  removed   = Creature.World.RemoveResourcesWithToss(Resources, Agent.Position, Zone);

            if (!removed)
            {
                yield return(Status.Fail);
            }
            else
            {
                Agent.Creature.Inventory.AddResource(Resources.CloneResource(), Inventory.RestockType.None);
                Agent.Creature.Sprite.ResetAnimations(Creature.Stats.CurrentClass.AttackMode);
                while (!waitTimer.HasTriggered)
                {
                    Agent.Creature.CurrentCharacterMode = Creature.Stats.CurrentClass.AttackMode;
                    waitTimer.Update(DwarfTime.LastTime);
                    yield return(Status.Running);
                }
                Agent.Creature.CurrentCharacterMode = CharacterMode.Idle;
                yield return(Status.Success);
            }
        }
예제 #3
0
        public override IEnumerable <Status> Run()
        {
            Zone zone = Agent.Faction.GetNearestStockpile(Agent.Position, (s) => !s.IsFull() && Resources.All(resource => s.IsAllowed(resource.ResourceType)));

            if (zone != null)
            {
                var resourcesToStock = Creature.Inventory.Resources.Where(a => a.MarkedForRestock).ToList();
                foreach (var resource in resourcesToStock)
                {
                    List <Body> createdItems = Creature.Inventory.RemoveAndCreate(new ResourceAmount(resource.Resource), Inventory.RestockType.RestockResource);

                    foreach (Body b in createdItems)
                    {
                        if (zone.AddItem(b))
                        {
                            Creature.NoiseMaker.MakeNoise("Stockpile", Creature.AI.Position);
                            Creature.Stats.NumItemsGathered++;
                            Creature.CurrentCharacterMode = CharacterMode.Attacking;
                            Creature.Sprite.ResetAnimations(CharacterMode.Attacking);
                            Creature.Sprite.PlayAnimations(CharacterMode.Attacking);

                            while (!Creature.Sprite.AnimPlayer.IsDone())
                            {
                                yield return(Status.Running);
                            }

                            yield return(Status.Running);
                        }
                    }
                }
            }

            Timer waitTimer = new Timer(1.0f, true);
            bool  removed   = Agent.Faction.RemoveResources(Resources, Agent.Position);

            if (!removed)
            {
                yield return(Status.Fail);
            }
            else
            {
                foreach (ResourceAmount resource in Resources)
                {
                    Agent.Creature.Inventory.AddResource(resource.CloneResource(), Inventory.RestockType.None);
                }

                while (!waitTimer.HasTriggered)
                {
                    waitTimer.Update(DwarfTime.LastTime);
                    yield return(Status.Running);
                }
                yield return(Status.Success);
            }
        }
예제 #4
0
        public override IEnumerable <Status> Run()
        {
            if (Zone == null)
            {
                Creature.DrawIndicator(IndicatorManager.StandardIndicators.Question);
                yield return(Status.Fail);

                yield break;
            }

            if (Resource.NumResources <= 0)
            {
                yield return(Status.Success);

                yield break;
            }

            List <Body> createdItems = Creature.Inventory.RemoveAndCreate(Resource);

            if (createdItems.Count == 0)
            {
                Creature.DrawIndicator(IndicatorManager.StandardIndicators.Question);
                yield return(Status.Fail);
            }

            foreach (Body b in createdItems)
            {
                if (Zone.AddItem(b))
                {
                    Creature.NoiseMaker.MakeNoise("Hurt", Creature.AI.Position);
                    Creature.Stats.NumItemsGathered++;
                    Creature.AI.AddXP(1);
                    Creature.CurrentCharacterMode = Creature.CharacterMode.Attacking;
                    Creature.Sprite.ResetAnimations(Creature.CharacterMode.Attacking);
                    Creature.Sprite.PlayAnimations(Creature.CharacterMode.Attacking);

                    while (!Creature.Sprite.CurrentAnimation.IsDone())
                    {
                        yield return(Status.Running);
                    }

                    yield return(Status.Running);
                }
                else
                {
                    Creature.DrawIndicator(IndicatorManager.StandardIndicators.Question);
                    Creature.CurrentCharacterMode = Creature.CharacterMode.Idle;
                    yield return(Status.Fail);
                }
            }
            Creature.CurrentCharacterMode = Creature.CharacterMode.Idle;
            yield return(Status.Success);
        }
예제 #5
0
        public override IEnumerable <Status> Run()
        {
            if (Zone == null)
            {
                Creature.DrawIndicator(IndicatorManager.StandardIndicators.Question);
                yield return(Status.Fail);

                yield break;
            }

            if (Resource.NumResources <= 0)
            {
                yield return(Status.Success);

                yield break;
            }

            List <Body> createdItems = Creature.Inventory.RemoveAndCreate(Resource, Inventory.RestockType.RestockResource);

            if (createdItems.Count == 0)
            {
                yield return(Status.Success);
            }

            foreach (Body b in createdItems)
            {
                if (Zone.AddItem(b))
                {
                    Creature.Stats.NumItemsGathered++;
                }
            }

            Creature.NoiseMaker.MakeNoise("Stockpile", Creature.AI.Position);
            Creature.CurrentCharacterMode = Creature.AttackMode;
            Creature.Sprite.ResetAnimations(Creature.AttackMode);
            Creature.Sprite.PlayAnimations(Creature.AttackMode);
            while (!Creature.Sprite.AnimPlayer.IsDone())
            {
                yield return(Status.Running);
            }

            var resource = ResourceLibrary.GetResourceByName(Resource.ResourceType);

            if (resource.Tags.Contains(DwarfCorp.Resource.ResourceTags.Corpse))
            {
                Creature.AddThought(Thought.ThoughtType.BuriedDead);
            }

            yield return(Status.Running);

            Creature.CurrentCharacterMode = CharacterMode.Idle;
            yield return(Status.Success);
        }
예제 #6
0
        public override IEnumerable <Status> Run()
        {
            if (Zone == null)
            {
                Creature.DrawIndicator(IndicatorManager.StandardIndicators.Question);
                yield return(Status.Fail);

                yield break;
            }

            if (Resource.NumResources <= 0)
            {
                yield return(Status.Success);

                yield break;
            }

            List <Body> createdItems = Creature.Inventory.RemoveAndCreate(Resource);

            if (createdItems.Count == 0)
            {
                Creature.DrawIndicator(IndicatorManager.StandardIndicators.Question);
                yield return(Status.Fail);
            }

            foreach (Body b in createdItems)
            {
                if (Zone.AddItem(b))
                {
                    Creature.NoiseMaker.MakeNoise("Hurt", Creature.AI.Position);
                    Creature.Stats.NumItemsGathered++;
                    Creature.AI.AddXP(1);
                    yield return(Status.Running);
                }
                else
                {
                    Creature.DrawIndicator(IndicatorManager.StandardIndicators.Question);
                    yield return(Status.Fail);
                }
            }

            yield return(Status.Success);
        }