<commit_before>package controle;

import individu.Element;
import interfaceGraphique.VueElement;

import java.awt.Point;
import java.rmi.Naming;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Random;

import serveur.Arene;
import serveur.IArene;
import utilitaires.UtilitaireConsole;

/**
 * 
 * Se connecte au serveur avec un Element et sa VueElement.
 * "run" permet a l'Element/VueElement de se deplacer
 *
 */
public class Console extends UnicastRemoteObject implements IConsole {
	
	private static final long serialVersionUID = 1L;
	private static final int port=5099;	              //port par defaut pour communiquer avec le serveur RMI
	private Remote serveur = null;                    //le serveur avec lequel le controleur communique
	private VueElement ve = null;                     //la vue de l'element (pour l'interface graphique)
	private Element elem = null;                      //l'element pour lequel le controleur est cree
	private Hashtable<Integer,VueElement> voisins;    //les vues des voisins sur l'interface graphique
	private Point pointErrance;                       //le point ou aller errer
	private int refRMI;                               //la reference (entiere) attribuee par le serveur a la connexion
	
	
	/**
	 * Constructeur
	 * @param elem l'element pour lequel le controleur est cree
	 * @param dx la position initiale de l'element sur l'ordonnee (interface graphique)
	 * @param dy la position initiale de l'element sur l'abscisse (interface graphique)
	 * @throws RemoteException
	 */
	public Console(Element elem, int dx, int dy) throws RemoteException {
		 //appel au constructeur de la super-classe -> il peut etre implicite
		super();
		try{
			//initialisation de l'element pour lequel le controleur est cree
			this.elem=elem;
			
			//position initiale aleatoire
			//Random r=new Random();
			//Point pos = new Point(r.nextInt(100),r.nextInt(100));
			
			//Creation de la position initiale de la vue de l'element sur l'interface graphique
			Point pos = new Point(dx,dy);
			
			//initialisation des voisins (vide avant la connexion)
			voisins = new Hashtable<Integer,VueElement>();
			
			//preparation connexion au serveur
			//handshake/enregistrement RMI
			serveur=Naming.lookup("rmi://localhost:"+port+"/Arene");
			serveur.toString();
			
			//initialisation de la reference du controleur sur le serveur
			this.refRMI=((IArene) serveur).allocateRef();
			Naming.rebind("rmi://localhost:"+port+"/Console"+refRMI,this);
			
			//initialisation de la vue sur l'element
			ve=new VueElement(refRMI, pos, this, "Atterrissage...", elem);
						
			//connexion au serveur
			((IArene) serveur).connect(ve);
			
			//affiche message si succes
			System.out.println("Console connectee ["+refRMI+"]");
 		} catch (Exception e) {
  			System.out.println("Erreur : la console n'a pa pu etre creee !\nCause : "+e.getCause());
  			e.printStackTrace();
 		}
	}


	/**
	 * Permet au serveur de faire "jouer" un tour a l'element.
	 * Calcule ses voisins (donnes par le serveur), cherche le plus proche, s'il est a proximite, lance l'interaction sinon se dirige vers lui (s'il existe un plus proche)
	 * Cette methode est execute chaque seconde  
	 */
	public void run() throws RemoteException {
		//decremente sa duree de vie
		ve.decrTTL(); 
			
		//mets a jour ses voisins 
		voisins = ((IArene) serveur).voisins(ve.getPoint(),refRMI);	
			
		//Hashtable<Integer,VueElement> voisinsInconnus = extraireInconnus(voisins);
		
		// Recherche du plus proche, sinon errer
			
		HashMap<Integer, HashMap<Integer,VueElement>> resultat = Strategie.chercherPersonnageProche(ve, voisins);
		int distPlusProche = resultat.keySet().iterator().next();
		int refPlusProche =  resultat.get(distPlusProche).keySet().iterator().next();
		//VueElement cible = resultat.get(distPlusProche).get(refPlusProche);
			
		//si le plus proche est a proximite
		if (distPlusProche<=1) { 
			//jeu
			parler("Je joue avec "+refPlusProche);
			((IArene) serveur).interaction(refRMI, refPlusProche);
	
		}
		//sinon
		else { 
			if (refPlusProche!=0) {
				parler("Je me dirige vers "+refPlusProche);
			}
			else parler("J'erre..."); 
			
			//l'element courant se deplace vers le plus proche (s'il existe) sinon il erre
			seDirigerVers(refPlusProche);	
		}
	}
	
	/**
	 * Deplace ce sujet d'une case en direction du sujet dont la reference est donnee en parametre
	 * @param ref la reference de l'element cible
	 */
	public void seDirigerVers(int ref) {
		Point pvers;
		
		//si la cible est l'element meme, il reste sur place
		if (ref==ve.getRef()) return;

		//s'il n'y a pas de reference la plus proche
		if (ref==0) {
			//si le point ou l'element se trouve est le point d'errance precedemment defini
			if ((pointErrance!=null) && (pointErrance.equals(ve.getPoint()))) { 
				//le point d'errance est reinitialise
				pointErrance=null;
			}
			if (pointErrance==null) {
				//initialisation aleatoire
				Random r=new Random();
				pointErrance=new Point(r.nextInt(Arene.tailleAreneX), r.nextInt(Arene.tailleAreneY));
			}
			//la cible devient le nouveau point d'errance
			pvers=pointErrance;
		} <commit_msg>Implémentation du ramassage des opjets dans la console des personnages<commit_after>package controle;

import individu.Element;
import interfaceGraphique.VueElement;

import java.awt.Point;
import java.rmi.Naming;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Random;

import serveur.Arene;
import serveur.IArene;
import utilitaires.UtilitaireConsole;

/**
 * 
 * Se connecte au serveur avec un Element et sa VueElement.
 * "run" permet a l'Element/VueElement de se deplacer
 *
 */
public class Console extends UnicastRemoteObject implements IConsole {
	
	private static final long serialVersionUID = 1L;
	private static final int port=5099;	              //port par defaut pour communiquer avec le serveur RMI
	private Remote serveur = null;                    //le serveur avec lequel le controleur communique
	private VueElement ve = null;                     //la vue de l'element (pour l'interface graphique)
	private Element elem = null;                      //l'element pour lequel le controleur est cree
	private Hashtable<Integer,VueElement> voisins;    //les vues des voisins sur l'interface graphique
	private Point pointErrance;                       //le point ou aller errer
	private int refRMI;                               //la reference (entiere) attribuee par le serveur a la connexion
	
	
	/**
	 * Constructeur
	 * @param elem l'element pour lequel le controleur est cree
	 * @param dx la position initiale de l'element sur l'ordonnee (interface graphique)
	 * @param dy la position initiale de l'element sur l'abscisse (interface graphique)
	 * @throws RemoteException
	 */
	public Console(Element elem, int dx, int dy) throws RemoteException {
		 //appel au constructeur de la super-classe -> il peut etre implicite
		super();
		try{
			//initialisation de l'element pour lequel le controleur est cree
			this.elem=elem;
			
			//position initiale aleatoire
			//Random r=new Random();
			//Point pos = new Point(r.nextInt(100),r.nextInt(100));
			
			//Creation de la position initiale de la vue de l'element sur l'interface graphique
			Point pos = new Point(dx,dy);
			
			//initialisation des voisins (vide avant la connexion)
			voisins = new Hashtable<Integer,VueElement>();
			
			//preparation connexion au serveur
			//handshake/enregistrement RMI
			serveur=Naming.lookup("rmi://localhost:"+port+"/Arene");
			serveur.toString();
			
			//initialisation de la reference du controleur sur le serveur
			this.refRMI=((IArene) serveur).allocateRef();
			Naming.rebind("rmi://localhost:"+port+"/Console"+refRMI,this);
			
			//initialisation de la vue sur l'element
			ve=new VueElement(refRMI, pos, this, "Atterrissage...", elem);
						
			//connexion au serveur
			((IArene) serveur).connect(ve);
			
			//affiche message si succes
			System.out.println("Console connectee ["+refRMI+"]");
 		} catch (Exception e) {
  			System.out.println("Erreur : la console n'a pa pu etre creee !\nCause : "+e.getCause());
  			e.printStackTrace();
 		}
	}


	/**
	 * Permet au serveur de faire "jouer" un tour a l'element.
	 * Calcule ses voisins (donnes par le serveur), cherche le plus proche, s'il est a proximite, lance l'interaction sinon se dirige vers lui (s'il existe un plus proche)
	 * Cette methode est execute chaque seconde  
	 */
	public void run() throws RemoteException {
		//decremente sa duree de vie
		ve.decrTTL(); 
			
		//mets a jour ses voisins 
		voisins = ((IArene) serveur).voisins(ve.getPoint(),refRMI);	
			
		//Hashtable<Integer,VueElement> voisinsInconnus = extraireInconnus(voisins);
		
		// Recherche du plus proche, sinon errer
			
		HashMap<Integer, HashMap<Integer,VueElement>> resultat = Strategie.chercherPersonnageProche(ve, voisins);
		int distPlusProche = resultat.keySet().iterator().next();
		int refPlusProche =  resultat.get(distPlusProche).keySet().iterator().next();
		//VueElement cible = resultat.get(distPlusProche).get(refPlusProche);
			
		//si le plus proche est a proximite
		if (distPlusProche<=1) { 
			//jeu
			parler("Je joue avec "+refPlusProche);
			((IArene) serveur).interaction(refRMI, refPlusProche);
	
		}
		//sinon
		else { 
			if (refPlusProche!=0) {
				parler("Je me dirige vers "+refPlusProche);
				//l'element courant se deplace vers le plus proche (s'il existe) sinon il erre
				seDirigerVers(refPlusProche);	
			} else {
				resultat = Strategie.chercherEquipementProche(ve, voisins);
				distPlusProche = resultat.keySet().iterator().next();

				if (distPlusProche<=1) { 
					//jeu
					parler("Je joue avec "+refPlusProche);
					((IArene) serveur).ramasser(refRMI, refPlusProche);
			
				} else { 
					if (refPlusProche!=0) {
						parler("Je me dirige vers "+refPlusProche);
					}
					else {
						parler("J'erre..."); 
					}
					//l'element courant se deplace vers le plus proche (s'il existe) sinon il erre
					seDirigerVers(refPlusProche);
				}
			}
		}
	}
	
	/**
	 * Deplace ce sujet d'une case en direction du sujet dont la reference est donnee en parametre
	 * @param ref la reference de l'element cible
	 */
	public void seDirigerVers(int ref) {
		Point pvers;
		
		//si la cible est l'element meme, il reste sur place
		if (ref==ve.getRef()) return;

		//s'il n'y a pas de reference la plus proche
		if (ref==0) {
			//si le point ou l'element se trouve est le point d'errance precedemment defini
			if ((pointErrance!=null) && (pointErrance.equals(ve.getPoint()))) { 
				//le point d'errance est reinitialise
				pointErrance=null;
			}
			if (pointErrance==null) {
				//initialisation aleatoire
				Random r=new Random();
				pointErrance=new Point(r.nextInt(Arene.tailleAreneX), r.nextInt(Arene.tailleAreneY));
			}
			//la cible devient le nouveau point d'errance
			pvers=pointErrance;
		} 
{'fraction_non_alphanumeric': 0.10605514507118399, 'fraction_numerical': 0.0027031897639214274, 'mean_word_length': 3.350842806742454, 'pattern_counts': {'":': 0, '<': 16, '<?xml version=': 0, '>': 15, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6312508', 'n_tokens_mistral': 4089, 'n_tokens_neox': 3608, 'n_words': 1079}