package com.planet_ink.coffee_mud.Commands;
import com.planet_ink.coffee_mud.core.interfaces.*;
import com.planet_ink.coffee_mud.core.*;
import com.planet_ink.coffee_mud.Abilities.interfaces.*;
import com.planet_ink.coffee_mud.Areas.interfaces.*;
import com.planet_ink.coffee_mud.Behaviors.interfaces.*;
import com.planet_ink.coffee_mud.CharClasses.interfaces.*;
import com.planet_ink.coffee_mud.Commands.interfaces.*;
import com.planet_ink.coffee_mud.Common.interfaces.*;
import com.planet_ink.coffee_mud.Exits.interfaces.*;
import com.planet_ink.coffee_mud.Items.interfaces.*;
import com.planet_ink.coffee_mud.Locales.interfaces.*;
import com.planet_ink.coffee_mud.MOBS.interfaces.*;
import com.planet_ink.coffee_mud.Races.interfaces.*;
import java.util.*;
import java.io.IOException;
/*
Copyright 2000-2006 Bo Zimmerman
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
public class Import extends StdCommand
{
public Import(){}
private String[] access={"IMPORT"};
public String[] getAccessWords(){return access;}
public static final String[][] objDescs={
{"silver",""+RawMaterial.RESOURCE_STEEL},
{"gold",""+RawMaterial.RESOURCE_GOLD},
{"iron",""+RawMaterial.RESOURCE_IRON},
{"dragonscales",""+RawMaterial.RESOURCE_SCALES},
{"dragonscale",""+RawMaterial.RESOURCE_SCALES},
{"mithril",""+RawMaterial.RESOURCE_MITHRIL},
{"animal fur",""+RawMaterial.RESOURCE_FUR},
{"stone",""+RawMaterial.RESOURCE_STONE},
{"platinum",""+RawMaterial.RESOURCE_PLATINUM},
{"soft leather",""+RawMaterial.RESOURCE_LEATHER},
{"plant",""+RawMaterial.RESOURCE_FLOWERS},
{"kid leather",""+RawMaterial.RESOURCE_HIDE},
{"shell",""+RawMaterial.RESOURCE_EGGS},
{"tin",""+RawMaterial.RESOURCE_TIN},
{"bone",""+RawMaterial.RESOURCE_BONE},
{"plastic",""+RawMaterial.RESOURCE_PLASTIC},
{"kevlar",""+RawMaterial.RESOURCE_PLASTIC},
{"Dew",""+RawMaterial.RESOURCE_FRESHWATER},
{"dew",""+RawMaterial.RESOURCE_FRESHWATER},
{"adamantite",""+RawMaterial.RESOURCE_ADAMANTITE},
{"admantite",""+RawMaterial.RESOURCE_ADAMANTITE},
{"marble",""+RawMaterial.RESOURCE_MARBLE},
{"nothingness",""+RawMaterial.RESOURCE_NOTHING},
{"hard leather",""+RawMaterial.RESOURCE_LEATHER},
{"feathers",""+RawMaterial.RESOURCE_FEATHERS},
{"ash",""+RawMaterial.RESOURCE_DUST},
{"snakeskin",""+RawMaterial.RESOURCE_SCALES},
{"fire",""+RawMaterial.RESOURCE_ENERGY},
{"gut",""+RawMaterial.RESOURCE_MEAT},
{"food",""+RawMaterial.RESOURCE_MEAT},
{"unknown",""+RawMaterial.RESOURCE_LEATHER},
{"onyx",""+RawMaterial.RESOURCE_STONE},
{"A oldstyle",""+RawMaterial.RESOURCE_WOOD},
{"a oldstyle",""+RawMaterial.RESOURCE_WOOD},
{"Other",""+RawMaterial.RESOURCE_WOOD},
{"other",""+RawMaterial.RESOURCE_WOOD},
{"etherealness",""+RawMaterial.RESOURCE_NOTHING},
{"target",""+RawMaterial.RESOURCE_LEATHER},
{"pill",""+RawMaterial.RESOURCE_CORN},
{"potion",""+RawMaterial.RESOURCE_GLASS},
{"rubies",""+RawMaterial.RESOURCE_GEM},
{"magic",""+RawMaterial.RESOURCE_ENERGY},
{"alcohol",""+RawMaterial.RESOURCE_GLASS},
{"beer",""+RawMaterial.RESOURCE_GLASS},
{"sword",""+RawMaterial.RESOURCE_IRON},
{"glas",""+RawMaterial.RESOURCE_GLASS},
{"bamboo",""+RawMaterial.RESOURCE_WOOD},
{"linen",""+RawMaterial.RESOURCE_COTTON},
{"book",""+RawMaterial.RESOURCE_PAPER},
{"shadow",""+RawMaterial.RESOURCE_NOTHING},
{"light",""+RawMaterial.RESOURCE_ENERGY},
{"corundum",""+RawMaterial.RESOURCE_STONE},
{"skin",""+RawMaterial.RESOURCE_HIDE},
{"air",""+RawMaterial.RESOURCE_NOTHING},
{"hair",""+RawMaterial.RESOURCE_FUR},
{"parchment",""+RawMaterial.RESOURCE_PAPER},
{"grain",""+RawMaterial.RESOURCE_WHEAT},
{"steele",""+RawMaterial.RESOURCE_STEEL},
{"dragonskin",""+RawMaterial.RESOURCE_SCALES},
{"granite",""+RawMaterial.RESOURCE_GRANITE},
{"pottery",""+RawMaterial.RESOURCE_CLAY},
{"pottery",""+RawMaterial.RESOURCE_CLAY},
{"liqued",""+RawMaterial.RESOURCE_FRESHWATER},
{"wax",""+RawMaterial.RESOURCE_WAX},
{"drink",""+RawMaterial.RESOURCE_FRESHWATER},
{"steel",""+RawMaterial.RESOURCE_STEEL},
{"lead",""+RawMaterial.RESOURCE_LEAD},
{"bronze",""+RawMaterial.RESOURCE_BRONZE},
{"copper",""+RawMaterial.RESOURCE_COPPER},
{"brass",""+RawMaterial.RESOURCE_BRASS},
{"platinium",""+RawMaterial.RESOURCE_PLATINUM},
{"titanium",""+RawMaterial.RESOURCE_STEEL},
{"aliminum",""+RawMaterial.RESOURCE_TIN},
{"aluminum",""+RawMaterial.RESOURCE_TIN},
{"metal",""+RawMaterial.RESOURCE_IRON},
{"wood",""+RawMaterial.RESOURCE_WOOD},
{"ebony",""+RawMaterial.RESOURCE_EBONY},
{"ice",""+RawMaterial.RESOURCE_CRYSTAL},
{"energy",""+RawMaterial.RESOURCE_ENERGY},
{"hardwood",""+RawMaterial.RESOURCE_BALSA},
{"softwood",""+RawMaterial.RESOURCE_OAK},
{"flesh",""+RawMaterial.RESOURCE_MEAT},
{"silk",""+RawMaterial.RESOURCE_SILK},
{"wool",""+RawMaterial.RESOURCE_WOOL},
{"cloth",""+RawMaterial.RESOURCE_COTTON},
{"fur",""+RawMaterial.RESOURCE_FUR},
{"water",""+RawMaterial.RESOURCE_FRESHWATER},
{"oak",""+RawMaterial.RESOURCE_OAK},
{"ivory",""+RawMaterial.RESOURCE_IVORY},
{"diamond",""+RawMaterial.RESOURCE_DIAMOND},
{"pearl",""+RawMaterial.RESOURCE_PEARL},
{"gem",""+RawMaterial.RESOURCE_GEM},
{"ruby",""+RawMaterial.RESOURCE_GEM},
{"obsidian",""+RawMaterial.RESOURCE_OBSIDIAN},
{"lead",""+RawMaterial.RESOURCE_LEAD},
{"leather",""+RawMaterial.RESOURCE_LEATHER},
{"glass",""+RawMaterial.RESOURCE_GLASS},
{"vellum",""+RawMaterial.RESOURCE_HIDE},
{"crystal",""+RawMaterial.RESOURCE_CRYSTAL},
{"clay",""+RawMaterial.RESOURCE_CLAY},
{"china",""+RawMaterial.RESOURCE_CHINA},
{"paper",""+RawMaterial.RESOURCE_PAPER},
{"adamantium",""+RawMaterial.RESOURCE_ADAMANTITE},
{"amethyst",""+RawMaterial.RESOURCE_AMETHYST},
{"bearskin",""+RawMaterial.RESOURCE_FUR},
{"blood",""+RawMaterial.RESOURCE_BLOOD},
{"bread",""+RawMaterial.RESOURCE_BREAD},
{"burlap",""+RawMaterial.RESOURCE_HEMP},
{"canvas",""+RawMaterial.RESOURCE_HEMP},
{"cashmire",""+RawMaterial.RESOURCE_WOOL},
{"coal",""+RawMaterial.RESOURCE_COAL},
{"cookie",""+RawMaterial.RESOURCE_CRACKER},
{"coral",""+RawMaterial.RESOURCE_SEAWEED},
{"Daggwood",""+RawMaterial.RESOURCE_WOOD},
{"daggwood",""+RawMaterial.RESOURCE_WOOD},
{"ethereal",""+RawMaterial.RESOURCE_NOTHING},
{"felt",""+RawMaterial.RESOURCE_WOOL},
{"fish",""+RawMaterial.RESOURCE_FISH},
{"flame",""+RawMaterial.RESOURCE_ENERGY},
{"flower",""+RawMaterial.RESOURCE_FLOWERS},
{"fruit",""+RawMaterial.RESOURCE_FRUIT},
{"golden",""+RawMaterial.RESOURCE_GOLD},
{"ink",""+RawMaterial.RESOURCE_BLOOD},
{"iron-wood",""+RawMaterial.RESOURCE_IRONWOOD},
{"jade",""+RawMaterial.RESOURCE_JADE},
{"kalarit",""+RawMaterial.RESOURCE_LEATHER},
{"lapis",""+RawMaterial.RESOURCE_GEM},
{"malachite",""+RawMaterial.RESOURCE_COPPER},
{"meat",""+RawMaterial.RESOURCE_MEAT},
{"none",""+RawMaterial.RESOURCE_NOTHING},
{"oil",""+RawMaterial.RESOURCE_LAMPOIL},
{"parafin",""+RawMaterial.RESOURCE_LAMPOIL},
{"pewter",""+RawMaterial.RESOURCE_TIN},
{"pie",""+RawMaterial.RESOURCE_CRACKER},
{"plant_organism",""+RawMaterial.RESOURCE_GREENS},
{"porcelain",""+RawMaterial.RESOURCE_CHINA},
{"quartz",""+RawMaterial.RESOURCE_CRYSTAL},
{"ruby-silver-diamond",""+RawMaterial.RESOURCE_GEM},
{"sapphire",""+RawMaterial.RESOURCE_GEM},
{"shadows",""+RawMaterial.RESOURCE_NOTHING},
{"tatamite",""+RawMaterial.RESOURCE_ADAMANTITE},
{"velvet",""+RawMaterial.RESOURCE_SILK},
{"wood-iron",""+RawMaterial.RESOURCE_IRONWOOD},
{"soft leather",""+RawMaterial.RESOURCE_LEATHER},
{"balm",""+RawMaterial.RESOURCE_WAX},
{"elastic",""+RawMaterial.RESOURCE_PLASTIC},
{"hemp",""+RawMaterial.RESOURCE_HEMP},
{"cork",""+RawMaterial.RESOURCE_WOOD},
{"sponge",""+RawMaterial.RESOURCE_WOOL},
{"rubber",""+RawMaterial.RESOURCE_RUBBER},
{"unique",""+RawMaterial.RESOURCE_WOOD},
{"satin",""+RawMaterial.RESOURCE_SILK},
{"horn",""+RawMaterial.RESOURCE_BONE},
{"bark",""+RawMaterial.RESOURCE_WOOD},
{"Fabric",""+RawMaterial.RESOURCE_COTTON},
{"Other",""+RawMaterial.RESOURCE_WOOD},
{"Cord",""+RawMaterial.RESOURCE_HEMP},
{"velum",""+RawMaterial.RESOURCE_PAPER},
{"clothe",""+RawMaterial.RESOURCE_COTTON},
{"beef",""+RawMaterial.RESOURCE_BEEF},
{"dough",""+RawMaterial.RESOURCE_BREAD},
{"chicken",""+RawMaterial.RESOURCE_POULTRY},
{"bagel",""+RawMaterial.RESOURCE_BREAD},
{"fries",""+RawMaterial.RESOURCE_POTATOES},
{"chicken",""+RawMaterial.RESOURCE_POULTRY},
{"cheese",""+RawMaterial.RESOURCE_CHEESE},
{"chalk",""+RawMaterial.RESOURCE_STONE},
{"cotton",""+RawMaterial.RESOURCE_COTTON},
{"electrum",""+RawMaterial.RESOURCE_SILVER},
{"wooden",""+RawMaterial.RESOURCE_WOOD},
{"cardboard",""+RawMaterial.RESOURCE_PAPER},
{"petals",""+RawMaterial.RESOURCE_FLOWERS},
{"lace",""+RawMaterial.RESOURCE_SILK},
{"fabric",""+RawMaterial.RESOURCE_COTTON},
{"flannel",""+RawMaterial.RESOURCE_WOOL},
{"Lightning",""+RawMaterial.RESOURCE_ENERGY},
{"lightning",""+RawMaterial.RESOURCE_ENERGY},
{"rawhide",""+RawMaterial.RESOURCE_LEATHER},
{"pine",""+RawMaterial.RESOURCE_PINE},
{"cream",""+RawMaterial.RESOURCE_MILK},
{"cheeseskin",""+RawMaterial.RESOURCE_PLASTIC},
{"fiberglass",""+RawMaterial.RESOURCE_COTTON},
{"leopard",""+RawMaterial.RESOURCE_HIDE},
{"tobacco",""+RawMaterial.RESOURCE_PIPEWEED},
{"flowers",""+RawMaterial.RESOURCE_FLOWERS},
{"emerald",""+RawMaterial.RESOURCE_GEM},
{"coffee",""+RawMaterial.RESOURCE_COFFEEBEANS},
{"turnip",""+RawMaterial.RESOURCE_GREENS},
{"nickel",""+RawMaterial.RESOURCE_SILVER},
{"yew",""+RawMaterial.RESOURCE_WOOD},
{"mahogany",""+RawMaterial.RESOURCE_WOOD},
{"alligator",""+RawMaterial.RESOURCE_SCALES},
{"potatoes",""+RawMaterial.RESOURCE_POTATOES},
{"yeast",""+RawMaterial.RESOURCE_BREAD},
{"pork",""+RawMaterial.RESOURCE_PORK},
{"turkey",""+RawMaterial.RESOURCE_POULTRY},
{"stew",""+RawMaterial.RESOURCE_MEAT},
{"chili",""+RawMaterial.RESOURCE_MEAT},
{"wonton",""+RawMaterial.RESOURCE_MEAT},
{"sandstone",""+RawMaterial.RESOURCE_STONE},
{"vevet",""+RawMaterial.RESOURCE_SILK},
{"lether",""+RawMaterial.RESOURCE_LEATHER},
{"(null)",""+RawMaterial.RESOURCE_NOTHING}
};
protected static String getAreaName(Vector V)
{
V=(Vector)V.clone();
// find area line first
String areaName="";
String firstLine=nextLine(V);
if((firstLine.indexOf("~")>=0)&&(firstLine.indexOf("}")>=0))
{
String areaLine=firstLine;
areaLine=areaLine.substring(0,areaLine.length()-1);
int x=areaLine.indexOf("}");
areaLine=areaLine.substring(x+1).trim();
x=areaLine.indexOf(" ");
if(x>0)
areaLine=areaLine.substring(x+1).trim();
areaName=areaLine;
}
else
if((firstLine.indexOf("~")>=0)
&&(firstLine.startsWith("#AREA "))
&&(firstLine.toUpperCase().indexOf(".ARE")<0))
{
String areaLine=firstLine;
areaLine=areaLine.substring(5).trim();
if(areaLine.endsWith("~"))
areaLine=areaLine.substring(0,areaLine.length()-1).trim();
areaName=areaLine;
}
else
if(V.size()>1)
{
String lineAfter=(String)V.elementAt(1);
if(lineAfter.indexOf("~")<0)
return "";
lineAfter=lineAfter.substring(0,lineAfter.length()-1);
if((lineAfter.indexOf(".are")>=0)&&(V.size()>2)&&(lineAfter.indexOf("@@")<0))
{
lineAfter=(String)V.elementAt(2);
if(lineAfter.indexOf("~")<0)
return "";
lineAfter=lineAfter.substring(0,lineAfter.length()-1);
areaName=lineAfter.trim();
}
else
areaName=lineAfter.trim();
}
if(areaName.toUpperCase().startsWith("NAME "))
{
if((areaName.length()>=41)
&&(areaName.charAt(12)=='{')
&&(areaName.charAt(21)!=' ')
&&(areaName.charAt(40)==' '))
areaName=areaName.substring(21,41).trim();
else
if((areaName.length()>13)&&((areaName.charAt(12)=='{')||(areaName.charAt(13)=='{')))
{
int x=areaName.indexOf("}",12);
if(x>12)
areaName=areaName.substring(x+1).trim();
else
areaName=areaName.substring(5).trim();
}
else
areaName=areaName.substring(5).trim();
}
if((areaName.indexOf(""+((char)27))>=0)
||(areaName.indexOf("&")>=0)
||(areaName.indexOf("{")>=0)
||(areaName.indexOf("@@")>=0))
{
for(int s1=0;s1<colors.length;s1++)
if(areaName.indexOf(colors[s1][0])>=0)
areaName=CMStrings.replaceAll(areaName,colors[s1][0],colors[s1][1]);
}
return CMStrings.removeColors(CMLib.coffeeFilter().safetyFilter(areaName));
}
protected static void processRoomRelinks(Vector reLinkTable, String areaName, Hashtable hashedRoomSet)
{
// try to re-link olde room links
if(reLinkTable!=null)
for(int r=0;r<reLinkTable.size();r++)
{
String link=(String)reLinkTable.elementAt(r);
String nextLink="";
if(r<(reLinkTable.size()-1))
nextLink=(String)reLinkTable.elementAt(r+1);
int s1=link.indexOf("/");
int s2=link.lastIndexOf("/");
String sourceRoomID=link.substring(0,s1);
synchronized(("SYNC"+sourceRoomID).intern())
{
int direction=CMath.s_int(link.substring(s1+1,s2));
String destRoomID=link.substring(s2+1);
Room sourceRoom=CMLib.map().getRoom(hashedRoomSet,areaName,sourceRoomID);
Room destRoom=CMLib.map().getRoom(hashedRoomSet,areaName,destRoomID);
if((sourceRoom==null)||(destRoom==null))
Log.errOut("Import","Relink error: "+sourceRoomID+"="+sourceRoom+"/"+destRoomID+"="+destRoom);
else
{
sourceRoom.rawDoors()[direction]=destRoom;
if(((!hashedRoomSet.containsValue(sourceRoom)))
&&((nextLink.length()==0)||(!nextLink.startsWith(sourceRoomID+"/"))))
CMLib.database().DBUpdateExits(sourceRoom);
}
}
}
}
protected static boolean temporarilyDeleteArea(MOB mob, Vector reLinkTable, String areaName)
{
if((mob!=null)&&(CMLib.flags().isInTheGame(mob,true)&&(mob.location().getArea().Name().equalsIgnoreCase(areaName))))
{
mob.tell("You dip! You are IN that area! Leave it first...");
return false;
}
try
{
for(Enumeration r=CMLib.map().rooms();r.hasMoreElements();)
{
Room R=(Room)r.nextElement();
if(!R.getArea().Name().equalsIgnoreCase(areaName))
for(int d=0;d<Directions.NUM_DIRECTIONS;d++)
{
Room dirR=R.rawDoors()[d];
if((dirR!=null)&&(dirR.getArea().Name().equalsIgnoreCase(areaName)))
reLinkTable.addElement(R.roomID()+"/"+d+"/"+dirR.roomID());
}
}
}catch(NoSuchElementException e){}
while(true)
{
Room foundOne=null;
try
{
for(Enumeration r=CMLib.map().rooms();r.hasMoreElements();)
{
Room R=(Room)r.nextElement();
if(R.getArea().Name().equalsIgnoreCase(areaName))
{
foundOne=R;
break;
}
}
}catch(NoSuchElementException e){}
if(foundOne==null)
break;
CMLib.map().obliterateRoom(foundOne);
}
Area A1=CMLib.map().getArea(areaName);
if(A1!=null)
{
CMLib.database().DBDeleteArea(A1);
CMLib.map().delArea(A1);
}
return true;
}
protected static String getAreaAuthor(Vector V)
{
V=(Vector)V.clone();
for(int v=0;v<V.size();v++)
{
String s=((String)V.elementAt(v)).trim();
if(s.toUpperCase().startsWith("#AUTHOR "))
{
s=s.substring(8).trim();
if(s.endsWith("~"))
s=s.substring(0,s.length()-1).trim();
return s;
}
else
if(s.toUpperCase().startsWith("BUILDERS "))
{
s=s.substring(9).trim();
if(s.endsWith("~"))
s=s.substring(0,s.length()-1).trim();
if((s.length()==0)||(s.toUpperCase().equalsIgnoreCase("NONE")))
continue;
return s;
}
else
if((s.toUpperCase().startsWith("NAME "))
&&(s.indexOf("{")>0))
{
s=s.substring(5).trim();
if(s.endsWith("~"))
s=s.substring(0,s.length()-1).trim();
if(CMParms.parse(s).size()>0)
s=(String)CMParms.parse(s).lastElement();
if((s.length()==0)||(s.toUpperCase().equalsIgnoreCase("NONE")))
continue;
return s;
}
else
if((s.toUpperCase().startsWith("#AREA "))
&&(s.indexOf("{")>0))
{
s=s.substring(6).trim();
if(s.trim().startsWith("{"))
{
int x=s.trim().indexOf("}");
if(x>0) s=s.substring(x+1).trim();
if(s.endsWith("~"))
s=s.substring(0,s.length()-1).trim();
x=s.indexOf(" ");
if((x>1)
&&(s.substring(0,x).trim().toUpperCase().equals("THE"))
&&(CMParms.parse(s).size()>0))
s=(String)CMParms.parse(s).lastElement();
else
if(x>1)
s=s.substring(0,x).trim();
if((s.length()==0)||(s.toUpperCase().equalsIgnoreCase("NONE")))
continue;
return s;
}
}
else
if(s.trim().startsWith("O ")&&(s.trim().endsWith("~")))
{
s=s.substring(1).trim();
if(s.endsWith("~"))
s=s.substring(0,s.length()-1).trim();
if((s.length()==0)||(s.toUpperCase().equalsIgnoreCase("NONE")))
continue;
return s;
}
else
if(s.toUpperCase().startsWith("CREDITS "))
{
s=s.substring(8).trim();
if(s.trim().startsWith("("))
continue;
if(s.trim().startsWith("{"))
{
int x=s.trim().indexOf("}");
if(x>0) s=s.substring(x+1).trim();
}
else
if((CMParms.parse(s).size()>2)
&&(CMath.isNumber((String)CMParms.parse(s).elementAt(0)))
&&(CMath.isNumber((String)CMParms.parse(s).elementAt(1))))
s=(String)CMParms.parse(s).elementAt(2);
if(s.endsWith("~"))
s=s.substring(0,s.length()-1).trim();
int x=s.indexOf(" ");
if(x>1) s=s.substring(0,x).trim();
if((s.length()==0)||(s.toUpperCase().equalsIgnoreCase("NONE")))
continue;
return s;
}
else
if(s.trim().startsWith("{"))
{
int x=s.trim().indexOf("}");
if(x>0) s=s.substring(x+1).trim();
if(s.endsWith("~"))
s=s.substring(0,s.length()-1).trim();
x=s.indexOf(" ");
if((x>1)
&&(s.substring(0,x).trim().toUpperCase().equals("THE"))
&&(CMParms.parse(s).size()>0))
s=(String)CMParms.parse(s).lastElement();
else
if(x>1)
s=s.substring(0,x).trim();
if((s.length()==0)||(s.toUpperCase().equalsIgnoreCase("NONE")))
continue;
return s;
}
else
if(s.trim().startsWith("["))
{
int x=s.trim().indexOf("]");
if(x>0) s=s.substring(x+1).trim();
if(s.endsWith("~"))
s=s.substring(0,s.length()-1).trim();
x=s.indexOf(" ");
if((x>1)
&&(s.substring(0,x).trim().toUpperCase().equals("THE"))
&&(CMParms.parse(s).size()>0))
s=(String)CMParms.parse(s).lastElement();
else
if(x>1)
s=s.substring(0,x).trim();
if((s.length()==0)||(s.toUpperCase().equalsIgnoreCase("NONE")))
continue;
return s;
}
}
return "";
}
protected static final String[][] colors={
{((char)27)+"ash"+((char)27),"^c"},
{((char)27)+"black"+((char)27),"^W"},
{((char)27)+"blood"+((char)27),"^R"},
{((char)27)+"blue"+((char)27),"^B"},
{((char)27)+"brown"+((char)27),"^Y"},
{((char)27)+"cyan"+((char)27),"^c"},
{((char)27)+"green"+((char)27),"^g"},
{((char)27)+"grey"+((char)27),"^W"},
{((char)27)+"pea"+((char)27),"^G"},
{((char)27)+"purple"+((char)27),"^P"},
{((char)27)+"red"+((char)27),"^r"},
{((char)27)+"smurf"+((char)27),"^b"},
{((char)27)+"teal"+((char)27),"^C"},
{((char)27)+"violet"+((char)27),"^p"},
{((char)27)+"white"+((char)27),"^w"},
{((char)27)+"yellow"+((char)27),"^y"},
{((char)27)+"misc"+((char)27),"^N"},
{((char)27)+"roomname"+((char)27),"^O"},
{((char)27)+"roomdesc"+((char)27),"^L"},
{((char)27)+"monster"+((char)27),"^M"},
{"_whi ","^w"},
{"_yel ","^y"},
{"_blu ","^b"},
{"_dbl ","^B"},
{"_lbl ","^C"},
{"_cya ","^c"},
{"_gre ","^g"},
{"_dgr ","^G"},
{"_cha ","^W"},
{"_dch ","^W"},
{"_pur ","^P"},
{"_red ","^r"},
{"_ora ","^Y"},
{"_bro ","^Y"},
{"_pin ","^p"},
{"_bla ",""},
{"&x",""},
{"&r","^R"},
{"&g","^G"},
{"&O","^Y"},
{"&b","^B"},
{"&p","^P"},
{"&c","^C"},
{"&w","^W"},
{"&z","^W"},
{"&R","^r"},
{"&G","^g"},
{"&Y","^y"},
{"&B","^b"},
{"&P","^p"},
{"&C","^c"},
{"&W","^w"},
{"&[",""},
{"&[","^?"},
{"{T","^C"},
{"{x","^?"},
{"{X","^?"},
{"{r","^R"},
{"{g","^G"},
{"{O","^Y"},
{"{b","^B"},
{"{p","^P"},
{"{M","^P"},
{"{m","^p"},
{"{c","^C"},
{"{w","^W"},
{"{D","^W"},
{"{z","^W"},
{"{R","^r"},
{"{G","^g"},
{"{Y","^y"},
{"{B","^b"},
{"{P","^p"},
{"{C","^c"},
{"{W","^w"},
{"{y","^Y"},
{"@@k",""},
{"@@R","^R"},
{"@@G","^G"},
{"@@b","^Y"},
{"@@B","^B"},
{"@@p","^P"},
{"@@c","^C"},
{"@@g","^W"},
{"@@d","^W"},
{"@@r","^r"},
{"@@e","^g"},
{"@@y","^y"},
{"@@l","^b"},
{"@@m","^p"},
{"@@M","^p"},
{"@@a","^c"},
{"@@W","^w"},
{"@@x","^!"},
{"@@f","^*"},
{"@@i",""},
{"@@2","^R"},
{"@@3","^G"},
{"@@4","^Y"},
{"@@1","^B"},
{"@@5","^P"},
{"@@6","^C"},
{"@@0","^W"},
{"@@7","^W"},
{"@@N","^?"}
};
protected static String nextLine(Vector V)
{
if(V.size()==0) return "";
return (String)V.elementAt(0);
}
protected static String eatLine(Vector V)
{
if(V.size()==0) return "";
String s=(String)V.elementAt(0);
V.removeElementAt(0);
return s;
}
protected static String eatNextLine(Vector V)
{
String s="";
while((s.trim().length()==0)&&(V.size()>0))
s=eatLine(V);
return s;
}
protected static Room changeRoomClass(Room R, String newClass)
{
Room R2=CMClass.getLocale(newClass);
if(R2==null)
{
Log.errOut("Import","Cannot find room class "+newClass+".");
return R;
}
Area area=R.getArea();
if(area!=null) area.delProperRoom(R);
R2.setRoomID(R.roomID());
R2.setArea(R.getArea());
if(R2.expirationDate()!=0) R2.setExpirationDate(R2.expirationDate()+(360000));
R2.setDescription(R.description());
R2.setDisplayText(R.displayText());
R2.setName(R.name());
R2.setBaseEnvStats(R.baseEnvStats());
R2.setMiscText(R.text());
return R2;
}
protected static int getBitMask(String str, int which)
{
String s=CMParms.getCleanBit(str,which);
if(s.length()==0)
return 0;
int x=s.indexOf("|");
if((x<0)&&(s.length()>0)&&(CMath.s_int(s)==0))
{
boolean otherStyle=true;
int num=0;
for(int z=0;z<s.length();z++)
if(!Character.isLetter(s.charAt(z)))
{
otherStyle=false;
break;
}
else
if(Character.isUpperCase(s.charAt(z)))
num=num|(1<<(s.charAt(z))-('A'));
else
if(Character.isLowerCase(s.charAt(z)))
num=num|(1<<(26+((s.charAt(z))-('a'))));
if(otherStyle)
return num;
}
int num=0;
while(x>0)
{
num=num|CMath.s_int(s.substring(0,x));
s=s.substring(x+1);
x=s.indexOf("|");
}
return (num|CMath.s_int(s));
}
protected static String trimSpacesOnly(String s)
{
while(s.startsWith(" ")||s.startsWith("\t")||s.startsWith("\n")||s.startsWith("\r"))
s=s.substring(1);
while(s.endsWith(" ")||s.endsWith("\t")||s.endsWith("\n")||s.endsWith("\r"))
s=s.substring(0,s.length()-1);
return s;
}
protected static String eatLineSquiggle(Vector V)
{
if(V.size()==0) return "";
String s=eatLine(V);
while(s.indexOf("~")<0)
{
String l=eatLine(V);
if(l.startsWith(" "))
s+="%0D"+l;
else
if(l.length()==0)
s+="%0D";
else
s+=" "+l;
}
s=trimSpacesOnly(s);
if(s.endsWith("~"))
s=s.substring(0,s.length()-1);
if(s.indexOf("^")>=0) s=CMStrings.replaceAll(s,"^","^^");
if((s.indexOf(""+((char)27))>=0)
||(s.indexOf("&")>=0)
||(s.indexOf("{")>=0)
||(s.indexOf("_")>=0)
||(s.indexOf("@@")>=0))
{
for(int s1=0;s1<colors.length;s1++)
if(s.indexOf(colors[s1][0])>=0)
s=CMStrings.replaceAll(s,colors[s1][0],colors[s1][1]);
}
int x=s.indexOf("@eng");
if(x>=0)
{
int y=s.indexOf("@rus",x);
if(y<x) y=s.indexOf("@ger",x);
if(y<x) y=s.indexOf("@spa",x);
if(y<x) y=s.length();
s=s.substring(x+4,y);
}
return s.trim();
}
protected static boolean hasReadableContent(String objectName)
{
objectName=objectName.toUpperCase();
if((objectName.indexOf("SIGN")>=0)
||(objectName.indexOf("PLAQUE")>=0)
||(objectName.indexOf("NOTICE")>=0)
||(objectName.indexOf("PAPER")>=0)
||(objectName.indexOf("WRITING")>=0)
||(objectName.indexOf("CARVING")>=0)
||(objectName.indexOf("LETTER")>=0)
||(objectName.indexOf("INSCRIPTION")>=0)
||(objectName.indexOf("NOTE")>=0)
||(objectName.indexOf("POST")>=0))
return true;
return false;
}
protected static String fixReadableContent(String text)
{
while(text.startsWith("%0D"))
text=text.substring(3);
if((text.toUpperCase().trim().startsWith("IT SAYS `"))
||(text.toUpperCase().trim().startsWith("IT SAYS '")))
{
text=text.trim().substring(9).trim();
if((text.endsWith("'"))||(text.endsWith("`")))
text=text.substring(0,text.length()-1);
}
if(text.toUpperCase().trim().startsWith("IT SAYS:"))
text=text.trim().substring(8).trim();
if(text.toUpperCase().trim().startsWith("IT SAYS"))
text=text.trim().substring(7).trim();
return text;
}
protected static boolean returnAnError(Session sess, String str, boolean compileErrors, Vector commands)
{
if((str==null)||(str.length()==0)) return true;
Log.errOut("Import",str);
if(sess!=null) sess.println(str);
if(compileErrors&&(commands!=null)) commands.addElement(str);
return false;
}
protected static void importCustomFiles(MOB mob, Hashtable files, HashSet customBother, boolean noPrompt, boolean noDelete)
throws IOException
{
if(files.size()==0) return;
if((!noPrompt)&&((mob==null)||(mob.session()==null))) return;
for(Enumeration e=files.keys();e.hasMoreElements();)
{
String filename=(String)e.nextElement();
String data=(String)files.get(filename);
if(customBother.contains(filename))
continue;
if(new CMFile(filename,mob,false).exists())
{
if(noDelete)
continue;
else
if(!noPrompt)
if(!mob.session().confirm("\n\rExternal resource '"+filename+"' found, import (Y/n)?","Y"))
continue;
}
Resources.saveFileResource(filename,mob,new StringBuffer(data));
}
}
protected static void importCustomObjects(MOB mob, Vector custom, HashSet customBother, boolean noPrompt, boolean noDelete)
throws IOException
{
if(custom.size()==0) return;
if((!noPrompt)&&((mob==null)||(mob.session()==null))) return;
for(int c=0;c<custom.size();c++)
{
if(custom.elementAt(c) instanceof Race)
{
Race R=(Race)custom.elementAt(c);
if(customBother.contains(R.ID()))
continue;
Race R2=CMClass.getRace(R.ID());
if(R2==null)
{
if(!noPrompt)
if(!mob.session().confirm("Custom Race '"+R.ID()+"' found, import (Y/n)?","Y"))
continue;
CMClass.addRace(R);
CMLib.database().DBCreateRace(R.ID(),R.racialParms());
}
else
if(!R2.isGeneric())
{
if(noDelete)
continue;
else
if(!noPrompt)
if(!mob.session().confirm("Custom Race '"+R.ID()+"' found which would override your standard race. Import anyway (Y/n)?","Y"))
continue;
CMClass.addRace(R);
CMLib.database().DBCreateRace(R.ID(),R.racialParms());
}
}
else
if(custom.elementAt(c) instanceof CharClass)
{
CharClass C=(CharClass)custom.elementAt(c);
if(customBother.contains(C.ID()))
continue;
CharClass C2=CMClass.getCharClass(C.ID());
if(C2==null)
{
if(!noPrompt)
if(!mob.session().confirm("Custom Char Class '"+C.ID()+"' found, import (Y/n)?","Y"))
continue;
CMClass.addCharClass(C);
CMLib.database().DBCreateClass(C.ID(),C.classParms());
}
else
if(!C2.isGeneric())
{
if(noDelete)
continue;
else
if(!noPrompt)
if(!mob.session().confirm("Custom Char Class '"+C.ID()+"' found which would override your standard class. Import anyway (Y/n)?","Y"))
continue;
CMClass.addCharClass(C);
CMLib.database().DBCreateClass(C.ID(),C.classParms());
}
}
}
}
protected static String getSpell(String word, int i)
{
if((word.trim().length()>0)&&((Character.isLetter(word.trim().charAt(0)))||(word.trim().startsWith("'"))||(word.trim().startsWith("`"))))
{
word=word.toUpperCase().trim();
if((word.startsWith("'"))||(word.startsWith("`")))
word=word.substring(1);
if(word.length()<3) return "";
if(word.startsWith("NONE")) i=-1;
else
if(word.startsWith("COMPLETE HEAL")) i=209;
else
if(word.startsWith("RESTORE MANA")) i=234;
else
if(word.startsWith("ACID B")) i=70;
else
if(word.startsWith("ARMOR")) i=1;
else
if(word.startsWith("ENHANCED ARMOR")) i=212;
else
if(word.startsWith("ENHANCE ARMOR")) i=212;
else
if(word.startsWith("BLESS")) i=3;
else
if(word.startsWith("BLINDNE")) i=4;
else
if(word.startsWith("BURNING H")) i=5;
else
if(word.startsWith("HASTE")) i=84;
else
if(word.startsWith("CALL LIGH")) i=6;
else
if(word.startsWith("GENERAL PURPOSE")) i=-1;
else
if(word.startsWith("CANCELLA")) i=59;
else
if(word.startsWith("CAUSE CRI")) i=63;
else
if(word.startsWith("CAUSE LI")) i=62;
else
if(word.startsWith("CAUSE SE")) i=222;
else
if(word.startsWith("CHANGE SE")) i=82;
else
if(word.startsWith("CHARM PER")) i=7;
else
if(word.startsWith("CHILL TOU")) i=8;
else
if(word.startsWith("COLO")) i=10;
else
if(word.startsWith("RESERVED")) i=223;
else
if(word.startsWith("FIREBA")) i=26;
else
if(word.startsWith("FLAMESTR")) i=65;
else
if(word.startsWith("FLY")) i=56;
else
if(word.startsWith("GATE")) i=83;
else
if(word.startsWith("GIANT")) i=39;
else
if(word.startsWith("HOLY STRE")) i=39;
else
if(word.startsWith("ENHANCED STRE")) i=39;
else
if(word.startsWith("HARM")) i=27;
else
if(word.startsWith("HOLY FIRE")) i=27;
else
if(word.startsWith("HEAL")) i=28;
else
if(word.startsWith("IDENTIFY")) i=53;
else
if(word.startsWith("INFRAVISION")) i=77;
else
if(word.startsWith("INVIS")) i=29;
else
if(word.startsWith("KNOW")) i=58;
else
if(word.startsWith("LIGHTNING BOLT")) i=30;
else
if(word.startsWith("LIGHTENING BOLT")) i=30;
else
if(word.startsWith("LIGHTNINGBOLT")) i=30;
else
if(word.startsWith("LIGHTENINGBOLT")) i=30;
else
if(word.startsWith("LOCATE")) i=31;
else
if(word.startsWith("CANCELL")) i=57;
else
if(word.startsWith("CONTINU")) i=57;
else
if(word.startsWith("CONTROL")) i=11;
else
if(word.startsWith("CREATE FO")) i=12;
else
if(word.startsWith("CREATE SP")) i=80;
else
if(word.startsWith("CREATE WA")) i=13;
else
if(word.startsWith("CURE BLI")) i=14;
else
if(word.startsWith("CURE CRI")) i=15;
else
if(word.startsWith("CURE LI")) i=16;
else
if(word.startsWith("CURE PO")) i=43;
else
if(word.startsWith("CURE SE")) i=61;
else
if(word.startsWith("CURE D")) i=45;
else
if(word.startsWith("DETECT E")) i=18;
else
if(word.startsWith("DETECT HI")) i=44;
else
if(word.startsWith("DETECT I")) i=19;
else
if(word.startsWith("DETECT M")) i=20;
else
if(word.startsWith("DETECT P")) i=21;
else
if(word.startsWith("DISPEL E")) i=22;
else
if(word.startsWith("DISPEL M")) i=59;
else
if(word.startsWith("EARTHQ")) i=23;
else
if(word.startsWith("ENCHANT W")) i=24;
else
if(word.startsWith("ENERGY DRA")) i=25;
else
if(word.startsWith("FAERIE F")) i=72;
else
if(word.startsWith("MAGIC MI")) i=32;
else
if(word.startsWith("MASS INV")) i=69;
else
if(word.startsWith("PASS D")) i=74;
else
if(word.startsWith("POISON")) i=33;
else
if(word.startsWith("PROTECTION")) i=34;
else
if(word.startsWith("REFRESH")) i=81;
else
if(word.startsWith("REMOVE CU")) i=35;
else
if(word.startsWith("SANCTUARY")) i=36;
else
if(word.startsWith("SHIELD")) i=67;
else
if(word.startsWith("SHOCKING G")) i=37;
else
if(word.startsWith("SLEEP")) i=38;
else
if(word.startsWith("STONE SK")) i=66;
else
if(word.startsWith("SUMMON")) i=40;
else
if(word.startsWith("TELEPORT")) i=2;
else
if(word.startsWith("VENTRI")) i=41;
else
if(word.startsWith("WEAKEN")) i=68;
else
if(word.startsWith("WORD OF R")) i=42;
else
if(word.startsWith("ACID BR")) i=200;
else
if(word.startsWith("FIRE BR")) i=201;
else
if(word.startsWith("FROST BR")) i=202;
else
if(word.startsWith("GAS BR")) i=203;
else
if(word.startsWith("LIGHTNING BR")) i=204;
else
if(word.startsWith("LIGHTENING BR")) i=204;
else
if(word.startsWith("FRENZY")) i=205;
else
if(word.startsWith("DISPEL G")) i=206;
else
if(word.startsWith("CURSE")) i=17;
else
if(word.startsWith("ENCHANT W")) i=207;
else
if(word.startsWith("ENCHANT A")) i=208;
else
if(word.startsWith("REJUV")) i=209;
else
if(word.startsWith("PLAGUE")) i=213;
else
if(word.startsWith("HEAT M")) i=210;
else
if(word.startsWith("HIGH EXP")) i=26;
else
if(word.startsWith("FARSIGHT")) i=211;
else
if(word.startsWith("SLOW")) i=214;
else
if(word.startsWith("WEB")) i=215;
else
if(word.startsWith("CONFUSE")) i=216;
else
if(word.startsWith("FIRESHIELD")) i=232;
else
if(word.startsWith("ICESHIELD")) i=232;
else
if(word.startsWith("SHOCKSHIELD")) i=89;
else
if(word.startsWith("BLADE BARRIER")) i=233;
else
if(word.startsWith("SENSE LI")) i=217;
else
if(word.startsWith("MYSTERIOUS DR")) i=218;
else
if(word.startsWith("MIND LIGHT")) i=219;
else
if(word.startsWith("ACUTE VIS")) i=44;
else
if(word.startsWith("CALM")) i=220;
else
if(word.startsWith("DETECT G")) i=221;
else
if(word.startsWith("DEMONFIRE")) i=27;
else
if(word.startsWith("BARK SKIN")) i=224;
else
if(word.startsWith("STEEL SKIN")) i=224;
else
if(word.startsWith("LETHARGIC MIS")) i=214;
else
if(word.startsWith("BLACK DEATH")) i=213;
else
if(word.startsWith("DISGRACE")) i=225;
else
if(word.startsWith("POWER WORD ST")) i=226;
else
if(word.startsWith("MASTER HEAL")) i=227;
else
if(word.startsWith("SCREAM")) i=32;
else
if(word.startsWith("SEVERITY FO")) i=23;
else
if(word.startsWith("HOLY WORD")) i=228;
else
if(word.startsWith("MASS HEAL")) i=229;
else
if(word.startsWith("ACID RAIN")) i=230;
else
if(word.startsWith("ETHEREAL FORM")) i=231;
else
if(word.startsWith("MANA")) i=234;
else
if(word.startsWith("CHAOS FIELD")) i=235;
else
if(word.startsWith("COMBAT MIND")) i=236;
else
if(word.startsWith("DARK BLESSING")) i=17;
else
if(word.startsWith("FLESH ARMOR")) i=224;
else
if(word.startsWith("TRUE SIGHT")) i=237;
else
if(word.startsWith("INERTIAL")) i=36;
else
if(word.startsWith("PHASE SHIFT")) i=36;
else
if(word.startsWith("DISPLACEMENT")) i=244;
else
if(word.startsWith("THOUGHT SHIELD")) i=238;
else
if(word.startsWith("INTELLECT FORTRESS")) i=238;
else
if(word.startsWith("MENTAL BARRIER")) i=238;
else
if(word.startsWith("MENTAL BLOCK")) i=238;
else
if(word.startsWith("SHATTER")) i=239;
else
if(word.startsWith("ICESTORM")) i=240;
else
if(word.startsWith("DISINTEGRATE")) i=241;
else
if(word.startsWith("ANIMATE DEAD")) i=242;
else
if(word.startsWith("VIBRATE")) i=243;
else
if(word.startsWith("ULTRABLAST")) i=26;
else
if(word.startsWith("FIELD OF DECAY")) i=245;
else
if(word.startsWith("BIOFEEDBACK")) i=245;
else
if(word.startsWith("DANCING LIGHTS")) i=246;
else
if(word.startsWith("BIO-ACCELERATION")) i=227;
else
if(word.startsWith("CELL ADJUSTMENT")) i=227;
else
if(word.startsWith("AURA SIGHT")) i=20;
else
if(word.startsWith("ENERGY CONTAINMENT")) i=247;
else
{
Log.sysOut("Unknown spell: "+word);
return "";
}
}
switch(i)
{
case -1: break;
case 0: break;
case 1: return "Spell_GraceOfTheCat"; // armor
case 2: return "Spell_Teleport";
case 3: return "Prayer_Bless";
case 4: return "Spell_Blindness";
case 5: return "Spell_BurningHands";
case 6: return "Spell_Clog"; // call lightening, dumb
case 7: return "Spell_Charm";
case 8: return "Undead_ColdTouch"; // chill touch
case 9: return "Spell_MirrorImage"; // clone
case 10: return "Spell_Feeblemind"; // color spray
case 11: return "Chant_CallRain";
case 12: return "Prayer_CreateFood";
case 13: return "Prayer_CreateWater";
case 14: return "Prayer_CureBlindness";
case 15: return "Prayer_CureCritical";
case 16: return "Prayer_CureLight";
case 17: return "Prayer_Curse";
case 18: return "Prayer_SenseEvil";
case 19: return "Spell_DetectInvisible";
case 20: return "Spell_DetectMagic";
case 21: return "Spell_DetectPoison";
case 22: return "Prayer_DispelEvil";
case 23: return "Spell_Earthquake";
case 24: return "Spell_EnchantWeapon";
case 25: return "Prayer_Drain";
case 26: return "Spell_Fireball";
case 27: return "Prayer_Harm";
case 28: return "Prayer_Heal";
case 29: return "Spell_Invisibility";
case 30: return "Spell_Lightning";
case 31: return "Spell_LocateObject";
case 32: return "Spell_MagicMissile";
case 33: return "Thief_Poison";
case 34: return "Prayer_ProtEvil";
case 35: return "Prayer_RemoveCurse";
case 36: return "Prayer_Sanctuary";
case 37: return "Spell_ShockingGrasp";
case 38: return "Spell_Sleep";
case 39: return "Spell_GiantStrength";
case 40: return "Spell_Summon";
case 41: return "Spell_Ventriloquate";
case 42: return "Skill_WordRecall";
case 43: return "Prayer_RemovePoison";
case 44: return "Chant_Dragonsight";
case 45: return "Prayer_CureDisease"; // not the real ###
case 51: return "Spell_ShockingGrasp";
case 53: return "Spell_IdentifyObject";
case 54: return "Prayer_AnimateDead";
case 55: return "Spell_Fear";
case 56: return "Spell_Fly";
case 57: return "Spell_Light";
case 58: return "Spell_KnowAlignment";
case 59: return "Spell_DispelMagic";
case 60: return "Spell_FlamingHands";
case 61: return "Prayer_CureSerious";
case 62: return "Prayer_CauseLight";
case 63: return "Spell_WaterBreathing"; // water of lifew
case 64: return "Prayer_CauseSerious";
case 65: return "Spell_Dragonfire"; // flamestrike
case 66: return "Spell_Stoneskin";
case 67: return "Spell_Shield";
case 68: return "Spell_Weaken";
case 69: return "Spell_MassInvisibility";
case 70: return "Spell_AcidArrow"; // acid blast
case 71: return "Spell_Portal"; // actually mass teleport
case 72: return "Spell_FaerieFog";
case 73: return "Spell_IceStorm";
case 74: return "Spell_PassDoor";
case 75: return "Spell_EnchantArmor";
case 76: return "Spell_StoneFlesh"; // stone
case 77: return "Spell_Infravision";
case 78: return "Prayer_RaiseDead";
case 80: return "Prayer_CreateWater";
case 81: return "Prayer_Restoration"; // refresh
case 82: return "Spell_ChangeSex";
case 83: return "Spell_Gate";
case 84: return "Spell_Haste";
case 85: return "Chant_SummonFire";
case 86: return "Spell_DetectTraps";
case 87: return "Thief_RemoveTraps";
case 88: return "Spell_Flameshield";
case 89: return "Spell_Shockshield";
case 90: return "Spell_PassDoor";
case 91: return "Spell_Scry";
case 93: return "Skill_Meditate";
case 94: return "Skill_Meditate";
case 97: return "Spell_Web";
case 98: return "Spell_EnchantArmor";
case 99: return "Spell_Teleport";
case 101: return ""; // create symbol
case 102: return ""; // alertness
case 103: return "Spell_Fatigue"; // fatigue
case 104: return ""; // grounding
case 105: return ""; // charged beacon
case 106: return ""; // resilience
case 107: return "Spell_Feeblemind";
case 108: return ""; // ill fortune
case 109: return "Spell_Slow";
case 110: return ""; // unravel defence
case 111: return ""; // holy sanctity
case 112: return ""; // divinity
case 113: return "Prayer_Restoration";
case 114: return "Undead_ColdTouch";
case 115: return ""; // spiritual wrath
case 120: return "Spell_Cloudkill";
case 121: return "Prayer_MajorInfusion"; // quickening
case 122: return "Chant_SummonElemental"; // summon elemental
case 124: return ""; // uplift
case 200: return "Acidbreath";
case 201: return "Firebreath";
case 202: return "Frostbreath";
case 203: return "Gasbreath";
case 204: return "Lighteningbreath";
case 205: return "Spell_Frenzy";
case 206: return "Prayer_DispelGood";
case 207: return "Spell_EnchantWeapon";
case 208: return "Spell_EnchantArmor";
case 209: return "Prayer_Restoration";
case 210: return "Spell_HeatMetal";
case 211: return "Spell_Farsight";
case 212: return "Spell_MageArmor";
case 213: return "Prayer_Plague";
case 214: return "Spell_Slow";
case 215: return "Spell_Web";
case 216: return "Spell_Confusion";
case 217: return "Spell_DetectSentience";
case 218: return "Spell_Nightmare";
case 219: return "Spell_MindLight";
case 220: return "Prayer_Calm";
case 221: return "Prayer_SenseGood";
case 222: return "Prayer_CauseSerious";
case 223: return "";
case 224: return "Chant_Barkskin";
case 225: return "Spell_Tourettes";
case 226: return "Spell_Misstep";
case 227: return "Prayer_Restoration";
case 228: return "Prayer_HolyWord";
case 229: return "Prayer_MassHeal";
case 230: return "Spell_AcidFog";
case 231: return "Prayer_Etherealness";
case 232: return "Spell_Flameshield";
case 233: return "Prayer_BladeBarrier";
case 234: return "Chant_RestoreMana";
case 235: return "Spell_Frenzy";
case 236: return "Spell_CombatPrecognition";
case 237: return "Spell_TrueSight";
case 238: return "Spell_MindBlock";
case 239: return "Spell_Shatter";
case 240: return "Spell_IceStorm";
case 241: return "Spell_Disintegrate";
case 242: return "Prayer_AnimateDead";
case 243: return "Spell_Siphon";
case 244: return "Spell_Blink";
case 245: return "Prayer_Plague";
case 246: return "Spell_Delirium";
case 247: return "Chant_SpellWard";
case 291: return "Chant_PlantPass";
case 292: return "Spell_FeatherFall";
case 294: return "Spell_Polymorph";
case 295: return ""; // spiral blast
case 296: return "Spell_BurningHands";
case 299: return ""; // ice shard
case 300: return ""; //Torrent
case 301: return ""; //Black Hand
case 302: return ""; //Acetum Primus
case 303: return ""; //Black Lightning
case 304: return ""; //Galvanic Whip
case 305: return ""; //Disruption
case 306: return ""; //Spectral Furor
case 308: return ""; //Sulfurous Spray
case 309: return ""; //Sonic Resonance
case 310: return ""; //Black Fist
case 311: return ""; //Magnetic Thrust
case 313: return ""; //Caustic Fount
case 314: return ""; //Quantum Spike
case 315: return ""; //Energy Blast
case 342: return ""; //Benefic Aura
case 356: return ""; //Succor
case 402: return "Skill_Explosive";
case 500: return "Spell_ChainLightening";
case 501: return "Chant_Goodberry";
case 502: return "Prayer_FlameWeapon";
case 503: return "Chant_GrowClub"; // spiritual hammer
case 504: return "Spell_Frenzy";
case 505: return "Spell_Fireball";
case 506: return "Prayer_HolyWord";
case 507: return ""; // vine whip
case 508: return "Chant_Barkskin";
case 509: return "Prayer_ProtectElements";
case 510: return "Spell_Frenzy";
case 511: return ""; // fletch
case 512: return ""; // divine aid
case 513: return "Spell_Frenzy"; // divine fury
case 514: return "Prayer_Curse"; // lich curse
case 515: return "Spell_GiantStrength";
case 516: return "Prayer_Drain"; // withering hand
case 517: return "Spell_GraceOfTheCat"; // chaos armor
case 518: return ""; // soul scream
case 519: return "Spell_StinkingCloud";
case 520: return "Spell_Web";
case 521: return "Chant_PlantSnare";
case 522: return "Prayer_BladeBarrier";
case 523: return "Spell_ResistFire";
case 524: return ""; // heroes feast
case 525: return "Prayer_RemoveParalysis";
case 526: return "Druid_RecoverVoice";
case 527: return "Spell_Silence";
case 528: return "Spell_Hold";
case 529: return "Prayer_HolyWord";
case 530: return "Spell_PolymorphSelf";
case 531: return "Spell_GustOfWind";
case 532: return ""; //creepingdoom
case 533: return "Chant_Sunray";
case 534: return "Prayer_Calm";
case 535: return ""; //fireseed
case 536: return ""; //warmount
case 537: return ""; //despair
case 538: return "Spell_Forget";
case 539: return "Skill_WordRecall";
case 540: return "Spell_Portal";
case 541: return ""; // mass armor
case 542: return ""; // arcane perception
case 543: return ""; // mass armor
case 544: return "Spell_MassFeatherfall"; // mass featherfall
case 545: return ""; // mass refresh
case 546: return "Spell_MassFly";
case 547: return ""; // minor track
case 548: return ""; // major track
case 550: return "Spell_AcidFog";
case 551: return "Spell_ResistPoison";
case 553: return "Prayer_Poison";
case 554: return "Spell_AcidArrow";
case 555: return "Spell_MeteorStorm";
case 556: return "Spell_Frost";
case 559: return "Spell_GustOfWind";
case 560: return "Spell_StinkingCloud";
case 561: return ""; // skeletal armor
case 562: return "Prayer_AiryForm"; // wraithform
case 563: return "Spell_ManaBurn";
case 564: return "Undead_ColdTouch";
case 565: return ""; // death chant
case 566: return ""; // life surge
case 567: return ""; // mana surge
case 568: return ""; // death aura
case 569: return ""; // dark ritual
case 570: return "Prayer_Deathfinger";
case 573: return ""; // crystal blades
case 574: return "Spell_Dragonfire"; // fiery dragon
case 575: return ""; // celestial thunder
case 576: return ""; // celestial lightning
case 577: return ""; // create mistletow
case 578: return "Prayer_Plague"; // toxin shot
case 579: return "Spell_Slow";
case 580: return "Chant_Dragonsight";
case 581: return "Spell_SummonSteed";
case 582: return ""; // rejuvenate
case 583: return "Spell_Haste";
case 584: return ""; // cacophony
case 585: return "Spell_Disintegrate";
case 586: return ""; // beacon
case 587: return "Prayer_Anger";
case 588: return "Spell_MassWaterbreath";
case 589: return "Spell_Gate";
case 590: return "Spell_Portal";
case 591: return ""; // tree transport
case 592: return ""; // treespeak
case 593: return ""; // bloodslash
case 594: return "Spell_SpellTurning";
case 595: return "Spell_ChainLightening";
case 596: return ""; // harmonic aura
case 597: return "Spell_Siphon";
case 598: return "Undead_ColdTouch";
case 599: return "Spell_ResistFire";
case 600: return "Spell_ResistCold";
case 601: return "Spell_ResistFire";
case 602: return "Prayer_Curse";
case 603: return "Spell_Knock";
case 604: return "Prayer_Deathfinger";
case 605: return "Spell_MinorGlobe";
case 606: return "Spell_Mirage";
case 607: return ""; // tarangreal
case 608: return ""; // kassandra
case 609: return ""; // sebat
case 610: return ""; // metandra
case 611: return ""; // vampiric blast
case 612: return ""; // dragonskin
case 613: return "Prayer_Heal";
case 614: return "Spell_ResistElectricity";
case 615: return ""; // shocking trap
case 616: return "Spell_Feeblemind"; //insanity
case 617: return ""; // holy shield
case 618: return ""; // evil spirit
case 619: return ""; // disgrace
case 620: return ""; // summon shadow
case 621: return ""; // dismantle
case 622: return ""; // astral walk
case 623: return "Prayer_SenseLife";
case 624: return ""; // take revenge
case 625: return "Spell_Hold";
case 626: return ""; // improved detect
case 627: return "Spell_ImprovedInvisibility";
case 628: return "Spell_MassSleep";
case 629: return ""; // desert heat
case 630: return "Prayer_DivineLuck";
case 631: return "Paralysis";
case 632: return ""; // lighting stroke
case 633: return "Spell_Repulsion";
case 634: return "Spel_MassSlow";
case 636: return "Prayer_ProtUndead";
case 637: return "Prayer_BlessItem";
case 638: return ""; // resiliance
case 639: return "Spell_Polymorph";
case 640: return "Prayer_Heal";
case 641: return "Prayer_Restoration";
case 643: return "Prayer_Restoration";
case 644: return "Spell_AcidArrow";
case 645: return ""; // etheral fist
case 646: return ""; // spectral furor
case 647: return "Undead_ColdTouch";
case 649: return ""; // disruption
case 650: return "Spell_Forget"; // mind wrack
case 651: return "Spell_Feeblemind"; // mind wrack
case 652: return ""; // sulferous spray
case 653: return ""; // caustic front
case 655: return ""; // galvan whip
case 656: return ""; // magnetic trust
case 657: return ""; // quantum spike
case 658: return ""; // mist walk
case 659: return ""; // solar flight
case 660: return ""; // blue fire
case 661: return ""; // hellenic flow
case 662: return ""; // lesser golem
case 663: return ""; // stone golem
case 664: return ""; // iron golem
case 665: return ""; // adamantite golem
case 666: return "Prayer_ProtGood";
case 667: return ""; // ruler aura
case 668: return "Chant_Reincarnation";
case 669: return "Skill_ControlUndead";
case 670: return ""; // assist
case 671: return ""; // corruption
case 672: return "Chant_Tornado";//hurricane
case 673: return ""; // sanctify lands
case 674: return ""; // deadly worm
case 675: return ""; // cursed lands
case 676: return ""; // lethargic mist
case 677: return ""; // black death
case 678: return "Spell_Dream";
case 679: return "Prayer_BladeBarrier";
case 680: return ""; // aid
case 681: return ""; // desert fist
default:
Log.sysOut("Unknown spell num: "+i);
break;
}
return "";
}
protected static int importNumber(String s)
{
StringBuffer str=new StringBuffer("");
for(int i=0;i<s.length();i++)
switch(s.charAt(i))
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
str.append(s.charAt(i));
break;
case 'x':
case 'X':
case 'Z':
case ' ':
break;
default:
return 0;
}
return CMath.s_int(str.toString());
}
protected static void readBlocks(Vector buf,
Vector areaData,
Vector roomData,
Vector mobData,
Vector resetData,
Vector objectData,
Vector mobProgData,
Vector objProgData,
Vector shopData,
Vector specialData,
Vector socialData)
{
Vector helpsToEat=new Vector();
Vector wasUsingThisOne=null;
Vector useThisOne=null;
while(buf.size()>0)
{
String s=((String)buf.elementAt(0)).toUpperCase().trim();
if(s.startsWith("#")&&((String)buf.elementAt(0)).startsWith(" "))
s=((String)buf.elementAt(0)).toUpperCase();
boolean okString=true;
if(s.startsWith("#"))
{
s=s.substring(1).trim();
if((s.startsWith("AREA"))
||(s.startsWith("AUTHOR")))
{
wasUsingThisOne=null;
if((s.indexOf("~")>=0)
&&(s.startsWith("AREA ")||s.startsWith("AUTHOR ")))
okString=true;
useThisOne=areaData;
}
else
if((s.startsWith("MOBILE"))
||(s.startsWith("MOBOLD")))
{
wasUsingThisOne=mobData;
useThisOne=mobData;
}
else
if((s.startsWith("OBJECT"))
||(s.startsWith("OBJOLD")))
{
wasUsingThisOne=objectData;
useThisOne=objectData;
}
else
if((s.startsWith("OLIMITS"))
||(s.startsWith("OMPROGS"))
||(s.startsWith("ECONOMY"))
||(s.startsWith("RANGES"))
||(s.startsWith("CLIMATE"))
||(s.startsWith("RESETMSG"))
||(s.startsWith("VERSION"))
||(s.startsWith("CONTINENT"))
||(s.startsWith("COORDS"))
||(s.startsWith("RESETFREQUENCY"))
||(s.startsWith("VNUMS"))
||(s.startsWith("FLAGS"))
||(s.startsWith("REPAIRS"))
||(s.startsWith("OBJFUNS"))
||(s.startsWith("HELPS"))
||(s.startsWith("PRACTICERS")))
{
wasUsingThisOne=null;
useThisOne=helpsToEat;
}
else
if(s.startsWith("MOBPROG"))
{
wasUsingThisOne=null;
useThisOne=mobProgData;
}
else
if(s.startsWith("ROOM"))
{
wasUsingThisOne=roomData;
useThisOne=roomData;
}
else
if(s.startsWith("RESETS"))
{
wasUsingThisOne=null;
useThisOne=resetData;
}
else
if(s.startsWith("SHOP"))
{
wasUsingThisOne=null;
useThisOne=shopData;
}
else
if(s.startsWith("SPECIALS"))
{
wasUsingThisOne=null;
useThisOne=specialData;
}
else
if(s.startsWith("SOCIALS"))
{
wasUsingThisOne=null;
useThisOne=socialData;
}
else
if((importNumber(s)>0)&&(wasUsingThisOne!=null))
{
Vector V=new Vector();
wasUsingThisOne.addElement(V);
useThisOne=V;
}
else
if(s.equals("0")||s.equals("$")||s.equals("O"))
{
okString=false;
}
else
if((s.equals("")||s.equals("~"))&&(useThisOne==socialData))
okString=true;
else
if(useThisOne==mobProgData)
okString=true;
else
{
//useThisOne=null;
Log.sysOut("Import","Suspect line: "+s);
}
}
if(useThisOne!=null)
{
if(okString)
useThisOne.addElement(CMLib.coffeeFilter().safetyFilter((String)buf.elementAt(0)));
buf.removeElementAt(0);
}
else
{
Log.sysOut("Import","Just eating: "+s);
buf.removeElementAt(0);
}
}
if(helpsToEat.size()>0)
{
Log.sysOut("Import","Ate "+helpsToEat.size()+" unsupported lines.");
helpsToEat.clear();
}
}
protected static void doWeapon(Weapon I, String name, int val1, String str1, int val2, int val3, int val4, String str4)
{
final String[][] weaponTypes={
{ "exotic","0"},
{ "sword","1"},
{ "dagger","9"},
{ "spear","3"},
{ "staff","10"},
{ "mace","4"},
{ "axe","5"},
{ "flail","6"},
{ "whip","7"},
{ "polearm","8"},
{ "bow","0"},
{ "arrow","3"},
{ "lance","3"}
};
str1=str1.toLowerCase().trim();
if(str1.startsWith("'")) str1=str1.substring(1);
for(int wt=0;wt<weaponTypes.length;wt++)
if(str1.startsWith(weaponTypes[wt][0]))
{ val1=CMath.s_int(weaponTypes[wt][1]); break;}
if(val1==0)
for(int wt=0;wt<weaponTypes.length;wt++)
if(name.toLowerCase().indexOf(weaponTypes[wt][0])>=0)
{ val1=CMath.s_int(weaponTypes[wt][1]); break;}
if((name.toUpperCase().endsWith("HAMMER"))&&(val1==4))
val1=11;
switch(val1)
{
case 0: I.setWeaponClassification(Weapon.CLASS_RANGED);
if(name.toUpperCase().indexOf("BOW")>=0)
{
I.setAmmoCapacity(20);
I.setAmmoRemaining(20);
I.setAmmunitionType("arrows");
I.setRanges(1,3);
I.setRawLogicalAnd(true);
}
break;
case 1: I.setWeaponClassification(Weapon.CLASS_SWORD); break;
case 2: I.setWeaponClassification(Weapon.CLASS_EDGED); break;
case 3: I.setWeaponClassification(Weapon.CLASS_POLEARM);
I.setRanges(0,1);
I.setRawLogicalAnd(true);
break;
case 4: I.setWeaponClassification(Weapon.CLASS_BLUNT); break;
case 5: I.setWeaponClassification(Weapon.CLASS_AXE); break;
case 6: I.setWeaponClassification(Weapon.CLASS_FLAILED);
I.setRanges(0,1);
break;
case 7: I.setWeaponClassification(Weapon.CLASS_FLAILED);
I.setRanges(0,1);
break;
case 8: I.setWeaponClassification(Weapon.CLASS_POLEARM);
I.setRanges(0,1);
I.setRawLogicalAnd(true);
break;
case 9: I.setWeaponClassification(Weapon.CLASS_DAGGER); break;
case 10: I.setWeaponClassification(Weapon.CLASS_STAFF); break;
case 11: I.setWeaponClassification(Weapon.CLASS_HAMMER); break;
}
if(val2>=1)
I.baseEnvStats().setDamage(val2*val3);
else
I.baseEnvStats().setDamage(val3);
if((str4.trim().length()>0)&&((Character.isLetter(str4.trim().charAt(0)))||(str4.trim().startsWith("'"))))
{
str4=str4.toUpperCase().trim();
if(str4.startsWith("'"))
str4=str4.substring(1);
if(str4.startsWith("POUND")) val4=7;
else
if(str4.startsWith("CRUSH")) val4=7;
else
if(str4.startsWith("SMASH")) val4=7;
else
if(str4.startsWith("FLAMI")) val4=57;
else
if(str4.startsWith("SCORC")) val4=57;
else
if(str4.startsWith("SEARI")) val4=57;
else
if(str4.startsWith("GOUT")) val4=57;
else
if(str4.startsWith("SCRATCH")) val4=22;
else
if(str4.startsWith("CLAW")) val4=22;
else
if(str4.startsWith("BITE")) val4=22;
else
if(str4.startsWith("PECK")) val4=22;
else
if(str4.startsWith("STING")) val4=22;
else
if(str4.startsWith("BEAT")) val4=22;
else
if(str4.startsWith("SLAP")) val4=22;
else
if(str4.startsWith("PUNC")) val4=22;
else
if(str4.startsWith("WHALL")) val4=22;
else
if(str4.startsWith("STAB")) val4=2;
else
if(str4.startsWith("PIERCE")) val4=2;
else
if(str4.startsWith("CHOP")) val4=25;
else
if(str4.startsWith("CLEA")) val4=25;
else
if(str4.startsWith("SLIC")) val4=25;
else
if(str4.startsWith("SLAS")) val4=25;
else
if(str4.startsWith("WHIP")) val4=25;
}
switch(val4)
{
case 7:
case 8:
case 27:
I.setWeaponType(Weapon.TYPE_BASHING); break;
case 29:
case 55:
case 56:
case 57:
I.setWeaponType(Weapon.TYPE_BURNING); break;
case 22:
case 5:
case 10:
case 23:
case 26:
case 32:
case 13:
case 16:
case 17:
case 24:
I.setWeaponType(Weapon.TYPE_NATURAL); break;
case 2:
case 11:
I.setWeaponType(Weapon.TYPE_PIERCING); break;
case 25:
case 21:
case 4:
case 3:
case 1:
I.setWeaponType(Weapon.TYPE_SLASHING); break;
default: I.setWeaponType(Weapon.TYPE_BURSTING); break;
}
}
public static int getDRoll(String str)
{
int i=str.indexOf("d");
if(i<0) return 11;
int roll=CMath.s_int(str.substring(0,i).trim());
str=str.substring(i+1).trim();
i=str.indexOf("+");
int dice=0;
int plus=0;
if(i<0)
{
i=str.indexOf("-");
if(i<0)
dice=CMath.s_int(str.trim());
else
{
dice=CMath.s_int(str.substring(0,i).trim());
plus=CMath.s_int(str.substring(i));
}
}
else
{
dice=CMath.s_int(str.substring(0,i).trim());
plus=CMath.s_int(str.substring(i+1));
}
return (roll*dice)+plus;
}
protected static MOB getMOB(String OfThisID,
Room putInRoom,
Session session,
Vector mobData,
Vector mobProgData,
Vector specialData,
Vector shopData,
Hashtable doneMOBS,
String areaFileName,
boolean compileErrors,
Vector commands)
{
if(OfThisID.startsWith("#"))
{
if(doneMOBS.containsKey(OfThisID.substring(1)))
{
MOB M=(MOB)((MOB)doneMOBS.get(OfThisID.substring(1))).copyOf();
M.setStartRoom(putInRoom);
M.setLocation(putInRoom);
return M;
}
}
else
{
if(doneMOBS.containsKey(OfThisID))
{
MOB M=(MOB)((MOB)doneMOBS.get(OfThisID)).copyOf();
M.setStartRoom(putInRoom);
M.setLocation(putInRoom);
return M;
}
}
for(int m=0;m<mobData.size();m++)
{
Vector objV=null;
if(mobData.elementAt(m) instanceof Vector)
objV=(Vector)mobData.elementAt(m);
else
if(mobData.elementAt(m) instanceof String)
{
String s=(String)mobData.elementAt(m);
if((!s.toUpperCase().trim().startsWith("#MOB"))&&(s.length()>0))
returnAnError(session,"Eating mob immaterial line: "+mobData.elementAt(m),compileErrors,commands);
continue;
}
else
continue;
String mobID=eatNextLine(objV);
if(!mobID.equals(OfThisID))
continue;
String simpleName=CMLib.coffeeFilter().safetyFilter(eatLineSquiggle(objV));
String mobName=CMLib.coffeeFilter().safetyFilter(eatLineSquiggle(objV));
String mobDisplay=CMLib.coffeeFilter().safetyFilter(eatLineSquiggle(objV));
String mobDescription=CMLib.coffeeFilter().safetyFilter(eatLineSquiggle(objV));
Race R=null;
boolean circleFormat=false;
if(nextLine(objV).endsWith("~"))
{
String raceName=eatLineSquiggle(objV);
R=CMClass.getRace(raceName);
circleFormat=true;
}
if(R==null)
R=CMClass.getRace("StdRace");
String codeStr1=eatNextLine(objV);
String codeStr2=eatNextLine(objV);
String codeStr3=eatNextLine(objV);
String codeStr4=eatNextLine(objV);
String codeStr5="";
if(circleFormat)
{
codeStr3=codeStr4;
codeStr4=eatNextLine(objV);
codeStr5=eatNextLine(objV);
}
if((!mobID.startsWith("#"))
||((mobName.length()==0)
&&((CMParms.numBits(codeStr1)<3)
||(CMParms.numBits(codeStr1)>4)
||(CMParms.numBits(codeStr2)<2)
||(CMParms.numBits(codeStr3)<2))))
{
returnAnError(session,"Malformed mob! Aborting this mob "+mobID+", display="+mobDisplay+", simple="+simpleName+", name="+mobName+", codeStr1="+codeStr1+", codeStr2="+codeStr2+", codeStr3="+codeStr3+"!",compileErrors,commands);
continue;
}
if(mobName.length()==0)
mobName="Unknown";
int actFlag=getBitMask(codeStr1,0);
int affFlag=getBitMask(codeStr1,1);
int aliFlag=CMath.s_int(CMParms.getBit(codeStr1,2));
MOB M=CMClass.getMOB("GenMob");
String checkName=mobName.trim().toUpperCase();
if(CMath.isSet(actFlag,14)
||(checkName.indexOf("GHOUL")>=0)
||(checkName.indexOf("GHAST")>=0)
||(checkName.indexOf("SKELETON")>=0)
||(checkName.indexOf("ZOMBIE")>=0)
||(checkName.indexOf("VAMPIRE")>=0)
||(checkName.indexOf("LICH")>=0)
||(checkName.indexOf("MUMMY")>=0)
||(checkName.indexOf("GHOST")>=0)
||(checkName.indexOf("GEIST")>=0))
M=CMClass.getMOB("GenUndead");
else
if(simpleName.toUpperCase().indexOf("HORSE")>=0)
M=CMClass.getMOB("GenRideable");
for(int i=0;i<shopData.size();i++)
{
String s=((String)shopData.elementAt(i)).trim();
if(("#"+s).startsWith(OfThisID+" ")||("#"+s).startsWith(OfThisID+"\t")||("#"+s).startsWith(OfThisID+" "))
{
M=CMClass.getMOB("GenShopkeeper");
int i1=CMath.s_int(CMParms.getBit(s,1));
int i2=CMath.s_int(CMParms.getBit(s,2));
int i3=CMath.s_int(CMParms.getBit(s,3));
//int i4=CMath.s_int(CMParms.getBit(s,4));
int whatIsell=ShopKeeper.DEAL_INVENTORYONLY;
if((i1>4)&&(i1<8)&&(i2>4)&&(i2<8)&&(i3>4)&&(i3<8))
whatIsell=ShopKeeper.DEAL_WEAPONS;
else
if((((i1>1)&&(i1<5))||(i1==10)||(i1==26))
&&(((i2>1)&&(i2<5))||(i2==10)||(i2==26))
&&(((i3>1)&&(i3<5))||(i3==10)||(i3==26)))
whatIsell=ShopKeeper.DEAL_MAGIC;
else
if(((i1==9)||(i1==0))&&((i2==9)||(i2==0))&&((i3==9)||(i3==0)))
whatIsell=ShopKeeper.DEAL_ARMOR;
else
if(mobName.toUpperCase().indexOf("LEATHER")>=0)
whatIsell=ShopKeeper.DEAL_LEATHER;
else
if((mobName.toUpperCase().indexOf("PET ")>=0)||(mobName.toUpperCase().indexOf("PETS ")>=0))
whatIsell=ShopKeeper.DEAL_PETS;
((ShopKeeper)M).setWhatIsSold(whatIsell);
break;
}
}
M.setName(mobName);
M.setDisplayText(mobDisplay);
if(!mobDescription.trim().equalsIgnoreCase("OLDSTYLE"))
M.setDescription(mobDescription);
aliFlag=(int)Math.round(CMath.div(aliFlag,2));
CMLib.factions().setAlignmentOldRange(M,500+aliFlag);
M.setStartRoom(putInRoom);
M.setLocation(putInRoom);
M.baseCharStats().setMyRace(R);
Behavior behavior=CMClass.getBehavior("Mobile");
if(CMath.isSet(actFlag,5))
behavior=CMClass.getBehavior("MobileAggressive");
//if(!CMath.isSet(actFlag,6))
// behavior.setParms("WANDER");
if(!CMath.isSet(actFlag,1))
M.addBehavior(behavior);
if(CMath.isSet(actFlag,2))
M.addBehavior(CMClass.getBehavior("Scavenger"));
if(CMath.isSet(actFlag,4))
M.addNonUninvokableEffect(CMClass.getAbility("Prop_Invisibility"));
if(CMath.isSet(actFlag,5)&&CMath.isSet(actFlag,1))
M.addBehavior(CMClass.getBehavior("Aggressive"));
M.setWimpHitPoint(0);
if(CMath.isSet(actFlag,7)) // this needs to be adjusted further down!
M.setWimpHitPoint(2);
//if(CMath.isSet(actFlag,8)) // not really supported properly
// M.addNonUninvokableEffect(CMClass.getAbility("Prop_SafePet"));
if(CMath.isSet(actFlag,9))
M.addNonUninvokableEffect(CMClass.getAbility("Prop_StatTrainer"));
if(CMath.isSet(actFlag,10))
M.addBehavior(CMClass.getBehavior("MOBTeacher"));
if(CMath.isSet(actFlag,11))
M.addBehavior(CMClass.getBehavior("Fighterness"));
if(CMath.isSet(actFlag,12))
M.addBehavior(CMClass.getBehavior("Mageness"));
if(CMath.isSet(actFlag,13))
M.addBehavior(CMClass.getBehavior("Mageness"));
if(CMath.isSet(actFlag,14))
{
R=M.baseCharStats().getMyRace();
if(R.ID().equals("Human")||R.ID().equals("StdRace"))
{
R=CMClass.getRace("Undead");
M.baseCharStats().setMyRace(R);
}
}
if(CMath.isSet(actFlag,16))
M.addBehavior(CMClass.getBehavior("Clericness"));
if(CMath.isSet(actFlag,17))
M.addBehavior(CMClass.getBehavior("Mageness"));
if(CMath.isSet(actFlag,18))
M.addBehavior(CMClass.getBehavior("Thiefness"));
if(CMath.isSet(actFlag,19))
M.addBehavior(CMClass.getBehavior("Fighterness"));
if(CMath.isSet(actFlag,26))
M.addBehavior(CMClass.getBehavior("Healer"));
if(CMath.isSet(actFlag,27))
M.addBehavior(CMClass.getBehavior("MOBTeacher"));
if(CMath.isSet(affFlag,0))
M.baseEnvStats().setSensesMask(M.baseEnvStats().sensesMask()|EnvStats.CAN_NOT_SEE);
if(CMath.isSet(affFlag,1))
M.baseEnvStats().setDisposition(M.baseEnvStats().disposition()|EnvStats.IS_INVISIBLE);
if(CMath.isSet(affFlag,2))
M.baseEnvStats().setSensesMask(M.baseEnvStats().sensesMask()|EnvStats.CAN_SEE_EVIL);
if(CMath.isSet(affFlag,3))
M.baseEnvStats().setSensesMask(M.baseEnvStats().sensesMask()|EnvStats.CAN_SEE_INVISIBLE);
if(CMath.isSet(affFlag,4))
M.baseEnvStats().setSensesMask(M.baseEnvStats().sensesMask()|EnvStats.CAN_SEE_BONUS);
if(CMath.isSet(affFlag,5))
{
M.baseEnvStats().setSensesMask(M.baseEnvStats().sensesMask()|EnvStats.CAN_SEE_HIDDEN);
M.baseEnvStats().setSensesMask(M.baseEnvStats().sensesMask()|EnvStats.CAN_SEE_SNEAKERS);
}
if(CMath.isSet(affFlag,6))
{
if(CMLib.flags().isEvil(M))
M.addNonUninvokableEffect(CMClass.getAbility("Prayer_UnholyWord"));
else
M.addNonUninvokableEffect(CMClass.getAbility("Prayer_HolyWord"));
M.addNonUninvokableEffect(CMClass.getAbility("Prayer_Sanctuary"));
}
else
if(CMath.isSet(affFlag,7))
M.addNonUninvokableEffect(CMClass.getAbility("Prayer_Sanctuary"));
if(CMath.isSet(affFlag,8))
M.addNonUninvokableEffect(CMClass.getAbility("Spell_FaerieFire"));
if(CMath.isSet(affFlag,9))
M.baseEnvStats().setSensesMask(M.baseEnvStats().sensesMask()|EnvStats.CAN_SEE_INFRARED);
if(CMath.isSet(affFlag,10))
M.addNonUninvokableEffect(CMClass.getAbility("Prayer_Curse"));
if(CMath.isSet(affFlag,11))
{
for(Enumeration a=CMClass.abilities();a.hasMoreElements();)
{
Ability A=(Ability)a.nextElement();
if(A.ID().startsWith("Specialization"))
M.addNonUninvokableEffect((Ability)A.newInstance());
}
}
//if(CMath.isSet(affFlag,12)) really dumb
// M.addNonUninvokableEffect(new Poison());
if(CMath.isSet(affFlag,13))
M.addNonUninvokableEffect(CMClass.getAbility("Prayer_ProtEvil"));
if(CMath.isSet(affFlag,14))
M.addNonUninvokableEffect(CMClass.getAbility("Prayer_ProtGood"));
if(CMath.isSet(affFlag,15))
{
Ability A=(Ability)CMClass.getAbility("Thief_Sneak").copyOf();
A.setProficiency(100);
M.addAbility(A);
}
if(CMath.isSet(affFlag,16))
M.addNonUninvokableEffect(CMClass.getAbility("Prop_Hidden"));
if(CMath.isSet(affFlag,17))
M.addNonUninvokableEffect(CMClass.getAbility("Spell_Sleep"));
if(CMath.isSet(affFlag,18))
M.addNonUninvokableEffect(CMClass.getAbility("Spell_Charm"));
if(CMath.isSet(affFlag,20))
M.addNonUninvokableEffect(CMClass.getAbility("Spell_PassDoor"));
if(CMath.isSet(affFlag,21))
M.addNonUninvokableEffect(CMClass.getAbility("Spell_Haste"));
//if(CMath.isSet(affFlag,22)) no effect anyway
// M.addNonUninvokableEffect(new Prayer_Calm());
if(CMath.isSet(affFlag,23))
M.addNonUninvokableEffect(CMClass.getAbility("Prayer_Plague"));
if(CMath.isSet(affFlag,24))
M.addNonUninvokableEffect(CMClass.getAbility("Spell_Weaken"));
if(CMath.isSet(affFlag,25))
M.baseEnvStats().setSensesMask(M.baseEnvStats().sensesMask()|EnvStats.CAN_SEE_DARK);
if(CMath.isSet(affFlag,26))
M.addNonUninvokableEffect(CMClass.getAbility("Fighter_Berzerk"));
if(CMath.isSet(affFlag,27))
M.addAbility(CMClass.getAbility("Skill_Swim"));
if(CMath.isSet(affFlag,28))
M.addNonUninvokableEffect(CMClass.getAbility("Regeneration"));
if(CMath.isSet(affFlag,29))
{
M.addNonUninvokableEffect(CMClass.getAbility("Regeneration"));
M.addNonUninvokableEffect(CMClass.getAbility("Spell_Slow"));
}
// start ROM type
int positionCode=8;
int sexCode=1;
if(CMParms.numBits(codeStr2)>=4)
{
M.baseEnvStats().setLevel(CMath.s_int(CMParms.getCleanBit(codeStr2,0)));
if(M.baseEnvStats().level()==0)
M.baseEnvStats().setLevel(1);
int baseHP=11;
if(circleFormat)
baseHP=getDRoll(CMParms.getCleanBit(codeStr2,2));
else
baseHP=getDRoll(CMParms.getCleanBit(codeStr2,3));
baseHP=baseHP-10;
baseHP=baseHP-((int)Math.round(CMath.mul(M.baseEnvStats().level()*M.baseEnvStats().level(),0.85)));
baseHP=baseHP/M.baseEnvStats().level();
M.baseEnvStats().setAbility(baseHP);
if(circleFormat)
{
if(CMath.isNumber(CMParms.getCleanBit(codeStr4,2)))
sexCode=CMath.s_int(CMParms.getCleanBit(codeStr4,2));
else
if(CMParms.getCleanBit(codeStr4,2).toUpperCase().equals("MALE"))
sexCode=1;
else
if(CMParms.getCleanBit(codeStr4,2).toUpperCase().equals("FEMALE"))
sexCode=2;
else
if(CMParms.getCleanBit(codeStr4,2).toUpperCase().equals("EITHER"))
sexCode=(CMLib.dice().rollPercentage()>50)?1:2;
else
sexCode=3;
if(CMath.isNumber(CMParms.getCleanBit(codeStr4,0)))
positionCode=CMath.s_int(CMParms.getCleanBit(codeStr4,2));
else
if(CMParms.getCleanBit(codeStr4,0).trim().startsWith("STAND"))
positionCode=8;
else
if(CMParms.getCleanBit(codeStr4,0).trim().startsWith("SIT"))
positionCode=5;
else
if(CMParms.getCleanBit(codeStr4,0).trim().startsWith("SLEEP"))
positionCode=1;
}
else
{
positionCode=CMath.s_int(CMParms.getCleanBit(codeStr4,0));
sexCode=CMath.s_int(CMParms.getCleanBit(codeStr4,2));
}
if(CMLib.dice().rollPercentage()>75)
M.addBehavior(CMClass.getBehavior("MudChat"));
}
else
{
M.baseEnvStats().setAbility(11);
int baseLevel=CMath.s_int(CMParms.getCleanBit(codeStr2,0));
while(baseLevel>25)
baseLevel=(int)Math.round(CMath.div(baseLevel,2.0));
}
if(M.baseEnvStats().level()==0)
M.baseEnvStats().setLevel(1);
if(M.getWimpHitPoint()==2)
M.setWimpHitPoint(((int)Math.round(CMath.div(M.baseEnvStats().level()*(11+M.baseEnvStats().ability()),8.0)))+1);
M.baseEnvStats().setArmor(CMClass.getCharClass("StdCharClass").getLevelArmor(M));
M.baseEnvStats().setAttackAdjustment(CMClass.getCharClass("StdCharClass").getLevelAttack(M));
M.baseEnvStats().setDamage(CMClass.getCharClass("StdCharClass").getLevelDamage(M));
if(circleFormat)
M.setMoney(CMath.s_int(CMParms.getCleanBit(codeStr4,3)));
else
M.setMoney(CMLib.dice().roll(1,M.baseEnvStats().level(),0)+CMLib.dice().roll(1,10,0));
M.baseEnvStats().setWeight(50);
switch(positionCode)
{
case 1:
case 2:
case 3:
case 4:
M.baseEnvStats().setDisposition(M.baseEnvStats().disposition()|EnvStats.IS_SLEEPING);
break;
case 5:
M.baseEnvStats().setDisposition(M.baseEnvStats().disposition()|EnvStats.IS_SITTING);
break;
case 6:
M.baseEnvStats().setDisposition(M.baseEnvStats().disposition()|EnvStats.IS_SITTING);
break;
}
M.baseCharStats().setStat(CharStats.STAT_GENDER,'M');
switch(sexCode)
{
case 2: M.baseCharStats().setStat(CharStats.STAT_GENDER,'F'); break;
case 3: M.baseCharStats().setStat(CharStats.STAT_GENDER,'N'); break;
}
if(circleFormat)
{
int off=getBitMask(codeStr3,0);
int imm=getBitMask(codeStr3,1);
int res=getBitMask(codeStr3,2);
int size=CMath.s_int(CMParms.getCleanBit(codeStr5,2));
switch(size)
{
case 0: M.baseEnvStats().setWeight(1); break;
case 1: M.baseEnvStats().setWeight(15); break;
case 2: M.baseEnvStats().setWeight(150); break;
case 3: M.baseEnvStats().setWeight(350); break;
case 4: M.baseEnvStats().setWeight(850); break;
case 5: M.baseEnvStats().setWeight(2000); break;
}
// ignore the above, coffeemud does it better!
int numAbiles=M.numLearnedAbilities();
M.baseCharStats().getMyRace().startRacing(M,false);
//if(CMath.isSet(off,0)) // no area killers in coffeemud
//if(CMath.isSet(off,1)) // no circling in coffeemud
if(CMath.isSet(off,2)) // bash them off their feet?
M.addAbility(CMClass.getAbility("Skill_Trip"));
if(CMath.isSet(off,3))
M.addAbility(CMClass.getAbility("Fighter_Berzerk"));
if(CMath.isSet(off,4))
M.addAbility(CMClass.getAbility("Skill_Disarm"));
if(CMath.isSet(off,5))
M.addAbility(CMClass.getAbility("Skill_Dodge"));
//if(CMath.isSet(off,6)) is missing
if(CMath.isSet(off,7))
M.baseEnvStats().setSpeed(M.baseEnvStats().speed()+1);
if(CMath.isSet(off,8))
M.addAbility(CMClass.getAbility("Fighter_Kick"));
if(CMath.isSet(off,9))
M.addAbility(CMClass.getAbility("Skill_Dirt"));
if(CMath.isSet(off,10))
M.addAbility(CMClass.getAbility("Skill_Parry"));
//if(CMath.isSet(off,11)) rescue is irrelevant
//if(CMath.isSet(off,12)) is missing
if(CMath.isSet(off,13))
M.addAbility(CMClass.getAbility("Skill_Trip"));
if(CMath.isSet(off,14))
M.addAbility(CMClass.getAbility("Fighter_Whomp"));
if(CMath.isSet(off,15))
M.addBehavior(CMClass.getBehavior("MOBHelper"));
if(CMath.isSet(off,16))
M.addBehavior(CMClass.getBehavior("AlignHelper"));
if(CMath.isSet(off,17))
M.addBehavior(CMClass.getBehavior("RaceHelper"));
if(CMath.isSet(off,18))
M.addBehavior(CMClass.getBehavior("PlayerHelper"));
if(CMath.isSet(off,19))
{
Behavior guardian=CMClass.getBehavior("GoodGuardian");
for(int b=M.numBehaviors()-1;b>=0;b--)
{
Behavior B=M.fetchBehavior(b);
if((B!=null)&&(CMath.bset(B.flags(),Behavior.FLAG_MOBILITY)))
{
if(guardian.ID().equals("GoodGuardian"))
guardian=CMClass.getBehavior("MobileGoodGuardian");
if(B.getParms().length()>0)
guardian.setParms(B.getParms());
M.delBehavior(B);
}
}
M.addBehavior(guardian);
M.addBehavior(CMClass.getBehavior("AntiVagrant"));
}
if(CMath.isSet(off,20))
M.addBehavior(CMClass.getBehavior("BrotherHelper"));
//if(CMath.isSet(off,21)) is missing
if(CMath.isSet(off,22))
M.addAbility(CMClass.getAbility("Fighter_Sweep"));
if((M.numAbilities())>numAbiles)
M.addBehavior(CMClass.getBehavior("CombatAbilities"));
Ability resist=CMClass.getAbility("Prop_Resistance");
if((CMath.isSet(res,0))||(CMath.isSet(imm,0)))
resist.setMiscText(resist.text()+" teleport");
if((CMath.isSet(res,1))||(CMath.isSet(imm,1)))
resist.setMiscText(resist.text()+" mind");
if((CMath.isSet(res,2))||(CMath.isSet(imm,2)))
resist.setMiscText(resist.text()+" magic");
if((CMath.isSet(res,3))||(CMath.isSet(imm,3)))
resist.setMiscText(resist.text()+" weapons");
if((CMath.isSet(res,4))||(CMath.isSet(imm,4)))
resist.setMiscText(resist.text()+" blunt");
if((CMath.isSet(res,5))||(CMath.isSet(imm,5)))
resist.setMiscText(resist.text()+" pierce");
if((CMath.isSet(res,6))||(CMath.isSet(imm,6)))
resist.setMiscText(resist.text()+" slash");
if((CMath.isSet(res,7))||(CMath.isSet(imm,7)))
resist.setMiscText(resist.text()+" fire");
if((CMath.isSet(res,8))||(CMath.isSet(imm,8)))
resist.setMiscText(resist.text()+" cold");
if((CMath.isSet(res,9))||(CMath.isSet(imm,9)))
resist.setMiscText(resist.text()+" elec");
if((CMath.isSet(res,10))||(CMath.isSet(imm,10)))
resist.setMiscText(resist.text()+" acid");
if((CMath.isSet(res,11))||(CMath.isSet(imm,11)))
resist.setMiscText(resist.text()+" poison");
if((CMath.isSet(res,12))||(CMath.isSet(imm,12)))
resist.setMiscText(resist.text()+" evil");
if((CMath.isSet(res,13))||(CMath.isSet(imm,13)))
resist.setMiscText(resist.text()+" holy");
if(CMath.isSet(res,14))
M.addNonUninvokableEffect(CMClass.getAbility("Spell_ResistMagicMissiles"));
if((CMath.isSet(res,15))||(CMath.isSet(imm,15)))
resist.setMiscText(resist.text()+" mind");
if((CMath.isSet(res,16))||(CMath.isSet(imm,16)))
resist.setMiscText(resist.text()+" disease");
if((CMath.isSet(res,17))||(CMath.isSet(imm,17)))
resist.setMiscText(resist.text()+" water gas");
//if(CMath.isSet(res,18)) no light resistance
//if(CMath.isSet(res,18)) no sound resistance
if(resist.text().length()>0)
{
resist.setMiscText(resist.text()+" "+(10+M.baseEnvStats().level())+"%");
M.addNonUninvokableEffect(resist);
}
}
String scriptStuff="";
while(objV.size()>0)
{
String s=nextLine(objV);
if(s.startsWith(">"))
{
s=eatLineSquiggle(objV);
if(!s.substring(1).trim().toUpperCase().startsWith("IN_FILE_PROG"))
{
scriptStuff+=s.substring(1).trim()+";";
s=nextLine(objV);
while(s.indexOf("~")<0)
{
scriptStuff+=s.trim()+";";
eatLine(objV);
s=nextLine(objV);
}
s=eatLineSquiggle(objV).trim();
scriptStuff+=s+"~";
}
}
else
if(s.startsWith("X "))
{
String codeLine=eatLineSquiggle(objV);
Behavior B=M.fetchBehavior("Sounder");
if(B==null)
{
B=CMClass.getBehavior("Sounder");
if(B!=null) M.addBehavior(B);
}
if(B.getParms().length()==0)
B.setParms(codeLine.substring(1).trim());
else
B.setParms(B.getParms()+";"+codeLine.substring(1).trim());
}
else
if(s.startsWith("|"))
{
eatNextLine(objV);
// just eat and go.. its an end of mob marker probably
}
else
eatNextLine(objV);
}
for(int mp=0;mp<mobProgData.size();mp++)
{
String s=(String)mobProgData.elementAt(mp);
String rest=null;
if(s.startsWith("#")&&(s.length()>1)&&(CMath.isNumber(""+s.charAt(1))))
{
s="M "+s.substring(1);
rest="";
while(s.indexOf("~")<=0)
{
mp++;
if(mp<mobProgData.size())
{
rest+=(String)mobProgData.elementAt(mp);
s=(String)mobProgData.elementAt(mp);
}
else
break;
}
}
if(s.startsWith("M "))
{
String MOBID=CMParms.getBit(s,1);
if(!("#"+MOBID).equals(OfThisID))
continue;
String mobprg=CMParms.getBit(s,2).toUpperCase().trim();
if(mobprg.equals("JANITOR.PRG"))
M.addBehavior(CMClass.getBehavior("Scavenger"));
else
if(mobprg.equals("VAGABOND.PRG"))
M.addBehavior(CMClass.getBehavior("Vagrant"));
else
if(mobprg.equals("DRUNK.PRG"))
{
if(M.fetchEffect("Inebriation")==null)
M.addNonUninvokableEffect(CMClass.getAbility("Inebriation"));
}
else
if(mobprg.equals("MID_CIT.PRG"))
{
//
}
else
if(mobprg.equals("BEGGAR.PRG"))
M.addBehavior(CMClass.getBehavior("Beggar"));
else
if(mobprg.equals("GATEGRD.PRG"))
M.addBehavior(CMClass.getBehavior("GateGuard"));
else
if(mobprg.equals("GATEGRD2.PRG"))
M.addBehavior(CMClass.getBehavior("GateGuard"));
else
if(mobprg.equals("CRIER.PRG"))
{
}
else
if(rest!=null)
continue;
else
{
try{
CMFile F2=new CMFile(areaFileName,M,true);
if((F2.exists())&&(!F2.isDirectory()))
{
int x=F2.getAbsolutePath().lastIndexOf('/');
String path=F2.getAbsolutePath().substring(0,x)+"/"+mobprg;
StringBuffer buf=new CMFile(path,M,true).text();
if((buf==null)||(buf.length()==0))
returnAnError(session,"Unknown MobPrg: "+mobprg,compileErrors,commands);
else
{
Vector V=Resources.getFileLineVector(buf);
while(V.size()>0)
{
s=nextLine(V);
if(s.startsWith(">"))
{
s=eatLineSquiggle(V).substring(1).trim();
scriptStuff+=s+";";
s=nextLine(V);
while(s.indexOf("~")<0)
{
scriptStuff+=s+";";
eatLine(V);
s=nextLine(V);
}
s=eatLineSquiggle(V).trim();
scriptStuff+=s+"~";
}
else
eatLine(V);
}
}
}
}catch(Exception e){
returnAnError(session,"Unknown MobPrg: "+mobprg,compileErrors,commands);
}
}
}
else
if(s.startsWith("O "))
{
// also unsupported
}
else
if((s.startsWith("#M"))||(s.startsWith("S")))
{
}
else
if(s.trim().length()>0)
returnAnError(session,"MobPrg line: "+s,compileErrors,commands);
}
if(scriptStuff.length()>0)
{
Behavior S=CMClass.getBehavior("Scriptable");
S.setParms(scriptStuff);
M.addBehavior(S);
}
for(int mp=0;mp<specialData.size();mp++)
{
String s=(String)specialData.elementAt(mp);
if(s.startsWith("M "))
{
String MOBID=CMParms.getBit(s,1);
if(!("#"+MOBID).equals(OfThisID))
continue;
String special=CMParms.getBit(s,2).toUpperCase().trim();
if((special.equals("SPEC_CAST_MAGE"))
||(special.equals("SPEC_WANDERER")))
M.addBehavior(CMClass.getBehavior("Mageness"));
else
if(special.equals("SPEC_CAST_SENESCHAL"))
{
M.addBehavior(CMClass.getBehavior("CombatAbilities"));
M.addAbility(CMClass.getAbility("Spell_Blindness"));
M.addAbility(CMClass.getAbility("Spell_DispelMagic"));
M.addAbility(CMClass.getAbility("Spell_Weaken"));
M.addAbility(CMClass.getAbility("Spell_AcidArrow"));
M.addAbility(CMClass.getAbility("Spell_Fireball"));
M.addAbility(CMClass.getAbility("Spell_AcidFog"));
M.addAbility(CMClass.getAbility("Spell_Lightning"));
M.addAbility(CMClass.getAbility("Undead_WeakEnergyDrain"));
M.addAbility(CMClass.getAbility("Prayer_Plague"));
}
else
if(special.equals("SPEC_CAST_BEHOLDER"))
{
M.addBehavior(CMClass.getBehavior("CombatAbilities"));
M.addAbility(CMClass.getAbility("Spell_Spook"));
M.addAbility(CMClass.getAbility("Spell_Slow"));
M.addAbility(CMClass.getAbility("Prayer_Harm"));
M.addAbility(CMClass.getAbility("Prayer_CauseCritical"));
M.addAbility(CMClass.getAbility("Prayer_CauseSerious"));
M.addAbility(CMClass.getAbility("Spell_DispelMagic"));
}
else
if(special.equals("SPEC_CAST_PSIONICIST"))
{
M.addBehavior(CMClass.getBehavior("CombatAbilities"));
M.addAbility(CMClass.getAbility("Spell_Spook"));
M.addAbility(CMClass.getAbility("Spell_Slow"));
M.addAbility(CMClass.getAbility("Spell_DispelMagic"));
M.addAbility(CMClass.getAbility("Undead_WeakEnergyDrain"));
M.addAbility(CMClass.getAbility("WeakParalysis"));
}
else
if((special.equals("SPEC_CAST_GHOST"))
||(special.equals("SPEC_UNDEAD")))
{
M.addBehavior(CMClass.getBehavior("CombatAbilities"));
M.addAbility(CMClass.getAbility("Spell_Spook"));
M.addAbility(CMClass.getAbility("Prayer_Curse"));
M.addAbility(CMClass.getAbility("Prayer_Blindness"));
M.addAbility(CMClass.getAbility("Prayer_Harm"));
M.addAbility(CMClass.getAbility("Prayer_Poison"));
M.addAbility(CMClass.getAbility("WeakParalysis"));
}
else
if(special.equals("SPEC_THIEF"))
M.addBehavior(CMClass.getBehavior("Thiefness"));
else
if(special.equals("SPEC_HEALER"))
M.addBehavior(CMClass.getBehavior("Healer"));
else
if(special.equals("SPEC_REPAIRMAN"))
M.addBehavior(CMClass.getBehavior("ItemMender"));
else
if((special.equals("SPEC_SUMMON_LIGHT"))
||(special.equals("SPEC_SUMMON_DEMON")))
{
M.addBehavior(CMClass.getBehavior("CombatAbilities"));
M.addAbility(CMClass.getAbility("Prayer_SummonElemental"));
}
else
if(special.equals("SPEC_EXECUTIONER"))
M.addBehavior(CMClass.getBehavior("GoodExecutioner"));
else
if(special.startsWith("SPEC_ASSASSIN"))
{
Behavior B=M.fetchBehavior("Aggressive");
if(B==null)B=M.fetchBehavior("MobileAggressive");
if(B==null)B=M.fetchBehavior("VeryAggressive");
if(B==null)B=CMClass.getBehavior("Aggressive");
B.setParms(B.getParms()+" MOBKILLER ");
M.addBehavior(B);
}
else
if(special.equals("SPEC_CAST_ADEPT"))
M.addBehavior(CMClass.getBehavior("Healer"));
else
if(special.equals("SPEC_CAST_CLERIC"))
M.addBehavior(CMClass.getBehavior("Clericness"));
else
if(special.equals("SPEC_NASTY"))
M.addBehavior(CMClass.getBehavior("FightFlee"));
else
if(special.equals("SPEC_DARK_MAGIC"))
{
M.addNonUninvokableEffect(CMClass.getAbility("Spell_SpellTurning"));
M.addAbility(CMClass.getAbility("Prayer_Heal"));
}
else
if(special.equals("SPEC_SMART"))
M.addBehavior(CMClass.getBehavior("Scavenger"));
else
if(special.equals("SPEC_CAST_UNDEAD"))
{
M.baseEnvStats().setDisposition(M.baseEnvStats().disposition()|EnvStats.IS_GOLEM);
M.addBehavior(CMClass.getBehavior("CombatAbilities"));
M.addAbility(CMClass.getAbility("Undead_ColdTouch"));
M.addAbility(CMClass.getAbility("Undead_LifeDrain"));
M.baseCharStats().setMyRace(CMClass.getRace("Undead"));
M.baseCharStats().getMyRace().startRacing(M,false);
}
else
if((special.equals("SPEC_GUARD"))
||(special.equals("SPEC_POLICEMAN"))
||(special.equals("SPEC_SPECIAL_GUARD")))
M.addBehavior(CMClass.getBehavior("GoodGuardian"));
else
if(special.equals("SPEC_FIDO"))
M.addBehavior(CMClass.getBehavior("CorpseEater"));
else
if((special.equals("SPEC_MAYOR"))
||(special.equals("SPEC_CAPTAIN")))
M.addBehavior(CMClass.getBehavior("MudChat"));
else
if(special.equals("SPEC_JANITOR"))
M.addBehavior(CMClass.getBehavior("Scavenger"));
else
if(special.equals("SPEC_BREATH_ANY"))
{
M.addBehavior(CMClass.getBehavior("CombatAbilities"));
M.addAbility(CMClass.getAbility("Dragonbreath"));
}
else
if(special.equals("SPEC_CAST_CADAVER"))
{
M.addBehavior(CMClass.getBehavior("CombatAbilities"));
M.addAbility(CMClass.getAbility("Prayer_Bury"));
}
else
if((special.equals("SPEC_REWIELD"))
||(special.equals("SPEC_WIZARDOFOZ"))
||(special.equals("SPEC_VAMP_HUNTER"))
||(special.equals("SPEC_MINO_GUARD")))
{
// who knows?
}
else
if(special.equals("SPEC_TAX_MAN"))
{
M.addBehavior(CMClass.getBehavior("RandomTeleporter"));
M.addBehavior(CMClass.getBehavior("Thiefness"));
}
else
if(special.equals("SPEC_STEPHEN"))
{
M.addBehavior(CMClass.getBehavior("RandomTeleporter"));
M.addBehavior(CMClass.getBehavior("Healer"));
}
else
if(special.equals("SPEC_CAST_BIGTIME"))
{
// In CoffeeMud, they all cast bigtime
}
else
if(special.equals("SPEC_BREATH_ACID"))
{
M.addBehavior(CMClass.getBehavior("CombatAbilities"));
M.addAbility(CMClass.getAbility("Acidbreath"));
}
else
if(special.equals("SPEC_CAST_JUDGE"))
{
M.addBehavior(CMClass.getBehavior("CombatAbilities"));
M.addAbility(CMClass.getAbility("Skill_Explosive"));
}
else
if(special.equals("SPEC_BREATH_FIRE"))
{
M.addBehavior(CMClass.getBehavior("CombatAbilities"));
M.addAbility(CMClass.getAbility("Firebreath"));
}
else
if(special.equals("SPEC_BREATH_FROST"))
{
M.addBehavior(CMClass.getBehavior("CombatAbilities"));
M.addAbility(CMClass.getAbility("Frostbreath"));
}
else
if(special.equals("SPEC_BREATH_GAS"))
{
M.addBehavior(CMClass.getBehavior("CombatAbilities"));
M.addAbility(CMClass.getAbility("Gasbreath"));
}
else
if(special.equals("SPEC_BREATH_LIGHTNING"))
{
M.addBehavior(CMClass.getBehavior("CombatAbilities"));
M.addAbility(CMClass.getAbility("Lighteningbreath"));
}
else
if(special.equals("SPEC_POISON"))
{
M.addBehavior(CMClass.getBehavior("CombatAbilities"));
M.addAbility(CMClass.getAbility("Poison"));
}
else
if(special.equals("SPEC_OGRE_MEMBER"))
{
Behavior B=CMClass.getBehavior("ROMGangMember");
B.setParms("Ogre");
M.addBehavior(B);
}
else
if(special.equals("SPEC_TROLL_MEMBER"))
{
Behavior B=CMClass.getBehavior("ROMGangMember");
B.setParms("Troll");
M.addBehavior(B);
}
else
if(special.equals("SPEC_PATROLMAN"))
M.addBehavior(CMClass.getBehavior("ROMPatrolman"));
else
returnAnError(session,"Unknown mob special: "+special,compileErrors,commands);
}
else
if((s.startsWith("#SPE"))||(s.startsWith("S"))||(s.startsWith("*")||(s.startsWith("#$"))))
{
}
else
if(s.trim().length()>0)
returnAnError(session,"Unknown mob special line: "+s,compileErrors,commands);
}
for(int a=0;a<M.numLearnedAbilities();a++)
{
Ability A=M.fetchAbility(a);
if(A!=null)
A.autoInvocation(M);
}
long rejuv=Tickable.TICKS_PER_RLMIN+Tickable.TICKS_PER_RLMIN+(Tickable.TICKS_PER_RLMIN*M.baseEnvStats().level()/2);
if(rejuv>(30*Tickable.TICKS_PER_RLMIN)) rejuv=(30*Tickable.TICKS_PER_RLMIN);
M.baseEnvStats().setRejuv((int)rejuv);
if(M.displayText().toUpperCase().indexOf("MONEY CHANGER")>=0)
M.addBehavior(CMClass.getBehavior("MoneyChanger"));
Behavior B=M.fetchBehavior("CombatAbilities");
if(B!=null)
{
Behavior BB=B;
for(int b=0;b<M.numBehaviors();b++)
{
B=M.fetchBehavior(b);
if(B.getClass().getSuperclass().getName().endsWith("CombatAbilities"))
{
M.delBehavior(BB);
M.recoverEnvStats();
break;
}
}
}
M.recoverCharStats();
M.recoverEnvStats();
M.recoverMaxState();
M.resetToMaxState();
M.text();
if(OfThisID.startsWith("#"))
doneMOBS.put(OfThisID.substring(1),M.copyOf());
else
doneMOBS.put(OfThisID,M.copyOf());
return M;
}
return null;
}
private static Item getItem(String OfThisID,
Session session,
String areaName,
Vector objectData,
Vector objProgData,
Hashtable doneItems,
Hashtable doneRooms,
boolean compileErrors,
Vector commands)
{
if(OfThisID.startsWith("#"))
{
if(doneItems.containsKey(OfThisID.substring(1)))
return (Item)((Item)doneItems.get(OfThisID.substring(1))).copyOf();
}
else
{
if(doneItems.containsKey(OfThisID))
return (Item)((Item)doneItems.get(OfThisID)).copyOf();
}
for(int o=0;o<objectData.size();o++)
{
Vector objV=null;
if(objectData.elementAt(o) instanceof Vector)
objV=(Vector)objectData.elementAt(o);
else
if(objectData.elementAt(o) instanceof String)
{
String s=(String)objectData.elementAt(o);
if((!s.toUpperCase().trim().startsWith("#OBJ"))&&(s.length()>0))
returnAnError(session,"Eating immaterial line: "+objectData.elementAt(o)+", area="+areaName,compileErrors,commands);
continue;
}
else
continue;
String objectID=eatNextLine(objV);
if(!objectID.equals(OfThisID))
continue;
String simpleName=CMLib.coffeeFilter().safetyFilter(eatLineSquiggle(objV));
String objectName=CMLib.coffeeFilter().safetyFilter(eatLineSquiggle(objV));
String objectDisplay=CMLib.coffeeFilter().safetyFilter(eatLineSquiggle(objV));
String objectDescription="";
if((nextLine(objV).indexOf("~")>=0)||((nextLine(objV).length()>0)&&(!Character.isDigit(nextLine(objV).charAt(0)))))
objectDescription=CMLib.coffeeFilter().safetyFilter(eatLineSquiggle(objV));
String codeStr1=eatNextLine(objV);
String codeStr2=eatNextLine(objV);
String codeStr3=eatNextLine(objV);
if((!objectID.startsWith("#"))
||((objectName.length()==0)
&&((CMParms.numBits(codeStr1)<3)
||(CMParms.numBits(codeStr1)>4)
||(CMParms.numBits(codeStr2)<4)
||(codeStr3.length()==0))))
{
returnAnError(session,"Malformed object! Aborting this object "+objectID+", display="+objectDisplay+", simple="+simpleName+", name="+objectName+", codeStr1="+codeStr1+", codeStr2="+codeStr2+", codeStr3="+codeStr3+", area="+areaName,compileErrors,commands);
continue;
}
if(objectName.length()==0)
objectName="Unknown";
boolean circleForm=false;
String obj=CMParms.getBit(codeStr1,0);
if((obj.trim().length()>1)&&(Character.isLetter(obj.charAt(0))))
circleForm=true;
int objType=CMath.s_int(obj);
final String[][] itemTypes={
{ "light","1"},
{ "scroll","2"},
{ "wand","3"},
{ "staff","4"},
{ "weapon","5"},
{ "treasure","8"},
{ "armor","9"},
{ "potion","10"},
{ "clothing","11"},
{ "furniture","12"},
{ "trash","13"},
{ "container","15"},
{ "drink","17"},
{ "key","18"},
{ "food","19"},
{ "money","20"},
{ "boat","22"},
{ "npc_corpse","99"},
{ "pc_corpse","99"},
{ "fountain","25"},
{ "pill","26"},
{ "protect",""},
{ "map","28"},
{ "portal","97"},
{ "warp_stone",""},
{ "room_key","98"},
{ "gem",""},
{ "jewelry",""},
{ "jukebox",""},
{ "tattoo",""},
{ "pipe","32"}
};
if(circleForm)
{
if(obj.equalsIgnoreCase("jukebox"))
continue;// NO JUKE BOXES!
for(int it=0;it<itemTypes.length;it++)
if(obj.equalsIgnoreCase(itemTypes[it][0]))
{
objType=CMath.s_int(itemTypes[it][1]);
break;
}
}
int extraFlag=getBitMask(codeStr1,1);
int wearFlag=getBitMask(codeStr1,2);
Ability adjuster=CMClass.getAbility("Prop_HaveAdjuster");
switch(objType)
{
case 2:
case 3:
case 4:
case 10:
if((codeStr2.indexOf("`")<=0)
&&(nextLine(objV).indexOf("`")>=0))
codeStr2=eatNextLine(objV);
break;
default:
break;
}
boolean forgiveZeroes=false;
if((codeStr2.indexOf("~")>=0)&&(codeStr2.lastIndexOf("~")>codeStr2.indexOf("~")))
{
Vector V=CMParms.parseSquiggles(codeStr2);
if(V.size()==4)
{
forgiveZeroes=true;
codeStr2="'"+((String)V.elementAt(0))+"' "
+"'"+((String)V.elementAt(1))+"' "
+"'"+((String)V.elementAt(2))+"' "
+"'"+((String)V.elementAt(3))+"'";
}
else
returnAnError(session,"Invalid object codeStr2 line: "+codeStr2+", item not aborted, but stuff will be wrong!",compileErrors,commands);
}
String str1=CMParms.getBit(codeStr2,0);
String str2=CMParms.getBit(codeStr2,1);
String str3=CMParms.getBit(codeStr2,2);
String str4=CMParms.getBit(codeStr2,3);
int val1=getBitMask(codeStr2,0);
int val2=getBitMask(codeStr2,1);
int val3=getBitMask(codeStr2,2);
int val4=getBitMask(codeStr2,3);
Item I=null;
switch(objType)
{
case 1: if(objectName.toUpperCase().indexOf("LANTERN")>=0)
I=CMClass.getBasicItem("GenLantern");
else
I=CMClass.getBasicItem("GenLightSource");
((Light)I).setDuration(val3*80);
break;
case 2: I=CMClass.getMiscMagic("GenScroll");
I.baseEnvStats().setLevel(val1);
I.setUsesRemaining(3);
((SpellHolder)I).setSpellList(getSpell(str2,val2)+";"+getSpell(str3,val3)+";"+getSpell(str4,val4));
break;
case 3: I=CMClass.getMiscMagic("GenWand");
I.baseEnvStats().setLevel(val1);
I.setUsesRemaining(val2);
((Wand)I).setSpell(CMClass.getAbility(getSpell(str4,val4)));
break;
case 4: I=CMClass.getWeapon("GenStaff");
I.baseEnvStats().setLevel(val1);
I.setUsesRemaining(val2);
((Wand)I).setSpell(CMClass.getAbility(getSpell(str4,val4)));
adjuster=CMClass.getAbility("Prop_WearAdjuster");
break;
case 5: I=CMClass.getWeapon("GenWeapon");
doWeapon((Weapon)I,objectName,val1,str1,val2,val3,val4,str4);
adjuster=CMClass.getAbility("Prop_WearAdjuster");
break;
case 6: I=CMClass.getWeapon("GenWeapon");
doWeapon((Weapon)I,objectName,val1,str1,val2,val3,val4,str4);
adjuster=CMClass.getAbility("Prop_WearAdjuster");
break;
case 7: I=CMClass.getWeapon("GenWeapon");
doWeapon((Weapon)I,objectName,val1,str1,val2,val3,val4,str4);
adjuster=CMClass.getAbility("Prop_WearAdjuster");
break;
case 8: I=CMClass.getBasicItem("GenItem");
break;
case 9: if(objectName.toUpperCase().indexOf("SHIELD")>=0)
I=CMClass.getArmor("GenShield");
else
I=CMClass.getArmor("GenArmor");
I.baseEnvStats().setArmor((int)Math.round(CMath.div((val1+val2+val3+val4+1),4.0)+1));
adjuster=CMClass.getAbility("Prop_WearAdjuster");
break;
case 10: I=CMClass.getMiscMagic("GenPotion");
I.baseEnvStats().setLevel(val1);
((Potion)I).setSpellList(getSpell(str2,val2)+";"+getSpell(str3,val3)+";"+getSpell(str4,val4));
break;
case 11: I=CMClass.getArmor("GenArmor");
I.baseEnvStats().setArmor(0);
adjuster=CMClass.getAbility("Prop_WearAdjuster");
break;
case 12: I=CMClass.getBasicItem("GenItem");
if(hasReadableContent(objectName))
I=CMClass.getBasicItem("GenReadable");
break;
case 13: I=CMClass.getBasicItem("GenItem");
if(hasReadableContent(objectName))
I=CMClass.getBasicItem("GenReadable");
break;
case 14: I=CMClass.getBasicItem("GenItem"); break;
case 15: if(CMLib.english().containsString(objectName,"belt")
||CMLib.english().containsString(objectName,"bandolier")
||CMLib.english().containsString(objectName,"sheath"))
I=CMClass.getArmor("GenArmor");
else
I=CMClass.getBasicItem("GenContainer");
((Container)I).setCapacity(val1);
boolean lid=false;
boolean open=true;
boolean lock=false;
boolean locked=false;
if((val2&1)==1)
lid=true;
if((val2&2)==2)
{
lock=true;
locked=true;
open=false;
lid=true;
I.baseEnvStats().setLevel(100);
}
if((val2&4)==4)
{
lid=true;
open=false;
}
if((val2&8)==8)
{
lock=true;
locked=true;
open=false;
lid=true;
}
((Container)I).setLidsNLocks(lid,open,lock,locked);
if(((Container)I).hasALid()&&((Container)I).hasALock())
((Container)I).setKeyName(areaName+"#"+val3);
break;
case 16: I=CMClass.getBasicItem("GenItem"); break;
case 17: I=CMClass.getBasicItem("GenDrink");
str3=str3.toUpperCase().trim();
if(((val3>0)&&(val3<6))
||(str3.indexOf("BEER")>=0)
||(str3.indexOf("ALE")>=0)
||(str3.indexOf("BREW")>=0)
||(str3.indexOf("WINE")>=0))
{
((Drink)I).setLiquidType(RawMaterial.RESOURCE_LIQUOR);
I.addEffect(CMClass.getAbility("Poison_Beer"));
((Drink)I).setLiquidHeld(val1*10);
((Drink)I).setLiquidRemaining(val2);
}
else
if(str3.indexOf("FIREBREATHER")>=0)
{
((Drink)I).setLiquidType(RawMaterial.RESOURCE_LIQUOR);
I.addEffect(CMClass.getAbility("Poison_Firebreather"));
((Drink)I).setLiquidHeld(val1*10);
((Drink)I).setLiquidRemaining(val2);
}
else
if(str3.indexOf("LOCAL SPECIALTY")>=0)
{
((Drink)I).setLiquidType(RawMaterial.RESOURCE_LIQUOR);
I.addEffect(CMClass.getAbility("Poison_Liquor"));
((Drink)I).setLiquidHeld(val1*10);
((Drink)I).setLiquidRemaining(val2);
}
else
if(str3.indexOf("WHISKEY")>=0)
{
((Drink)I).setLiquidType(RawMaterial.RESOURCE_LIQUOR);
I.addEffect(CMClass.getAbility("Poison_Liquor"));
((Drink)I).setLiquidHeld(val1*10);
((Drink)I).setLiquidRemaining(val2);
}
else
if((val4>0)||(str3.indexOf("POISON")>=0))
{
((Drink)I).setLiquidType(RawMaterial.RESOURCE_POISON);
I.addEffect(CMClass.getAbility("Poison"));
((Drink)I).setLiquidHeld(val1*10);
((Drink)I).setLiquidRemaining(val2);
}
else
{
((Drink)I).setLiquidHeld(val1*30);
((Drink)I).setLiquidRemaining(val2*10);
}
break;
case 18: I=CMClass.getBasicItem("GenKey");
((Key)I).setKey(areaName+objectID);
break;
case 19: I=CMClass.getBasicItem("GenFood");
if(val4>0)
{
I=CMClass.getMiscMagic("GenPill");
((Pill)I).setSpellList("Poison"+";");
}
((Food)I).setNourishment(20*val1);
break;
case 20: I=CMClass.getBasicItem("StdCoins");
((Coins)I).setNumberOfCoins(val1);
((Coins)I).setDenomination(1.0);
((Coins)I).setCurrency("");
break;
case 21: I=CMClass.getBasicItem("GenItem"); break;
case 22: I=CMClass.getBasicItem("GenBoat");
break;
case 23: I=CMClass.getBasicItem("GenCorpse"); break;
case 24: I=CMClass.getBasicItem("GenCorpse"); break;
case 25: I=CMClass.getBasicItem("GenWater");
CMLib.flags().setGettable(I,false);
((Drink)I).setLiquidHeld(Integer.MAX_VALUE-5000);
((Drink)I).setLiquidRemaining(((Drink)I).liquidHeld());
break;
case 26: I=CMClass.getMiscMagic("GenPill");
I.baseEnvStats().setLevel(val1);
((Pill)I).setSpellList(getSpell(str2,val2)+";"+getSpell(str3,val3)+";"+getSpell(str4,val4));
break;
case 27: I=CMClass.getBasicItem("GenItem"); break;
case 28: I=CMClass.getBasicItem("GenReadable"); // don't use GemMaps any more...
break;
case 29: I=CMClass.getBasicItem("GenItem"); break;
case 97: I=CMClass.getBasicItem("GenPortal");
if((str4.length()>0)&&(!str4.equals("0")))
{
Room R=CMLib.map().getRoom(doneRooms,areaName,str4);
if(R!=null)
I.setReadableText(R.roomID());
else
for(Enumeration e=CMLib.map().rooms();e.hasMoreElements();)
{
R=(Room)e.nextElement();
if(R.roomID().endsWith("#"+str4))
{
I.setReadableText(R.roomID());
break;
}
}
if(I.readableText().length()==0)
I.setReadableText("#"+str4);
}
break;
case 98: I=CMClass.getBasicItem("GenKey");
((Key)I).setKey(areaName+objectID);
break;
case 99: I=CMClass.getBasicItem("GenCorpse"); break;
case -1: I=CMClass.getBasicItem("GenWallpaper"); break;
default:
I=CMClass.getBasicItem("GenItem");
break;
}
if(!CMath.isSet(wearFlag,0))
CMLib.flags().setGettable(I,false);
if(CMath.isSet(wearFlag,1))
I.setRawProperLocationBitmap(Item.WORN_LEFT_FINGER|Item.WORN_RIGHT_FINGER|I.rawProperLocationBitmap());
if(CMath.isSet(wearFlag,2))
I.setRawProperLocationBitmap(Item.WORN_NECK|I.rawProperLocationBitmap());
if(CMath.isSet(wearFlag,3))
I.setRawProperLocationBitmap(Item.WORN_TORSO|I.rawProperLocationBitmap());
if(CMath.isSet(wearFlag,4))
I.setRawProperLocationBitmap(Item.WORN_HEAD|I.rawProperLocationBitmap());
if(CMath.isSet(wearFlag,5))
I.setRawProperLocationBitmap(Item.WORN_LEGS|I.rawProperLocationBitmap());
if(CMath.isSet(wearFlag,6))
I.setRawProperLocationBitmap(Item.WORN_FEET|I.rawProperLocationBitmap());
if(CMath.isSet(wearFlag,7))
I.setRawProperLocationBitmap(Item.WORN_HANDS|I.rawProperLocationBitmap());
if(CMath.isSet(wearFlag,8))
I.setRawProperLocationBitmap(Item.WORN_ARMS|I.rawProperLocationBitmap());
if(CMath.isSet(wearFlag,9))
I.setRawProperLocationBitmap(Item.WORN_HELD|I.rawProperLocationBitmap());
if(CMath.isSet(wearFlag,10))
I.setRawProperLocationBitmap(Item.WORN_ABOUT_BODY|I.rawProperLocationBitmap());
if(CMath.isSet(wearFlag,11))
I.setRawProperLocationBitmap(Item.WORN_WAIST|I.rawProperLocationBitmap());
if(CMath.isSet(wearFlag,12))
I.setRawProperLocationBitmap(Item.WORN_LEFT_WRIST|Item.WORN_RIGHT_WRIST|I.rawProperLocationBitmap());
if(CMath.isSet(wearFlag,13))
I.setRawProperLocationBitmap(Item.WORN_WIELD|Item.WORN_HELD|I.rawProperLocationBitmap());
if(CMath.isSet(wearFlag,14))
I.setRawProperLocationBitmap(Item.WORN_HELD|I.rawProperLocationBitmap());
if(CMath.isSet(wearFlag,15))
I.setRawLogicalAnd(true);
if(CMath.isSet(wearFlag,17))
I.setRawProperLocationBitmap(Item.WORN_EARS|I.rawProperLocationBitmap());
if(CMath.isSet(wearFlag,18)) // ankles
I.setRawProperLocationBitmap(Item.WORN_FEET|I.rawProperLocationBitmap());
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// the relation of this stuff is vital! must follow properlocation setting
// and the getttable setting ONLY!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if((adjuster.ID().equals("Prop_HaveAdjuster"))
&&(I.rawProperLocationBitmap()>0)
)
{
adjuster=CMClass.getAbility("Prop_WearAdjuster");
if(I.ID().equals("GenItem"))
{
long wear=I.rawProperLocationBitmap();
boolean bool=I.rawLogicalAnd();
boolean gettable=CMLib.flags().isGettable(I);
I=CMClass.getArmor("GenArmor");
I.setRawProperLocationBitmap(wear);
I.setRawLogicalAnd(bool);
I.baseEnvStats().setArmor(0);
CMLib.flags().setGettable(I,gettable);
}
}
Ability resister=CMClass.getAbility("Prop_HaveResister");
Ability caster=CMClass.getAbility("Prop_HaveSpellCast");
if(adjuster.ID().equals("Prop_WearAdjuster"))
{
resister=CMClass.getAbility("Prop_WearResister");
caster=CMClass.getAbility("Prop_WearSpellCast");
}
if(CMParms.numBits(codeStr3)>2)
{
I.baseEnvStats().setLevel(CMath.s_int(CMParms.getCleanBit(codeStr3,0)));
I.baseEnvStats().setWeight(CMath.s_int(CMParms.getCleanBit(codeStr3,1)) / 10);
if(I.baseEnvStats().weight()<1) I.baseEnvStats().setWeight(1);
if(I instanceof Rideable)
I.baseEnvStats().setWeight(CMath.s_int(CMParms.getCleanBit(codeStr3,1)) * 10);
I.setBaseValue(CMath.s_int(CMParms.getCleanBit(codeStr3,2)));
}
else
{
I.baseEnvStats().setLevel(CMath.s_int(codeStr3));
}
I.setName(objectName);
I.setDisplayText(objectDisplay);
if(!objectDescription.trim().equalsIgnoreCase("OLDSTYLE"))
I.setDescription(objectDescription);
if((I instanceof Weapon)
&&((objectName.toUpperCase().indexOf("TWO-HANDED")>=0)
||(objectName.toUpperCase().indexOf("TWO HANDED")>=0)))
{
I.setRawLogicalAnd(true);
I.setRawProperLocationBitmap(Item.WORN_HELD|I.rawProperLocationBitmap());
}
boolean materialchange=false;
for(int ot=0;ot<objDescs.length;ot++)
if(objectDescription.equalsIgnoreCase(objDescs[ot][0]))
{
I.setMaterial(CMath.s_int(objDescs[ot][1]));
materialchange=true;
break;
}
// correction for certain rings
if((((I.material()&RawMaterial.MATERIAL_MASK)==RawMaterial.MATERIAL_CLOTH)
||((I.material()&RawMaterial.MATERIAL_MASK)==RawMaterial.MATERIAL_PAPER))
&&(I.fitsOn(Item.WORN_LEFT_FINGER)))
{
I.setMaterial(RawMaterial.RESOURCE_SILVER);
materialchange=true;
}
if(materialchange)
I.setDescription("");
if((I instanceof Armor)&&(((Armor)I).containTypes()==Container.CONTAIN_ANYTHING))
{
if(CMLib.english().containsString(objectName,"belt")
||CMLib.english().containsString(objectName,"bandolier")
||CMLib.english().containsString(objectName,"sheath"))
{
((Armor)I).setContainTypes(Container.CONTAIN_ONEHANDWEAPONS);
if(((Armor)I).capacity()-I.baseEnvStats().weight()<30)
((Armor)I).setCapacity(I.baseEnvStats().weight()+30);
}
else
if(CMLib.english().containsString(objectName,"boot")
||CMLib.english().containsString(objectName,"bracer")
||CMLib.english().containsString(objectName,"sheath"))
{
((Armor)I).setContainTypes(Container.CONTAIN_DAGGERS);
if(((Armor)I).capacity()-I.baseEnvStats().weight()<10)
((Armor)I).setCapacity(I.baseEnvStats().weight()+10);
}
}
if(CMath.isSet(extraFlag,0))
I.baseEnvStats().setDisposition(I.baseEnvStats().disposition()|EnvStats.IS_GLOWING);
//if((extraFlag&2)==2) coffeemud has no hummers
if(CMath.isSet(extraFlag,2))
I.baseEnvStats().setDisposition(I.baseEnvStats().disposition()|EnvStats.IS_DARK);
if(CMath.isSet(extraFlag,4))
I.baseEnvStats().setDisposition(I.baseEnvStats().disposition()|EnvStats.IS_EVIL);
if(CMath.isSet(extraFlag,5))
I.baseEnvStats().setDisposition(I.baseEnvStats().disposition()|EnvStats.IS_INVISIBLE);
if(CMath.isSet(extraFlag,6))
I.baseEnvStats().setDisposition(I.baseEnvStats().disposition()|EnvStats.IS_BONUS);
if(CMath.isSet(extraFlag,7))
CMLib.flags().setDroppable(I,false);
if(CMath.isSet(extraFlag,8))
I.addNonUninvokableEffect(CMClass.getAbility("Prayer_Bless"));
Ability prop_WearZapper = CMClass.getAbility("Prop_WearZapper");
if(CMath.isSet(extraFlag,9))
prop_WearZapper.setMiscText(prop_WearZapper.text()+" -good");
if(CMath.isSet(extraFlag,10))
prop_WearZapper.setMiscText(prop_WearZapper.text()+" -evil");
if(CMath.isSet(extraFlag,11))
prop_WearZapper.setMiscText(prop_WearZapper.text()+" -neutral");
if(prop_WearZapper.text().length()>0)
I.addNonUninvokableEffect(prop_WearZapper);
if(CMath.isSet(extraFlag,12))
CMLib.flags().setRemovable(I,false);
//if(extraFlag&4096)==4096) coffeemud doesn't support rotting cargo
if(CMath.isSet(extraFlag,14))
CMLib.flags().setGettable(I,false);
//if(extraFlag&16384)==16384) coffeemud doesn't support rotting cargo
if(CMath.isSet(extraFlag,16))
I.baseEnvStats().setDisposition(I.baseEnvStats().disposition()|EnvStats.IS_INVISIBLE);
if(CMath.isSet(extraFlag,17))
I.baseEnvStats().setDisposition(I.baseEnvStats().disposition()|EnvStats.IS_GOOD);
if(CMath.isSet(extraFlag,18))
if((I.material()&RawMaterial.MATERIAL_MASK)==RawMaterial.MATERIAL_METAL)
I.setMaterial(RawMaterial.RESOURCE_GLASS);
if(CMath.isSet(extraFlag,20))
I.baseEnvStats().setSensesMask(I.baseEnvStats().sensesMask()|EnvStats.SENSE_UNLOCATABLE);
//if(CMath.isSet(extraFlag,22))
//nothing is unidentifiable
// now all those funny tags
while(objV.size()>0)
{
String codeLine=nextLine(objV).trim().toUpperCase();
if(codeLine.equals("E"))
{
eatNextLine(objV);
if((CMClass.getItem(I.ID())!=null)
&&(I.description().equals(CMClass.getItem(I.ID()).description())))
I.setDescription("");
else
if(I.description().length()>0)
I.setDescription(I.description()+"%0D");
eatLineSquiggle(objV);
boolean squiggleFound=false;
for(int y=0;y<objV.size();y++)
{
String ts=(String)objV.elementAt(y);
if(ts.indexOf("~")>=0)
{
squiggleFound=true;
break;
}
if(ts.equals("A")
||ts.equals("E")
||ts.equals("L")
||ts.equals("F"))
{
objV.insertElementAt("~",y);
squiggleFound=true;
break;
}
}
if(!squiggleFound)
objV.addElement("~");
String desc=CMLib.coffeeFilter().safetyFilter(eatLineSquiggle(objV));
I.setDescription(I.description()+desc);
if(I.ID().equals("GenReadable"))
I.setReadableText(fixReadableContent(I.description()));
}
else
if(codeLine.equals("L"))
{
eatNextLine(objV);
// need to figure this one out.
eatLine(objV);
}
else
if(codeLine.startsWith("X "))
{
codeLine=eatLineSquiggle(objV);
Behavior B=I.fetchBehavior("Sounder");
if(B==null)
{
B=CMClass.getBehavior("Sounder");
if(B!=null) I.addBehavior(B);
}
if(B.getParms().length()==0)
B.setParms(codeLine.substring(1).trim());
else
B.setParms(B.getParms()+";"+codeLine.substring(1).trim());
}
else
if(codeLine.equals("A"))
{
eatNextLine(objV);
String codesLine=eatNextLine(objV);
if(CMParms.numBits(codesLine)!=2)
returnAnError(session,"Malformed 'A' code for item "+objectID+", "+I.Name()+": "+codesLine+", area="+areaName,compileErrors,commands);
else
{
int num=CMath.s_int(CMParms.getCleanBit(codesLine,0));
int val=CMath.s_int(CMParms.getCleanBit(codesLine,1));
switch(num)
{
case 1:
adjuster.setMiscText(adjuster.text()+" str"+((val>=0)?("+"+val):(""+val)));
break;
case 2:
adjuster.setMiscText(adjuster.text()+" dex"+((val>=0)?("+"+val):(""+val)));
break;
case 3:
adjuster.setMiscText(adjuster.text()+" int"+((val>=0)?("+"+val):(""+val)));
break;
case 4:
adjuster.setMiscText(adjuster.text()+" wis"+((val>=0)?("+"+val):(""+val)));
break;
case 5:
adjuster.setMiscText(adjuster.text()+" con"+((val>=0)?("+"+val):(""+val)));
break;
case 6:
// coffeemud don't play with sex
break;
case 7:
adjuster.setMiscText(adjuster.text()+" cha"+((val>=0)?("+"+val):(""+val)));
break;
case 8: break;
case 9: break;
case 10: break;
case 11: break;
case 12:
adjuster.setMiscText(adjuster.text()+" mana"+((val>=0)?("+"+val):(""+val)));
break;
case 13:
adjuster.setMiscText(adjuster.text()+" hit"+((val>=0)?("+"+val):(""+val)));
break;
case 14:
adjuster.setMiscText(adjuster.text()+" move"+((val>=0)?("+"+val):(""+val)));
break;
case 15: break;
case 16: break;
case 17:
if((val>0)&&(I instanceof Armor))
I.baseEnvStats().setArmor(I.baseEnvStats().armor()+(val*5));
else
adjuster.setMiscText(adjuster.text()+" armor"+((val>=0)?("+"+(val*5)):(""+(val*5))));
break;
case 18:
if((val>0)&&(I instanceof Weapon))
I.baseEnvStats().setAttackAdjustment(I.baseEnvStats().attackAdjustment()+(val*5));
else
adjuster.setMiscText(adjuster.text()+" attack"+((val>=0)?("+"+(val*5)):(""+(val*5))));
break;
case 19:
if((val>0)&&(I instanceof Weapon))
I.baseEnvStats().setDamage(I.baseEnvStats().damage()+val);
else
adjuster.setMiscText(adjuster.text()+" damage"+((val>=0)?("+"+(val)):(""+(val))));
break;
case 20: // spells, but with a numeric value.. ?!?!
break;
case 21: break;
case 22: break;
case 23: break;
case 24:
resister.setMiscText(resister.text()+" magic "+((-val)*2)+"%");
break;
case 25:
// i have no idea what a power up is
break;
case 30:
switch(val)
{
case 6:
caster.setMiscText(caster.text()+("Prayer_Curse")+";");
break;
case 9:
caster.setMiscText(caster.text()+("Poison")+";");
break;
case 10:
caster.setMiscText(caster.text()+("Prayer_Plague")+";");
break;
case 11:
caster.setMiscText(caster.text()+("Spell_Blindness")+";");
break;
}
break;
}
}
}
else
if(codeLine.equals("F"))
{
eatNextLine(objV);
String codesLine=eatNextLine(objV);
if(CMParms.numBits(codesLine)!=4)
returnAnError(session,"Malformed 'F' code for item "+objectID+", "+I.Name()+": "+codesLine+", area="+areaName,compileErrors,commands);
else
{
String codeType=CMParms.getBit(codesLine,0);
if(codeType.equals("V"))
{
int res=getBitMask(codesLine,3);
int imm=getBitMask(codesLine,3);
String[] resistances={
" teleport",
" mind",
" magic",
" weapons",
" blunt",
" pierce",
" slash",
" fire",
" cold",
" elec",
" acid",
" poison",
" evil",
" holy",
"",
" mind",
" disease",
" gas"};
for(int rei=0;rei<resistances.length;rei++)
{
if((CMath.isSet(res,rei))&&(resistances[rei].length()>0))
resister.setMiscText(resister.text()+resistances[rei]+" -25%");
else
if((CMath.isSet(imm,rei))&&(resistances[rei].length()>0))
resister.setMiscText(resister.text()+resistances[rei]+" -100%");
}
}
else
if(codeType.equals("A"))
{
int dis=0;
int sense=0;
int codeBits=getBitMask(codesLine,3);
if(CMath.isSet(codeBits,0))
sense=sense|EnvStats.CAN_NOT_SEE;
if(CMath.isSet(codeBits,1))
dis=dis|EnvStats.IS_INVISIBLE;
if(CMath.isSet(codeBits,2))
sense=sense|EnvStats.CAN_SEE_EVIL;
if(CMath.isSet(codeBits,3))
sense=sense|EnvStats.CAN_SEE_INVISIBLE;
if(CMath.isSet(codeBits,4))
sense=sense|EnvStats.CAN_SEE_BONUS;
if(CMath.isSet(codeBits,5))
sense=sense|EnvStats.CAN_SEE_HIDDEN|EnvStats.CAN_SEE_SNEAKERS;
if(CMath.isSet(codeBits,6))
caster.setMiscText(caster.text()+("Spell_IronGrip")+";");
if(CMath.isSet(codeBits,7))
caster.setMiscText(caster.text()+("Prayer_Sanctuary")+";");
if(CMath.isSet(codeBits,8))
caster.setMiscText(caster.text()+("Spell_FaerieFire")+";");
if(CMath.isSet(codeBits,9))
sense=sense|EnvStats.CAN_SEE_INFRARED;
if(CMath.isSet(codeBits,10))
caster.setMiscText(caster.text()+("Prayer_Curse")+";");
if(CMath.isSet(codeBits,11))
caster.setMiscText(caster.text()+"Specialization_Weapon;");
if(CMath.isSet(codeBits,12))
caster.setMiscText(caster.text()+("Poison")+";");
if(CMath.isSet(codeBits,13))
caster.setMiscText(caster.text()+("Prayer_ProtEvil")+";");
if(CMath.isSet(codeBits,14))
caster.setMiscText(caster.text()+("Prayer_ProtGood")+";");
if(CMath.isSet(codeBits,15))
dis=dis|EnvStats.IS_SNEAKING;
if(CMath.isSet(codeBits,16))
caster.setMiscText(caster.text()+("Skill_Hide")+";");
if(CMath.isSet(codeBits,17))
{
dis=dis|EnvStats.IS_SLEEPING;
caster.setMiscText(caster.text()+("Spell_Sleep")+";");
}
//if(CMath.isSet(codeBits,18)) item cannot charm you
// caster.setMiscText(caster.text()+(new Poison().ID())+";");
if(CMath.isSet(codeBits,19))
dis=dis|EnvStats.IS_FLYING;
if(CMath.isSet(codeBits,20))
caster.setMiscText(caster.text()+("Spell_PassDoor")+";");
if(CMath.isSet(codeBits,21))
caster.setMiscText(caster.text()+("Spell_Haste")+";");
if(CMath.isSet(codeBits,22))
caster.setMiscText(caster.text()+("Prayer_Calm")+";");
if(CMath.isSet(codeBits,23))
caster.setMiscText(caster.text()+("Prayer_Plague")+";");
if(CMath.isSet(codeBits,24))
caster.setMiscText(caster.text()+("Spell_Awe")+";");
if(CMath.isSet(codeBits,25))
sense=sense|EnvStats.CAN_SEE_DARK;
if(CMath.isSet(codeBits,26))
caster.setMiscText(caster.text()+("Fighter_Berzerk")+";");
if(CMath.isSet(codeBits,27))
caster.setMiscText(caster.text()+("Regeneration")+";");
if(CMath.isSet(codeBits,28))
sense=sense|EnvStats.CAN_SEE_GOOD;
if(CMath.isSet(codeBits,29))
caster.setMiscText(caster.text()+("Spell_Slow")+";");
if(sense>0)
adjuster.setMiscText(adjuster.text()+" sen+"+sense);
if(dis>0)
adjuster.setMiscText(adjuster.text()+" dis+"+dis);
}
else
{
int res=getBitMask(codesLine,3);
int imm=getBitMask(codesLine,3);
String[] resistances={
" teleport",
" mind",
" magic",
" weapons",
" blunt",
" pierce",
" slash",
" fire",
" cold",
" elec",
" acid",
" poison",
" evil",
" holy",
"",
" mind",
" disease",
" gas"};
for(int rei=0;rei<resistances.length;rei++)
{
if((CMath.isSet(res,rei))&&(resistances[rei].length()>0))
resister.setMiscText(resister.text()+resistances[rei]+" 25%");
else
if((CMath.isSet(imm,rei))&&(resistances[rei].length()>0))
resister.setMiscText(resister.text()+resistances[rei]+" 100%");
}
if(CMath.isSet(res,14))
caster.setMiscText(caster.text()+"Spell_ResistMagicMissiles;");
//if(CMath.isSet(res,18)) no light resistance
//if(CMath.isSet(res,18)) no sound resistance
}
}
}
else
if(codeLine.startsWith(">"))
{
codeLine=eatLineSquiggle(objV);
String scriptStuff="";
if(!codeLine.substring(1).trim().toUpperCase().startsWith("IN_FILE_PROG"))
{
scriptStuff+=codeLine.substring(1).trim()+";";
codeLine=nextLine(objV);
while(codeLine.indexOf("~")<0)
{
scriptStuff+=codeLine.trim()+";";
eatLine(objV);
codeLine=nextLine(objV);
}
codeLine=eatLineSquiggle(objV).trim();
scriptStuff+=codeLine+"~";
}
// nothing done with the script. :(
}
else
if(codeLine.equals("|"))
{
eatNextLine(objV);
// have no idea, but we skip it
}
else
if((forgiveZeroes)
&&(codeLine.length()>0)
&&(CMath.isNumber(""+codeLine.charAt(0)))
&&(CMParms.numBits(codeLine)>1))
{
eatNextLine(objV);
// eos support
}
else
if((forgiveZeroes)
&&(codeLine.endsWith("~")))
{
eatNextLine(objV);
// eos support
}
else
if((codeLine.startsWith("#"))||(codeLine.length()==0))
{
eatNextLine(objV);
}
else
{
eatNextLine(objV);
returnAnError(session,"Unknown code for item "+objectID+", "+I.Name()+": "+codeLine+", area="+areaName,compileErrors,commands);
}
}
if(adjuster.text().length()>0)
I.addNonUninvokableEffect(adjuster);
if(caster.text().length()>0)
I.addNonUninvokableEffect(caster);
if(resister.text().length()>0)
I.addNonUninvokableEffect(resister);
I.recoverEnvStats();
I.text();
I.recoverEnvStats();
if(OfThisID.startsWith("#"))
doneItems.put(OfThisID.substring(1),I);
else
doneItems.put(OfThisID,I);
return I;
}
return null;
}
public static String socialFix(String str)
{
str=CMStrings.replaceAll(str,"$n","<S-NAME>");
str=CMStrings.replaceAll(str,"$N","<T-NAMESELF>");
str=CMStrings.replaceAll(str,"$m","<S-HIM-HER>");
str=CMStrings.replaceAll(str,"$M","<T-HIM-HER>");
str=CMStrings.replaceAll(str,"$s","<S-HIS-HER>");
str=CMStrings.replaceAll(str,"$S","<T-HIS-HER>");
str=CMStrings.replaceAll(str,"$e","<S-HE-SHE>");
str=CMStrings.replaceAll(str,"$E","<T-HE-SHE>");
str=CMStrings.replaceAll(str,"`","\'");
if(str.equals("$")) return "";
return str.trim();
}
public boolean execute(MOB mob, Vector commands)
throws java.io.IOException
{
boolean prompt=true;
boolean nodelete=false;
Hashtable doneItems=new Hashtable();
Hashtable doneRooms=new Hashtable();
Hashtable doneMOBS=new Hashtable();
Vector nextResetData=new Vector();
Hashtable laterLinks=new Hashtable();
boolean multiArea=false;
Vector custom=new Vector();
Hashtable externalFiles=new Hashtable();
HashSet customBotherChecker=new HashSet();
boolean compileErrors=false;
commands.removeElementAt(0);
if(((commands.size()>0)
&&(commands.elementAt(0) instanceof String)
&&((String)commands.elementAt(0)).equalsIgnoreCase("nodelete")))
{
commands.removeElementAt(0);
nodelete=true;
}
if(((commands.size()>0)
&&(commands.elementAt(0) instanceof String)
&&((String)commands.elementAt(0)).equalsIgnoreCase("noprompt")))
{
commands.removeElementAt(0);
prompt=false;
}
Session session=mob.session();
if((commands.size()>0)&&(commands.lastElement() instanceof StringBuffer))
{
compileErrors=true;
session=null;
}
else
{
if(session==null) return false;
if(commands.size()<1)
return returnAnError(session,"Import what? Specify the path/filename!",compileErrors,commands);
// continue pre-processing
for(int areaFile=commands.size()-1;areaFile>=0;areaFile--)
{
String areaFileName=(String)commands.elementAt(areaFile);
CMFile F=new CMFile(areaFileName,mob,true);
CMFile[] FF=F.listFiles();
if((FF!=null)&&(FF.length>0))
{
for(int f=0;f<FF.length;f++)
commands.addElement(FF[f].getAbsolutePath());
commands.removeElementAt(areaFile);
}
}
}
Vector mobData=new Vector();
Vector objectData=new Vector();
multiArea=commands.size()>1;
for(int areaFile=0;areaFile<commands.size();areaFile++)
{
Vector areaData=new Vector();
Vector roomData=new Vector();
Vector resetData=new Vector();
Vector mobProgData=new Vector();
Vector objProgData=new Vector();
Vector shopData=new Vector();
Vector specialData=new Vector();
Vector newRooms=new Vector();
Vector socialData=new Vector();
Vector reLinkTable=null;
StringBuffer buf=null;
String areaFileName=null;
CMFile CF=null;
if(commands.elementAt(areaFile) instanceof StringBuffer)
{
areaFileName="memory.cmare";
buf=(StringBuffer)commands.elementAt(areaFile);
}
else
{
areaFileName=(String)commands.elementAt(areaFile);
// read in the .are file
CF=new CMFile(areaFileName,mob,true);
buf=CF.text();
if((buf==null)||((buf!=null)&&(buf.length()==0)))
return returnAnError(session,"File not found at: '"+areaFileName+"'!",compileErrors,commands);
}
try
{
if(areaFileName.toUpperCase().trim().endsWith(".LST"))
{
if(session!=null) session.println("Unpacking areas lists from file : '"+areaFileName+"'...");
String filePrefix="";
int c=areaFileName.lastIndexOf('/');
if(c>=0) filePrefix=areaFileName.substring(0,c+1);
c=0;
String fn="";
while((buf.length()>0)&&(c<buf.length()))
{
switch(buf.charAt(c))
{
case '\n':
case '\r':
if((fn.length()>0)&&(!fn.startsWith("#"))&&(!fn.startsWith("$")))
commands.addElement(filePrefix+fn);
buf.delete(0,c+1);
c=0;
fn="";
break;
default:
fn+=buf.charAt(c);
c++;
break;
}
}
if((fn.length()>0)&&(!fn.startsWith("#"))&&(!fn.startsWith("$")))
commands.addElement(filePrefix+fn);
continue;
}
if((buf.length()>20)&&(buf.substring(0,20).indexOf("<AREAS>")>=0))
{
if(!CMSecurity.isAllowedEverywhere(mob,"IMPORTROOMS"))
{
returnAnError(session,"You are not allowed to import areas in '"+areaFileName+"'.",compileErrors,commands);
continue;
}
if(CF!=null) buf=CF.textUnformatted();
Vector areas=new Vector();
if(session!=null)
session.rawPrint("Unpacking area(s) from file: '"+areaFileName+"'...");
String error=CMLib.coffeeMaker().fillAreasVectorFromXML(buf.toString(),areas,custom,externalFiles);
if(error.length()==0) importCustomObjects(mob,custom,customBotherChecker,!prompt,nodelete);
if(error.length()==0) importCustomFiles(mob,externalFiles,customBotherChecker,!prompt,nodelete);
if(error.length()>0) return false;
if(session!=null)
session.rawPrintln("!");
if(session!=null) session.println("Found "+areas.size()+" areas.");
int num=areas.size();
int a=0;
while(areas.size()>0)
{
if(session!=null)
session.rawPrint("Unpacking area #"+(a+1)+"/"+num+"...");
Vector area=(Vector)areas.firstElement();
error=CMLib.coffeeMaker().unpackAreaFromXML(area,session,true);
if(session!=null)
session.rawPrintln("!");
if(error.startsWith("Area Exists: "))
{
String areaName=error.substring(13).trim();
if((nodelete)&&(!prompt))
return returnAnError(session,"Area '"+areaName+"' already exists.",compileErrors,commands);
else
if(((!prompt)||((session!=null)&&session.confirm("Area: \""+areaName+"\" exists, obliterate first?","N"))))
{
if(reLinkTable==null) reLinkTable=new Vector();
if((mob.location()!=null)
&&(mob.location().getArea().Name().equalsIgnoreCase(areaName)))
{
try
{
for(Enumeration r=CMLib.map().rooms();r.hasMoreElements();)
{
Room R=(Room)r.nextElement();
if((R!=null)&&(!R.getArea().Name().equalsIgnoreCase(areaName)))
{
R.bringMobHere(mob,true);
break;
}
}
}catch(NoSuchElementException e){}
}
if(!temporarilyDeleteArea(mob,reLinkTable,areaName))
return false;
}
else
return false;
}
else
if(error.length()>0)
return returnAnError(session,"An error occurred on import: "+error+"\n\rPlease correct the problem and try the import again.",compileErrors,commands);
else
{
areas.removeElement(area);
a++;
}
}
Log.sysOut("Import",mob.Name()+" imported "+areaFileName);
if(session!=null) session.println("Area(s) successfully imported!");
continue;
}
else
if((buf.length()>20)&&(buf.substring(0,20).indexOf("<AREA>")>=0))
{
if(!CMSecurity.isAllowedEverywhere(mob,"IMPORTROOMS"))
{
returnAnError(session,"You are not allowed to import area in '"+areaFileName+"'.",compileErrors,commands);
continue;
}
if(CF!=null) buf=CF.textUnformatted();
if(session!=null)
session.rawPrint("Unpacking area from file: '"+areaFileName+"'...");
Vector areaD=new Vector();
String error=CMLib.coffeeMaker().fillAreaAndCustomVectorFromXML(buf.toString(),areaD,custom,externalFiles);
if(error.length()==0) importCustomObjects(mob,custom,customBotherChecker,!prompt,nodelete);
if(error.length()==0) importCustomFiles(mob,externalFiles,customBotherChecker,!prompt,nodelete);
if(error.length()==0)
error=CMLib.coffeeMaker().unpackAreaFromXML(areaD,session,true);
if(session!=null)
session.rawPrintln("!");
if(error.startsWith("Area Exists: "))
{
String areaName=error.substring(13).trim();
if((nodelete)&&(!prompt))
return returnAnError(session,"Area '"+areaName+"' already exists.",compileErrors,commands);
else
if((!prompt)
||((session!=null)&&session.confirm("Area: \""+areaName+"\" exists, obliterate first?","N")))
{
reLinkTable=new Vector();
if(!temporarilyDeleteArea(mob,reLinkTable,areaName))
return false;
}
else
return false;
if(session!=null)
session.rawPrint("Unpacking area from file: '"+areaFileName+"'...");
error=CMLib.coffeeMaker().unpackAreaFromXML(areaD,session,true);
if(session!=null)
session.rawPrintln("!");
}
if(error.length()>0)
return returnAnError(session,"An error occurred on import: "+error+"\n\rPlease correct the problem and try the import again.",compileErrors,commands);
Log.sysOut("Import",mob.Name()+" imported "+areaFileName);
if(session!=null) session.println("Area successfully imported!");
continue;
}
else
if((buf.length()>20)&&(buf.substring(0,20).indexOf("<AROOM>")>=0))
{
if(!CMSecurity.isAllowedEverywhere(mob,"IMPORTROOMS"))
{
returnAnError(session,"You are not allowed to import room in '"+areaFileName+"'.",compileErrors,commands);
continue;
}
if(CF!=null) buf=CF.textUnformatted();
if(session!=null) session.println("Unpacking room from file: '"+areaFileName+"'...");
String error=CMLib.coffeeMaker().fillCustomVectorFromXML(buf.toString(),custom,externalFiles);
if(error.length()==0) importCustomObjects(mob,custom,customBotherChecker,!prompt,nodelete);
if(error.length()==0) importCustomFiles(mob,externalFiles,customBotherChecker,!prompt,nodelete);
if(error.length()==0)
error=CMLib.coffeeMaker().unpackRoomFromXML(buf.toString(),true);
if(error.startsWith("Room Exists: "))
{
Room R=CMLib.map().getRoom(error.substring(13).trim());
if(R!=null)
{
if((nodelete)&&(!prompt))
return returnAnError(session,"Room '"+R.ID()+"' already exists.",compileErrors,commands);
reLinkTable=new Vector();
try
{
for(Enumeration r=CMLib.map().rooms();r.hasMoreElements();)
{
Room R2=(Room)r.nextElement();
if(R2!=R)
for(int d=0;d<Directions.NUM_DIRECTIONS;d++)
{
Room dirR=R2.rawDoors()[d];
if((dirR!=null)&&(dirR==R))
reLinkTable.addElement(R2.roomID()+"/"+d+"/"+dirR.roomID());
}
}
}catch(NoSuchElementException e){}
CMLib.map().obliterateRoom(R);
}
error=CMLib.coffeeMaker().unpackRoomFromXML(buf.toString(),true);
}
if(error.length()>0)
return returnAnError(session,"An error occurred on import: "+error+"\n\rPlease correct the problem and try the import again.",compileErrors,commands);
Log.sysOut("Import",mob.Name()+" imported "+areaFileName);
if(session!=null) session.println("Room successfully imported!");
continue;
}
else
if((buf.length()>20)&&(buf.substring(0,20).indexOf("<MOBS>")>=0))
{
if(!CMSecurity.isAllowed(mob,mob.location(),"IMPORTMOBS"))
{
returnAnError(session,"You are not allowed to import mobs in '"+areaFileName+"' here.",compileErrors,commands);
continue;
}
if(CF!=null) buf=CF.textUnformatted();
if(session!=null)
session.rawPrint("Unpacking mobs from file: '"+areaFileName+"'...");
Vector mobs=new Vector();
String error=CMLib.coffeeMaker().fillCustomVectorFromXML(buf.toString(),custom,externalFiles);
if(error.length()==0) importCustomObjects(mob,custom,customBotherChecker,!prompt,nodelete);
if(error.length()==0) importCustomFiles(mob,externalFiles,customBotherChecker,!prompt,nodelete);
if(error.length()==0)
error=CMLib.coffeeMaker().addMOBsFromXML(buf.toString(),mobs,session);
if(session!=null) session.rawPrintln("!");
if(error.length()>0)
return returnAnError(session,"An error occurred on import: "+error+"\n\rPlease correct the problem and try the import again.",compileErrors,commands);
if(mob.location()==null)
return returnAnError(session,"You must be in a room to import mobs.",compileErrors,commands);
for(int m=0;m<mobs.size();m++)
{
MOB M=(MOB)mobs.elementAt(m);
M.setStartRoom(mob.location());
M.setLocation(mob.location());
M.bringToLife(mob.location(),true);
}
mob.location().recoverRoomStats();
Log.sysOut("Import",mob.Name()+" imported "+areaFileName);
if(session!=null) session.println("MOB(s) successfully imported!");
continue;
}
else
if((buf.length()>20)&&(buf.substring(0,20).indexOf("<PLAYERS>")>=0))
{
if(!CMSecurity.isAllowedEverywhere(mob,"IMPORTPLAYERS"))
{
returnAnError(session,"You are not allowed to import players in '"+areaFileName+"' here.",compileErrors,commands);
continue;
}
if(CF!=null) buf=CF.textUnformatted();
if(session!=null)
session.rawPrint("Unpacking players from file: '"+areaFileName+"'...");
Vector mobs=new Vector();
String error=CMLib.coffeeMaker().fillCustomVectorFromXML(buf.toString(),custom,externalFiles);
if(error.length()==0) importCustomObjects(mob,custom,customBotherChecker,!prompt,nodelete);
if(error.length()==0) importCustomFiles(mob,externalFiles,customBotherChecker,!prompt,nodelete);
if(error.length()==0)
error=CMLib.coffeeMaker().addPLAYERsFromXML(buf.toString(),mobs,session);
if(session!=null)
session.rawPrintln("!");
if(error.length()>0)
return returnAnError(session,"An error occurred on import: "+error+"\n\rPlease correct the problem and try the import again.",compileErrors,commands);
Vector names=null;
for(int m=0;m<mobs.size();m++)
{
MOB M=(MOB)mobs.elementAt(m);
for(int af=areaFile+1;af<commands.size();af++)
if(M.Name().equalsIgnoreCase((String)commands.elementAt(af)))
{
if(names==null) names=new Vector();
names.addElement(commands.elementAt(af));
}
}
if(names!=null)
for(int n=0;n<names.size();n++)
commands.removeElement(names.elementAt(n));
for(int m=0;m<mobs.size();m++)
{
MOB M=(MOB)mobs.elementAt(m);
if(names!=null)
{
boolean found=false;
for(int n=0;n<names.size();n++)
if(M.Name().equalsIgnoreCase((String)names.elementAt(n)))
found=true;
if(!found)
continue;
}
if(CMLib.database().DBUserSearch(null,M.Name()))
{
if(!prompt)
{
returnAnError(session,"Player '"+M.Name()+"' already exists. Skipping.",compileErrors,commands);
continue;
}
else
if((session!=null)&&(!session.confirm("Player: \""+M.Name()+"\" exists, obliterate first?","Y")))
continue;
else
CMLib.map().obliteratePlayer(CMLib.map().getLoadPlayer(M.Name()),false);
}
if(M.playerStats()!=null)
M.playerStats().setUpdated(System.currentTimeMillis());
CMLib.database().DBCreateCharacter(M);
CMLib.map().addPlayer(M);
Log.sysOut("Import","Imported user: "+M.Name());
for(int s=0;s<CMLib.sessions().size();s++)
{
Session S=CMLib.sessions().elementAt(s);
if((S!=null)
&&(S.mob()!=null)
&&((!CMLib.flags().isCloaked(M))||(CMSecurity.isASysOp(S.mob())))
&&(CMath.bset(S.mob().getBitmap(),MOB.ATT_AUTONOTIFY))
&&(S.mob().playerStats()!=null)
&&((S.mob().playerStats().getFriends().contains(M.Name())||S.mob().playerStats().getFriends().contains("All"))))
S.mob().tell("^X"+M.Name()+" has just been created.^.^?");
}
Vector channels=CMLib.channels().getFlaggedChannelNames("NEWPLAYERS");
for(int i=0;i<channels.size();i++)
CMLib.commands().postChannel((String)channels.elementAt(i),M.getClanID(),M.Name()+" has just been created.",true);
if(M.getStartRoom()==null)
M.setStartRoom(CMLib.map().getDefaultStartRoom(M));
if(M.location()==null)
M.setLocation(mob.location());
if(M.playerStats().getBirthday()==null)
{
M.baseCharStats().setStat(CharStats.STAT_AGE,M.playerStats().initializeBirthday((int)Math.round(CMath.div(M.getAgeHours(),60.0)),M.baseCharStats().getMyRace()));
M.recoverCharStats();
}
CMLib.database().DBUpdatePlayer(M);
M.removeFromGame(false);
}
Log.sysOut("Import",mob.Name()+" imported "+areaFileName);
if(session!=null) session.println("PLAYER(s) successfully imported!");
continue;
}
else
if((buf.length()>20)&&(buf.substring(0,20).indexOf("<ITEMS>")>=0))
{
if(!CMSecurity.isAllowed(mob,mob.location(),"IMPORTITEMS"))
{
returnAnError(session,"You are not allowed to import items in '"+areaFileName+"' here.",compileErrors,commands);
continue;
}
if(CF!=null) buf=CF.textUnformatted();
if(session!=null)
session.rawPrint("Unpacking items from file: '"+areaFileName+"'...");
Vector items=new Vector();
String error=CMLib.coffeeMaker().fillCustomVectorFromXML(buf.toString(),custom,externalFiles);
if(error.length()==0) importCustomObjects(mob,custom,customBotherChecker,!prompt,nodelete);
if(error.length()==0) importCustomFiles(mob,externalFiles,customBotherChecker,!prompt,nodelete);
if(error.length()==0)
error=CMLib.coffeeMaker().addItemsFromXML(buf.toString(),items,session);
if(session!=null) session.rawPrintln("!");
if(error.length()>0)
return returnAnError(session,"An error occurred on import: "+error+"\n\rPlease correct the problem and try the import again.",compileErrors,commands);
if(mob.location()==null)
return returnAnError(session,"You must be in a room to import items.",compileErrors,commands);
for(int i=0;i<items.size();i++)
{
Item I=(Item)items.elementAt(i);
mob.location().addItemRefuse(I,Item.REFUSE_PLAYER_DROP);
}
mob.location().recoverRoomStats();
Log.sysOut("Import",mob.Name()+" imported "+areaFileName);
if(session!=null) session.println("Item(s) successfully imported!");
continue;
}
}
catch(Exception e)
{
Log.errOut("Import-",e);
return returnAnError(session,e.getMessage(),compileErrors,commands);
}
Vector V=Resources.getFileLineVector(buf);
// sort the data into general blocks, and identify area
if(session!=null) session.println("\n\rSorting data from file '"+areaFileName+"'...");
readBlocks(V,areaData,roomData,mobData,resetData,objectData,mobProgData,objProgData,shopData,specialData,socialData);
boolean didSocials=false;
try
{
while(socialData.size()>0)
{
String codeLine=eatNextLine(socialData);
if((!codeLine.startsWith("#"))&&(codeLine.trim().length()>0))
{
didSocials=true;
String word=codeLine.trim().toUpperCase();
int x=word.indexOf(" ");
if(x>0) word=word.substring(0,x).trim();
Social S1=CMLib.socials().FetchSocial(word,true);
Social S2=CMLib.socials().FetchSocial(word+" <T-NAME>",true);
Social S3=CMLib.socials().FetchSocial(word+" SELF",true);
boolean changing=true;
if((S1==null)||(!S1.name().toUpperCase().equals(word)))
{
S1=(Social)CMClass.getCommon("DefaultSocial");
S1.setName(word);
CMLib.socials().addSocial(S1);
changing=false;
}
String str=socialFix(eatNextLine(socialData));
if(str.startsWith("#")) continue;
if((S1.You_see()==null)||(!S1.You_see().equals(str)))
{
if((changing)&&(session!=null))
session.rawPrint("Change '"+S1.name()+"' from '"+S1.You_see()+"', you see, to: '"+str+"'");
if((!changing)||((session!=null)&&session.confirm("?","Y")))
S1.setYou_see(str);
}
str=socialFix(eatNextLine(socialData));
if(str.startsWith("#")) continue;
if((S1.Third_party_sees()==null)||(!S1.Third_party_sees().equals(str)))
{
if((changing)&&(session!=null))
session.rawPrint("Change '"+S1.name()+"' from '"+S1.Third_party_sees()+"', others see, to: '"+str+"'");
if((!changing)||((session!=null)&&(session.confirm("?","Y"))))
S1.setThird_party_sees(str);
}
changing=true;
str=socialFix(eatNextLine(socialData));
if(str.startsWith("#")) continue;
if(S2==null)
{
S2=(Social)CMClass.getCommon("DefaultSocial");
S2.setName(word+" <T-NAME>");
CMLib.socials().addSocial(S2);
changing=false;
}
if((S2.You_see()==null)||(!S2.You_see().equals(str)))
{
if(changing)
session.rawPrint("Change '"+S2.name()+"' from '"+S2.You_see()+"', you see, to: '"+str+"'");
if((!changing)||(session.confirm("?","Y")))
S2.setYou_see(str);
}
str=socialFix(eatNextLine(socialData));
if(str.startsWith("#")) continue;
if((S2.Third_party_sees()==null)||(!S2.Third_party_sees().equals(str)))
{
if(changing)
session.rawPrint("Change '"+S2.name()+"', others see from '"+S2.Third_party_sees()+"', to: '"+str+"'");
if((!changing)||(session.confirm("?","Y")))
S2.setThird_party_sees(str);
}
str=socialFix(eatNextLine(socialData));
if(str.startsWith("#")) continue;
if((S2.Target_sees()==null)||(!S2.Target_sees().equals(str)))
{
if(changing)
session.rawPrint("Change '"+S2.name()+"', target sees from '"+S2.Target_sees()+"', to: '"+str+"'");
if((!changing)||(session.confirm("?","Y")))
S2.setTarget_sees(str);
}
str=socialFix(eatNextLine(socialData));
if(str.startsWith("#")) continue;
if((S2.See_when_no_target()==null)||(!S2.See_when_no_target().equals(str)))
{
if(changing)
session.rawPrint("Change '"+S2.name()+"', no target sees from '"+S2.See_when_no_target()+"', to: '"+str+"'");
if((!changing)||(session.confirm("?","Y")))
S2.setSee_when_no_target(str);
}
changing=true;
str=socialFix(eatNextLine(socialData));
if(str.startsWith("#")) continue;
if(S3==null)
{
S3=(Social)CMClass.getCommon("DefaultSocial");
S3.setName(word+" SELF");
CMLib.socials().addSocial(S3);
changing=false;
}
if((S3.You_see()==null)||(!S3.You_see().equals(str)))
{
if(changing)
session.rawPrint("Change '"+S3.name()+"', you see from '"+S3.You_see()+"', to: '"+str+"''");
if((!changing)||(session.confirm("?","Y")))
S3.setYou_see(str);
}
str=socialFix(eatNextLine(socialData));
if(str.startsWith("#")) continue;
if((S3.Third_party_sees()==null)||(!S3.Third_party_sees().equals(str)))
{
if(changing)
session.rawPrint("Change '"+S3.name()+"', others see from '"+S3.Third_party_sees()+"', to: '"+str+"'");
if((!changing)||(session.confirm("?","Y")))
S3.setThird_party_sees(str);
}
}
}
if(didSocials)
{
Log.sysOut("Import",mob.Name()+" imported socials from "+areaFileName);
CMLib.socials().save(mob);
}
}
catch(Exception e)
{
Log.errOut("Import",e);
return returnAnError(session,e.getMessage(),compileErrors,commands);
}
if((roomData.size()==0)||(areaData.size()==0))
{
if(!didSocials)
{
if(multiArea)
{
returnAnError(session,"No data in "+areaFileName,compileErrors,commands);
if((prompt)&&(session!=null))
{
try{
if(!session.confirm("Would you like to continue (y/N)","N"))
return false;
}catch(Exception e){}
}
continue;
}
returnAnError(session,"Missing data! It is very unlikely this is an .are file.",compileErrors,commands);
return false;
}
}
String areaName=getAreaName(areaData);
String areaAuthor=getAreaAuthor(areaData);
if((areaName==null)||((areaName!=null)&&(areaName.length()==0)))
{
if(!didSocials)
returnAnError(session,"#AREA tag not found!",compileErrors,commands);
if(multiArea)
continue;
return false;
}
if((areaName.toUpperCase().startsWith(areaAuthor.toUpperCase()+" "))
&&(areaName.substring(areaAuthor.length()+1).trim().length()>0))
areaName=areaName.substring(areaAuthor.length()+1).trim();
try
{
// confirm area creation/overwrite
boolean exists=false;
try
{
for(Enumeration r=CMLib.map().rooms();r.hasMoreElements();)
{
Room R=(Room)r.nextElement();
if(R.getArea().Name().equalsIgnoreCase(areaName))
{
exists=true;
break;
}
}
}catch(NoSuchElementException e){}
if(exists)
{
if((nodelete)&&(!prompt))
return returnAnError(session,"Area '"+areaName+"' already exists.",compileErrors,commands);
else
if((!prompt)
||(session.confirm("Area: \""+areaName+"\" exists, obliterate first?","N")))
{
reLinkTable=new Vector();
if(!temporarilyDeleteArea(mob,reLinkTable,areaName))
return false;
}
else
return false;
}
else
if((prompt)&&(!session.confirm("Found area: \""+areaName+"\", is this ok?","Y")))
return false;
if(session!=null) session.println("Loading and Linking Rooms...");
Log.sysOut("Import",mob.Name()+" imported "+areaName+" from "+areaFileName);
// begin initial room-read
// build first room structures, leaving rest for later.
Room lastRoom=null;
Hashtable petShops=new Hashtable();
for(int r=0;r<roomData.size();r++)
{
Vector roomV=null;
if(roomData.elementAt(r) instanceof Vector)
roomV=(Vector)roomData.elementAt(r);
else
if(roomData.elementAt(r) instanceof String)
{
String s=(String)roomData.elementAt(r);
if(!s.toUpperCase().trim().startsWith("#ROOM"))
returnAnError(session,"Eating immaterial line: "+roomData.elementAt(r)+", area="+areaName,compileErrors,commands);
continue;
}
else
continue;
Area A=CMLib.map().getArea(areaName);
if(A==null)
{
A=CMLib.database().DBCreateArea(areaName,"StdArea");
A.setAuthorID(areaAuthor);
CMLib.database().DBUpdateArea(areaName,A);
}
else
A.toggleMobility(false);
Room R=CMClass.getLocale("StdRoom");
String plainRoomID=eatNextLine(roomV);
R.setRoomID(plainRoomID);
if((roomV.size()>2)
&&(((String)roomV.elementAt(0)).trim().equals("~"))
&&(((String)roomV.elementAt(1)).trim().equals("~")))
{
eatLineSquiggle(roomV);
eatLineSquiggle(roomV);
R.setDisplayText("Emptiness...");
R.setDescription("");
}
else
{
R.setDisplayText(CMLib.coffeeFilter().safetyFilter(eatLineSquiggle(roomV)));
R.setDescription(CMLib.coffeeFilter().safetyFilter(eatLineSquiggle(roomV)));
}
if(R.expirationDate()!=0) R.setExpirationDate(R.expirationDate()+(360000));
String codeLine=eatNextLine(roomV);
if((!R.roomID().startsWith("#"))
||(R.displayText().length()==0)
||(CMParms.numBits(codeLine)<2)
||(CMParms.numBits(codeLine)>3))
{
returnAnError(session,"Malformed room! Aborting this room "+R.roomID()+", display="+R.displayText()+", description="+R.description()+", numBits="+CMParms.numBits(codeLine)+", area="+areaName,compileErrors,commands);
continue;
}
R.setRoomID(areaName+R.roomID());
R.setArea(A);
int codeBits=getBitMask(codeLine,0);
int sectorType=getBitMask(codeLine,1);
final String[][] secTypes={
{ "inside", "0"},
{ "city", "1"},
{ "field", "2"},
{ "forest", "3"},
{ "hills", "4"},
{ "mountain", "5"},
{ "swim", "6"},
{ "noswim", "7"},
{ "unused", "8"},
{ "air", "9"},
{ "desert", "10"}};
if(CMParms.numBits(codeLine)==3)
{
codeBits=sectorType;
String secType=CMParms.getBit(codeLine,2);
sectorType=getBitMask(codeLine,2);
for(int st=0;st<secTypes.length;st++)
if(secType.equalsIgnoreCase(secTypes[st][0]))
{
sectorType=CMath.s_int(secTypes[st][1]);
break;
}
}
if((codeBits&8)==0)
{
switch(sectorType)
{
case 0: R=changeRoomClass(R,"CityStreet"); break;
case 1: R=changeRoomClass(R,"CityStreet"); break;
case 2: R=changeRoomClass(R,"Plains"); break;
case 3: R=changeRoomClass(R,"Woods"); break;
case 4: R=changeRoomClass(R,"Hills"); break;
case 5: R=changeRoomClass(R,"Mountains"); break;
case 6: R=changeRoomClass(R,"ShallowWater"); break;
case 7: R=changeRoomClass(R,"WaterSurface"); break;
case 8: R=changeRoomClass(R,"FrozenPlains"); break;
case 9: R=changeRoomClass(R,"InTheAir"); break;
case 10: R=changeRoomClass(R,"Desert"); break;
case 11: R=changeRoomClass(R,"FrozenPlains"); break;
case 12: R=changeRoomClass(R,"FrozenMountains"); break;
}
}
else
{
switch(sectorType)
{
case 0: R=changeRoomClass(R,"StoneRoom"); break;
case 1: R=changeRoomClass(R,"StoneRoom"); break;
case 2: R=changeRoomClass(R,"WoodRoom"); break;
case 3: R=changeRoomClass(R,"WoodRoom"); break;
case 4: R=changeRoomClass(R,"StoneRoom"); break;
case 5: R=changeRoomClass(R,"StoneRoom"); break;
case 6: R=changeRoomClass(R,"IndoorShallowWater"); break;
case 7: R=changeRoomClass(R,"IndoorWaterSurface"); break;
case 8: R=changeRoomClass(R,"IceRoom"); break;
case 9: R=changeRoomClass(R,"IndoorInTheAir"); break;
case 10: R=changeRoomClass(R,"HotRoom"); break;
case 11: R=changeRoomClass(R,"IceRoom"); break;
case 12: R=changeRoomClass(R,"IceRoom"); break;
}
switch(sectorType)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 10:
case 11:
case 12:
if((R.displayText().toUpperCase().indexOf("CAVE")>=0)
||(R.description().toUpperCase().indexOf("CAVE")>=0))
R=changeRoomClass(R,"CaveRoom");
break;
}
}
Ability prop_RoomCapacity=CMClass.getAbility("Prop_ReqCapacity");
Ability prop_RoomLevels=CMClass.getAbility("Prop_ReqLevels");
if(CMath.isSet(codeBits,21)) // underwater room
R=changeRoomClass(R,"UnderWater");
//if(CMath.isSet(codeBits,1)) //BANKS are forked up in the ROM files, who knows WHAT this is...
if(CMath.isSet(codeBits,0)) // dark room
R.addNonUninvokableEffect(CMClass.getAbility("Prop_RoomDark"));
if(CMath.isSet(codeBits,2)) // no mobs room
R.addNonUninvokableEffect(CMClass.getAbility("Prop_ReqNoMOB"));
if(CMath.isSet(codeBits,4)) // no summon out room
R.addNonUninvokableEffect(CMClass.getAbility("Prop_NoSummon"));
if(CMath.isSet(codeBits,9)) // two people only room
{
prop_RoomCapacity.setMiscText("2");
if(R.fetchEffect(prop_RoomCapacity.ID())==null)
R.addNonUninvokableEffect(prop_RoomCapacity);
}
if(CMath.isSet(codeBits,10)) // no fighting
R.addNonUninvokableEffect(CMClass.getAbility("Prop_PeaceMaker"));
if(CMath.isSet(codeBits,11)) // solitaire room
{
prop_RoomCapacity.setMiscText("1");
if(R.fetchEffect(prop_RoomCapacity.ID())==null)
R.addNonUninvokableEffect(prop_RoomCapacity);
}
if(CMath.isSet(codeBits,12))
petShops.put(R,R);
else
if((lastRoom!=null)&&(petShops.get(lastRoom)!=null)&&(petShops.get(lastRoom)==lastRoom))
{
petShops.remove(lastRoom);
petShops.put(R,lastRoom); // now ready to plop stuff!
}
if(CMath.isSet(codeBits,13))
R.addNonUninvokableEffect(CMClass.getAbility("Prop_NoRecall"));
if(CMath.isSet(codeBits,14))
{
prop_RoomLevels.setMiscText("SYSOP");
if(R.fetchEffect(prop_RoomLevels.ID())==null)
R.addNonUninvokableEffect(prop_RoomLevels);
}
if(CMath.isSet(codeBits,15))
{
prop_RoomLevels.setMiscText(">=93");
if(R.fetchEffect(prop_RoomLevels.ID())==null)
R.addNonUninvokableEffect(prop_RoomLevels);
}
if(CMath.isSet(codeBits,16))
{
prop_RoomLevels.setMiscText(">=91");
if(R.fetchEffect(prop_RoomLevels.ID())==null)
R.addNonUninvokableEffect(prop_RoomLevels);
}
if(CMath.isSet(codeBits,17))
{
prop_RoomLevels.setMiscText("<=5");
if(R.fetchEffect(prop_RoomLevels.ID())==null)
R.addNonUninvokableEffect(prop_RoomLevels);
}
if(CMath.isSet(codeBits,18))
{
R.addNonUninvokableEffect(CMClass.getAbility("Prop_NoSummon"));
R.addNonUninvokableEffect(CMClass.getAbility("Prop_NoCharm"));
}
if(CMath.isSet(codeBits,19))
R.addNonUninvokableEffect(CMClass.getAbility("Prop_reqPKill"));
if(CMath.isSet(codeBits,20))
R.addNonUninvokableEffect(CMClass.getAbility("Prop_NoTeleportOut"));
// if(CMath.isSet(codeBits,23)) No "dirt" in CoffeeMud, so this doesn't matter
if(CMath.isSet(codeBits,24))
R.addNonUninvokableEffect(CMClass.getAbility("Prop_NoChannel"));
roomV.insertElementAt(R.roomID(),0);
newRooms.addElement(R);
if(plainRoomID.startsWith("#"))
doneRooms.put(plainRoomID.substring(1),R);
else
doneRooms.put(plainRoomID.substring(1),R);
lastRoom=R;
}
// begin second pass through rooms
// handle exits, mobs, objects, etc.
for(int r=0;r<roomData.size();r++)
{
Vector roomV=null;
if(roomData.elementAt(r) instanceof Vector)
roomV=(Vector)roomData.elementAt(r);
else
continue;
String roomID=eatLine(roomV);
Room R=CMLib.map().getRoom(doneRooms,areaName,roomID);
if(R==null)
{
Log.errOut("Import","Unhashed room "+roomID+"! Aborting!");
return false;
}
// handle exits, and 'E' tags
while(roomV.size()>0)
{
String nextLine=eatNextLine(roomV);
if(nextLine.toUpperCase().startsWith("S"))
continue;
else
if(nextLine.toUpperCase().startsWith("E"))
{
String nameString=CMLib.coffeeFilter().safetyFilter(eatLineSquiggle(roomV));
String descString=CMLib.coffeeFilter().safetyFilter(eatLineSquiggle(roomV));
Item I=null;
if(hasReadableContent(nameString))
{
I=CMClass.getBasicItem("GenWallpaper");
CMLib.flags().setReadable(I,true);
I.setReadableText(fixReadableContent(descString));
}
else
I=CMClass.getBasicItem("GenWallpaper");
I.setName(nameString);
I.setDisplayText("");
I.setDescription(descString);
R.addItem(I);
}
else
if(nextLine.toUpperCase().startsWith("D"))
{
int dirCode=CMath.s_int(CMParms.getCleanBit(nextLine,0).substring(1).trim());
String descStr=CMLib.coffeeFilter().safetyFilter(eatLineSquiggle(roomV));
String nameStr=CMLib.coffeeFilter().safetyFilter(eatLineSquiggle(roomV));
String codeStr=eatLine(roomV);
if(dirCode<Directions.NUM_DIRECTIONS)
switch(dirCode)
{
case 0: dirCode=Directions.NORTH; break;
case 1: dirCode=Directions.EAST; break;
case 2: dirCode=Directions.SOUTH; break;
case 3: dirCode=Directions.WEST; break;
case 4: dirCode=Directions.UP; break;
case 5: dirCode=Directions.DOWN; break;
case 6: dirCode=Directions.NORTHWEST; break;
case 7: dirCode=Directions.NORTHEAST; break;
case 8: dirCode=Directions.SOUTHWEST; break;
case 9: dirCode=Directions.SOUTHEAST; break;
case 10: dirCode=Directions.GATE; break;
default:
for(int d=0;d<Directions.NUM_DIRECTIONS;d++)
if(R.rawDoors()[d]==null)
{
dirCode=d;
break;
}
break;
}
else
if((dirCode==10)&&(Directions.NUM_DIRECTIONS<10))
dirCode=Directions.GATE;
else
for(int d=0;d<Directions.NUM_DIRECTIONS;d++)
if(R.rawDoors()[d]==null)
{
dirCode=d;
break;
}
if((dirCode<0)||(dirCode>=Directions.NUM_DIRECTIONS))
{
returnAnError(session,"Room: "+R.roomID()+", Unknown direction code: "+dirCode+", aborting exit, area="+areaName,compileErrors,commands);
continue;
}
if(CMParms.numBits(codeStr)!=3)
{
returnAnError(session,"Room: "+R.roomID()+", Malformed exit codeStr "+codeStr+". Aborting exit, area="+areaName,compileErrors,commands);
continue;
}
if((R.rawExits()[dirCode]!=null)||(R.rawDoors()[dirCode]!=null))
{
returnAnError(session,"Room: "+R.roomID()+", Redundant exit codeStr "+nextLine+"/"+codeStr+", dircode="+dirCode+". Aborting exit, area="+areaName,compileErrors,commands);
continue;
}
int exitFlag=( CMath.s_int(CMParms.getCleanBit(codeStr,0)) & 31);
int doorState=CMath.s_int(CMParms.getCleanBit(codeStr,1));
int linkRoomID=CMath.s_int(CMParms.getCleanBit(codeStr,2));
Exit E=CMClass.getExit("GenExit");
Room linkRoom=CMLib.map().getRoom(doneRooms,areaName,""+linkRoomID);
if(linkRoomID>=0)
{
boolean hasDoor=false;
boolean hasLock=false;
boolean defaultsClosed=false;
boolean defaultsLocked=false;
if((exitFlag==1)||(exitFlag==6))
{
hasDoor=true;
defaultsClosed=true;
if(exitFlag==6)
{
E.baseEnvStats().setLevel(100);
E.recoverEnvStats();
}
}
if(doorState<0)
defaultsClosed=false;
else
if(doorState>0)
{
hasDoor=true;
defaultsClosed=true;
if(doorState>1)
{
hasLock=true;
defaultsLocked=true;
E.setKeyName(areaName+"#"+doorState);
}
}
E.setDoorsNLocks(hasDoor,!defaultsClosed,defaultsClosed,
hasLock,defaultsLocked,defaultsLocked);
}
E.setDisplayText(descStr);
String name=CMParms.getCleanBit(nameStr,0).trim();
if(name.equalsIgnoreCase("SECRET"))
{
name="secret door";
E.baseEnvStats().setDisposition(E.baseEnvStats().disposition()|EnvStats.IS_HIDDEN);
E.recoverEnvStats();
}
if(name.length()>0)
E.setName(CMStrings.startWithAorAn(name));
else
{
if(E.hasADoor())
{
E.setName("a door");
name="door";
}
else
{
E.setName("the ground");
name="ground";
}
}
E.setExitParams(name,E.closeWord(),E.openWord(),E.Name()+", closed");
E.setDescription(descStr);
R.rawExits()[dirCode]=E;
Exit opExit=null;
if(((linkRoom==null)||(linkRoom.getArea().Name()!=R.getArea().Name()))&&(linkRoomID>=0))
{
try
{
for(Enumeration r2=CMLib.map().rooms();r2.hasMoreElements();)
{
Room R2=(Room)r2.nextElement();
if((R2.roomID().endsWith("#"+linkRoomID))&&(R2!=R))
{
synchronized(("SYNC"+R2.roomID()).intern())
{
R2=CMLib.map().getRoom(R2);
for(int d=0;d<Directions.NUM_DIRECTIONS;d++)
{
Exit E3=R2.rawExits()[d];
if((E3!=null)
&&(E3.temporaryDoorLink().length()>0)
&&(R.roomID().endsWith(E3.temporaryDoorLink())))
{
opExit=E3;
R2.rawDoors()[d]=R;
}
}
if(opExit==null)
if((prompt)&&
(!session.confirm(R.roomID()+" links to #"+linkRoomID+". Found "+R2.roomID()+". Link?","Y")))
continue;
linkRoom=R2;
if(opExit!=null) opExit.setTemporaryDoorLink("");
if((!doneRooms.containsValue(linkRoom))&&(!doneRooms.contains(linkRoom)))
CMLib.database().DBUpdateExits(linkRoom);
}
break;
}
}
}catch(NoSuchElementException e){}
if(linkRoom==null)
E.setTemporaryDoorLink("#"+linkRoomID);
else
E.setTemporaryDoorLink("");
}
if((linkRoom==null)&&(R.rawDoors()[dirCode]!=null))
returnAnError(session,"Room: "+R.roomID()+" re-linked "+Directions.getDirectionName(dirCode)+"ward to unknown room #"+linkRoomID+", area="+areaName,compileErrors,commands);
R.rawDoors()[dirCode]=linkRoom;
if((linkRoom==null)&&(linkRoomID>=0))
{
if(multiArea)
laterLinks.put((R.roomID()+"/"+dirCode),"#"+linkRoomID);
else
returnAnError(session,"Room: "+R.roomID()+" links "+Directions.getDirectionName(dirCode)+"ward to unknown room #"+linkRoomID+", area="+areaName,compileErrors,commands);
}
}
else
if(nextLine.toUpperCase().startsWith("M"))
{
// mana heal rate
// not important enough to generate an error from
}
else
if(nextLine.toUpperCase().startsWith("H"))
{
// hit point heal rate
// not important enough to generate an error from
}
else
if(nextLine.startsWith(">"))
{
String scriptStuff="";
if(!nextLine.substring(1).trim().toUpperCase().startsWith("IN_FILE_PROG"))
{
scriptStuff+=nextLine.substring(1).trim()+";";
nextLine=nextLine(roomV);
while(nextLine.indexOf("~")<0)
{
scriptStuff+=nextLine.trim()+";";
eatLine(roomV);
nextLine=nextLine(roomV);
}
nextLine=eatLineSquiggle(roomV).trim();
scriptStuff+=nextLine+"~";
}
// nothing done with the script. :(
}
else
if(nextLine.toUpperCase().startsWith("O"))
{
// ?
// not important enough to generate an error from
}
else
if(nextLine.startsWith("Rd"))
{
// some sort of eos thang
// not important enough to generate an error from
}
else
if(nextLine.trim().equals("|"))
{
// ?
// not important enough to generate an error from
}
else
if((!nextLine.equalsIgnoreCase("#0"))&&(nextLine.trim().length()>0))
returnAnError(session,"Unknown room code: "+nextLine+", area="+areaName,compileErrors,commands);
}
}
if(session!=null) session.print("Loading objects..");
Hashtable containerHash=new Hashtable();
MOB M=null;
Room R=null;
for(int nrd=0;nrd<nextResetData.size();nrd++)
resetData.addElement(nextResetData.elementAt(nrd));
nextResetData.clear();
while(resetData.size()>0)
{
if(session!=null) session.print(".");
String s=eatNextLine(resetData).trim();
if((s.startsWith("#RE"))||(s.startsWith("*"))||(s.startsWith("S")))
{
}
else
if(s.startsWith("M "))
{
String mobID=CMParms.getCleanBit(s,2);
String roomID=CMParms.getCleanBit(s,4);
R=CMLib.map().getRoom(doneRooms,areaName,roomID);
if(R==null)
{
if(multiArea)
nextResetData.addElement(s);
else
returnAnError(session,"Reset error (no room) on line: "+s+", area="+areaName,compileErrors,commands);
}
else
{
M=getMOB("#"+mobID,R,session,CMParms.copyVector(mobData),CMParms.copyVector(mobProgData),CMParms.copyVector(specialData),CMParms.copyVector(shopData),doneMOBS,areaFileName,compileErrors,commands);
if(M==null)
{
if(multiArea)
nextResetData.addElement(s);
else
returnAnError(session,"Reset error (no mob) on line: "+s+", area="+areaName,compileErrors,commands);
}
else
M.bringToLife(R,true);
}
}
else
if(s.startsWith("G "))
{
if(M==null)
{
if(multiArea)
nextResetData.addElement(s);
else
returnAnError(session,"Reset error (no mob) on line: "+s+", area="+areaName,compileErrors,commands);
}
else
{
String itemID=CMParms.getCleanBit(s,2);
Item I=getItem("#"+itemID,session,areaName,CMParms.copyVector(objectData),CMParms.copyVector(objProgData),doneItems,doneRooms,compileErrors,commands);
if(I==null)
{
if(multiArea) nextResetData.addElement(s);
else
returnAnError(session,"Reset error (no item) on line: "+s+", area="+areaName,compileErrors,commands);
}
else
{
I.recoverEnvStats();
if(M instanceof ShopKeeper)
{
int num=CMath.s_int(CMParms.getCleanBit(s,3));
if(num<0) num=100;
((ShopKeeper)M).getShop().addStoreInventory(I,num,-1,((ShopKeeper)M));
if((I instanceof Light)&&(!((ShopKeeper)M).getShop().doIHaveThisInStock("OilFlask",null,((ShopKeeper)M).whatIsSold(),M.getStartRoom())))
((ShopKeeper)M).getShop().addStoreInventory(CMClass.getBasicItem("OilFlask"),num*2,-1,((ShopKeeper)M));
else
if(((I.ID().equals("GenReadable"))
||(I instanceof com.planet_ink.coffee_mud.Items.interfaces.Map))
&&(!((ShopKeeper)M).getShop().doIHaveThisInStock("Parchment",null,((ShopKeeper)M).whatIsSold(),M.getStartRoom())))
{
((ShopKeeper)M).setWhatIsSold(ShopKeeper.DEAL_INVENTORYONLY);
((ShopKeeper)M).getShop().addStoreInventory(CMClass.getBasicItem("Parchment"),num,-1,((ShopKeeper)M));
Item journal2=CMClass.getBasicItem("GenJournal");
journal2.setName("the adventurers journal");
journal2.setBaseValue(250);
journal2.recoverEnvStats();
journal2.text();
((ShopKeeper)M).getShop().addStoreInventory(journal2,num,-1,((ShopKeeper)M));
}
else
if(((ShopKeeper)M).whatIsSold()==ShopKeeper.DEAL_WEAPONS)
{
Item arrows=CMClass.getBasicItem("GenAmmunition");
((Ammunition)arrows).setAmmunitionType("arrows");
arrows.setName("a pack of 20 arrows");
arrows.setUsesRemaining(20);
arrows.setBaseValue(50);
arrows.setDescription("They are sturdy and wooden, but probably not much use without a bow.");
arrows.setDisplayText("Some arrows have been left here.");
arrows.recoverEnvStats();
arrows.text();
((ShopKeeper)M).getShop().addStoreInventory(arrows,num,-1,((ShopKeeper)M));
}
}
else
M.addInventory(I);
I.recoverEnvStats();
M.recoverCharStats();
M.recoverEnvStats();
M.recoverMaxState();
M.text();
if(I instanceof Container)
containerHash.put(itemID,I);
}
}
}
else
if(s.startsWith("EC "))
{
String roomID=CMParms.getCleanBit(s,1);
String mobID=CMParms.getCleanBit(s,2);
int x=roomID.lastIndexOf("#");
if(x>=0) roomID=roomID.substring(x);
Room R2=CMLib.map().getRoom(doneRooms,areaName,roomID);
MOB M2=null;
if(R2!=null)
M2=R2.fetchInhabitant(mobID);
if((R2==null)||(M2==null))
{
if(multiArea)
nextResetData.addElement(s);
else
returnAnError(session,"Reset error (no mob) on line: "+s+", area="+areaName,compileErrors,commands);
}
else
{
String itemID=CMParms.getCleanBit(s,5);
Item I=getItem("#"+itemID,session,areaName,CMParms.copyVector(objectData),CMParms.copyVector(objProgData),doneItems,doneRooms,compileErrors,commands);
if(I==null)
{
if(multiArea)
nextResetData.addElement(s);
else
returnAnError(session,"Reset error (no item) on line: "+s+", area="+areaName,compileErrors,commands);
}
else
{
M2.addInventory(I);
I.wearIfPossible(M2);
I.recoverEnvStats();
M2.recoverCharStats();
M2.recoverEnvStats();
M2.recoverMaxState();
M2.text();
if(I instanceof Container)
containerHash.put(itemID,I);
}
}
}
else
if(s.startsWith("E "))
{
if(M==null)
{
if(multiArea) nextResetData.addElement(s);
else
returnAnError(session,"Reset error (no mob) on line: "+s+", area="+areaName,compileErrors,commands);
}
else
{
String itemID=CMParms.getCleanBit(s,2);
Item I=getItem("#"+itemID,session,areaName,CMParms.copyVector(objectData),CMParms.copyVector(objProgData),doneItems,doneRooms,compileErrors,commands);
if(I==null)
{
if(multiArea)
{
if(M.location()!=null)
nextResetData.addElement("EC '"+M.location().roomID()+"' '"+M.Name()+"' "+s);
else
nextResetData.addElement(s);
}
else
returnAnError(session,"Reset error (no item) on line: "+s+", area="+areaName,compileErrors,commands);
}
else
{
M.addInventory(I);
I.wearIfPossible(M);
I.recoverEnvStats();
M.recoverCharStats();
M.recoverEnvStats();
M.recoverMaxState();
M.text();
if(I instanceof Container)
containerHash.put(itemID,I);
}
}
}
else
if(s.startsWith("O "))
{
String itemID=CMParms.getCleanBit(s,2);
String roomID=CMParms.getCleanBit(s,4);
R=CMLib.map().getRoom(doneRooms,areaName,roomID);
if(R==null)
{
if(multiArea) nextResetData.addElement(s);
else
returnAnError(session,"Reset error (no room) on line: "+s+"/"+roomID+"/"+roomID.length()+", area="+areaName,compileErrors,commands);
}
else
{
Item I=getItem("#"+itemID,session,areaName,CMParms.copyVector(objectData),CMParms.copyVector(objProgData),doneItems,doneRooms,compileErrors,commands);
if(I==null)
{
if(multiArea) nextResetData.addElement(s);
else
returnAnError(session,"Reset error (no item) on line: "+s+", area="+areaName,compileErrors,commands);
}
else
{
R.addItem(I);
if(CMLib.flags().isGettable(I))
{
int rejuv=(int)Math.round(CMath.div((long)60000,Tickable.TIME_TICK)*4.0);
I.baseEnvStats().setRejuv(rejuv*I.baseEnvStats().level());
}
I.recoverEnvStats();
if(I instanceof Container)
{
containerHash.remove(itemID);
containerHash.put(itemID,I);
}
}
}
}
else
if(s.startsWith("P "))
{
String itemID=CMParms.getCleanBit(s,2);
String containerID=CMParms.getCleanBit(s,4);
Item I=getItem("#"+itemID,session,areaName,CMParms.copyVector(objectData),CMParms.copyVector(objProgData),doneItems,doneRooms,compileErrors,commands);
Container C=(Container)containerHash.get(containerID);
if(I==null)
{
if(multiArea) nextResetData.addElement(s);
else
returnAnError(session,"Reset error (no item) on line: "+s+", area="+areaName,compileErrors,commands);
}
else
if(C==null)
{
if(multiArea) nextResetData.addElement(s);
else
returnAnError(session,"Reset error (no container) on line: "+s+", area="+areaName,compileErrors,commands);
}
else
if(C.owner()==null)
{
if(multiArea) nextResetData.addElement(s);
else
returnAnError(session,"Reset error (no container owner) on line: "+s+", area="+areaName,compileErrors,commands);
}
else
if(C.owner() instanceof Room)
{
Room RR=(Room)C.owner();
RR.addItem(I);
I.setContainer(C);
if(CMLib.flags().isGettable(I))
I.baseEnvStats().setRejuv(1000);
I.recoverEnvStats();
if(I instanceof Container)
containerHash.put(itemID,I);
}
else
if(C.owner() instanceof MOB)
{
MOB MM=(MOB)C.owner();
MM.addInventory(I);
I.setContainer(C);
M.text();
I.recoverEnvStats();
if(I instanceof Container)
containerHash.put(itemID,I);
}
}
else
if(s.startsWith("D "))
{
String roomID=CMParms.getCleanBit(s,2);
int dirCode=getBitMask(s,3);
R=CMLib.map().getRoom(doneRooms,areaName,roomID);
if(R==null)
{
if(multiArea) nextResetData.addElement(s);
else
returnAnError(session,"Reset error (no room) on line: "+s+", area="+areaName,compileErrors,commands);
}
else
{
switch(dirCode)
{
case 0: dirCode=Directions.NORTH; break;
case 1: dirCode=Directions.EAST; break;
case 2: dirCode=Directions.SOUTH; break;
case 3: dirCode=Directions.WEST; break;
case 4: dirCode=Directions.UP; break;
case 5: dirCode=Directions.DOWN; break;
case 6:
case 7:
case 8:
case 9:
for(int d=0;d<Directions.NUM_DIRECTIONS;d++)
if((R.rawExits()[d]!=null)
&&(!R.rawExits()[d].hasADoor()))
{
dirCode=d;
break;
}
break;
case 10: dirCode=Directions.GATE; break;
default:
returnAnError(session,"Room: "+R.roomID()+", Unknown direction code: "+dirCode+" (not so bad at this point, it was probably aborted earlier, area="+areaName,compileErrors,commands);
}
if(dirCode<Directions.NUM_DIRECTIONS)
{
Exit E=R.rawExits()[dirCode];
if(E==null)
returnAnError(session,"Room: "+R.roomID()+", Unknown exit in dir: "+dirCode+" very confusing!, area="+areaName,compileErrors,commands);
else
{
int lockBit=getBitMask(s,4);
boolean HasDoor=E.hasADoor();
boolean HasLock=E.hasALock();
boolean DefaultsClosed=E.defaultsClosed();
boolean DefaultsLocked=E.defaultsLocked();
boolean Open=E.isOpen();
boolean Locked=E.isLocked();
switch(lockBit)
{
case 0:
HasDoor=true;
Locked=false;
DefaultsLocked=false;
Open=true;
DefaultsClosed=false;
break;
case 1:
HasDoor=true;
Locked=false;
DefaultsLocked=false;
Open=false;
DefaultsClosed=true;
break;
case 2:
HasDoor=true;
Locked=true;
DefaultsLocked=true;
Open=false;
DefaultsClosed=true;
break;
default:
returnAnError(session,"Room: "+R.roomID()+", Unknown door code: "+lockBit+", area="+areaName,compileErrors,commands);
break;
}
E.setDoorsNLocks(HasDoor,Open,DefaultsClosed,HasLock,Locked,DefaultsLocked);
if(E.hasADoor()&&E.name().equals("the ground"))
{
E.setName("a door");
E.setExitParams("door","close","open","a door, closed.");
}
}
}
}
}
else
if(s.startsWith("R "))
{
// have no idea what this is, but its not important.
}
else
if(s.startsWith("*"))
{
// usually a comment of some sort
}
else
if(s.length()>0)
returnAnError(session,"Reset, unknown command: "+s+", area="+areaName,compileErrors,commands);
}
// now fix the pet shops!
for(Enumeration e=petShops.keys();e.hasMoreElements();)
{
Room storeRoom=(Room)e.nextElement();
Room shopRoom=(Room)petShops.get(storeRoom);
ShopKeeper shopKeeper=null;
if(shopRoom==null)
returnAnError(session,"Unknown store room: "+storeRoom.roomID()+", area="+areaName,compileErrors,commands);
else
for(int i=0;i<shopRoom.numInhabitants();i++)
{
MOB sk=shopRoom.fetchInhabitant(i);
if((sk!=null)&&(sk instanceof ShopKeeper))
{ shopKeeper=(ShopKeeper)sk; break; }
}
if(shopKeeper==null)
returnAnError(session,"Unknown shopkeeper not in room: "+storeRoom.roomID()+", area="+areaName,compileErrors,commands);
else
while(storeRoom.numInhabitants()>0)
{
shopKeeper.setWhatIsSold(ShopKeeper.DEAL_PETS);
MOB pet=storeRoom.fetchInhabitant(0);
if(pet!=null)
{
shopKeeper.getShop().addStoreInventory(pet,20,-1,shopKeeper);
pet.setFollowing(null);
pet.destroy();
}
}
}
// now fix the smurfy wells
for(int r=0;r<newRooms.size();r++)
{
Room smurfRoom=(Room)newRooms.elementAt(r);
for(int ei=0;ei<smurfRoom.numItems();ei++)
{
Item lookItem=smurfRoom.fetchItem(ei);
if((lookItem!=null)&&(lookItem.displayText().length()==0))
{
for(int i=0;i<smurfRoom.numItems();i++)
{
Item I=smurfRoom.fetchItem(i);
if((I!=null)
&&(I.displayText().length()>0)
&&(I.displayText().indexOf(lookItem.Name())>=0))
{
String description=lookItem.description();
smurfRoom.delItem(lookItem);
Item testItem=CMClass.getItem(I.ID());
if((testItem!=null)&&(testItem.description().equals(I.description())))
I.setDescription(description);
else
I.setDescription(I.description()+"%0D"+description);
ei=ei-1;
break;
}
}
}
}
}
if(session!=null) session.print("\n\rResets...");
processRoomRelinks(reLinkTable,areaName,doneRooms);
if(newRooms.size()==0)
if(session!=null) session.println("\nDone? No Room!\n\r");
else
if(!multiArea)
if(session!=null) session.println("\nDone!!!!!! A good room to look at would be "+((Room)newRooms.elementAt(0)).roomID()+"\n\r");
else
if(session!=null) session.println("Done!!!\n\r");
}
catch(Exception e)
{
Log.errOut("Import",e);
return returnAnError(session,e.getMessage(),compileErrors,commands);
}
}
if(nextResetData.size()>0)
{
StringBuffer nrf=new StringBuffer("Import bad resets:\n\r");
for(int nrd=0;nrd<nextResetData.size();nrd++)
nrf.append(((String)nextResetData.elementAt(nrd))+"\n\r");
returnAnError(session,nrf.toString(),compileErrors,commands);
Log.errOut("Import",nrf.toString());
}
if(session!=null) session.print("\n\nSaving all areas imported...");
for(Enumeration e=doneRooms.elements();e.hasMoreElements();)
{
Room saveRoom=(Room)e.nextElement();
CMLib.database().DBCreateRoom(saveRoom,CMClass.className(saveRoom));
// final exit clean-up optomization
for(int d=0;d<Directions.NUM_DIRECTIONS;d++)
{
Exit E=saveRoom.rawExits()[d];
if((E!=null)
&&(E.isGeneric())
&&(!E.hasADoor())
&&(!E.hasALock())
&&(E.name().equalsIgnoreCase("the ground"))
&&(!E.isReadable())
&&(E.numEffects()==0)
&&(E.numBehaviors()==0)
&&(E.temporaryDoorLink().length()==0)
&&(E.displayText().equals(E.description())))
{
Exit E2=CMClass.getExit("OpenDescriptable");
E2.setMiscText(E.displayText());
saveRoom.rawExits()[d]=E2;
}
}
CMLib.threads().clearDebri(saveRoom,0);
CMLib.database().DBUpdateExits(saveRoom);
CMLib.database().DBUpdateMOBs(saveRoom);
CMLib.database().DBUpdateItems(saveRoom);
saveRoom.startItemRejuv();
saveRoom.recoverRoomStats();
if(session!=null) session.print(".");
}
if(session!=null) session.println("!");
if(laterLinks.size()>0)
{
for(Enumeration e=laterLinks.keys();e.hasMoreElements();)
{
String key=(String)e.nextElement();
String dcode=(String)laterLinks.get(key);
String roomID="";
String dirID="";
int x=key.lastIndexOf("/");
if(x>=0)
{
roomID=key.substring(0,x);
dirID=key.substring(x+1);
}
else
continue;
Room R1=CMLib.map().getRoom(doneRooms,"NOAREA",roomID);
if(R1!=null)
{
int dir=CMath.s_int(dirID);
Room RR=null;
Exit RE=null;
if(dir<Directions.NUM_DIRECTIONS)
{
RR=R1.rawDoors()[dir];
RE=R1.rawExits()[dir];
}
Room TR=CMLib.map().getRoom(doneRooms,"NOAREA",dcode);
if((RR==null)&&(TR==null))
returnAnError(session,"Room "+R1.roomID()+" links to unknown room "+dcode+" in direction "+Directions.getDirectionName(dir)+".",compileErrors,commands);
else
if(RR==null)
{
synchronized(("SYNC"+R1.roomID()).intern())
{
R1=CMLib.map().getRoom(R1);
R1.rawDoors()[dir]=TR;
if(RE!=null) RE.setTemporaryDoorLink("");
CMLib.database().DBUpdateExits(R1);
}
}
}
}
}
for(Enumeration e=doneRooms.elements();e.hasMoreElements();)
{
Room saveRoom=(Room)e.nextElement();
saveRoom.getArea().toggleMobility(true);
}
if(doneRooms.elements().hasMoreElements())
for(Enumeration a=CMLib.map().areas();a.hasMoreElements();)
((Area)a.nextElement()).fillInAreaRooms();
if(session!=null) session.println("done!");
return true;
}
public boolean canBeOrdered(){return true;}
public boolean securityCheck(MOB mob){return CMSecurity.isAllowedStartsWith(mob,"IMPORT");}
}