/*
* Copyright (c) 2012. HappyDroids LLC, All rights reserved.
*/
package com.happydroids.droidtowers.entities;
import com.badlogic.gdx.utils.Array;
import com.happydroids.droidtowers.controllers.AvatarSteeringManager;
import com.happydroids.droidtowers.entities.elevator.Passenger;
import java.util.Iterator;
import static com.happydroids.droidtowers.math.Direction.DOWN;
public class ElevatorQueue {
public static final int INVALID_FLOOR = -1;
private Array<Passenger> passengersWaiting;
private Array<Passenger> currentRiders;
private Array<Integer> floorNumbers;
private int currentFloor;
private int nextFloor;
public ElevatorQueue(Elevator elevator) {
passengersWaiting = new Array<Passenger>(5);
currentRiders = new Array<Passenger>(5);
currentFloor = INVALID_FLOOR;
nextFloor = INVALID_FLOOR;
floorNumbers = new Array<Integer>();
}
public void add(Passenger passenger) {
passengersWaiting.add(passenger);
}
public Array<Passenger> getPassengersWaiting() {
return passengersWaiting;
}
public boolean determinePickups() {
if (passengersWaiting.size == 0) {
return false;
}
Passenger firstPassenger = passengersWaiting.removeIndex(0);
currentRiders.clear();
currentRiders.add(firstPassenger);
Iterator<Passenger> iterator = passengersWaiting.iterator();
while (iterator.hasNext()) {
Passenger otherPassenger = iterator.next();
if (firstPassenger.travelContains(otherPassenger)) {
currentRiders.add(otherPassenger);
iterator.remove();
}
}
floorNumbers.clear();
for (Passenger passenger : currentRiders) {
floorNumbers.add(passenger.boardingFloor);
floorNumbers.add(passenger.destinationFloor);
}
floorNumbers.sort();
if (firstPassenger.travelDirection.equals(DOWN)) {
floorNumbers.reverse();
}
return true;
}
public boolean moveToNextStop() {
nextFloor = INVALID_FLOOR;
if (floorNumbers.size == 0) {
return false;
}
nextFloor = floorNumbers.removeIndex(0);
return true;
}
public int getCurrentFloor() {
return currentFloor;
}
public void arrivedAt(int nextFloor) {
currentFloor = nextFloor;
Iterator<Passenger> riderIterator = currentRiders.iterator();
while (riderIterator.hasNext()) {
Passenger rider = riderIterator.next();
if (!rider.isRiding() && rider.boardingFloor == currentFloor) {
rider.boardNow();
} else if (rider.isRiding() && rider.destinationFloor == currentFloor) {
rider.disembarkNow();
riderIterator.remove();
}
}
}
public boolean waitingOnRiders() {
for (Passenger currentRider : currentRiders) {
if (currentRider.shouldWaitFor()) {
return true;
}
}
return false;
}
public Array<Passenger> getCurrentRiders() {
return currentRiders;
}
public void removePassenger(AvatarSteeringManager avatarSteeringManager) {
Iterator<Passenger> ridersIterator = currentRiders.iterator();
while (ridersIterator.hasNext()) {
if (ridersIterator.next().getSteeringManager().equals(avatarSteeringManager)) {
ridersIterator.remove();
break;
}
}
ridersIterator = passengersWaiting.iterator();
while (ridersIterator.hasNext()) {
if (ridersIterator.next().getSteeringManager().equals(avatarSteeringManager)) {
ridersIterator.remove();
break;
}
}
}
public void clear() {
passengersWaiting.clear();
currentRiders.clear();
}
public void informPassengersOfServiceChange() {
for (Passenger passenger : passengersWaiting) {
passenger.informOfServiceChange();
}
for (Passenger currentRider : currentRiders) {
currentRider.informOfServiceChange();
}
floorNumbers.clear();
currentFloor = INVALID_FLOOR;
nextFloor = INVALID_FLOOR;
}
public int getNextFloor() {
return nextFloor;
}
}