import simworldobjects.*;
import iad.*;

/**
* Models a simple world with a 'maze' of walls
*
* @author Graham Ritchie
*/
public class SimLabyrinthe extends BasicSimWorld
{
	/**
	* Creates the MazeWorld
	*/
	public SimLabyrinthe()
	{		
		// initialise the SimWorld size
		super(1000,1000,1000);
		
		// add maze walls
		double width = 800.0;
		double length = 600.0;		
		int x = 4;
		int y = 4;
		double dx = width/x;
		double dy = length/y;	
		
		//Nord
		SimWall wall1=new SimWall(100.0+width/2,0.0,50.0,0.0,width,10.0);
		addObject(wall1);
		
		//Sud
		SimWall wall2=new SimWall(100.0+width/2,0.0,50.0+length,0.0,width,10.0);
		addObject(wall2);
		
		//Est
		SimWall wall3=new SimWall(100.0+width,0.0,50.0+length/2,90.0,length,10.0);
		addObject(wall3);
		
		//Ouest
		SimWall wall4=new SimWall(100.0,0.0,50.0+length/2,90.0,length,10.0);
		addObject(wall4);
		
		//On génère un labyrinthe 4x4
		Kruskal kruskal = new Kruskal(x,y);
		Labyrinthe lab = kruskal.algorithme();	
		
		//Que l'on parcours ...(1)
		Cellule cel = lab.getCellule(0,0);
		int etat = cel.getEtat();
		if (etat == 0 || etat == 3 || etat == 12 ||etat == 15) {
			//Sud
			SimWall inner1 = new SimWall(100.0+dx/2,0.0,50.0+dy,0.0,dx,5.0);
			addObject(inner1);
			//Est
			SimWall inner2 = new SimWall(100.0+dx,0.0,50.0+dy/2,90.0,dy,5.0);
			addObject(inner2);
		}
		if (etat == 1 || etat == 13) {
			//Est
			SimWall inner2 = new SimWall(100.0+dx,0.0,50.0+dy/2,90.0,dy,5.0);
			addObject(inner2);
		}
		if (etat == 4 || etat == 7) {
			//Sud
			SimWall inner1 = new SimWall(100.0+dx/2,0.0,50.0+dy,0.0,dx,5.0);
			addObject(inner1);
		}
		//Que l'on parcours ...(2)
		cel = lab.getCellule(1,0);
		etat = cel.getEtat();
		if (etat == 0 || etat == 3 || etat == 12 ||etat == 15) {
			//Sud
			SimWall inner3 = new SimWall(100.0+3*dx/2,0.0,50.0+dy,0.0,dx,5.0);
			addObject(inner3);
			//Est
			SimWall inner4 = new SimWall(100.0+2*dx,0.0,50.0+dy/2,90.0,dy,5.0);
			addObject(inner4);
		}
		if (etat == 1 || etat == 13) {
			//Est
			SimWall inner4 = new SimWall(100.0+2*dx,0.0,50.0+dy/2,90.0,dy,5.0);
			addObject(inner4);
		}
		if (etat == 4 || etat == 7) {
			//Sud
			SimWall inner3 = new SimWall(100.0+3*dx/2,0.0,50.0+dy,0.0,dx,5.0);
			addObject(inner3);
		}
		//Que l'on parcours ...(3)
		cel = lab.getCellule(2,0);
		etat = cel.getEtat();
		if (etat == 0 || etat == 3 || etat == 12 ||etat == 15) {
			//Sud
			SimWall inner5 = new SimWall(100.0+5*dx/2,0.0,50.0+dy,0.0,dx,5.0);
			addObject(inner5);
			//Est
			SimWall inner6 = new SimWall(100.0+3*dx,0.0,50.0+dy/2,90.0,dy,5.0);
			addObject(inner6);
		}
		if (etat == 1 || etat == 13) {
			//Est
			SimWall inner6 = new SimWall(100.0+3*dx,0.0,50.0+dy/2,90.0,dy,5.0);
			addObject(inner6);
		}
		if (etat == 4 || etat == 7) {
			//Sud
			SimWall inner5 = new SimWall(100.0+5*dx/2,0.0,50.0+dy,0.0,dx,5.0);
			addObject(inner5);
		}
		//Que l'on parcours ...(4)
		cel = lab.getCellule(3,0);
		etat = cel.getEtat();
		if (etat == 0 || etat == 3 || etat == 12 ||etat == 15 || etat == 4 || etat == 7) {
			//Sud
			SimWall inner7 = new SimWall(100.0+7*dx/2,0.0,50.0+dy,0.0,dx,5.0);
			addObject(inner7);
		}
		
		//Que l'on parcours ...(5)
		cel = lab.getCellule(0,1);
		etat = cel.getEtat();
		if (etat == 0 || etat == 3 || etat == 12 ||etat == 15) {
			//Sud
			SimWall inner8 = new SimWall(100.0+dx/2,0.0,50.0+2*dy,0.0,dx,5.0);
			addObject(inner8);
			//Est
			SimWall inner9 = new SimWall(100.0+dx,0.0,50.0+3*dy/2,90.0,dy,5.0);
			addObject(inner9);
		}
		if (etat == 1 || etat == 13) {
			//Est
			SimWall inner9 = new SimWall(100.0+dx,0.0,50.0+3*dy/2,90.0,dy,5.0);
			addObject(inner9);
		}
		if (etat == 4 || etat == 7) {
			//Sud
			SimWall inner8 = new SimWall(100.0+dx/2,0.0,50.0+2*dy,0.0,dx,5.0);
			addObject(inner8);
		}
		//Que l'on parcours ...(6)
		cel = lab.getCellule(1,1);
		etat = cel.getEtat();
		if (etat == 0 || etat == 3 || etat == 12 ||etat == 15) {
			//Sud
			SimWall inner10 = new SimWall(100.0+3*dx/2,0.0,50.0+2*dy,0.0,dx,5.0);
			addObject(inner10);
			//Est
			SimWall inner11 = new SimWall(100.0+2*dx,0.0,50.0+3*dy/2,90.0,dy,5.0);
			addObject(inner11);
		}
		if (etat == 1 || etat == 13) {
			//Est
			SimWall inner11 = new SimWall(100.0+2*dx,0.0,50.0+3*dy/2,90.0,dy,5.0);
			addObject(inner11);
		}
		if (etat == 4 || etat == 7) {
			//Sud
			SimWall inner10 = new SimWall(100.0+3*dx/2,0.0,50.0+2*dy,0.0,dx,5.0);
			addObject(inner10);
		}
		//Que l'on parcours ...(7)
		cel = lab.getCellule(2,1);
		etat = cel.getEtat();
		if (etat == 0 || etat == 3 || etat == 12 ||etat == 15) {
			//Sud
			SimWall inner12 = new SimWall(100.0+5*dx/2,0.0,50.0+2*dy,0.0,dx,5.0);
			addObject(inner12);
			//Est
			SimWall inner13 = new SimWall(100.0+3*dx,0.0,50.0+3*dy/2,90.0,dy,5.0);
			addObject(inner13);
		}
		if (etat == 1 || etat == 13) {
			//Est
			SimWall inner13 = new SimWall(100.0+3*dx,0.0,50.0+3*dy/2,90.0,dy,5.0);
			addObject(inner13);
		}
		if (etat == 4 || etat == 7) {
			//Sud
			SimWall inner12 = new SimWall(100.0+5*dx/2,0.0,50.0+2*dy,0.0,dx,5.0);
			addObject(inner12);
		}
		//Que l'on parcours ...(8)
		cel = lab.getCellule(3,1);
		etat = cel.getEtat();
		if (etat == 0 || etat == 3 || etat == 12 ||etat == 15 || etat == 4 || etat == 7) {
			//Sud
			SimWall inner14 = new SimWall(100.0+7*dx/2,0.0,50.0+2*dy,0.0,dx,5.0);
			addObject(inner14);
		}
		
		//Que l'on parcours ...(9)
		cel = lab.getCellule(0,2);
		etat = cel.getEtat();
		if (etat == 0 || etat == 3 || etat == 12 ||etat == 15) {
			//Sud
			SimWall inner15 = new SimWall(100.0+dx/2,0.0,50.0+3*dy,0.0,dx,5.0);
			addObject(inner15);
			//Est
			SimWall inner16 = new SimWall(100.0+dx,0.0,50.0+5*dy/2,90.0,dy,5.0);
			addObject(inner16);
		}
		if (etat == 1 || etat == 13) {
			//Est
			SimWall inner16 = new SimWall(100.0+dx,0.0,50.0+5*dy/2,90.0,dy,5.0);
			addObject(inner16);
		}
		if (etat == 4 || etat == 7) {
			//Sud
			SimWall inner15 = new SimWall(100.0+dx/2,0.0,50.0+3*dy,0.0,dx,5.0);
			addObject(inner15);
		}
		//Que l'on parcours ...(10)
		cel = lab.getCellule(1,2);
		etat = cel.getEtat();
		if (etat == 0 || etat == 3 || etat == 12 ||etat == 15) {
			//Sud
			SimWall inner17 = new SimWall(100.0+3*dx/2,0.0,50.0+3*dy,0.0,dx,5.0);
			addObject(inner17);
			//Est
			SimWall inner18 = new SimWall(100.0+2*dx,0.0,50.0+5*dy/2,90.0,dy,5.0);
			addObject(inner18);
		}
		if (etat == 1 || etat == 13) {
			//Est
			SimWall inner18 = new SimWall(100.0+2*dx,0.0,50.0+5*dy/2,90.0,dy,5.0);
			addObject(inner18);
		}
		if (etat == 4 || etat == 7) {
			//Sud
			SimWall inner17 = new SimWall(100.0+3*dx/2,0.0,50.0+3*dy,0.0,dx,5.0);
			addObject(inner17);
		}
		//Que l'on parcours ...(11)
		cel = lab.getCellule(2,2);
		etat = cel.getEtat();
		if (etat == 0 || etat == 3 || etat == 12 ||etat == 15) {
			//Sud
			SimWall inner19 = new SimWall(100.0+5*dx/2,0.0,50.0+3*dy,0.0,dx,5.0);
			addObject(inner19);
			//Est
			SimWall inner20 = new SimWall(100.0+3*dx,0.0,50.0+5*dy/2,90.0,dy,5.0);
			addObject(inner20);
		}
		if (etat == 1 || etat == 13) {
			//Est
			SimWall inner20 = new SimWall(100.0+3*dx,0.0,50.0+5*dy/2,90.0,dy,5.0);
			addObject(inner20);
		}
		if (etat == 4 || etat == 7) {
			//Sud
			SimWall inner19 = new SimWall(100.0+5*dx/2,0.0,50.0+3*dy,0.0,dx,5.0);
			addObject(inner19);
		}
		//Que l'on parcours ...(12)
		cel = lab.getCellule(3,2);
		etat = cel.getEtat();
		if (etat == 0 || etat == 3 || etat == 12 ||etat == 15 || etat == 4 || etat == 7) {
			//Sud
			SimWall inner21 = new SimWall(100.0+7*dx/2,0.0,50.0+3*dy,0.0,dx,5.0);
			addObject(inner21);
		}
		
		//Que l'on parcours ...(13)
		cel = lab.getCellule(0,3);
		etat = cel.getEtat();
		if (etat == 0 || etat == 3 || etat == 12 ||etat == 15 || etat == 1 || etat == 13) {			
			//Est
			SimWall inner22 = new SimWall(100.0+dx,0.0,50.0+7*dy/2,90.0,dy,5.0);
			addObject(inner22);
		}
		//Que l'on parcours ...(14)
		cel = lab.getCellule(1,3);
		etat = cel.getEtat();
		if (etat == 0 || etat == 3 || etat == 12 ||etat == 15 || etat == 1 || etat == 13) {
			//Est
			SimWall inner23 = new SimWall(100.0+2*dx,0.0,50.0+7*dy/2,90.0,dy,5.0);
			addObject(inner23);
		}
		
		//Que l'on parcours ...(15)
		cel = lab.getCellule(2,3);
		etat = cel.getEtat();
		if (etat == 0 || etat == 3 || etat == 12 ||etat == 15 || etat == 1 || etat == 13) {
			//Est
			SimWall inner20 = new SimWall(100.0+3*dx,0.0,50.0+7*dy/2,90.0,dy,5.0);
			addObject(inner20);
		}
		SimLight exit = new SimLight(25, 100+width-dx/4,0.0,dy/2);
		addObject(exit);
	}
}
