package route;
import game_timer.GameTimer;
import game_timer.TimerNotify;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Map;
import _main.Game;
import logger.Logger;
import misc.carType;
import vehicles.OrdinaryCar;
import vehicles.RobberyCar;
import vehicles.Vehicle;
import cross.Cross;
/**
* Az utat reprezent�l� oszt�ly. Ir�ny�tottak, egyir�ny�ak, keresztez�d�st�l keresztez�d�sig tart.
* � felel�s a rajta halad� aut�k megfelel� mozgat�s��rt �s a rajta t�rt�nt esetleges �tk�z�s felismer�s��rt.
* A Map oszt�ly hozza l�tre �t.
*
*/
public class Route implements TimerNotify {
private Map m;
private Cross startCross;
private Cross endCross;
private int length;
private ArrayList<Vehicle> vehicles = new ArrayList<Vehicle>();
//FOR THE TEST
private InputStreamReader converter = new InputStreamReader(System.in);
private BufferedReader in = new BufferedReader(converter);
//TEST SESSION END
/**
* Az �t konstrukora.
*/
public Route(){
Logger.get().addOrdinaryMessage("[Route.Constructor]: Called!");
Logger.get().addOrdinaryMessage("[Route.Constructor]: registering to observer...");
Logger.get().addMethodCall("\t", "GameTimer", "registObserver");
GameTimer.getInstance().registObserver(this);
Logger.get().addMethodReturn("\t", "GameTimer", "registObserver");
}
/**
* V�gign�zi, milyen aut�k vannak az �ton, �s a megfelel� m�don l�pteti �ket,
* aut�k positionj�t, �s currentSpeedj�t �ll�tjuk.
* K�zben megk�rdezi, hogy a k�t aut� utol�rte-e egym�st,
* �s ennek tudat�ban h�vja meg a megfelel� met�dusokat.
*
* A k�rd�sn�l csak "i" vagy "n" bemenetet fogad el, m�s bemenet eset�n �jb�l k�rdez.
*/
public void moveCars() {
try {
Logger.get().addMethodCall("", "Route", "moveCars");
vehicles.get(0).getPosition();
vehicles.get(1).getPosition();
vehicles.get(0).getCurrentSpeed();
int firstCurSpeed = vehicles.get(1).getCurrentSpeed();
Logger.get().addOrdinaryMessage("-------Szeretne, hogy a ket auto utolerje egymast? (i/n)");
//goForward: tovabb mehet-e vagy sem; isGainUpon: utolerte-e vagy sem;
boolean goForward = false;
boolean isGainUpon = false;
while(!goForward){
String input = in.readLine();
if(input.equals("i")){
isGainUpon = true;
goForward = true;
} else if(input.equals("n")){
isGainUpon = false;
goForward = true;
} else {
System.out.println("Ez nem opcio...");
}
}
if(isGainUpon){
Logger.get().addOrdinaryMessage("[Route.moveCars()] [A gyorsabb auto utolerte a lasabbat! Uj sebesseg beallitasa!]");
vehicles.get(0).setCurrentSpeed(firstCurSpeed);
} else {
Logger.get().addOrdinaryMessage("[Route.moveCars()] [Senki nem ert senkit utol, leptetjuk oket a sebesseguknek megfeleloen!]");
}
Logger.get().addOrdinaryMessage("[Route.moveCars()] [v1 leptetese]");
vehicles.get(0).setPosition(0);
Logger.get().addOrdinaryMessage("[Route.moveCars()] [v2 leptetese]");
vehicles.get(1).setPosition(0);
} catch (IOException e) {
e.printStackTrace();
}
Logger.get().addMethodReturn("", "Route", "moveCars");
}
/**
* v�gign�zi az �ton tal�lhat� Vehicle-�ket,
* hogy �tk�ztek-e, mivel � l�pteti �ket.
*
* A program megk�rdezi a felhaszn�l�t�l, hogy szeretn�-e, hogy legyen �tk�z�s, �s
* ezalapj�n alakul majd ez a teszteset.
*
* A k�rd�sn�l csak "i" vagy "n" bemenetet fogad el, m�s bemenet eset�n �jb�l k�rdez.
*/
public void collisionDetect() {
try {
boolean goForward = false; //for testing...
boolean isCollisionDetected = true;//
RobberyCar rcar;//storing the robbery car...
Logger.get().addMethodCall("", "Route", "collisionDetect");
//getting the robbery car's position
Logger.get().addOrdinaryMessage("[Route.collisionDetect()] Lekerjuk a rablo poziciojat...");
for(Vehicle v : vehicles){
if(v.getCarType() == carType.Robbery){
rcar = (RobberyCar) v;
rcar.getPosition();
}
}
Logger.get().addOrdinaryMessage("[Route.collisionDetect()] Egy iteracioban lekerjuk az uton levo osszes tobbi kocsi poziciojat...");
Logger.get().addOrdinaryMessage("Szeretned, h legyen utkozes?(i/n)");
while(!goForward){
String input;
input = in.readLine();
if(input.equals("i")){
isCollisionDetected = true;
goForward = true;
Logger.get().addOrdinaryMessage("[A valasztott opcio: IGEN, van utkozes!]");
} else if(input.equals("n")){
isCollisionDetected = false;
goForward = true;
Logger.get().addOrdinaryMessage("[A valasztott opcio: NEM, nincs utkozes!]");
} else {
System.out.println("Ez nem opcio...");
}
}
if(isCollisionDetected){
Game.getInstance().finishGame();
} else {
Logger.get().addOrdinaryMessage("[Ha nincs utkozes, akkor leptetjuk az autokat stb... ezt ezen a szekvencian mar nem reszleteztuk!]");
}
Logger.get().addMethodReturn("", "Route", "collisionDetect");
} catch (IOException e) {
System.out.println("IOException van geco... :(");
}
}
/**
* a Cross ezt h�vja meg, ha egy aut�t beh�v a keresztez�d�sbe: leszedi az �tr�l az aut�t, majd visszat�r a leszedett aut� �rt�k�vel
*/
public Vehicle getAndRemoveLastCar() {
Logger.get().addOrdinaryMessage("[Route.getAndRemoveLastCar]: called!");
Logger.get().addOrdinaryMessage("[Route.getAndRemoveLastCar]: Az atlekesre varakozo auto atadasa a keresztezodesnek!");
return vehicles.get(0);
}
/**
* Aut�t tesz az �tra
* @param v aut�
*/
public void addVehicle(Vehicle v) {
//add the vehicle to the arraylist
vehicles.add(v);
//and the logging..
Logger.get().addMethodCall("", "Route", "addVehicle");
v.setPosition(0);
v.setRoute(this);
v.setCross(endCross);
Logger.get().addMethodReturn("", "Route", "addVehicle");
}
/**
* onTick: a GameTimer megh�vja a megfelel� f�ggv�nyeket adott id�k�z�nk�nt
*/
public void onTick() {
Logger.get().addOrdinaryMessage("[Route.onTick]: Called!");
}
/**
* Az �thoz adhat� meg olyan keresztez�d�s, amely az �t elej�n tal�lhat�
* @param c keresztez�d�s.
*/
public void addStartCross(Cross c) {
Logger.get().addOrdinaryMessage("[Route.addStartCross]: called!");
c.addOutRoutes(this);
}
/**
* Az �thoz adhat� meg olyan keresztez�d�s, amely az �t v�g�n tal�lhat�
* @param c keresztez�d�s.
*/
public void addEndCross(Cross c) {
Logger.get().addOrdinaryMessage("[Route.addEndCross]: called!");
c.addInRoutes(this);
}
/**
* Visszaadja az �ton tal�lhat� els� aut�t
* @return aut�
*/
public Vehicle test_getACar(){
return vehicles.get(0);
}
}