/* Write by
* Ekkalak Leelasornchai 5830622421
* Burin Naowarat 5831034621
* Progmeth project
*/
package model;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.paint.Color;
import logic.GameLogic;
import logic.Scorebar;
public abstract class Station implements IDrawable,IPassengerDrawable{
protected double x,y;
//protected ArrayList<Passenger> passengers;
protected CopyOnWriteArrayList<Passenger> passengers;
protected CopyOnWriteArrayList<Passenger> tempPassengers;
protected boolean isCrowded;
protected double crowdedState;
protected Set<Color> lines;
public Station(double x, double y){
lines = new HashSet<>();
passengers = new CopyOnWriteArrayList<Passenger>();
tempPassengers = new CopyOnWriteArrayList<>();
this.setX(x);
this.setY(y);
crowdedState = 0.0;
isCrowded = false;
Thread t = new Thread(()->{ // thread for creating passenger
while(true){
try {
Thread.sleep(8000);
Random r = new Random();
if( r.nextInt(2) == 1 ){
for(int i=0;i< r.nextInt(2)+Scorebar.getInstance().getlevel();i++){
AddPassenger();
}
}
if(passengers.size()>9 ) GameLogic.isGameOver = true;//false;
else if( passengers.size() > 5 ){
isCrowded = true;
}
else{
crowdedState = 0.0;
isCrowded = false;
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
break;
}
}
});
ThreadHolder.instance.addThread(t);
t.start();
}
public void drawCrowded(GraphicsContext gc){
if(!isCrowded ) return;
gc.setGlobalAlpha(crowdedState);
gc.setFill(Color.BLACK);
gc.fillOval(getCenterX()-40, getCenterY()-40, 80, 80);
gc.setGlobalAlpha(1.0);
crowdedState = crowdedState >= 0.5 ? 0.05 : crowdedState + 0.05;
}
public synchronized Passenger dequeuePassengers(){
if(this.passengers.size() == 0)return null;
Passenger temp = this.passengers.get(0);
for(int i=this.passengers.size()-1;i>0;i--){
this.passengers.get(i).setX(this.passengers.get(i-1).getX());
this.passengers.get(i).setY(this.passengers.get(i-1).getY());
}
for(int i=0;i<this.passengers.size()-1;i++)
this.passengers.set(i, this.passengers.get(i+1));
this.passengers.remove(this.passengers.size()-1);
return temp;
}
public void draw_passengers(GraphicsContext gc) {
// TODO Auto-generated method stub
for(Passenger e: passengers){
e.draw(gc);
}
}
public synchronized int getNumberOfPassengers(){
return passengers.size();
}
public double getX() {
return x;
}
public abstract void AddPassenger();
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
public abstract double getCenterX();
public abstract double getCenterY();
public abstract String getType();
public void addLine(Color c){
//TODO rew rew
lines.add(c);
}
public void removeLine(Color l){
//TODO naja
lines.remove(l);
}
public synchronized boolean canGo(String type){
boolean canGo = false;
for(Color c : lines){
Line l = LineHolder.getInstance().getLine(c);
if(l != null){
canGo = canGo || l.canGo(type);
}
}
return canGo;
}
public boolean isClowded(){
return isCrowded;
}
public abstract void recievePeople(Passenger p);
public abstract void updateRecievePeople();
}