Hajj-simulation/src/Vehicle.java

173 lines
4.9 KiB
Java

import java.util.Date;
import java.util.HashMap;
public abstract class Vehicle {
private double vehicleSize;
private Route route;
private Street currentStreet;
private double currentLocation;
private double totalDistanceTraveled;
private boolean arrivedToDest;
private boolean moving;
private Date timeStartedMoving;
private Date timeOfArrival;
private Date timeStartedOnCurrentStreet;
//Map Street to Minutes
private HashMap<Street, Integer> routeTimeHistory = new HashMap<>();
public abstract int getMaxSpeed();
public Vehicle(double vehicleSize){
setVehicleSize(vehicleSize);
}
public double getVehicleSize() {
return vehicleSize;
}
public Route getRoute() {
return route;
}
public void arrive() {
setArrivedToDest(true);
setMoving(false);
setTimeOfArrival(MakkahCity.getTimeMan().getCurrentTime());
getCurrentStreet().getVehicles().remove(this);
this.currentLocation = 0;
}
public void move(double distance) {
if (!isMoving()) {
setMoving(true);
setTimeStartedMoving(MakkahCity.getTimeMan().getCurrentTime());
}
setCurrentLocation(getCurrentLocation() + distance);
setTotalDistanceTraveled(getTotalDistanceTraveled() + distance);
}
public void setRoute(Route route) {
this.route = route;
this.arrivedToDest = false;
this.routeTimeHistory.clear();
}
private void setVehicleSize(double vehicleSize) {
if (vehicleSize <= 0) throw new IllegalArgumentException("Vehicle can not be negative in length!");
else this.vehicleSize = vehicleSize;
}
public Street getCurrentStreet() {
return currentStreet;
}
public double getCurrentLocation() {
return currentLocation;
}
/**
* @return Distance in meters to next car on same street. -1 if Can not calculate.
*/
public double getDistanceToNextVehicle() {
if (getCurrentStreet() != null) {
int indexOfNxt = getCurrentStreet().getVehicles().indexOf(this) - 1; //next
//Index may be out of bound if this car is the only or first (end if street)
try {
Vehicle nextVehicle = getCurrentStreet().getVehicles().get(indexOfNxt);
return nextVehicle.getCurrentLocation() - this.getCurrentLocation();
}
catch (IndexOutOfBoundsException e) {return -1;}
}
return -1;//open or unlimited
}
public void setCurrentStreet(Street currentStreet) {
if (this.currentStreet != null) {
this.currentStreet.getVehicles().remove(this);
}
this.currentStreet = currentStreet;
if (this.currentStreet != null)
this.currentStreet.addVehicle(this);
this.timeStartedOnCurrentStreet = MakkahCity.getTimeMan().getCurrentTime();
}
public void setCurrentLocation(double currentLocation) {
this.currentLocation = currentLocation;
}
public double getTotalDistanceTraveled() {
return totalDistanceTraveled;
}
public void setTotalDistanceTraveled(double totalDistanceTraveled) {
this.totalDistanceTraveled = totalDistanceTraveled;
}
public boolean isArrivedToDest() {
return arrivedToDest;
}
public void setArrivedToDest(boolean arrivedToDest) {
this.arrivedToDest = arrivedToDest;
}
public boolean isMoving() {
return moving;
}
public void setMoving(boolean moving) {
this.moving = moving;
}
public Date getTimeStartedMoving() {
return timeStartedMoving;
}
public void setTimeStartedMoving(Date timeStartedMoving) {
this.timeStartedMoving = timeStartedMoving;
}
public Date getTimeOfArrival() {
return timeOfArrival;
}
public void setTimeOfArrival(Date timeOfArrival) {
this.timeOfArrival = timeOfArrival;
}
public void moveToNextStreet() {
this.routeTimeHistory.put(this.currentStreet,
(int) (MakkahCity.getTimeMan().getCurrentTime().getTime() - timeStartedOnCurrentStreet.getTime())/60000);
int nxtIndex = route.indexOf(this.getCurrentStreet()) + 1;
if (nxtIndex <= route.getStreets().length - 1) {
if (this.getRoute().getStreets()[nxtIndex].capcityPoint(0, 1000) < 1) {
this.setCurrentStreet(route.getStreets()[nxtIndex]);
this.setCurrentLocation(0);
}
}
else
this.arrive();
}
/**
* Get value in minutes of time spent travling on street. If did not, return 0.
* @param street
* @return Time in minutes
*/
public int getTimeOnStreet(Street street) {
if (routeTimeHistory.containsKey(street)) {
return routeTimeHistory.get(street);
}
return 0;
}
public boolean hasCrossedStreet(Street street) {
return routeTimeHistory.containsKey(street);
}
}