001import java.util.Stack;
002import java.util.HashMap;
003/**
004 * Classe en relation étroite avec Game Engine, prenant dans son corps toutes les lignes de codes relatives au joueur.
005 * 
006 * @author Gabriel Leroux 
007 * @version 23/03/2020
008 */
009public class Player
010{
011    private Room aCurrentRoom;
012    private Stack <Room> aStackRoom;
013    private UserInterface aGui;
014    private String aNom;
015    private ItemList aListe;
016    private Audio aSon;
017    private int aArgent=100;
018    private int aNbDeplacement;
019    
020    // ===== constructeurs =====
021    /**
022     * Constructeur naturel d'objets de la classe Player
023     * @param pNom c'est le nom du joueur 
024     * @param pCurrentRoom la pièce courante
025     */
026    public Player( final String pNom, final Room pCurrentRoom )
027    {
028        this.aCurrentRoom=pCurrentRoom;
029        this.aNom=pNom;
030        this.aStackRoom= new Stack <Room>();
031        this.aSon = new Audio();
032        aListe=new ItemList();
033        this.aNbDeplacement=30;
034    } // Player(.)
035    /**
036     * Constructeur de gui
037     * @param pUserInterface interface utilisateur
038     */
039    public void setGUI( final UserInterface pUserInterface )
040    {
041        this.aGui = pUserInterface;
042        this.printWelcome();
043    }
044    
045    /**
046     * Accesseur de aCurrentRoom
047     * @return la Room courante
048     */
049    public Room getCurrentRoom(){
050        return this.aCurrentRoom;
051    }
052   
053    /**
054     * Accesseur qui retourne le nom du joueur
055     * @return le nom du joueur 
056     */
057    public String getNom(){
058        return this.aNom;
059    }
060    /**
061     * Accesseur de aListe
062     * @return la Hashmap
063     */
064    public ItemList getListe(){
065        return this.aListe;
066    }
067    
068    /**
069     * Modificateur de aArgent
070     * @param pInt argent à enlever ou ajouter s'il gagne ou perd contre R2D2
071     * 
072     */
073    public void setArgent(final int pInt){
074        
075            this.aArgent=this.aArgent+pInt;
076        
077            
078    }
079    /**
080     * Procédure de bienvenue affichant ce qui doit être affiché au démarrage du jeu i.e du texte et fais appel
081     * à printLocationInfo(). Cette procédure lance aussi la musique du jeu.
082     */
083    private void printWelcome(){
084
085        this.aGui.println("Joueur : "+this.getNom());
086        this.aGui.println("Bienvenue dans le Gaby's Game !");
087        this.aGui.println("Je vous souhaite bonne fortune, et que la chance vous sourit ! ");
088        this.aGui.println("  ");
089        this.aGui.println("Tapez 'help' si vous avez besoin d'aide.");
090        this.aGui.println("  ");
091        printLocationInfo();
092        //lance la musique
093        this.aSon.run("imperial_march.wav");
094    }
095
096    /**
097     * Procédure permettant d'afficher la description de la Room courante 
098     * ainsi que ses sorties en faisant appel à la foction getLongDescription().
099     * cette procédure indique aussi le nombre d'argent restant au joueur ainsi que
100     * le récapitulatif de ce qu'il possède dans son inventaire.
101     */
102    public void printLocationInfo(){
103        this.aGui.println(this.aCurrentRoom.getLongDescription()+  " \n Il vous reste "+this.aArgent+" roubles. \n Votre inventaire : " +this.aListe.returnListItem()+ this.aListe.returnPoidsTot()+"\n Il vous reste "+aNbDeplacement+" déplacements.");
104        if ( this.aCurrentRoom.getImageName() != null )
105            this.aGui.showImage( this.aCurrentRoom.getImageName() );
106
107    }
108
109    /**
110     * Affiche la méthode look qui affiche une description de la pièce courante
111     */ 
112    public void look(){
113        printLocationInfo();
114        //this.aSon.stop();
115    }
116    /**
117     * méthode permettant de "tirer"
118     * @param pNom, le nom de l'item de type Beamer
119     */
120    public void seTeleporter(final String pNom){
121        
122        this.changerLaRoom(aListe.getBeamer(pNom).getCharger(),true);
123        
124        this.aListe.suppItem(pNom);
125        this.printLocationInfo();
126    }
127    /**
128     * Changer la Room et compter le nombre de deplacement
129     * @param pRoom change la room courante 
130     * @param pBool boolean permettant de savoir s'il faut reinitilaiser la Stack, comme par exemple quand la porte est trap
131     */
132    public void changerLaRoom(final Room pRoom,final boolean pBool){
133        this.aStackRoom.push(this.aCurrentRoom); // bien mettre avant sinon aucun sens
134        this.aCurrentRoom=pRoom;
135        this.compteDep();
136        
137        if (pBool==true){
138            this.aStackRoom =new Stack <Room>();
139        }
140    }
141    /**
142     * méthode servant à décompter les deplacements du joueur 
143     */
144    public void compteDep(){
145        this.aNbDeplacement-=1;
146        if (this.aNbDeplacement<=0){
147            this.aGui.println("Vous avez atteint la limite de déplacement maximum pour finir le jeu.");
148            this.aGui.println( "Thank you for playing.  Good bye." );
149            this.aGui.enable( false );
150        }
151    }
152    /**
153     * méthode permettant de se rediriger vers la précédente room visitée par le joueur.
154     */
155    public void back(){
156        if (this.aStackRoom.empty()==true){
157            this.aGui.println( "Vous n'avez pas encore bougé, ou voulez vous donc retourner ?!" ); 
158            return;}
159        this.aCurrentRoom=this.aStackRoom.pop();
160        this.compteDep();
161        this.printLocationInfo();
162
163    }
164
165    /**
166     * méthode permettant de prendre les objets de la room
167     * @param pNom représentant le nom d'un item
168     */
169    public void prendre(final String pNom){
170        try {
171        if(this.aCurrentRoom.retourneItem(pNom).getPrix()<=this.aArgent){
172            this.aListe.addItem(pNom,this.aCurrentRoom.retourneItem(pNom));
173            this.aCurrentRoom.suppItem(pNom);
174            this.aArgent=this.aArgent-this.aListe.getItem(pNom).getPrix();}
175        else{this.aGui.println("Vous n'avez pas assez de rouble pour prendre cet item.");
176        }
177    }
178        catch(java.lang.NullPointerException gaby){ this.aGui.println("Je ne vois pas de quel objet vous voulez parler.");}
179    }
180
181    /**
182     * méthode permettant de déposer un objet
183     * @param pNom représentant le nom d'un item
184     */
185    public void deposer(final String pNom){
186        try{
187        
188        this.aCurrentRoom.addItem(this.aListe.getItem(pNom));        
189        this.aArgent=this.aArgent+this.aListe.getItem(pNom).getPrix();
190        this.aListe.suppItem(pNom);
191        }
192        catch(java.lang.NullPointerException gaby){ this.aGui.println("Je ne vois pas de quel objet vous voulez parler.");}
193    }
194    /**
195     * méthode permettant d'ouvrir les objets et d'augmenter le nombrede rouble que le joueur possède
196     * @param pString représentant le nom d'un item
197     */
198    public void ouvrir(final String pString){
199        if (pString.equals("bourse")){
200            this.aGui.println("Magnifique ! La bourse contient 10 roubles. Cette bourse est la chance de votre vie.");
201            this.aArgent+=20;
202            this.aListe.suppItem(pString);
203        }
204        else if (pString.equals("Moyenne_bourse")){
205            this.aGui.println("Magnifique ! La bourse contient 80 roubles. Cette bourse est la chance de votre vie.");
206            this.aArgent+=80;
207            this.aListe.suppItem(pString);
208        }
209        else if (pString.equals("Grosse_bourse")){
210             this.aGui.println("Magnifique ! La bourse contient 100 roubles. Cette bourse est la chance de votre vie.");
211            this.aArgent+=100;
212            this.aListe.suppItem(pString);
213        }
214        else{
215            this.aGui.println("Cet objet n'a pas la possibilité d'être ouvert.");
216        }    
217    }
218    
219    // ===== Methodes =====
220} // Player