package squidpony.squidgrid.mapping.locks; import squidpony.squidgrid.mapping.locks.util.Rect2I; import squidpony.squidmath.Coord; import squidpony.squidmath.K2; import java.util.SortedSet; /** * @see IRoomLayout */ public class RoomLayout implements IRoomLayout { protected int itemCount; protected K2<Integer, Room> rooms; protected Rect2I bounds; public RoomLayout() { rooms = new K2<>(); bounds = Rect2I.fromExtremes(Integer.MAX_VALUE,Integer.MAX_VALUE, Integer.MIN_VALUE,Integer.MIN_VALUE); } @Override public Rect2I getExtentBounds() { return bounds; } @Override public SortedSet<Room> getRooms() { return rooms.getSetB(); } @Override public int roomCount() { return rooms.size(); } @Override public Room get(int id) { return rooms.getBFromA(id); } @Override public void add(Room room) { rooms.put(room.id, room); Coord xy = room.center; if (xy.x < bounds.left()) { bounds = Rect2I.fromExtremes(xy.x, bounds.top(), bounds.right(), bounds.bottom()); } if (xy.x >= bounds.right()) { bounds = Rect2I.fromExtremes(bounds.left(), bounds.top(), xy.x + 1, bounds.bottom()); } if (xy.y < bounds.top()) { bounds = Rect2I.fromExtremes(bounds.left(), xy.y, bounds.right(), bounds.bottom()); } if (xy.y >= bounds.bottom()) { bounds = Rect2I.fromExtremes(bounds.left(), bounds.top(), bounds.right(), xy.y + 1); } } @Override public void linkOneWay(Room room1, Room room2) { linkOneWay(room1, room2, Symbol.NOTHING); } @Override public void link(Room room1, Room room2) { link(room1, room2, Symbol.NOTHING); } @Override public void linkOneWay(Room room1, Room room2, int cond) { assert rooms.containsB(room1) && rooms.containsB(room2); room1.setEdge(room2.id, cond); } @Override public void link(Room room1, Room room2, int cond) { linkOneWay(room1, room2, cond); linkOneWay(room2, room1, cond); } @Override public boolean roomsAreLinked(Room room1, Room room2) { return room1.getEdge(room2.id) != null || room2.getEdge(room1.id) != null; } @Override public Room findStart() { for (Room room: getRooms()) { if (room.isStart()) return room; } return null; } @Override public Room findBoss() { for (Room room: getRooms()) { if (room.isBoss()) return room; } return null; } @Override public Room findGoal() { for (Room room: getRooms()) { if (room.isGoal()) return room; } return null; } @Override public Room findSwitch() { for (Room room: getRooms()) { if (room.isSwitch()) return room; } return null; } }