/*
 **************************************
 * HOW TO BUILD A NEW AGENT WITH SEMA *
 **************************************
 */
package modelling;
/*
 * Importation des packages sema et base.
 */
import sema.*;
import sema.Agent;

/**
 * Structure dépouillée d'un fichier .java pour implémenter un nouveau type d'agent.
 * Pour etre utilisable, le fichier doit être compilé, puis placé dans un répertoire
 * accessible à Java (typiquement java/lib).
 * On peut préciser en option les capacités de l'individu, par l'intermédiaire d'interfaces.
 * Pour préciser qu'un individu est communiquant et peut voir, on écrira:
 * <code>implements Communicating, Vision</code>.<br>
 */
public class NewAgent extends Agent /*implements interfaceName1, interfaceName2*/ {
    
    /**
     * Le constructeur de l'agent prend nécessairement le monde d'acceuil en argument.
     * Ce monde est casté en sema.World par le lecteur de fichiers SIM.
     * Pour inclure cet élément dans une simulation, il faut l'ajouter dans la section "ELEMENTS:"
     * d'un fichier SIM, ou dans l'interface par "Add Element", avec la ligne suivante:
     * <code>NewAgent(YourType1 yourArg1Value, .., YourTypeN yourArgNValue)</code>.
     */
    public NewAgent(World world /*, YourType1 yourArg1, .., YourTypeN yourArgN*/) {
        super(world, null /*une Area, forme de l'individu*/, 1 /*un flottant, délai caractéristique de l'individu*/, null /*java.awt.Image de l'individu*/);
        /*
         * Mettre ici le code à exécuter à l'instanciation d'un NewAgent.
         * Celui-ci s'ajoute automatiquement au monde (lors de l'appel au constructeur de sa classe mère <code>Agent</code>).
         */
    }
    
    /*
     * Remarque technique:
     * pour utiliser explicitement un monde d'un type World2 hérité de sema.World,
     * il faut caster dans le constructeur de NewAgent 'world' en World2 et le stocker.
     * L'élément ne pourra être instancié dans Sema s'il prend directement un World2 en argument.
     * Ce cast n'est nécessaire que si World2 ajoute de nouvelles méthodes ou champs de données
     * à World, auquel cas il faudra caster le monde en World2 pour pouvoir y accéder.
     * Il faut prendre garde à ce genre de cast: l'utilisation d'un tel élément dans un monde
     * utilisant une carte par défaut sema.Map provoquera une erreur...
     * Il convient donc de vérifier que le cast est possible, par un try {...} catch ...
     */
    
    
    /**
     * Pour les éventuelles classes qui hériteront de NewAgent,
     * il est conseillé de remettre en protected certains accesseurs
     * de la classe mère, devenus privés avec l'héritage.
     */
    
    
    /**
     * Eventuellement, rendre 'protected', en les redéfinissant, les classes et méthodes
     * qui sont maintenant privées dans NewAgent (à l'héritage, protected -> private).
     *
     * Exemple:
     * protected class Action extends super.Action{
     * ...
     * }
     */
    
    
    /**
     * Ici, rajouter de nouveaux champs, de nouvelles méthodes, de nouvelles classes internes
     */
    
    /**
     * Nouvelles actions, généralement définies en protected
     */
    protected class NewAction  extends Agent.Action{
        public NewAction(double t){
            super(t);
        }
        public float step(){
            //code de NewAction ici
            /*
             * continue, end, pause
             */
            return -1; //
        }
    }
    
    /**
     * Mettre à jour l'heuristique de décision.
     */
    public boolean acceptAction(Action action){
        return super.acceptAction(action); //à changer
    }
    
}