package cross;
import game_timer.TimerNotify;
import java.util.ArrayList;
import java.util.List;
import map.Map;
import misc.carType;
import route.Route;
import vehicles.Vehicle;
import _main.Game;
/**
* Cross oszt�ly:
*Ez egy olyan absztrakt keresztez�d�s oszt�ly,
*amib�l �r�k�lnek m�s oszt�lyok (Bank, StopCross, stb.).
*Kezeli a keresztez�d�sben l�v� bemen� �s kimen� utakat, a
*rajtuk l�v� j�rm�veket. Egyszerre csak egy j�rm� lehet a keresztez�d�sben.
*Az oszt�ly implement�lja a TimerNotify interface-t.
*/
public abstract class Cross implements TimerNotify {
protected Map m;
protected ArrayList<Route> inroutes = new ArrayList<Route>();
protected ArrayList<Route> outroutes = new ArrayList<Route>();
protected ArrayList<Vehicle> vehiclesAtCross = new ArrayList<Vehicle>();
protected Vehicle vehicleInCross = null;
/**
* Friss�ti a vehiclesAtCross-t a keresztez�d�s bemen� �tjain tal�lhat� aut�kr�l
*/
public void updateVehiclesAtCross() {
//az ososztalybeli update vehicle at cross ertelmetlen, ugyis sajat szabalyok szerint fog mukodni
throw new UnsupportedOperationException();
}
/**
* �tk�z�s figyel�se; ha vannak a keresztez�d�sben �s j�n a bankrabl� befel�,
* akinek nagyobb a sebess�ge 0-n�l, akkor �tk�z�s lesz
*/
public void collisionDetect() {
//TODO: [PROG] ez igy baromsag
if(vehicleInCross != null){
Game.getInstance().finishGame();
}
}
/**
*
* a keresztez�d�sben l�v� aut�t kil�pteti
*/
public void vehicleOut() {
try{
if(vehicleInCross != null){
ArrayList<Route> al_selectableRoutes = new ArrayList<Route>();
if(vehicleInCross.getCarType() == carType.Robbery){
for(Route r : inroutes){
//if(r != fromRoute)
al_selectableRoutes.add(r);
}
for(Route r : outroutes){
//if(r != fromRoute)
al_selectableRoutes.add(r);
}
Route selectedOutRoute = vehicleInCross.selectRoute(al_selectableRoutes);
selectedOutRoute.addVehicle(vehicleInCross);
} else {
Route selectedOutRoute = vehicleInCross.selectRoute(outroutes);
selectedOutRoute.addVehicle(vehicleInCross);
}
vehicleInCross = null;
}
} catch(Exception e){
e.printStackTrace();
}
}
/**
*
* egy �tr�l bel�ptet egy j�rm�t a keresztez�d�sbe (a megadott szab�lyok alapj�n,
* mely a keresztez�d�s t�pus�t�l f�gg
*/
public void stepIntoCross(Route r) {
if(r != null){
Vehicle car = r.getAndRemoveLastCar();
if(vehicleInCross == null){
vehicleInCross = car;
} else {
if(vehicleInCross.getCarType() == carType.Robbery){
//ha nem ures a cross(a bankrablo van benne)
Game.getInstance().finishGame();
} else{
//ket masfajta auto utkozott - nem teszt esetek ez nem lehetseges, mivel utkozeselkerulok.
//dobjuk el azt az autot, amelyik jott.
car = null;
}
}
}
}
/**
*
* az id�l�ptet� f�ggv�ny; megh�vja a megfelel� f�ggv�nyeket adott id�k�z�nk�nt
*/
public void onTick() {
throw new UnsupportedOperationException();
}
/**
* az inroutes t�mbh�z hozz�ad egy bemen� utat
* @param r bemen� �t hozz�ad�sa
*/
public void addInRoutes(Route r) {
inroutes.add(r);
}
/**
* az outroutes t�mbh�z hozz�ad egy bemen� utat
* @param r kimen� �t hozz�ad�sa
*/
public void addOutRoutes(Route r) {
outroutes.add(r);
}
/**
* Aut�t tesz a keresztez�d�sbe(ami a robbery lesz) es egybol ki is lepteti
* @param v a keresztez�d�sbe teend� aut�
*/
public void addVehicleToCross(Vehicle v) {
if(vehicleInCross == null){
vehicleInCross = v;
vehicleOut();
}
else {
System.out.println("A keresztezodesben mar van auto, igy nem sikerult azt betenni!");
}
}
public Vehicle getVehicleFromCross(){
return vehicleInCross;
}
public List<Route> getInRoutes(){
return inroutes;
}
public List<Route> getOutRoutes(){
return outroutes;
}
}