private static void LeaveServiceArea(RefuellerPictureBox refueller)
        {
            var destPointY = -(2 * RefuellerHeight);
            var destPoint  = new Point(refueller.Left + FuelingPointDeltaX, destPointY);

            refueller.AddDestinationPoint(destPoint);
        }
        internal static Point MoveRefueller(RefuellerPictureBox refueller, Point destPoint, int refuellerSpeed)
        {
            // Go left
            if (refueller.Left >= destPoint.X)
            {
                refueller.Left -= refuellerSpeed;
            }

            // Go Right
            if (refueller.Right <= destPoint.X)
            {
                refueller.Left += refuellerSpeed;
            }

            // Go Up
            if (refueller.Top >= destPoint.Y)
            {
                refueller.Top -= refuellerSpeed;
            }

            // Go Down
            if (refueller.Bottom <= destPoint.Y)
            {
                refueller.Top += refuellerSpeed;
            }

            return(destPoint);
        }
        internal static void RefillFuelTank(RefuellerPictureBox refueller, FuelTankView fillingFuelTank)
        {
            var refuellerView = refueller.Tag as RefuellerView;

            refuellerView.RefillFuelTank();

            if (fillingFuelTank.CurrentFullness >= fillingFuelTank.Volume || refuellerView.FuelRemaining <= 0)
            {
                StopRefilling(refueller, fillingFuelTank);
            }
        }
        internal static void MoveRefuellerToDestination(RefuellerPictureBox refueller)
        {
            var refuellerView = refueller.Tag as RefuellerView;

            if (refueller.IsFilling)
            {
                var fillingFuelTank = refuellerView.FuelTank;

                ModelingProcessor.RefillFuelTank(refueller, fillingFuelTank);

                return;
            }

            var        destPoint = refueller.GetDestinationPoint();
            PictureBox destSpot  = refueller.DestinationSpot;

            var refuellerSpeed = _refuellerSpeed;

            #region MotionLogic

            destPoint = MoveRefueller(refueller, destPoint, refuellerSpeed);

            #endregion /MotionLogic


            if (refueller.DestinationSpot == null)
            {
                destSpot = refueller.CreateDestinationSpot(destPoint);
                _modelingForm.PlaygroundPanel.Controls.Add(destSpot);
            }

            if (refueller.Bounds.IntersectsWith(destSpot.Bounds))
            {
                refueller.RemoveDestinationPoint(_modelingForm);

                var fuelTank       = ((RefuellerView)refueller.Tag).FuelTank;
                var pointOfFilling = fuelTank.PointOfRefilling;

                if (destPoint.Equals(pointOfFilling))
                {
                    ModelingProcessor.StartRefilling(refueller, fuelTank);
                    //test
                    //carView.IsFilled = true;
                }


                if (refueller.Bottom < -(2 * ElementSizeDefiner.RefuellerHeight))
                {
                    _modelingForm.PlaygroundPanel.Controls.Remove(refueller);
                    refueller.Dispose();
                }
            }
        }
        private static void GoToFuelTank(RefuellerPictureBox refueller)
        {
            var fuelTank       = ((RefuellerView)refueller.Tag).FuelTank;
            var pointOfFilling = fuelTank.PointOfRefilling;

            var destPointX = pointOfFilling.X;
            var destPointY = pointOfFilling.Y;
            var destPoint  = new Point(destPointX, destPointY);

            // The main point of fueling
            refueller.AddDestinationPoint(destPoint);

            // Service area enter point
            destPoint = new Point(destPointX, RefuellerSpawnPoint.Y);
            refueller.AddDestinationPoint(destPoint);
        }
        internal static void RouteRefueller(RefuellerPictureBox refueller)
        {
            var isFilled = refueller.IsFilled;

            if (refueller.IsFilling || refueller.HasDestPoints())
            {
                return;
            }

            if (!isFilled)
            {
                GoToFuelTank(refueller);
            }
            else
            {
                LeaveServiceArea(refueller);
            }
        }
        private static void StopRefilling(RefuellerPictureBox refueller, FuelTankView fillingFuelTank)
        {
            var refuellerView = refueller.Tag as RefuellerView;

            if (fillingFuelTank.CurrentFullness >= fillingFuelTank.Volume)
            {
                var fuelSurplus = fillingFuelTank.CurrentFullness - fillingFuelTank.Volume;

                if (refuellerView.FuelRemaining <= 0)
                {
                    fuelSurplus = -fuelSurplus;
                }

                refuellerView.ReturnFuelFromFuelTank(fuelSurplus);
            }

            refueller.IsFilling = false;
            refueller.IsFilled  = true;

            _isRefilling = false;
        }
 internal static void StartRefilling(RefuellerPictureBox refueller, FuelTankView fuelTank)
 {
     refueller.IsFilling = true;
 }