| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 | 
							- {
 - 	init: function(elevators, floors) {
 - 		console.clear();
 - 		console.log("Starting...");
 - 
 - 		// Get elevator/building info
 - 		let floorCount    = floors.length;
 - 		let bottomFloor   = 0;
 - 		let topFloor      = floorCount - 1;
 - 		let elevatorCount = elevators.length;
 - 
 - 		// Direction/status constants
 - 		const UP   = 0;
 - 		const DOWN = 1;
 - 		const IDLE = 2;
 - 
 - 		// Create a data structure for floor requests
 - 		let requests = [new Set(), new Set()];
 - 
 - 		// Register floor button presses
 - 		floors.forEach(function (floor) {
 - 			floor.on("up_button_pressed", function() { requests[UP].add(floor.floorNum); });
 - 			floor.on("down_button_pressed", function() { requests[DOWN].add(floor.floorNum); });
 - 		});
 - 
 - 
 - 		// ----
 - 		// Functions
 - 		// ----
 - 
 - 		function getClosestFloor(currentFloor, floorList){
 - 			let distance = floorCount;
 - 			let closestFloor = currentFloor;
 - 			floorList.forEach(function(floorNum) {
 - 				let newDistance = Math.abs(currentFloor - floorNum);
 - 				if (newDistance < distance) {
 - 					closestFloor = floorNum;
 - 					distance = newDistance;
 - 				}
 - 			})
 - 			return closestFloor;
 - 		}
 - 
 - 		// ----
 - 		// Individual elevators
 - 		// ----
 - 
 - 		elevators.forEach(function (elevator) {
 - 		elevator.on("floor_button_pressed", function(floorNum) { destinations.add(floorNum); });
 - 
 - 		// Basic elevator info
 - 		const elevatorIndex = elevators.indexOf(elevator);
 - 			const restFloors = [
 - 				(elevatorIndex + 0) * Math.floor(floorCount / (elevatorCount + 1)),
 - 				(elevatorIndex + 1) * Math.floor(floorCount / (elevatorCount + 1)),
 - 				(elevatorIndex + 2) * Math.floor(floorCount / (elevatorCount + 1))
 - 			]
 - 
 - 			// Elevator variables
 - 			let status = UP;
 - 			let destinations = new Set();
 - 
 - 			// Go to designated starting floor
 - 			console.log("Sending elevator[" + elevatorIndex + "] to floor[" + restFloors[0] + "]")
 - 			elevator.goToFloor(restFloors[0]);
 - 
 - 			elevator.on("idle", function() {
 - 				status = IDLE;
 - 				if (requests[UP].size == 0 && requests[DOWN].size == 0 && destinations.size == 0) {
 - 					elevator.goToFloor(restFloors[1]);
 - 				} else {
 - 					let allStops = new Set([...destinations, ...requests[UP], ...requests[DOWN]]);
 - 					elevator.goToFloor(getClosestFloor(elevator.currentFloor(), allStops));
 - 				}
 - 			});
 - 
 - 			elevator.on("passing_floor", function(floorNum, direction) {
 - 				if(requests[UP].has(floorNum) || requests[DOWN].has(floorNum) || destinations.has(floorNum)) {
 - 					elevator.goToFloor(floorNum, true);
 - 				}
 - 			});
 - 
 - 			elevator.on("stopped_at_floor", function(floorNum) {
 - 				requests[UP].delete(floorNum);
 - 				requests[DOWN].delete(floorNum);
 - 				destinations.delete(floorNum);
 - 
 - 				if (destinations.size > 0 || requests[UP] > 0 || requests[DOWN] > 0) {
 - 					let allStops = new Set([...destinations, ...requests[UP], ...requests[DOWN]]);
 - 					elevator.goToFloor(getClosestFloor(elevator.currentFloor(), allStops));
 - 				}
 - 			});
 - 		});
 - 	},
 - 
 - 	update: function(dt, elevators, floors) {}
 - }
 
 
  |