package squidpony.squidgrid.mapping.locks.constraints; import squidpony.squidgrid.Direction; import squidpony.squidgrid.mapping.locks.IRoomLayout; import squidpony.squidgrid.mapping.locks.generators.ILayoutGenerator; import squidpony.squidmath.Arrangement; import squidpony.squidmath.Coord; import squidpony.squidmath.IntVLA; import java.util.*; /** * Limits the {@link ILayoutGenerator} in * the <i>number</i> of keys, switches and rooms it is allowed to place. * * Also restrict to a grid of 1x1 rooms. * * @see ILayoutConstraints */ public class CountConstraints implements ILayoutConstraints { protected int maxSpaces, maxKeys, maxSwitches; protected Arrangement<Coord> roomIds; protected int firstRoomId; public CountConstraints(int maxSpaces, int maxKeys, int maxSwitches) { this.maxSpaces = maxSpaces; this.maxKeys = maxKeys; this.maxSwitches = maxSwitches; roomIds = new Arrangement<Coord>(); Coord first = Coord.get(127,127); firstRoomId = getRoomId(first); } public int getRoomId(Coord xy) { if (roomIds.containsKey(xy)) { return roomIds.get(xy); } else { roomIds.add(xy); return roomIds.size()-1; } } public Coord getRoomCoords(int id) { assert roomIds.containsValue(id); return roomIds.keyAt(id); } @Override public int getMaxRooms() { return maxSpaces; } public void setMaxSpaces(int maxSpaces) { this.maxSpaces = maxSpaces; } @Override public IntVLA initialRooms() { return IntVLA.with(firstRoomId); } @Override public int getMaxKeys() { return maxKeys; } public void setMaxKeys(int maxKeys) { this.maxKeys = maxKeys; } @Override public boolean isAcceptable(IRoomLayout dungeon) { return true; } @Override public int getMaxSwitches() { return maxSwitches; } public void setMaxSwitches(int maxSwitches) { this.maxSwitches = maxSwitches; } protected boolean validRoomCoords(Coord c) { return c.y >= 0 && c.x >= 0 && c.x <= 255 && c.y <= 255; } @Override public IntVLA getAdjacentRooms(int id, int keyLevel) { Coord xy = roomIds.keyAt(id); IntVLA ids = new IntVLA(); for (Direction d: Direction.CARDINALS) { Coord neighbor = xy.translate(d); if (validRoomCoords(neighbor)) ids.add(getRoomId(neighbor)); } return ids; } @Override public Set<Coord> getCoords(int id) { return Collections.singleton(getRoomCoords(id)); } @Override public double edgeGraphifyProbability(int id, int nextId) { return 0.2; } @Override public boolean roomCanFitItem(int id, int key) { return true; } }