/
maps/
package mapmaker;

/** links two rooms in a map
 */
public class Link {

  Room[] rooms;
  AreaMap map;

  /** automatically links room1 and room2 at the given exits
   * @param map the map containing the link
   */
  public Link(AreaMap map, Room room1, int exit1, Room room2, int exit2) {
    rooms = new Room[2];
    rooms[0] = room1;
    rooms[1] = room2;
    this.map = map;
    notifyRooms(exit1, exit2);
  } // Link

  /** initializes as a deep copy of orgLink
   */
  public Link(AreaMap map, Link orgLink) {
    this.map = map;
    rooms = new Room[2];
    Room[] orgRooms = orgLink.getRooms();
    int[] exits = new int[2];
    for (int i = 0; i < 2; i++) {
      rooms[i] = map.getRoom(orgRooms[i].getPos());
      exits[i] = orgRooms[i].getExitDir(orgLink);
    }
    notifyRooms(exits[0], exits[1]);
  } // Link

  /** returns the rooms linked
   */
  public Room[] getRooms() {
    return rooms;
  } // getRoom

  void notifyRooms(int exit1, int exit2) {
    rooms[0].setLink(this, exit1);
    rooms[1].setLink(this, exit2);
  } // notifyRooms

  /** should only be called by Room or Map object
   */
  public void suicide() {
    unlinkRooms();
    map.removeLink(this);
  } // suicide

  void unlinkRooms() {
    for (int i = 0; i < 2; i++)
      rooms[i].unlink(this);
  } // unlinkRooms

  /** from the two rooms linked, returns the one unequal to room
   * @param room must be one of the rooms linked
   */
  public Room opposite(Room room) {
    if (rooms[0] == room)
      return rooms[1];
    if (rooms[1] == room)
      return rooms[0];
    throw new IllegalArgumentException();
  } // opposite

} // Link