/
maps/
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