/// <summary>
        /// Every action happens here.
        /// </summary>
        public override void Update()
        {
            bool  found;
            Point pos = Engine.GetMapObjectPosition(this, out found);

            if (found)
            {
                if (Amount == Capacity && (myNextOrder == Order.GoToFood || myNextOrder == Order.GoToWood || myNextOrder == Order.GoToGold))
                {
                    myNextOrder = Order.ReturnResource;
                    if (RememberedReturnTarget == null)
                    {
                        RememberedReturnTarget = Engine.SearchClosestMainHall(pos);
                    }
                }
                if (Amount == 0 && myNextOrder == Order.ReturnResource)
                {
                    switch (CarriedResourceType)
                    {
                    case ResourceType.Gold: myNextOrder = Order.GoToGold; break;

                    case ResourceType.Wood: myNextOrder = Order.GoToWood; break;

                    case ResourceType.Food: myNextOrder = Order.GoToFood; break;
                    }
                }
                switch (myNextOrder)
                {
                case Order.ReturnResource:
                    MoveTarget = RememberedReturnTarget; break;

                case Order.Hunt:
                    bool isDead;
                    MoveTarget = Engine.SearchClosestPeacefulAnimalInRange(pos, SightRange, out isDead);
                    if (isDead)
                    {
                        NextOrder = Order.GoToFood;
                        RememberedGatherTarget = MoveTarget;
                    }
                    break;

                case Order.GoToFood:
                    bool ResourceIsNotValid = true;
                    foreach (MapObject mo in Engine.Map.GetCellAt(RememberedGatherTarget).MapObjects)
                    {
                        if (mo.GetType().IsSubclassOf(typeof(Resource)))
                        {
                            Resource res = (Resource)mo;
                            if (res.Type == ResourceType.Food)
                            {
                                if (mo.GetType().IsSubclassOf(typeof(Animal)))
                                {
                                    Animal animal = (Animal)mo;
                                    if (animal.Dead)
                                    {
                                        ResourceIsNotValid = false;
                                    }
                                }
                                else
                                {
                                    ResourceIsNotValid = false;
                                }
                            }
                        }
                    }
                    if (ResourceIsNotValid)
                    {
                        myNextOrder = Order.Hunt;

                        MoveTarget = Engine.SearchClosestPeacefulAnimalInRange(pos, SightRange, out isDead);
                        if (isDead)
                        {
                            NextOrder = Order.GoToFood;
                            RememberedGatherTarget = MoveTarget;
                        }
                    }
                    MoveTarget = RememberedGatherTarget;
                    break;

                case Order.GoToGold:
                    ResourceIsNotValid = true;
                    foreach (MapObject mo in Engine.Map.GetCellAt(RememberedGatherTarget).MapObjects)
                    {
                        if (mo.GetType().IsSubclassOf(typeof(Resource)))
                        {
                            Resource res = (Resource)mo;
                            if (res.Type == ResourceType.Gold)
                            {
                                ResourceIsNotValid = false;
                            }
                        }
                    }
                    if (ResourceIsNotValid)
                    {
                        RememberedGatherTarget = Engine.SearchClosestResourceInRange(pos, ResourceType.Gold, SightRange);
                    }
                    MoveTarget = RememberedGatherTarget;
                    break;

                case Order.GoToWood:
                    ResourceIsNotValid = true;
                    foreach (MapObject mo in Engine.Map.GetCellAt(RememberedGatherTarget).MapObjects)
                    {
                        if (mo.GetType().IsSubclassOf(typeof(Resource)))
                        {
                            Resource res = (Resource)mo;
                            if (res.Type == ResourceType.Wood)
                            {
                                ResourceIsNotValid = false;
                            }
                        }
                    }
                    if (ResourceIsNotValid)
                    {
                        RememberedGatherTarget = Engine.SearchClosestResourceInRange(pos, ResourceType.Wood, SightRange);
                    }
                    MoveTarget = RememberedGatherTarget;
                    break;
                }


                if (myNextOrder == Order.GoToFood || myNextOrder == Order.GoToGold || myNextOrder == Order.GoToWood)
                {
                    Gather(pos);
                }
                if (myNextOrder == Order.ReturnResource)
                {
                    ReturnResource(pos);
                }
                if (myNextOrder == Order.Build)
                {
                    Build(pos);
                }
                if (myNextOrder == Order.Hunt)
                {
                    Attack(pos);
                }

                Move(pos);
            }
        }
        /// <summary>
        /// Gather the targeted resource if it is next to it.
        /// </summary>
        internal void Gather(Point pos)
        {
            if (MoveTarget != null && pos.DistanceFrom(MoveTarget) == 1)
            {
                foreach (MapObject mo in Engine.Map.GetCellAt(MoveTarget).MapObjects)
                {
                    if (mo.GetType().IsSubclassOf(typeof(Resource)))
                    {
                        if (mo.GetType().IsSubclassOf(typeof(Animal)))
                        {
                            Animal animal = (Animal)mo;
                            if (animal.Dead)
                            {
                                if ((CarriedResourceType != ResourceType.Food))
                                {
                                    ResetAmount();
                                    CarriedResourceType = ResourceType.Food;
                                }
                                Resource resource = (Resource)mo;
                                int      amount   = HowMuchCanILoad();
                                if (amount > 3)
                                {
                                    amount = 3;
                                }
                                amount = resource.gatherAmount(amount);
                                AddAmount(amount);

                                break;
                            }
                        }
                        else
                        {
                            if (mo.GetType() == typeof(Mine) && CarriedResourceType != ResourceType.Gold)
                            {
                                ResetAmount();
                                CarriedResourceType = ResourceType.Gold;
                            }
                            if (mo.GetType() == typeof(Tree) && CarriedResourceType != ResourceType.Wood)
                            {
                                ResetAmount();
                                CarriedResourceType = ResourceType.Wood;
                            }
                            if ((mo.GetType() == typeof(Farm))
                                &&
                                (CarriedResourceType != ResourceType.Food))
                            {
                                ResetAmount();
                                CarriedResourceType = ResourceType.Food;
                            }



                            Resource resource = (Resource)mo;
                            int      amount   = HowMuchCanILoad();
                            if (amount > 3)
                            {
                                amount = 3;
                            }
                            amount = resource.gatherAmount(amount);
                            AddAmount(amount);


                            break;
                        }
                    }
                }
            }
        }