daily pastebin goal
88%
SHARE
TWEET

Untitled

a guest Jan 23rd, 2019 72 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. {
  2.     init: function (elevators, floors) {
  3.  
  4.         function queueDestinationForElevator(elevator, floorNum) {
  5.             if (elevator.destinationQueue.length) {
  6.                 if (isElevatorGoingUp(elevator)) {
  7.                     if (floorNum < elevator.destinationQueue[0]) {
  8.                         if (elevator.currentFloor() < floorNum) {
  9.                             elevator.destinationQueue.splice(0, 0, floorNum);
  10.                         } else {
  11.                             elevator.destinationQueue.push(floorNum);
  12.                         }
  13.                     } else if (floorNum > elevator.destinationQueue[elevator.destinationQueue.length - 1]) {
  14.                         elevator.destinationQueue.push(floorNum);
  15.                     } else {
  16.                         for (var i = 0; i < (elevator.destinationQueue.length - 1); i++) {
  17.                             if ((floorNum >= elevator.destinationQueue[i]) && (floorNum <= elevator.destinationQueue[i + 1])) {
  18.                                 elevator.destinationQueue.splice(i + 1, 0, floorNum);
  19.                                 break;
  20.                             }
  21.                         }
  22.                     }
  23.                 } else {
  24.                     if (floorNum > elevator.destinationQueue[0]) {
  25.                         if (elevator.currentFloor() > floorNum) {
  26.                             elevator.destinationQueue.splice(0, 0, floorNum);
  27.                         } else {
  28.                             elevator.destinationQueue.push(floorNum);
  29.                         }
  30.                     } else if (floorNum < elevator.destinationQueue[elevator.destinationQueue.length - 1]) {
  31.                         elevator.destinationQueue.push(floorNum);
  32.                     } else {
  33.                         for (var i = 0; i < (elevator.destinationQueue.length - 1); i++) {
  34.                             if ((floorNum <= elevator.destinationQueue[i]) && (floorNum >= elevator.destinationQueue[i + 1])) {
  35.                                 elevator.destinationQueue.splice(i + 1, 0, floorNum);
  36.                                 break;
  37.                             }
  38.                         }
  39.                     }
  40.                 }
  41.                 elevator.checkDestinationQueue();
  42.             } else {
  43.                 elevator.goToFloor(floorNum);
  44.             }
  45.         }
  46.  
  47.         function isElevatorGoingUp(elevator) {
  48.             return !elevator.destinationQueue.length || (elevator.currentFloor() < elevator.destinationQueue[0]);
  49.         }
  50.  
  51.         function isElevatorGoingDown(elevator) {
  52.             return !elevator.destinationQueue.length || (elevator.currentFloor() > elevator.destinationQueue[0]);
  53.         }
  54.  
  55.         function isFloorPickupableForElevator(elevator, floorNum) {
  56.             return !elevator.destinationQueue.length
  57.                 || (isElevatorGoingUp(elevator) && (elevator.currentFloor() < floorNum))
  58.                 || (isElevatorGoingDown(elevator) && (elevator.currentFloor() > floorNum));
  59.         }
  60.  
  61.         function scheduleElevatorForFloorButtonEvent(floor, isGoingUp) {
  62.             var candidate = null;
  63.             elevators.forEach(function (elevator) {
  64.                 if ((elevator.loadFactor() < 1) || (elevator.destinationQueue[0] == floor.floorNum())) {
  65.                     if (candidate) {
  66.                         candidate.floorDiff = Math.abs(candidate.currentFloor() - floor.floorNum());
  67.                         elevator.floorDiff = Math.abs(elevator.currentFloor() - floor.floorNum());
  68.                         if (!elevator.destinationQueue.length) {
  69.                             if (!candidate.destinationQueue.length) {
  70.                                 if ((elevator.floorDiff < candidate.floorDiff) || ((elevator.floorDiff == candidate.floorDiff) && (elevator.loadFactor() < candidate.loadFactor()))) {
  71.                                     candidate = elevator;
  72.                                 }
  73.                             } else {
  74.                                 candidate = elevator;
  75.                             }
  76.                         } else {
  77.                             if ((elevator.floorDiff < candidate.floorDiff) && (elevator.loadFactor() < candidate.loadFactor()) && ((isElevatorGoingUp(elevator) == isGoingUp) || (isElevatorGoingDown(elevator) != isGoingUp)) && isFloorPickupableForElevator(elevator, floor.floorNum())) {
  78.                                 candidate = elevator;
  79.                             }
  80.                         }
  81.                     } else {
  82.                         candidate = elevator;
  83.                     }
  84.                 }
  85.             });
  86.             if (candidate) {
  87.                 queueDestinationForElevator(candidate, floor.floorNum());
  88.             } else {
  89.                 elevators.sort(function (a, b) {
  90.                     return (a.floorDiff < b.floorDiff) && (a.loadFactor() < b.loadFactor());
  91.                 });
  92.                 queueDestinationForElevator(elevators[0], floor.floorNum());
  93.             }
  94.         }
  95.  
  96.         elevators.forEach(function (elevator) {
  97.             elevator.on('floor_button_pressed', function (floorNum) {
  98.                 queueDestinationForElevator(elevator, floorNum);
  99.             });
  100.  
  101.             elevator.on('stopped_at_floor', function (floorNum) {
  102.                 elevator.destinationQueue.forEach(function (destination, index) {
  103.                     if (destination == floorNum) {
  104.                         elevator.destinationQueue.splice(index, 1);
  105.                     }
  106.                 });
  107.  
  108.             });
  109.         });
  110.  
  111.         floors.forEach(function (floor) {
  112.             floor.on('up_button_pressed', function () {
  113.                 scheduleElevatorForFloorButtonEvent(floor, true);
  114.             });
  115.             floor.on('down_button_pressed', function () {
  116.                 scheduleElevatorForFloorButtonEvent(floor, false);
  117.             });
  118.         });
  119.     },
  120.         update: function(dt, elevators, floors) {
  121.             // We normally don't need to do anything here
  122.         }
  123. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top