package net.sourceforge.pain.logic.transform.rom24support;
import net.sourceforge.pain.*;
import net.sourceforge.pain.data.*;
import net.sourceforge.pain.data.prototype.*;
import net.sourceforge.pain.data.type.*;
import net.sourceforge.pain.logic.fn.*;
import net.sourceforge.pain.util.*;
import java.io.*;
import java.util.*;
public final class Rom24ToPainConverter {
private static final int[] defaultMoveDice = new int[]{1, 100, 0};
private Rom24ToPainConverter() {
};
public static void transform(File areaListFile, Rom24ConversionLogListener l) throws Exception {
String path = areaListFile.getParent();
log(l, "Opening area list file for reading:"+areaListFile.getAbsolutePath());
BufferedReader reader = new BufferedReader(new FileReader(areaListFile));
log(l, "Reading area list file");
ArrayList files = new ArrayList();
try {
while (true) {
String areaFileName = reader.readLine();
if (areaFileName == null) {
break;
}
areaFileName = areaFileName.trim();
if (areaFileName.equals("$")) { // end of list
break;
}
if (!areaFileName.startsWith("#") && !areaFileName.startsWith("!")) {
files.add(path + File.separator + areaFileName);
}
}
} finally {
reader.close();
}
Log.info("Area list file read");
log(l, "Area list file read (found areas:" + files.size() + "), loading areas..");
Log.info("Loading areas..");
ArrayList areas = new ArrayList();
for (int i = 0; i < files.size(); i++) {
String fileName = (String) files.get(i);
Log.info("Loading area :" + fileName);
log(l, "Loading area:" + fileName + " , num:" + i);
Rom24AreaModel area = Rom24AreaLoader.loadArea(fileName);
if (area.areaName == null) {
throw new RuntimeException("ParseError: Area has no name:" + fileName);
}
areas.add(area);
Log.info("Area:" + fileName + " loaded OK");
}
Log.info("ROM areas parsed!");
log(l, "area loading done, importing data...");
Log.info("Creating areas and rooms");
HashMap prototypes = new HashMap(); // by VNUM;
HashMap rooms = new HashMap(); // rooms by VNUM;
HashMap resetGroupByArea = new HashMap(); // ResetGroup by rom24support area - used for reset binding
World world = Core.getWorld();
Space birthSpaceCandidate = null;
IndexedSpacesRegistry namedSpacesRegistry = world.getIndexedSpacesRegistry();
PrototypesRegistry protoRegistry = world.getPrototypesRegistry();
for (int j = 0; j < areas.size(); j++) {
Rom24AreaModel romArea = (Rom24AreaModel) areas.get(j);
SpaceGroup area = (SpaceGroup) ObjectFactory.create(SpaceGroup.class);
ResetGroup rg = (ResetGroup) ObjectFactory.create(ResetGroup.class);
rg.setResetMessage(romArea.resetMessage);
rg.setResetPeriod(Time.PULSE_PER_MIN * 3);
rg.setNextResetTime(0);
rg.setGroupInfo(romArea.areaName);
rg.setGroupId(romArea.areaName.trim());
world.getResetGroupRegistry().registerResetGroup(rg);
resetGroupByArea.put(romArea, rg);
// p.setVnum("area:" + j);
// p.setLogin(romArea.areaName);
// p.setAuthor(romArea.areaAuthor);
// p.setDesc(romArea.areaName);
// creating rooms;
for (Iterator it = romArea.rooms.values().iterator(); it.hasNext();) {
ROMRoom romRoom = (ROMRoom) it.next();
Log.info("creating room:" + romRoom.vnum);
IndexedSpace named = (IndexedSpace) ObjectFactory.create(IndexedSpace.class);
named.setSpaceUniqueId("rom24:" + romRoom.vnum);
namedSpacesRegistry.registerSpace(named);
Room room = (Room) named.addRole(Room.class);
Space space = room.asSpace();
space.setName(romRoom.name);
space.setDesc(romRoom.desc);
space.setCapacity(1000);
//!!!rInfo.setArea(romArea);
rooms.put(romRoom.vnum, room);
area.addSpace(space);
// exits will be bound later
}
//creating mobile prototypes
Log.info("Creating creatures prototypes");
Race defaultRace = (Race) world.getRaces().iterator().next(); // temporaty unprocessed
for (Iterator it = romArea.mobiles.values().iterator(); it.hasNext();) {
ROMMobile romMobile = (ROMMobile) it.next();
Log.info("creating creature prototype:" + romMobile.vnum);
PrototypeInfo p = (PrototypeInfo) ObjectFactory.create(PrototypeInfo.class);
p.setVnum("rom24creature:" + romMobile.vnum);
p.setName(romMobile.shortDesc);
PhysicalPrototype ph = (PhysicalPrototype) p.addRole(PhysicalPrototype.class);
ph.setAppearanceDesc(romMobile.lookDesc);
ph.setWeight(1);
ph.setSize(1);
InteractivePrototype ip = ph.asInteractivePrototype();
ip.setTargetList(romMobile.nameList);
ip.setInteractiveName(romMobile.shortDesc);
ip.setDesc(romMobile.longDesc);
MobilePrototype mp = (MobilePrototype) p.addRole(MobilePrototype.class);
mp.setMovePointsDice(new Dice(defaultMoveDice));
prototypes.put("creature:" + romMobile.vnum, p);
CreaturePrototype cp = (CreaturePrototype) p.addRole(CreaturePrototype.class);
cp.setHPDice(new Dice(romMobile.hitDice));
cp.setSex(romMobile.gender.equals("male") ? CreaturePrototype.SEX_MALE : romMobile.gender.equals("female") ? CreaturePrototype.SEX_FEMALE : romMobile.gender.equals("either") ? CreaturePrototype.SEX_EITHER : CreaturePrototype.SEX_UNDEFINED);
cp.setRace(defaultRace);
final SpacePrototype inventoryPrototype = (SpacePrototype) ObjectFactory.create(SpacePrototype.class);
inventoryPrototype.setSpaceName("Inventory");
inventoryPrototype.setSpaceDesc("");
inventoryPrototype.setCapacity(Integer.MAX_VALUE);
cp.setInventoryPrototype(inventoryPrototype);
protoRegistry.registerPrototype(p);
}
//creating object prototypes
Log.info("Creating thing prototypes");
for (Iterator it = romArea.objects.values().iterator(); it.hasNext();) {
ROMObject romObject = (ROMObject) it.next();
Log.info("creating thing prototype:" + romObject.vnum);
PrototypeInfo p = (PrototypeInfo) ObjectFactory.create(PrototypeInfo.class);
p.setName(romObject.shortDesc);
p.setVnum("rom24thing:" + romObject.vnum);
PhysicalPrototype ph = (PhysicalPrototype) p.addRole(PhysicalPrototype.class);
ph.setAppearanceDesc(romObject.longDesc);
ph.setWeight(1);
ph.setSize(1);
InteractivePrototype ip = ph.asInteractivePrototype();
ip.setTargetList(romObject.nameList);
ip.setInteractiveName(romObject.shortDesc);
ip.setDesc(romObject.longDesc);
prototypes.put("thing:" + romObject.vnum, p);
protoRegistry.registerPrototype(p);
}
}
// binding room exits
// and resets
log(l, "linking rooms and creating resets...");
Log.info("Creating exits and resets");
for (int j = 0; j < areas.size(); j++) {
Rom24AreaModel romArea = (Rom24AreaModel) areas.get(j);
ResetGroup rg = (ResetGroup) resetGroupByArea.get(romArea);
for (Iterator it = romArea.rooms.values().iterator(); it.hasNext();) {
ROMRoom romRoom = (ROMRoom) it.next();
Room room1 = (Room) rooms.get(romRoom.vnum);
Space space1 = room1.asSpace();
for (int i = 0; i < romRoom.exits.length; i++) {
if (romRoom.exits[i] != null) {
if (birthSpaceCandidate == null) {
if (space1.getName().toLowerCase().indexOf("temple") > 0) {
birthSpaceCandidate = space1;
}
}
Room room2 = (Room) rooms.get(romRoom.exits[i]);
if (room2 == null) {
continue;
}
Exit exit1to2 = (Exit) ObjectFactory.create(Exit.class);
exit1to2.setTargetRoom(room2);
exit1to2.setExitDesc(romRoom.exitsDescs[i]);
exit1to2.setMoveConst(1);
room1.setExit(i, exit1to2);
}
}
if (romRoom.resets.size() > 0) {
for (int r = 0; r < romRoom.resets.size(); r++) {
Object romReset = romRoom.resets.get(r);
PrototypeInfo p;
if (romReset instanceof ROMMobileReset) {
ROMMobileReset mreset = (ROMMobileReset) romReset;
Log.info("mob reset :" + mreset.mob.vnum);
p = (PrototypeInfo) prototypes.get("creature:" + mreset.mob.vnum);
} else {// this is ROMObjectReset
ROMObjectReset oreset = (ROMObjectReset) romReset;
Log.info("obj reset :" + oreset.obj.vnum);
p = (PrototypeInfo) prototypes.get("thing:" + oreset.obj.vnum);
}
if (p == null) {
Log.warn("Prototype is not found for reset:" + romReset.toString() + "space vnum:" + romRoom.vnum + " space name:" + romRoom.name);
} else {
SpaceReset reset = (SpaceReset) ObjectFactory.create(SpaceReset.class);
reset.setResettedPrototype(p);
reset.setLocation(space1);
RelocateFn.addToSpace(space1, reset.asLocated());
rg.addReset(reset.asReset());
}
}
}
}// rooms
} // areas
if (birthSpaceCandidate == null && world.getDefaultBirthSpace() == null) {
// any space
world.setDefaultBirthSpace((Space) rooms.values().iterator().next());
}
Log.info("schema converted OK!");
log(l, "convertion done!");
log(l, "{w Note: {c rooms vnums adjusted with rom24:<vnum> prefix");
log(l, "{c use 'goto' or builders 'link' command to check (example: goto rom24:3001){x");
}
private static void log(Rom24ConversionLogListener l, String message) {
if (l != null) {
l.onConversionMessage(message);
}
}
// adding one dir way from the initial space1 to rom world
// Room room = (Room) rooms.values().iterator().next();
// IndexedSpace initial = namedSpacesRegistry.getSpace("initial");
// Room link = (Room) initial.getRole(Room.class);
// if (link == null) {
// link = (Room) initial.addRole(Room.class);
// }
// Exit e = (Exit) ObjectFactory.create(Exit.class);
// link.setExit(Room.DIR_DOWN, e);
// e.setTargetRoom(room);
}