package fr.cnam.espacetore;

import java.lang.*;
import java.rmi.*;
import java.util.*;
import java.awt.Point;
import fr.cnam.joueur.*;

/** Interface d'utilisation de l'espace de Tore de mani&egrave;re distante
 */
public interface EspaceToreODInt extends Remote
{
    // Methode qui permet a l'IHM de s'abonner afin qu'elle soit notifiee des changements des cases de la grille
    //    observer est le Stub de l'objet RMI qui est utilise par l'IHM pour etre  prevenu des notifications 
    //
    public void addObserver(Remote observer) throws RemoteException;

    // Methode qui permet a un agent de se deplacer dans l'espace de Tore
    //   Cette methode est synhronisee sur l'espace de Tore afin que deux agents ne puissent pas 
    //      se deplacer en meme temps sur une meme case.
    // La methode retourn un Point qui est les coordonnees en x et y de destination calculees par l'espace de Tore.
    //    La valeur est null si le deplacement ne peut pas se faire.
    //
    public Point deplacer(int x,int y,int sensX,int sensY,int couleur) throws RemoteException;

    // Methode qui retourne le temps en millisecondes utilisee par chaque agent pour attendre entre chaque deplacement.
    //
    public int getTempo() throws RemoteException;

    // Retourne la taille en X de la grille de l'espace de Tore.
    //
    public int getNbX() throws RemoteException;

    // Retourne la taille en Y de la grille de l'espace de Tore.
    //
    public int getNbY() throws RemoteException;

    // Methode qui retourne la taille de la cellule de la grille.
    //
    public int getTailleCellule() throws RemoteException;

    // Methode qui retourne un tableau contenant les coordonnees de tous les agents qui ont la couleur 
    //   passe en parametre.
    //
    public Vector getPopulation(int couleur) throws RemoteException;

    // Methode qui retourne la grille geree par l'espace de tore
    //
    public CelluleGrille[][] getGrille() throws RemoteException;

    // Methode utilise par un agent pour se declarer au pres de l'espace de Tore.
    // L'espace de Tore reçoit le stub de l'agent ce qui va lui permettre d'utiliser les methodes de l'agent
    // De plus cette methode calcule une coordonnee libre de la grille qui est retournee
    // Cette methode est synchronisee afin que deux agents ne puissent arriver sur une meme case.
    //
    public Point arriver(AgentInt agent,int couleur) throws RemoteException;

    // Methode qui retourne un tableau contenant les coordonnees de tous les agents qui n'ont pas la couleur passe en parametre.
    //
    public Vector getAutrePopulation(int couleur) throws RemoteException;

    // Retourne le mode combat ou non de l'espace de tore
    //
    public boolean getModeCombat() throws RemoteException;

}

