001import java.util.HashMap;
002import java.util.Set;
003
004public class Room {
005    private String aDescription;
006    private HashMap<String, Room> aExits;
007    private HashMap<String, Door> aDoors;
008    private String aImageName;
009    private ItemList aItems;
010
011    public Room(final String pDescription, final String pImageName) {
012        this.aDescription = pDescription;
013        this.aExits = new HashMap<String, Room>();
014        this.aDoors = new HashMap<String, Door>();
015        this.aImageName = pImageName;
016        this.aItems = new ItemList();
017    }
018
019    /**
020     * Retourne le nom de l'image de la salle
021     * 
022     * @return nom de l'image
023     */
024    public String getImageName() {
025        return this.aImageName;
026    }
027
028    /**
029     * Récupère la description de la salle actuelle
030     * 
031     * @return description de la salle
032     */
033    public String getDescription() {
034        return this.aDescription;
035    }
036    public HashMap<String,Door> getDoors() {
037        return this.aDoors;
038    }
039    /**
040     * Donne une longue description de la salle
041     * 
042     * @return longue description
043     */
044    public String getLongDescription() {
045        String vOutput = "You are " + this.aDescription + ".\n" + this.getExitString() + "\n";
046        String vAllItems = "Items :" + this.aItems.getItemsString();
047        if (vAllItems.equals("Items :")) {
048            vOutput += "No item here.";
049        } else {
050            vOutput += vAllItems;
051        }
052        return vOutput;
053    }
054
055    /**
056     * Crée une sortie
057     * 
058     * @param pDirection direction de la sortie, par exemple "up", ou "west".
059     * @param pNeighbor  la salle dans laquelle on veut arriver en suivant cette
060     *                   direction.
061     */
062    public void setExitRoom(final String pDirection, final Room pNeighbor) {
063        if (pDirection != null) {
064            this.aExits.put(pDirection, pNeighbor);
065        }
066    }
067    /**
068     * Crée une porte
069     * @param pDirection direction dans laquelle se trouve la porte
070     * @param pDoor la porte
071     */
072    public void setExitDoor(final String pDirection, final Door pDoor) {
073        if(pDirection!=null) {
074            this.aDoors.put(pDirection,pDoor);
075        }
076    }
077    /**
078     * Paramètre la porte et la salle de sortie.
079     * @param pDirection la direction vers la sortie
080     * @param pRoom la salle de destination
081     * @param pDoor la porte entre la salle actuelle et la salle de destination.
082     */
083    public void setExit(final String pDirection, final Room pRoom, final Door pDoor) {
084        this.setExitRoom(pDirection, pRoom);
085        this.setExitDoor(pDirection, pDoor);
086    }
087    /**
088     * Retourne la salle qui se trouve dans la direction donnée.
089     * 
090     * @param pDirection Direction dans laquelle on veut aller. Exemple: "north",
091     *                   "down".
092     * @return La salle située dans la direction passée en paramètre.
093     */
094    public Room getExit(final String pDirection) {
095        return this.aExits.get(pDirection);
096    }
097
098    /**
099     * Retourne une chaine de caractère qui liste toutes les sorties de la salle.
100     * 
101     * @return Liste de toutes les sorties : "Exits : north east south down" par
102     *         exemple.
103     */
104    public String getExitString() {
105        String vOutput = "Exits :";
106        StringBuilder vSb = new StringBuilder(vOutput);
107        Set<String> allKeys = this.aExits.keySet();
108        for (String vKey : allKeys) {
109            vSb.append(" ");
110            vSb.append(vKey);
111        }
112        return vSb.toString();
113    }
114
115    public void addItem(final Item pItem) {
116        this.aItems.addItem(pItem);
117    }
118
119    public HashMap<String, Item> getItems() {
120        return this.aItems.getItems();
121    }
122
123    /**
124     * Renvoie true ou false en fonction de si la salle est une sortie ou non de la salle actuelle.
125     * @param pRoom salle de sortie ?
126     * @return boolean
127     */
128    public boolean isExit(final Room pRoom) {
129        Set<String> allKeys = this.aExits.keySet();
130        for (String vKey : allKeys) {
131            if (this.aExits.get(vKey).equals(pRoom)) {
132                return true;
133            }
134        }
135        return false;
136    }
137} // Room