protected override IAssignment PrepareNextAssignment()
        {
            IAssignment assignment;

            switch (m_state)
            {
                case State.MoveToItem:
                    assignment = new MoveAssignment(this, this.Item.Environment, this.Item.Location, DirectionSet.Exact);
                    break;

                case State.CarryItem:
                    assignment = new CarryItemAssignment(this, this.Item);
                    break;

                case State.Haul:
                    assignment = new HaulAssignment(this, m_environment, m_location, m_positioning, this.Item);
                    break;

                case State.DropItem:
                    assignment = new DropItemAssignment(this, this.Item);
                    break;

                default:
                    throw new Exception();
            }

            return assignment;
        }
        protected override IAssignment PrepareNextAssignment()
        {
            IAssignment assignment;

            switch (m_state)
            {
                case State.MoveToItem:
                    assignment = new MoveAssignment(this, this.Item.Environment, this.Item.Location, DirectionSet.Exact);
                    break;

                case State.CarryItem:
                    assignment = new CarryItemAssignment(this, this.Item);
                    break;

                case State.HaulToStockpile:
                    if (!m_stockpile.Area.Contains(this.Worker.Location))
                    {
                        assignment = new HaulToAreaAssignment(this, m_stockpile.Environment, m_stockpile.Area.ToIntGrid3(), DirectionSet.Exact, this.Item);
                    }
                    else
                    {
                        bool ok;
                        var l = m_stockpile.FindEmptyLocation(out ok);
                        if (!ok)
                            throw new Exception();

                        assignment = new HaulAssignment(this, m_stockpile.Environment, l, DirectionSet.Exact, this.Item);
                    }
                    break;

                case State.DropItem:
                    assignment = new DropItemAssignment(this, this.Item);
                    break;

                default:
                    throw new Exception();
            }

            return assignment;
        }