001import java.util.Stack;
002import java.io.File;
003import java.util.Scanner;
004import java.io.FileNotFoundException;
005/**
006 * This class is part of the "Pere-Noel" application. 
007 * "Pere Noel" is a very simple, text based adventure game.
008 * 
009 *  This class creates all rooms, creates the parser.  It also evaluates and executes the commands that 
010 *  the parser returns.
011 * 
012 * @author  Célia PRIOL & Benoît CHAUVEAU
013 *
014 */
015public class GameEngine
016{
017    private Parser parser;
018    private Player aPlayer;
019    private UserInterface gui;
020    private CommandWords commande;
021    private Item Objets;
022    private Stack<Room> stack;
023    private int aMove = 0;
024    private int aMaxMove = 30;
025    private Room salon, bibliotheque, cuisine, cour, cabane, couloir, lagrandechambre, WC, salledejeu, chambrerouge, chambrebleue, chambreverte, placard, dressing, salledebain ;
026    
027    /**
028     * Constructor for objects of class GameEngine
029     */
030    public GameEngine()
031    {
032        parser = new Parser();
033        createRooms();
034        stack = new Stack<Room>();
035        aPlayer = new Player("pièce", salon);
036    }
037
038    public void setGUI(UserInterface userInterface)
039    {
040        gui = userInterface;
041        printWelcome();
042    }
043
044    /**
045     * Print out the opening message for the player.
046     */
047    private void printWelcome()
048    {
049        String vPrenom = javax.swing.JOptionPane.showInputDialog( "Quel est ton prénom ?" );
050        gui.print("\n");
051        gui.println("Bonjour" + " " + vPrenom +"."+"\n"+"\n"+"Bienvenue dans : L'enlèvement du Père Noël ! ");
052        gui.println("Le Père Noël a été capturé ! Nous avons besoin de toi, détective" + " " + vPrenom + " !" + "\n");
053        gui.println("Clique sur ''AIDE'' si tu es bloqué. ");
054        gui.println(aPlayer.getcurrentRoom().getLongDescription());
055        gui.showImage (aPlayer.getcurrentRoom().getImageName());
056    }
057
058    /**
059     * Create all the rooms and link their exits together.
060     */
061    private void createRooms()
062    {
063        //Room salon, bibliotheque, cuisine, cour, cabane, couloir, lagrandechambre, WC, salledejeu, chambrerouge, chambrebleue, chambreverte, placard, dressing, salledebain;
064        // create the rooms
065        salon = new Room("dans le salon", "images/salon.jpg");
066        bibliotheque = new Room("dans la bibliothèque", "images/bibli3.jpg");
067        cuisine = new Room("dans la cuisine", "images/cuisine.jpg");
068        cour = new Room("dans la petite cour", "images/cour.jpg");
069        cabane = new Room("dans la cabane", "images/cabane.png");
070        couloir = new Room("dans le couloir à l'étage", "images/couloir etage.jpg");
071        lagrandechambre = new Room("dans la grande chambre à l'étage","images/grandechambre.jpg");
072        WC = new Room("dans les toilettes à l'étage", "images/toilettes.jpg");
073        salledejeu = new Room("dans la salle de jeu à l'étage", "images/sallejeu.png");
074        chambrerouge = new Room("dans la chambre rouge à l'étage", "images/chambrerouge.jpg");
075        chambrebleue = new Room("dans la chambre bleue à l'étage", "images/chambrebleue.jpg");
076        chambreverte = new Room("dans la chambre verte à l'étage", "images/chambreverte.jpg");
077        placard = new Room("dans le placard", "images/penderiepn.png");
078        dressing = new Room("dans le dressing", "images/dressing.jpg");
079        salledebain = new Room("dans la salle de bain à l'étage", "images/sdb.jpg");
080
081        // initialise room exits
082        salon.setExits("nord",bibliotheque);
083        salon.setExits("haut",couloir);
084        bibliotheque.setExits("nord", cuisine);
085        bibliotheque.setExits("sud",salon);
086        cuisine.setExits("est", cour);
087        cuisine.setExits("sud", bibliotheque);
088        cour.setExits("est", cabane);
089        cour.setExits("ouest",cuisine);
090        cabane.setExits("ouest", cour);
091        couloir.setExits("est", salledejeu);
092        couloir.setExits("sud",lagrandechambre);
093        couloir.setExits("bas", salon);
094        lagrandechambre.setExits("nord",couloir);
095        lagrandechambre.setExits("est", WC);
096        WC.setExits("ouest", lagrandechambre);
097        salledejeu.setExits("nord",chambrerouge);
098        salledejeu.setExits("ouest", couloir);
099        chambrerouge.setExits("nord",dressing);
100        chambrerouge.setExits("est", salledebain);
101        chambrerouge.setExits("ouest",chambrebleue);
102        chambrerouge.setExits("sud",null);
103        chambrebleue.setExits("est", chambrerouge);
104        chambrebleue.setExits("sud", chambreverte);
105        chambreverte.setExits("nord", chambrebleue);
106        chambreverte.setExits("est", placard);
107        placard.setExits("ouest", chambreverte);
108        dressing.setExits("sud", chambrerouge);
109        
110        salledebain.setExits("ouest", chambrerouge);
111        salledebain.setExits("sud", salledejeu);
112
113        // creationdes items et initialisation de leur prix
114        Item cookie, cadeau1, clef, cadeau2, cadeau3, cadeau4 ;
115        //         cookie = new Item("un cookie","cookie",0) ;
116        cadeau1 = new Item ( "le cadeau1","le cadeau1", 10 );
117        cadeau2 = new Item ( "le cadeau2","le cadeau2", 10 );
118        cadeau3 = new Item ( "le cadeau3","le cadeau3", 10 );
119        cadeau4 = new Item ( "le cadeau4","le cadeau4", 10 );
120        clef = new Item ( "une clef","une clef", 31 );
121        cookie = new Item ( "un cookie","un cookie", 5 );
122       
123        //Initialise le nombre d'item dans chaque room
124        //cabane.setObjets(cadeau,2);
125        //         cuisine.setObjets(cookie,1);
126
127        cuisine.setItem("cookie", cookie);
128        cabane.setItem("cadeau1", cadeau1);
129        cabane.setItem("cadeau2", cadeau2);
130        bibliotheque.setItem("clef", clef);
131        WC.setItem("cadeau3", cadeau3);
132        salledebain.setItem("cadeau4", cadeau4);
133        // piece de depart
134        //currentRoom = salon;  // start game outside
135
136    }
137
138    /**
139     * Given a command, process (that is: execute) the command.
140     * If this command ends the game, true is returned, otherwise false is
141     * returned.
142     */
143    public void interpretCommand(String commandLine) 
144    {
145        gui.println(commandLine);
146        Command command = parser.getCommand(commandLine);
147        CommandWord commandWord = command.getCommandWord();
148
149       switch(commandWord)
150        {
151            
152           
153            case UNKNOWN : gui.println("\n"+"Je ne vois pas ce que tu veux dire.. "+"\n");
154            break;
155            case HELP : printHelp();
156            break;
157            case QUIT : endGame();
158            break;
159            case GO : goRoom(command);
160            break;
161            case LOOK : look(); 
162            break;
163            case EAT : eat(command);
164            break;
165            case INVENTAIRE : inventaire();
166            break;
167            case BACK : backRoom();
168            break;
169            case DROP : drop(command);
170            break;
171            case TAKE : take(command);
172            break;
173            case USE: utiliser ();
174            break;
175            case LOAD : charger () ;
176            break;
177            case TEST : test(command);
178            break;
179        }
180           
181      
182     }               
183        
184//           if(command.isUnknown()) {
185//             gui.println("Je ne vois pas ce que tu veux dire ...");
186//             return ;
187//         }        
188//         String commandWord = command.getCommandWord();
189//         if (commandWord.equals("help"))
190//             printHelp();
191//         else if (commandWord.equals("go"))
192//             goRoom(command);
193//         else if (commandWord.equals("look"))
194//         {
195//             look();
196//         }
197//         else if (commandWord.equals("eat"))
198//         {eat(command);
199//         }
200//         else if (commandWord.equals("back"))
201//             backRoom();
202//         else if (commandWord.equals("quit"))
203//         {
204//             if(command.hasSecondWord())
205//                 gui.println("Quit what?");
206//             else
207//                 endGame();
208//         }
209//         else if (commandWord.equals("take"))
210//         {
211//             take(command);//instruction à mettre après
212//         }//condition pour savoir si take est entré
213//         else if (commandWord.equals("drop"))
214//         {
215//             drop(command);//instruction à mettre après
216//         }//condition pour savoir si deposer est entré
217
218    
219    private void look()
220    {
221        gui.println(aPlayer.getcurrentRoom().getLongDescription());
222    }
223    
224        private void inventaire()
225    {
226        gui.print("\n");
227        gui.println(aPlayer.getInventory());
228    }
229
230
231    public void eat(Command command)
232    {
233        
234        if(!command.hasSecondWord())
235        {
236            gui.print("\n");
237            gui.println("Que veux-tu manger ? ");
238            gui.print("\n");
239        }
240
241        String vName = command.getSecondWord();
242
243        if(aPlayer.getItem(vName) == null)
244        {
245            gui.print("\n");
246            gui.println("Tu ne possèdes pas cet objet ! ");
247            gui.print("\n");
248        }
249        else
250        {
251            gui.println("\n" +"Tu as mangé " + vName + ". ");
252             if (vName.equals("cookie"))
253            {
254               gui.println("Tu peux porter plus d'objets maintenant.");
255               gui.println("Le poids maximal que tu peux porter a été augmenté de 50 kg. ");
256               gui.print("\n");
257               aPlayer.setMaxPoids(80);
258            }
259            else
260            {
261               gui.println("Tu viens de dévorer cet objet ! Quelle idée ! Tu ne l'as plus dans ton inventaire, dommage...");
262               gui.print("\n");
263            }
264            this.aPlayer.removeItem(vName);
265        }
266    }
267
268    /**
269     * Print out some help information.
270     * Here we print some stupid, cryptic message and a list of the 
271     * command words.
272     */
273     
274    private void printHelp() 
275    {
276        gui.print("\n");
277        gui.println("Essaie de trouver des cadeaux. Il y en a 4 dans les différentes pièces de la maison. ");
278        gui.println("Et n'oublie pas non plus de retrouver le Père Noël...!" + "\n");
279        gui.println("Attention, tu as un nombre de déplacements limité, si tu dépasse la limite, le soleil se lèvera, et les enfants n'auront ");
280        gui.println("pas leurs cadeaux.");
281        gui.println("Fais aussi attention, une pièce est piégée : la porte ne s'ouvre que d'un certain côté.");
282        gui.println("A toi de trouver ton chemin dans cette maison pas comme les autres !" + "\n");
283        gui.println("Tes commandes sont :"+parser.showCommands()+". ");
284        gui.print("\n");
285        
286    }
287//        /**
288//      * Checks if the player is dead. 
289//      * The player dies when he has exceeded some number of moves.
290//      */
291//     public boolean isDead() 
292//     {
293//         return aMove > aMaxMove ;
294//     }
295     /** 
296     * Try to go to one direction. If there is an exit, enter the new
297     * room, otherwise print an error message.
298     */
299     private void goRoom(Command command) 
300     {
301        if(!command.hasSecondWord())
302        {
303            // sans second mots nous ne savons pas ou aller
304            gui.print("\n");
305            gui.println("Aller où ?");
306            gui.print("\n");
307            return;
308        }
309
310        String direction = command.getSecondWord();
311        //Try to leave currentRoom.
312        // Try to leave current room.
313        Room nextRoom = aPlayer.getcurrentRoom().getExit(direction);
314        if (nextRoom == null)
315            {
316            gui.print("\n");
317            gui.println("Il n'y a pas de porte ! Tu ne peux pas passer. ");
318            gui.print("\n");}
319        else {
320            stack.push(aPlayer.getcurrentRoom());
321            aPlayer.changeRoom(nextRoom);
322            gui.println(aPlayer.getcurrentRoom().getLongDescription());
323            if(aPlayer.getcurrentRoom().getImageName() != null)
324                gui.showImage(aPlayer.getcurrentRoom().getImageName());
325        }
326        
327           if(aMove >= aMaxMove  )
328  
329        { 
330            this.Dead();
331            gui.enable(false);
332        }
333           else 
334        {
335            this.aMove++ ; 
336        }
337       
338        Room nextRoom2 = aPlayer.getcurrentRoom();
339        if (nextRoom2 == placard)
340       
341        {
342            this.PrintVictoire();
343            gui.enable(false);
344        }
345     }
346    
347     public void PrintVictoire ()
348     {   
349        gui.println("\n" +"\n" +"BRAVO !" + "\n" + "\n" +"Tu as retrouvé le Père Noël !!!"+ "\n" + "Tous les enfants du monde te sont reconnaissants ( et Bernie aussi ;) ) !!");
350        gui.println("\n" +"A bientôt pour de nouvelles aventures !"+ "\n");
351        
352     }
353
354     private void test( Command command )
355     {
356         if ( stack.empty() == false ) {
357            gui.print("\n");
358            gui.println( "Il est nécessaire de se trouver sur le palier pour pouvoir tester le jeu. " );
359            gui.print("\n");
360            return;
361        }
362        if ( !command.hasSecondWord() ) {
363            // if there is no second word, we don't know where to go...
364            gui.print("\n");
365            gui.println( "Que veux tu tester ? " );
366            gui.print("\n");
367            return;
368        }
369        try {
370            File fichier= new File( command.getSecondWord() );
371            Scanner scan= new Scanner( fichier );
372            while ( scan.hasNextLine() ) {
373                interpretCommand( scan.nextLine() );
374            }
375            }
376            catch ( Exception e ) {
377            gui.print("\n");
378            gui.println( "Le fichier n'existe pas. " );
379            gui.print("\n");
380        }
381    }
382
383    public void backRoom()
384    {
385        if (stack.empty()==true){
386            gui.print("\n");
387            gui.println("Il n'y a pas de pièce. ");
388            gui.print("\n");
389        }
390        else { 
391            gui.print("\n");
392            gui.println("Tu es dans la pièce précédente : ");
393
394            aPlayer.changeRoom((stack.pop()));
395            gui.println(aPlayer.getcurrentRoom().getLongDescription());
396            if(aPlayer.getcurrentRoom().getImageName() != null)
397                {gui.showImage(aPlayer.getcurrentRoom().getImageName());}
398        }
399    }
400
401    private void endGame()
402    {
403        
404        System.exit(0);
405        
406    }
407    
408    private void Dead()
409    {
410        gui.println("\n" +"\n" +"Trop tard, tu n'as pas reussi à retrouver le Père Noël à temps !"+"\n");
411        gui.println("Merci d'avoir joué à ce jeu !  A bientôt." + "\n"+ "\n"+ "\n");
412        
413    }
414    
415    /**
416     * Permet de prendre un objet
417     */
418
419    private void take(Command command)
420    {
421        if (!command.hasSecondWord()) {
422            gui.print("\n");
423            gui.println("Prendre quoi ? ");
424            gui.print("\n");
425            return;
426        }
427
428        String vName  = command.getSecondWord();
429        Item vItem = this.aPlayer.getcurrentRoom().getItem(vName);
430        int vPoids = this.aPlayer.getPlayerPoids();
431        if (vItem == null)
432        {
433            gui.print("\n");
434            gui.println("Il n'y a pas cet objet dans la pièce ! ");
435            gui.print("\n");
436            return;
437        }
438        else if (vItem.getItemPoids()+vPoids > this.aPlayer.maxPoids()) {
439            gui.print("\n");
440            gui.println("Tu ne peux pas prendre cet objet car tu n'as pas assez de force pour tout porter ! ");
441            gui.print("\n");
442            return;
443        }
444        else {
445            this.aPlayer.addItem(vName,vItem);
446            this.aPlayer.getcurrentRoom().removeItem(vName);
447            gui.println("\n" +"Tu as pris "+ vName+". ");
448            gui.println(aPlayer.getInventory());
449        }
450        gui.println("");
451    }
452
453    /**
454     * Command Drop
455     */
456
457    public void drop(Command command)
458    {
459        if (!command.hasSecondWord())
460            // if there is no second word, we don't know what to do...
461            {
462                gui.print("\n");
463                gui.println("Déposer quoi ?");
464                gui.print("\n");
465                return;
466            }
467
468        String vName = command.getSecondWord();
469        Item vItem = this.aPlayer.getItem(vName);
470
471        if (vItem == null)
472            {
473             gui.print("\n");
474             gui.println("Tu n'as pas cet objet dans ton inventaire.");
475             gui.print("\n");
476            }
477            else
478            {
479            aPlayer.getcurrentRoom().addItem(vName, vItem );
480            
481            aPlayer.removeItem(vName);
482            gui.println("\n" +"Tu as déposé "+vName+". ");
483            gui.print("\n");
484        }
485    }
486   
487    private void charger() {
488        aPlayer.chargeBeamer();
489        gui.println("\n" +"Tu viens de charger ton beamer. ");
490        gui.print("\n");
491    }
492    
493    private void utiliser() {
494        
495        if(aPlayer.fireBeamer()) {
496            gui.println("\n" +"Tu viens d'utiliser ton beamer avec succès ! ");
497            gui.print("\n");
498            gui.println(aPlayer.getLongDescription());
499            gui.showImage(aPlayer.getcurrentRoom().getImageName());}
500        
501        else {
502            gui.println("\n" +"Tu n'as pas chargé ton beamer ! Charge-le dans une pièce, puis utilise-le pour t'y téléporter. ");
503            gui.print("\n");
504        }
505    }
506}