Created
January 25, 2015 02:24
-
-
Save kevin-brown/15371214aae59dc8ab23 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
init: function(elevators, floors) { | |
function randomElevator(elevators) { | |
return elevators[Math.floor(Math.random() * elevators.length)]; | |
}; | |
function bestElevator(floorNum) { | |
var bestElevator = elevators[0]; | |
var emptyElevators = []; | |
for (var e = 0; e < elevators.length; e++) { | |
var elevator = elevators[e]; | |
if (elevator.loadFactor() === 0) { | |
emptyElevators.push(elevator); | |
} | |
} | |
if (emptyElevators.length !== 0) { | |
return randomElevator(emptyElevators); | |
} | |
var nonEmptyElevators = []; | |
for (var e = 0; e < elevators.length; e++) { | |
var elevator = elevators[e]; | |
if (elevator.loadFactor() !== 1) { | |
nonEmptyElevators.push(elevator); | |
} | |
} | |
if (nonEmptyElevators.length === 0) { | |
return randomElevator(elevators); | |
} | |
bestElevator = nonEmptyElevators[0]; | |
var onRouteElevators = []; | |
for (var e = 0; e < nonEmptyElevators.length; e++) { | |
var elevator = nonEmptyElevators[e]; | |
if (elevator.goingUp) { | |
if (elevator.currentFloor() < floorNum) { | |
onRouteElevators.push(elevator); | |
} | |
} else { | |
if (elevator.currentFloor() > floorNum) { | |
onRouteElevators.push(elevator); | |
} | |
} | |
} | |
if (onRouteElevators.length === 0) { | |
onRouteElevators = nonEmptyElevators; | |
} | |
bestElevator = onRouteElevators[0]; | |
for (var e = 0; e < onRouteElevators.length; e++) { | |
var elevator = onRouteElevators[e]; | |
if (bestElevator.loadFactor() > elevator.loadFactor()) { | |
bestElevator = elevator; | |
} | |
} | |
return bestElevator; | |
} | |
function elevatorToFloor(elevator, floorNum) { | |
if (elevator.goingUp) { | |
if (elevator.currentFloor() > floorNum) { | |
elevatorDown(elevator, floorNum); | |
} else { | |
elevatorUp(elevator, floorNum); | |
} | |
} else { | |
if (elevator.currentFloor() < floorNum) { | |
elevatorUp(elevator, floorNum); | |
} else { | |
elevatorDown(elevator, floorNum); | |
} | |
} | |
refreshElevatorQueue(elevator); | |
} | |
function elevatorDown(elevator, floorNum) { | |
if (elevator.downQueue.indexOf(floorNum) !== -1) { | |
return; | |
} | |
elevator.downQueue.push(floorNum); | |
elevator.downQueue.sort().reverse(); | |
} | |
function elevatorUp(elevator, floorNum) { | |
if (elevator.upQueue.indexOf(floorNum) !== -1) { | |
return; | |
} | |
elevator.upQueue.push(floorNum); | |
elevator.upQueue.sort(); | |
} | |
function elevatorRemoveFloor(elevator, floorNum) { | |
if (elevator.upQueue.indexOf(floorNum) !== -1) { | |
elevator.upQueue.splice(elevator.upQueue.indexOf(floorNum), 1); | |
} | |
if (elevator.downQueue.indexOf(floorNum) !== -1) { | |
elevator.downQueue.splice(elevator.downQueue.indexOf(floorNum), 1); | |
} | |
} | |
function refreshElevatorQueue (elevator) { | |
if (elevator.goingUp) { | |
elevator.destinationQueue = elevator.upQueue; | |
} else { | |
elevator.destinationQueue = elevator.downQueue; | |
} | |
elevator.checkDestinationQueue(); | |
} | |
function elevatorButtonPressed(elevator) { | |
return function (floorNum) { | |
elevatorToFloor(elevator, floorNum); | |
}; | |
} | |
function elevatorStopped(elevator) { | |
return function (floorNum) { | |
elevatorRemoveFloor(elevator, floorNum); | |
}; | |
} | |
function elevatorIdle(elevator) { | |
return function () { | |
elevator.goingUp = !elevator.goingUp; | |
var homeFloor = Math.floor(floors.length / 2); | |
if (elevator.goingUp) { | |
if (elevator.currentFloor() < homeFloor) { | |
elevatorToFloor(elevator, homeFloor); | |
} else { | |
elevatorToFloor(elevator, floors.length - 1); | |
} | |
} else { | |
if (elevator.currentFloor() > homeFloor) { | |
elevatorToFloor(elevator, homeFloor); | |
} else { | |
elevatorToFloor(elevator, 0); | |
} | |
} | |
}; | |
} | |
for (var e = 0; e < elevators.length; e++) { | |
var elevator = elevators[e]; | |
elevator.goingUp = true; | |
elevator.upQueue = []; | |
elevator.downQueue = []; | |
elevator.on("floor_button_pressed", elevatorButtonPressed(elevator)); | |
elevator.on("stopped_at_floor", elevatorStopped(elevator)); | |
elevator.on("idle", elevatorIdle(elevator)); | |
} | |
function handleFloorUp (floor) { | |
return function () { | |
var elevator = bestElevator(floor.floorNum()); | |
elevatorToFloor(elevator, floor.floorNum()); | |
} | |
} | |
function handleFloorDown (floor) { | |
return function () { | |
var elevator = bestElevator(floor.floorNum()); | |
elevatorToFloor(elevator, floor.floorNum()); | |
} | |
} | |
for (var f = 0; f < floors.length; f++) { | |
var floor = floors[f]; | |
floor.on("up_button_pressed", handleFloorUp(floor)); | |
floor.on("down_button_pressed", handleFloorDown(floor)); | |
} | |
}, | |
update: function(dt, elevators, floors) { | |
// We normally don't need to do anything here | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment