import java.util.*;
import java.awt.*;

public class GenAleaExterieur{
	
	String strType=new String() ;
	Entite objet=new Entite();
	
	String ti=new String();
	String tiC=new String();
	
	
	
	public GenAleaExterieur(
		Monde monde,
		Catalog cat,
		Point oldInsertPt,
		int tailleGrille,
		boolean vertical,
		boolean sens,
		ArrayList[][] grille,
		Personnage perso
		){
		
		for(int rx=10;rx<tailleGrille-10;rx++){
			for(int ry=10;ry<tailleGrille-10;ry++){
				
        		if(!grille[rx][ry].isEmpty()){
					
	        		for(int i=0;i<grille[rx][ry].size();i++){
						
			 			try{
			 					
			 				objet = (Entite) grille[rx][ry].get(i);
		 					
		 					//String strType ;			
							strType = (objet.getClass().getName());
							
							if(strType.compareTo("Vide")==0){
								grille[rx][ry].remove(objet);
							}
							
						}
						catch(NoSuchElementException exc){};
					}
				}
			
			}
		}
		
		/////////////////////////////////////////
		
		/////////////HERBE///////////////////////////////////////////////////
		Surface h1=new Surface(true,"./images/surfaces/herbe.gif",1,false);
		Surface h2=new Surface(true,"./images/surfaces/herbesombre.gif",1,false);
		Surface h3=new Surface(true,"./images/surfaces/ground0.gif",1,false);
		
		for(int rx=10;rx<tailleGrille-10;rx++){
			for(int ry=10;ry<tailleGrille-10;ry++){
        		
 				int rndm=(int)((Math.random()*100)+1);	
 				if(rndm<50){grille[rx][ry].add(h1);}
 				if(rndm>=50 && rndm<75){grille[rx][ry].add(h2);}
 				if(rndm>=75){grille[rx][ry].add(h3);}
 						
			}
		}
		
		
		
		
		
		
		
				
		//if(perso.indexTerrainZ==0){
			
			for(int rx=10;rx<tailleGrille-10;rx++){
				for(int ry=10;ry<tailleGrille-10;ry++){
					
					
						////ORCS
	        		if(((int)(Math.abs(Math.random()*1000))+1)<=2){
	        			
	        			GoblinoidCategory gob=new GoblinoidCategory(monde,false,"gobelin","Un gobelin","A goblin",true,"Creature",true,"./images/creatures/goblinoid/orc2.gif","./images/creatures/corpse.gif","./sons/goblin.wav");
						gob.setCooX(rx);
						gob.setCooY(ry);
						
						cat.equiperCreatureArme(gob);
						cat.equiperCreatureArmure(gob);
						cat.equiperCreatureOutil(gob);
						
						
	        			grille[rx][ry].add(gob);
	        			
	        			
	        		}
	        		
	        		
	        		////SKEL
	        		else if(((int)(Math.abs(Math.random()*1000))+1)<=2){
	        			UndeadCategory skel=new UndeadCategory(monde,false,"lesser skeleton","Un squelette","A skeleton",true,"Creature",true,"./images/creatures/undead/funkysquelette.gif","./images/creatures/bones.gif","./sons/gravel.wav");
						skel.setCooX(rx);
						skel.setCooY(ry);
						
						//cat.equiperCreatureArme(skel);
						
	        			grille[rx][ry].add(skel);
	        		}
					
					
					if(rx!=54 && ry!=82){
					
		        		////ARBRES
		        		if(((int)(Math.abs(Math.random()*100))+1)>95){
		        			
		        			
		        			ti="t"+((int)(Math.abs(Math.random()*39))+6)+".gif";
	        				tiC="tallTreeCasse.gif";
		        			
		        			/*
		        			int roll=((int)(Math.abs(Math.random()*100))+1);
		        			if(roll<25){
		        				ti="tallTree.gif";
		        				tiC="tallTreeCasse.gif";
		        			}
		        			else if(roll>=25 && roll<50){
		        				ti="arbuste.gif";
		        				tiC="arbusteCasse.gif";
		        			}
		        			else if(roll>=50 && roll<75){
		        				ti="sapin.gif";
		        				tiC="sapinCasse.gif";
		        			}
		        			else{
		        				ti="arbremort.gif";
		        				tiC="arbremortCasse.gif";
		        			}*/
		        			
		        			
		        			grille[rx][ry].add(new Arbre(false,"mediumtree","Un arbre","A tree","Obstacle",true,"./images/vegetation/"+ti,"./images/vegetation/"+tiC));
		        		}
		        		
		        	
		        		
		        		////TOMBES
		        		else if(((int)(Math.abs(Math.random()*500))+1)==1){
		        			ti=new String();
		        			if(((int)(Math.abs(Math.random()*100))+1)<50){
		        				ti="pierretombale.gif";
		        			}
		        			else{ti="tombstone.gif";
		        			}
		        			grille[rx][ry].add(new Ecrit(false,"standardpierretombale","Une pierre tombale","A tombstone","Ecrit",true,"./images/ecrits/"+ti,"R.I.P","R.I.P"));
		        		}
		        		
		        		///STATUES
		        		else if(((int)(Math.abs(Math.random()*2000))+1)==1){
		        			ti=new String();
		        			if(((int)(Math.abs(Math.random()*100))+1)<50){
		        				ti="s2.gif";
		        			}
		        			else{ti="s2b.gif";
		        			}
		        			grille[rx][ry].add(new Wall(false,"statue","statue","statue","Obstacle",true,"./images/deco/"+ti,"./images/walls/rocks.gif"));
		        		}
		        		
		        		
		        		
		        	}	
	        	
	        	 }	
				
			}
			
			
			///////BATIMENT ALEATOIRE//////////////////////////////////////
			if(((int)(Math.abs(Math.random()*100))+1)>50){
				
				//on tire aléatoirement les dimensions tailleBatX et tailleBatY
				short tailleBatX=(short)((Math.random()*10)+5);
				short tailleBatY=(short)((Math.random()*10)+5);
				
				//on détermine le point haut-gauche
				
				//Math.random()*tailleGrille-11)+10
				
				
				short locBatX=(short)((Math.random()*(tailleGrille-11-tailleBatX))+10);// de 10 à 89 -tailleBatX
				short locBatY=(short)((Math.random()*(tailleGrille-11-tailleBatY))+10);
				
				
				if(locBatX+tailleBatX>=89){
					
					locBatX=(short)(locBatX-tailleBatX);
					
				}
				if(locBatY+tailleBatY>=89){
					
					locBatY=(short)(locBatY-tailleBatY);
					
				}
				
				if(locBatX+tailleBatX<=10){
					
					locBatX=(short)(locBatX+10);
					
				}
				if(locBatY+tailleBatY<=10){
					
					locBatY=(short)(locBatY+10);
					
				}
				
				
				if(locBatX+tailleBatX>89 || locBatX+tailleBatX<10 || locBatY+tailleBatY>89 || locBatY+tailleBatY<10){
					monde.message("*****ERREUR BATIMENT EN "+locBatX+" "+locBatY+" TAILLE "+tailleBatX+" "+tailleBatY,true);
				}
				
				
				try{
					new BatimentAlea(monde,locBatX,locBatY,tailleBatX,tailleBatY,cat);
				}
				catch (Exception ex) {
					ex.printStackTrace();
					
				}
				
				//message("BATIMENT EN "+locBatX+" "+locBatY+" TAILLE "+tailleBatX+" "+tailleBatY,true);
				
			}
			////////////////////////////////////////////////////////
			
			
		//}
		/////////////////////////////////////////////////////////////////////////
		
		
		
		
		//Placer aléatoirement un escalier descendant vers un donjon si voyage horizontal et en surface
	
		//if(!vertical && perso.indexTerrainZ==0){
		
		if(!vertical){			
			boolean escalierDown=false;
			for(int rx=10;rx<tailleGrille-10;rx++){
				for(int ry=10;ry<tailleGrille-10;ry++){
					
	        		if(!escalierDown && (int)((Math.random()*6400)+1)==1){
	        			
	        			new Foreuse(grille,"Arbre",rx,ry,0,0);
	        			new Foreuse(grille,"Wall",rx,ry,0,0);
	        			new Foreuse(grille,"Ecrit",rx,ry,0,0);
	        			
	        			//System.out.println("ESCALIER DONJON PLACE EN "+rx+" "+ry);
	        			grille[rx][ry].add(new Escalier(false,"standardstairDOWN","Entree d un donjon","A Dungeon","Escalier",true,"./images/escaliers/escalierdown.gif"));
		
	        			escalierDown=true;
	        		}
				}
			}
		}
		
		
		
		
	}
	
	
}