package mapmaker;
import java.awt.*;
import java.util.*;
import mapmaker.mapcmd.*;
import util.*;
public class MapUtil {
/** checks if the rooms can be moved in the given direction on the map
* without conflicting with other rooms or the map dimensions
* @param rooms must contain nothing but Room objects part of map
*/
public static boolean isMoveable(AreaMap map, Set rooms, Point dir) {
Dimension dim = map.getSize();
Iterator it = rooms.iterator();
while (it.hasNext()) {
Room room = (Room)it.next();
Point newPos = room.getPos();
newPos.translate(dir.x, dir.y);
// check if within map dimensions
if (newPos.x < 0 || newPos.x >= dim.width ||
newPos.y < 0 || newPos.y >= dim.height)
return false;
// check if new Position free of occupied with room in rooms
Room occupier = map.getRoom(newPos);
if (occupier != null && !rooms.contains(occupier))
return false;
}
return true;
} // isMoveable
/** moves all rooms in given direction,
* isMoveable(map, rooms, dir) must be true
*/
public static void moveRooms(AreaMap map, Set rooms, Point dir) {
// swap first those with biggest <pos, dir> to ensure
// that only swaps to empty positions are done
// otherwise positions given in commands could invalidate
// during execution of previous commands
Iterator it = rooms.iterator();
int size = rooms.size();
Point[] pos = new Point[size];
for (int i = 0; i < size; i++)
pos[i] = ((Room)it.next()).getPos();
MapMath.partialSort(new DirComparer(dir), pos);
CompositeCommand cmd = new CompositeCommand();
for (int i = size - 1; i >= 0; i--)
cmd.add(new CmdSwapRooms(pos[i], new Point(pos[i].x + dir.x,
pos[i].y + dir.y)));
map.execute(cmd);
} // moveRooms
/** marks all rooms who's descriptions contain a given string
* @param map the rooms of this map will be searched and marked
* @param searchString the String that must be contained in
* a room's description
* @param nameOnly if true, only marks rooms with the exact name
* as the searchString
*/
public static void markRoomsWithDesc(AreaMap map,
String searchString,
boolean nameOnly) {
CompositeCommand markCmd = new CompositeCommand();
Room[] rooms = map.getRooms();
for (int i = 0; i < rooms.length; i++)
if (rooms[i] instanceof DescObj) {
Text desc = ((DescObj)rooms[i]).getDesc();
// search even if desc null: searchString could be ""
if (desc == null)
desc = new Text();
if (!nameOnly && desc.contains(searchString) ||
nameOnly && MapDescParser.get().getName(desc).equals(searchString))
markCmd.add(new RCmdSetMarked(rooms[i].getPos(), true));
}
map.execute(markCmd);
} // markRoomsWithDesc
public static Room[] getMarkedRooms(AreaMap map) {
Room[] rooms = map.getRooms();
Vector markedVector = new Vector();
for (int i = 0; i < rooms.length; i++)
if (rooms[i].getMarked())
markedVector.addElement(rooms[i]);
Room[] markedRooms = new Room[markedVector.size()];
markedVector.copyInto(markedRooms);
return markedRooms;
} // getMarkedRooms
/** sets all rooms of the given map as not marked
*/
public static void unmarkRooms(AreaMap map) {
CompositeCommand unmarkCmd = new CompositeCommand();
Room[] rooms = getMarkedRooms(map);
for (int i = 0; i < rooms.length; i++)
unmarkCmd.add(new RCmdSetMarked(rooms[i].getPos(), false));
map.execute(unmarkCmd);
} // unmarkRooms
/** sets all marked sooms on the given map to the given color
*/
public static void colorMarkedRooms(AreaMap map, NamedColor color) {
CompositeCommand colorCmd = new CompositeCommand();
Room[] rooms = getMarkedRooms(map);
for (int i = 0; i < rooms.length; i++)
colorCmd.add(new RCmdSetColor(rooms[i].getPos(), color));
map.execute(colorCmd);
} // unmarkRooms
/** adds cmd to the room description of all marked rooms
* or replaces it if it already exists
*/
public static void replaceCommandOnMarkedRooms(AreaMap map, String cmd) {
Room[] rooms = getMarkedRooms(map);
for (int i = 0; i < rooms.length; i++)
if (rooms[i] instanceof DescObj) {
DescObj descObj = (DescObj)rooms[i];
descObj.setDesc(StringUtil.replaceMatchingLine(
descObj.getDesc().trim(), cmd));
}
map.notifyOfChange(MapEvent.ChangeDesc);
} // replaceCommandOnMarkedRooms
/** removes the first occurence of the given command from all
* room descriptions of the marked rooms
* @param map the map to search
* @param cmd the command to remove
*/
public static void removeCommandOnMarkedRooms(AreaMap map, String cmd) {
Room[] rooms = getMarkedRooms(map);
for (int i = 0; i < rooms.length; i++)
if (rooms[i] instanceof DescObj) {
DescObj descObj = (DescObj)rooms[i];
Text desc = descObj.getDesc();
int index = StringUtil.firstMatch(desc, cmd);
if (index != -1)
descObj.setDesc(desc.removeLine(index));
}
map.notifyOfChange(MapEvent.ChangeDesc);
} // removeCommandOnMarkedRooms
/** returns an array containing the positions of all existing
* rooms in map between startPos and endPos
*/
public static Point[] meanRooms(AreaMap map, Point startPos, Point endPos) {
Point[] meanPoints = MapMath.meanPoints(startPos, endPos);
// check if rooms exist at mean positions
Vector meanRoomVector = new Vector();
for (int i = 0; i < meanPoints.length; i++)
if (map.getRoom(meanPoints[i]) != null)
meanRoomVector.add(meanPoints[i]);
Point[] meanRoomArray = new Point[meanRoomVector.size()];
meanRoomVector.copyInto(meanRoomArray);
return meanRoomArray;
} // meanRooms
} // MapUtil