package net.sourceforge.pain.util.rom;
import net.sourceforge.pain.data.*;
import net.sourceforge.pain.data.prototype.*;
import net.sourceforge.pain.data.type.*;
import net.sourceforge.pain.db.*;
import net.sourceforge.pain.util.*;
import net.sourceforge.pain.*;
import net.sourceforge.pain.logic.fn.*;
import java.io.*;
import java.util.*;
public final class Rom24ToPainConverter {
private static final int[] defaultMoveDice = new int[]{1, 100, 0};
private Rom24ToPainConverter() {
};
public static PainDB db = null;
public static void main(String[] args) throws Exception {
if (args.length < 2 || args[0] == null || args[1] == null) {
System.err.println("Usage: <db file name> <area list file name>");
return;
}
Log.info("Creating DB...");
db = new PainDB(args[0]);
db.ALLOW_PLAIN_WRITE = true;
Core.setDB(db);
Log.info("DB created");
Log.info("Reading area list file..");
File file = new File(args[1]);
if (!file.exists()) {
throw new RuntimeException("file " + args[1] + " not exists");
}
if (file.isDirectory()) {
throw new RuntimeException("file " + args[1] + " is directory");
}
String path = file.getParent();
BufferedReader reader = new BufferedReader(new FileReader(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.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);
Rom24AreaLoader area = new Rom24AreaLoader(fileName);
area.load();
if (area.areaName == null) {
Log.warn("Area without name! file:" + fileName + " SKIPPING");
continue;
}
areas.add(area);
Log.info("Area:" + fileName + " loaded OK");
}
Log.info("ROM areas parsed!");
// loading finished! converting
Log.info("Creating world");
World world = (World) db.getRoot();
if (world == null) {
world = Launcher.DatabaseConstructor.createSmallFantasyWorld(db);//:)
db.setRoot(world);
}
world.setName("some world");
Log.info("Creating areas and rooms");
HashMap prototypes = new HashMap(); // by VNUM;
HashMap spaces = new HashMap(); // room space by VNUM;
HashMap resetGroupByArea = new HashMap(); // ResetGroup by rom area - used for reset binding
Space birthSpaceCandidate = null;
IndexedSpacesRegistry namedSpacesRegistry = world.getIndexedSpacesRegistry();
for (int j = 0; j < areas.size(); j++) {
Rom24AreaLoader romArea = (Rom24AreaLoader) 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(romRoom.vnum);
namedSpacesRegistry.registerSpace(named);
Space room = named.asSpace();
room.setName(romRoom.name);
room.setDesc(romRoom.desc);
room.setCapacity(1000);
//!!!rInfo.setArea(romArea);
spaces.put(romRoom.vnum, room);
area.addSpace(room);
// 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("creature:" + romMobile.vnum);
p.setName(romMobile.shortDesc);
LifeFormPrototype lfp = (LifeFormPrototype) p.addRole(LifeFormPrototype.class);
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);
lfp.setLifePointsDice(new Dice(romMobile.hitDice));
lfp.setSex(romMobile.gender.equals("male") ? LifeFormPrototype.SEX_MALE : romMobile.gender.equals("female") ? LifeFormPrototype.SEX_FEMALE : romMobile.gender.equals("either") ? LifeFormPrototype.SEX_EITHER : LifeFormPrototype.SEX_UNDEFINED);
lfp.setRace(defaultRace);
MobilePrototype mp = (MobilePrototype) p.addRole(MobilePrototype.class);
mp.setMovePointsDice(new Dice(defaultMoveDice));
prototypes.put("creature:" + romMobile.vnum, p);
EquippedPrototype eqp = (EquippedPrototype) p.addRole(EquippedPrototype.class);
final SpacePrototype inventoryPrototype = (SpacePrototype) ObjectFactory.create(SpacePrototype.class);
inventoryPrototype.setSpaceName("Inventory");
inventoryPrototype.setSpaceDesc("");
inventoryPrototype.setCapacity(Integer.MAX_VALUE);
eqp.setInventoryPrototype(inventoryPrototype);
}
//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("thing:" + 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.setDesc(romObject.shortDesc);
prototypes.put("thing:" + romObject.vnum, p);
}
}
// binding room exits
// and resets
Log.info("Creating exits and resets");
for (int j = 0; j < areas.size(); j++) {
Rom24AreaLoader romArea = (Rom24AreaLoader) areas.get(j);
ResetGroup rg = (ResetGroup) resetGroupByArea.get(romArea);
for (Iterator it = romArea.rooms.values().iterator(); it.hasNext();) {
ROMRoom romRoom = (ROMRoom) it.next();
Space space1 = (Space) spaces.get(romRoom.vnum);
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;
}
}
Space space2 = (Space) spaces.get(romRoom.exits[i]);
if (space2 == null) {
continue;
}
LinkedSpace link1 = (LinkedSpace) (space1.is(LinkedSpace.class) ? space1.getRole(LinkedSpace.class) : space1.addRole(LinkedSpace.class));
// LinkedSpace link2 = (LinkedSpace) (space2.is(LinkedSpace.class) ? space2.getRole(LinkedSpace.class) : space2.addRole(LinkedSpace.class));
Exit exit1 = (Exit) ObjectFactory.create(Exit.class);
// Exit exit2 = (Exit) ObjectFactory.create(Exit.class);
exit1.setTargetSpace(space2);
exit1.setExitDesc(romRoom.exitsDescs[i]);
exit1.setMoveConst(1);
link1.setExit(i, exit1);
// link2.setExit(LinkedSpace.reverseDir[i], exit2);
// exit2.setTargetSpace(space1);
}
}
// adding one dir way from the initial space1 to our world
Space sp = (Space) spaces.values().iterator().next();
IndexedSpace initial = namedSpacesRegistry.getSpace("initial");
LinkedSpace link = (LinkedSpace) initial.getRole(LinkedSpace.class);
if (link == null) {
link = (LinkedSpace) initial.addRole(LinkedSpace.class);
}
Exit e = (Exit) ObjectFactory.create(Exit.class);
link.setExit(LinkedSpace.DIR_DOWN, e);
e.setTargetSpace(sp);
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() + "space1:" + romRoom.vnum + " space1 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) spaces.values().iterator().next());
}
Log.debug("commiting!");
db.flush();
Log.info("schema converted OK!");
db.close();
}
}