Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.95 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement