package mapmaker;
import java.util.*;
import javax.swing.*;
import java.io.*;
import util.*;
/** used to convert a map into a ROM file
*/
public class RomConverter
implements MapConverter {
protected static final String STRING_TERM = "~";
protected static final String[] ROM_FLAG_NAMES =
{ "A", "C", "D", "J", "K", "L", "M", "N" };
protected String getRoomName(Room room) {
return RomConverterTool.getRoomName(room) + STRING_TERM;
} // getRoomName
protected Text getRoomDesc(Room room) {
Text roomDesc = RomConverterTool.getRoomDesc(room);
roomDesc.append(STRING_TERM);
return roomDesc;
} // getRoomDesc
/** returns a String representing the proper roomflags for
* the given room as needed in ROM area file
*/
protected String getRomRoomFlags(Room room) {
String flagString = "";
boolean[] flags = RomConverterTool.getRoomFlags(room);
for (int i = 0; i < ROM_FLAG_NAMES.length; i++)
if (flags[i])
flagString += ROM_FLAG_NAMES[i];
if (flagString.length() == 0)
return "0";
else
return flagString;
} // getRomRoomFlags
/** converts the given map into an array of strings that
* represents the map in Rom format
*/
public Text mapToText(AreaMap map, int startVnum, String fileName) {
Room[] rooms = map.getRooms();
NoEqualValuesMap roomVnums =
RomConverterTool.assignVnums(rooms, startVnum);
Text out = new Text();
// the #AREA section
out.append("#AREA");
// file name
out.append(fileName + STRING_TERM);
// area name
String areaName = "noname";
if (map instanceof DescObj) {
String mapName = MapDescParser.get().getName(((DescObj)map).getDesc());
if (mapName.length() > 0)
areaName = mapName;
}
out.append(areaName + STRING_TERM);
// area command line
out.append("{?? ??} MapMaker " + areaName + STRING_TERM);
// get maximum vnum -> area vnums
int maxVnum = 0;
Iterator it = roomVnums.values().iterator();
while (it.hasNext()) {
int vnum = ((Integer)it.next()).intValue();
if (vnum > maxVnum)
maxVnum = vnum;
}
// range of vnums must be from __00 - __99
int lastVnum = startVnum + 99;
while (lastVnum < maxVnum)
lastVnum += 100;
out.append(startVnum + " " + lastVnum);
out.append("");
// the #ROOMS section
out.append("#ROOMS");
for (int i = 0; i < rooms.length; i++) {
if (!(rooms[i] instanceof VirtualRoom)) {
// append non-link data
out.append("#" + roomVnums.get(rooms[i]));
out.append(getRoomName(rooms[i]));
out.append(getRoomDesc(rooms[i]));
out.append("0 " +
getRomRoomFlags(rooms[i]) + " " +
RomConverterTool.getRoomSector(rooms[i]));
// append links
for (int dir = 0; dir < Dir.DIRNR; dir++)
if (rooms[i].exitLinked(dir) && !rooms[i].exitBlocked(dir)) {
Room exitRoom =
RomConverterTool.getExitRoom(rooms[i], rooms[i].getLink(dir));
// exitRoom can be null -> no exit
if (exitRoom != null) {
out.append("D" + Dir.mercID(dir));
out.append(STRING_TERM);
out.append(STRING_TERM);
out.append("0 0 " + roomVnums.get(exitRoom));
}
}
// finish room
out.append("S");
}
} // for (rooms)
out.append("#0");
out.append("");
// the #$ section
out.append("#$");
return out;
} // mapToText
} // RomConverter