package com.planet_ink.coffee_mud.Behaviors; 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 org.mozilla.javascript.*; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.planet_ink.coffee_mud.Libraries.interfaces.*; /* 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 Scriptable extends StdBehavior implements ScriptingEngine { public String ID(){return "Scriptable";} protected int canImproveCode(){return Behavior.CAN_MOBS|Behavior.CAN_ITEMS|Behavior.CAN_ROOMS;} protected MOB lastToHurtMe=null; protected Room lastKnownLocation=null; protected Tickable altStatusTickable=null; protected Vector que=new Vector(); protected static final Hashtable funcH=new Hashtable(); protected static final Hashtable methH=new Hashtable(); protected static final Hashtable progH=new Hashtable(); private static Hashtable patterns=new Hashtable(); protected Vector oncesDone=new Vector(); protected Hashtable delayTargetTimes=new Hashtable(); protected Hashtable delayProgCounters=new Hashtable(); protected Hashtable lastTimeProgsDone=new Hashtable(); protected Hashtable lastDayProgsDone=new Hashtable(); private HashSet registeredSpecialEvents=new HashSet(); private Hashtable noTrigger=new Hashtable(); protected long tickStatus=Tickable.STATUS_NOT; private Quest defaultQuest=null; private Quest getQuest(String named) { if((defaultQuest!=null)&&(named.equals("*")||named.equalsIgnoreCase(defaultQuest.name()))) return defaultQuest; Quest Q=null; for(int i=0;i<CMLib.quests().numQuests();i++) { try{Q=CMLib.quests().fetchQuest(i);}catch(Exception e){} if(Q!=null) { if(Q.name().equalsIgnoreCase(named)) if(Q.running()) return Q; } } return CMLib.quests().fetchQuest(named); } public long getTickStatus() { Tickable T=altStatusTickable; if(T!=null) return T.getTickStatus(); return tickStatus; } public void registerDefaultQuest(Quest Q){ defaultQuest=Q; } public boolean endQuest(Environmental hostObj, MOB mob, String quest) { if(mob!=null) { Vector scripts=getScripts(); if(!mob.amDead()) lastKnownLocation=mob.location(); for(int v=0;v<scripts.size();v++) { Vector script=(Vector)scripts.elementAt(v); String trigger=""; if(script.size()>0) trigger=((String)script.elementAt(0)).toUpperCase().trim(); if((getTriggerCode(trigger)==13) //questtimeprog &&(!oncesDone.contains(script)) &&(CMParms.getCleanBit(trigger,1).equalsIgnoreCase(quest)||(quest.equalsIgnoreCase("*"))) &&(CMath.s_int(CMParms.getCleanBit(trigger,2).trim())<0)) { oncesDone.addElement(script); execute(hostObj,mob,mob,mob,null,null,script,null,new Object[10]); return true; } } } return false; } public Vector externalFiles() { Vector xmlfiles=new Vector(); parseParmFilenames(getParms(),xmlfiles,0); return xmlfiles; } public String getVarHost(Environmental E, String rawHost, MOB source, Environmental target, MOB monster, Item primaryItem, Item secondaryItem, String msg, Object[] tmp) { if(!rawHost.equals("*")) { if(E==null) rawHost=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,rawHost); else if(E instanceof Room) rawHost=CMLib.map().getExtendedRoomID((Room)E); else rawHost=E.Name(); } return rawHost; } public String getVar(Environmental E, String rawHost, String var, MOB source, Environmental target, MOB monster, Item primaryItem, Item secondaryItem, String msg, Object[] tmp) { return getVar(getVarHost(E,rawHost,source,target,monster,primaryItem,secondaryItem,msg,tmp),var); } public static String getVar(String host, String var) { Hashtable H=(Hashtable)Resources.getResource("SCRIPTVAR-"+host); String val=""; if(H!=null) { val=(String)H.get(var.toUpperCase()); if(val==null) val=""; } return val; } protected static class JScriptEvent extends ScriptableObject { public String getClassName(){ return "JScriptEvent";} static final long serialVersionUID=43; Environmental h=null; MOB s=null; Environmental t=null; MOB m=null; Item pi=null; Item si=null; Vector scr; String message=null; public Environmental host(){return h;} public MOB source(){return s;} public Environmental target(){return t;} public MOB monster(){return m;} public Item item(){return pi;} public Item item2(){return si;} public String message(){return message;} public void setVar(String host, String var, String value) { Scriptable.mpsetvar(host.toString(),var.toString().toUpperCase(),value.toString()); } public String getVar(String host, String var) { return Scriptable.getVar(host,var);} public String toJavaString(Object O){return Context.toString(O);} public JScriptEvent(Environmental host, MOB source, Environmental target, MOB monster, Item primaryItem, Item secondaryItem, String msg) { h=host; s=source; t=target; m=monster; pi=primaryItem; si=secondaryItem; message=msg; } } public void setParms(String newParms) { newParms=CMStrings.replaceAll(newParms,"'","`"); if(newParms.startsWith("+")) { String superParms=super.getParms(); if(superParms.length()>100) Resources.removeResource("PARSEDPRG: "+superParms.substring(0,100)+superParms.length()+superParms.hashCode()); else Resources.removeResource("PARSEDPRG: "+superParms); newParms=super.getParms()+";"+newParms.substring(1); } que=new Vector(); oncesDone=new Vector(); delayTargetTimes=new Hashtable(); delayProgCounters=new Hashtable(); lastTimeProgsDone=new Hashtable(); lastDayProgsDone=new Hashtable(); registeredSpecialEvents=new HashSet(); noTrigger=new Hashtable(); super.setParms(newParms); if(oncesDone.size()>0) oncesDone.clear(); } protected void parseParmFilenames(String parse, Vector filenames, int depth) { if(depth>10) return; // no including off to infinity while(parse.length()>0) { int y=parse.toUpperCase().indexOf("LOAD="); if(y>=0) { if(parse.substring(0,y).trim().endsWith("#")) { parse=parse.substring(y+1); continue; } int z=parse.indexOf("~",y); while((z>0)&&(parse.charAt(z-1)=='\\')) z=parse.indexOf("~",z+1); if(z>0) { String filename=parse.substring(y+5,z).trim(); parse=parse.substring(z+1); filenames.addElement(filename); parseParmFilenames(new CMFile(Resources.makeFileResourceName(filename),null,true).text().toString(),filenames,depth+1); } else { String filename=parse.substring(y+5).trim(); filenames.addElement(filename); parseParmFilenames(new CMFile(Resources.makeFileResourceName(filename),null,true).text().toString(),filenames,depth+1); break; } } else break; } } protected String parseLoads(String text, int depth) { StringBuffer results=new StringBuffer(""); String parse=text; if(depth>10) return ""; // no including off to infinity String p=null; while(parse.length()>0) { int y=parse.toUpperCase().indexOf("LOAD="); if(y>=0) { p=parse.substring(0,y).trim(); if((!p.endsWith(";")) &&(!p.endsWith("\n")) &&(!p.endsWith("\r")) &&(p.length()>0)) { results.append(parse.substring(0,y+1)); parse=parse.substring(y+1); continue; } results.append(p+"\n"); int z=parse.indexOf("~",y); while((z>0)&&(parse.charAt(z-1)=='\\')) z=parse.indexOf("~",z+1); if(z>0) { String filename=parse.substring(y+5,z).trim(); parse=parse.substring(z+1); results.append(parseLoads(new CMFile(Resources.makeFileResourceName(filename),null,true).text().toString(),depth+1)); } else { String filename=parse.substring(y+5).trim(); results.append(parseLoads(new CMFile(Resources.makeFileResourceName(filename),null,true).text().toString(),depth+1)); break; } } else { results.append(parse); break; } } return results.toString(); } protected Vector parseScripts(String text) { synchronized(funcH) { if(funcH.size()==0) { for(int i=0;i<funcs.length;i++) funcH.put(funcs[i],new Integer(i+1)); for(int i=0;i<methods.length;i++) methH.put(methods[i],new Integer(i+1)); for(int i=0;i<progs.length;i++) progH.put(progs[i],new Integer(i+1)); } } Vector V=new Vector(); text=parseLoads(text,0); int y=0; while((text!=null)&&(text.length()>0)) { y=text.indexOf("~"); while((y>0)&&(text.charAt(y-1)=='\\')) y=text.indexOf("~",y+1); String script=""; if(y<0) { script=text.trim(); text=""; } else { script=text.substring(0,y).trim(); text=text.substring(y+1).trim(); } if(script.length()>0) V.addElement(script); } for(int v=0;v<V.size();v++) { String s=(String)V.elementAt(v); Vector script=new Vector(); while(s.length()>0) { y=-1; int yy=0; while(yy<s.length()) if((s.charAt(yy)==';')&&((yy<=0)||(s.charAt(yy-1)!='\\'))) {y=yy;break;} else if(s.charAt(yy)=='\n'){y=yy;break;} else if(s.charAt(yy)=='\r'){y=yy;break;} else yy++; String cmd=""; if(y<0) { cmd=s.trim(); s=""; } else { cmd=s.substring(0,y).trim(); s=s.substring(y+1).trim(); } if((cmd.length()>0)&&(!cmd.startsWith("#"))) { cmd=CMStrings.replaceAll(cmd,"\\~","~"); cmd=CMStrings.replaceAll(cmd,"\\=","="); script.addElement(CMStrings.replaceAll(cmd,"\\;",";")); } } V.setElementAt(script,v); } V.trimToSize(); return V; } protected Room getRoom(String thisName, Room imHere) { if(thisName.length()==0) return null; Room room=CMLib.map().getRoom(thisName); if((room!=null)&&(room.roomID().equalsIgnoreCase(thisName))) return room; Room inAreaRoom=null; try { for(Enumeration p=CMLib.map().players();p.hasMoreElements();) { MOB M=(MOB)p.nextElement(); if((M.Name().equalsIgnoreCase(thisName)) &&(M.location()!=null) &&(CMLib.flags().isInTheGame(M,true))) inAreaRoom=M.location(); } if(inAreaRoom==null) for(Enumeration p=CMLib.map().players();p.hasMoreElements();) { MOB M=(MOB)p.nextElement(); if((M.name().equalsIgnoreCase(thisName)) &&(M.location()!=null) &&(CMLib.flags().isInTheGame(M,true))) inAreaRoom=M.location(); } if(inAreaRoom==null) for(Enumeration r=CMLib.map().rooms();r.hasMoreElements();) { Room R=(Room)r.nextElement(); if((R.roomID().endsWith("#"+thisName)) ||(R.roomID().endsWith(thisName))) { if((imHere!=null)&&(imHere.getArea().Name().equals(R.getArea().Name()))) inAreaRoom=R; else room=R; } } }catch(NoSuchElementException nse){} if(inAreaRoom!=null) return inAreaRoom; if(room!=null) return room; try { for(Enumeration r=CMLib.map().rooms();r.hasMoreElements();) { Room R=(Room)r.nextElement(); if(CMLib.english().containsString(R.displayText(),thisName)) { if((imHere!=null)&&(imHere.getArea().Name().equals(R.getArea().Name()))) inAreaRoom=R; else room=R; } } }catch(NoSuchElementException nse){} if(inAreaRoom!=null) return inAreaRoom; if(room!=null) return room; try { for(Enumeration r=CMLib.map().rooms();r.hasMoreElements();) { Room R=(Room)r.nextElement(); if(CMLib.english().containsString(R.description(),thisName)) { if((imHere!=null)&&(imHere.getArea().Name().equals(R.getArea().Name()))) inAreaRoom=R; else room=R; } } }catch(NoSuchElementException nse){} if(inAreaRoom!=null) return inAreaRoom; if(room!=null) return room; try { for(Enumeration r=CMLib.map().rooms();r.hasMoreElements();) { Room R=(Room)r.nextElement(); if((R.fetchInhabitant(thisName)!=null) ||(R.fetchItem(null,thisName)!=null)) { if((imHere!=null)&&(imHere.getArea().Name().equals(R.getArea().Name()))) inAreaRoom=R; else room=R; } } }catch(NoSuchElementException nse){} if(inAreaRoom!=null) return inAreaRoom; return room; } protected void scriptableError(Environmental scripted, String cmdName, String errType, String errMsg) { if(scripted!=null) { Room R=CMLib.map().roomLocation(scripted); Log.errOut("Scriptable",scripted.name()+"/"+CMLib.map().getExtendedRoomID(R)+"/"+ cmdName+"/"+errType+"/"+errMsg); if(R!=null) R.showHappens(CMMsg.MSG_OK_VISUAL,"Scriptable Error: "+scripted.name()+"/"+CMLib.map().getExtendedRoomID(R)+"/"+CMParms.toStringList(externalFiles())+"/"+ cmdName+"/"+errType+"/"+errMsg); } else Log.errOut("Scriptable","*/*/"+CMParms.toStringList(externalFiles())+"/"+cmdName+"/"+errType+"/"+errMsg); } protected boolean simpleEvalStr(Environmental scripted, String arg1, String arg2, String cmp, String cmdName) { int x=arg1.compareToIgnoreCase(arg2); if(cmp.equalsIgnoreCase("==")) return (x==0); else if(cmp.equalsIgnoreCase(">=")) return (x==0)||(x>0); else if(cmp.equalsIgnoreCase("<=")) return (x==0)||(x<0); else if(cmp.equalsIgnoreCase(">")) return (x>0); else if(cmp.equalsIgnoreCase("<")) return (x<0); else if(cmp.equalsIgnoreCase("!=")) return (x!=0); else { scriptableError(scripted,cmdName,"Syntax",arg1+" "+cmp+" "+arg2); return false; } } protected boolean simpleEval(Environmental scripted, String arg1, String arg2, String cmp, String cmdName) { long val1=CMath.s_long(arg1.trim()); long val2=CMath.s_long(arg2.trim()); if(cmp.equalsIgnoreCase("==")) return (val1==val2); else if(cmp.equalsIgnoreCase(">=")) return val1>=val2; else if(cmp.equalsIgnoreCase("<=")) return val1<=val2; else if(cmp.equalsIgnoreCase(">")) return (val1>val2); else if(cmp.equalsIgnoreCase("<")) return (val1<val2); else if(cmp.equalsIgnoreCase("!=")) return (val1!=val2); else { scriptableError(scripted,cmdName,"Syntax",val1+" "+cmp+" "+val2); return false; } } protected boolean simpleExpressionEval(Environmental scripted, String arg1, String arg2, String cmp, String cmdName) { double val1=CMath.s_parseMathExpression(arg1.trim()); double val2=CMath.s_parseMathExpression(arg2.trim()); if(cmp.equalsIgnoreCase("==")) return (val1==val2); else if(cmp.equalsIgnoreCase(">=")) return val1>=val2; else if(cmp.equalsIgnoreCase("<=")) return val1<=val2; else if(cmp.equalsIgnoreCase(">")) return (val1>val2); else if(cmp.equalsIgnoreCase("<")) return (val1<val2); else if(cmp.equalsIgnoreCase("!=")) return (val1!=val2); else { scriptableError(scripted,cmdName,"Syntax",val1+" "+cmp+" "+val2); return false; } } protected Vector loadMobsFromFile(Environmental scripted, String filename) { filename=filename.trim(); Vector monsters=(Vector)Resources.getResource("RANDOMMONSTERS-"+filename); if(monsters!=null) return monsters; StringBuffer buf=new CMFile(filename,null,true).text(); String thangName="null"; Room R=CMLib.map().roomLocation(scripted); if(R!=null) thangName=scripted.name()+" at "+CMLib.map().getExtendedRoomID((Room)scripted); else if(scripted!=null) thangName=scripted.name(); if((buf==null)||((buf!=null)&&(buf.length()<20))) { scriptableError(scripted,"XMLLOAD","?","Unknown XML file: '"+filename+"' in "+thangName); return null; } if(buf.substring(0,20).indexOf("<MOBS>")<0) { scriptableError(scripted,"XMLLOAD","?","Invalid XML file: '"+filename+"' in "+thangName); return null; } monsters=new Vector(); String error=CMLib.coffeeMaker().addMOBsFromXML(buf.toString(),monsters,null); if(error.length()>0) { scriptableError(scripted,"XMLLOAD","?","Error in XML file: '"+filename+"'"); return null; } if(monsters.size()<=0) { scriptableError(scripted,"XMLLOAD","?","Empty XML file: '"+filename+"'"); return null; } Resources.submitResource("RANDOMMONSTERS-"+filename,monsters); return monsters; } protected Vector loadItemsFromFile(Environmental scripted, String filename) { filename=filename.trim(); Vector items=(Vector)Resources.getResource("RANDOMITEMS-"+filename); if(items!=null) return items; StringBuffer buf=new CMFile(filename,null,true).text(); String thangName="null"; Room R=CMLib.map().roomLocation(scripted); if(R!=null) thangName=scripted.name()+" at "+CMLib.map().getExtendedRoomID((Room)scripted); else if(scripted!=null) thangName=scripted.name(); if((buf==null)||((buf!=null)&&(buf.length()<20))) { scriptableError(scripted,"XMLLOAD","?","Unknown XML file: '"+filename+"' in "+thangName); return null; } if(buf.substring(0,20).indexOf("<ITEMS>")<0) { scriptableError(scripted,"XMLLOAD","?","Invalid XML file: '"+filename+"' in "+thangName); return null; } items=new Vector(); String error=CMLib.coffeeMaker().addItemsFromXML(buf.toString(),items,null); if(error.length()>0) { scriptableError(scripted,"XMLLOAD","?","Error in XML file: '"+filename+"'"); return null; } if(items.size()<=0) { scriptableError(scripted,"XMLLOAD","?","Empty XML file: '"+filename+"'"); return null; } Resources.submitResource("RANDOMITEMS-"+filename,items); return items; } protected Environmental findSomethingCalledThis(String thisName, MOB meMOB, Room imHere, Vector OBJS, boolean mob) { if(thisName.length()==0) return null; Environmental thing=null; Environmental areaThing=null; ShopKeeper SK=null; if(thisName.toUpperCase().trim().startsWith("FROMFILE ")) { try{ Vector V=null; if(mob) V=loadMobsFromFile(null,CMParms.getCleanBit(thisName,1)); else V=loadItemsFromFile(null,CMParms.getCleanBit(thisName,1)); if(V!=null) { String name=CMParms.getPastBit(thisName,1); if(name.equalsIgnoreCase("ALL")) OBJS=V; else if(name.equalsIgnoreCase("ANY")) { if(V.size()>0) areaThing=(Environmental)V.elementAt(CMLib.dice().roll(1,V.size(),-1)); } else { areaThing=CMLib.english().fetchEnvironmental(V,name,true); if(areaThing==null) areaThing=CMLib.english().fetchEnvironmental(V,name,false); } } } catch(Exception e){} } else { if(!mob) areaThing=(meMOB!=null)?meMOB.fetchInventory(thisName):null; try { if(areaThing==null) for(Enumeration r=CMLib.map().rooms();r.hasMoreElements();) { Room R=(Room)r.nextElement(); Environmental E=null; if(mob) E=R.fetchInhabitant(thisName); else { E=R.fetchItem(null,thisName); if(E==null) for(int i=0;i<R.numInhabitants();i++) { MOB M=R.fetchInhabitant(i); if(M!=null) { E=M.fetchInventory(thisName); SK=CMLib.coffeeShops().getShopKeeper(M); if((SK!=null)&&(E==null)) E=SK.getShop().getStock(thisName,null,SK.whatIsSold(),M.getStartRoom()); } } } if(E!=null) { if((imHere!=null)&&(imHere.getArea().Name().equals(R.getArea().Name()))) areaThing=E; else thing=E; } } }catch(NoSuchElementException nse){} } if(areaThing!=null) OBJS.addElement(areaThing); else if(thing!=null) OBJS.addElement(thing); if(OBJS.size()>0) return (Environmental)OBJS.firstElement(); return null; } public Environmental getArgumentMOB(String str, MOB source, MOB monster, Environmental target, Item primaryItem, Item secondaryItem, String msg, Object[] tmp) { return getArgumentItem(str,source,monster,monster,target,primaryItem,secondaryItem,msg,tmp); } public Environmental getArgumentItem(String str, MOB source, MOB monster, Environmental scripted, Environmental target, Item primaryItem, Item secondaryItem, String msg, Object[] tmp) { if(str.length()<2) return null; if(str.charAt(0)=='$') { if(Character.isDigit(str.charAt(1))) { Object O=tmp[CMath.s_int(Character.toString(str.charAt(1)))]; if(O instanceof Environmental) return (Environmental)O; else if((O instanceof Vector)&&(str.length()>3)&&(str.charAt(2)=='.')) { Vector V=(Vector)O; String back=str.substring(2); if(back.charAt(1)=='$') back=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,back); if((back.length()>1)&&Character.isDigit(back.charAt(1))) { int x=1; while((x<back.length())&&(Character.isDigit(back.charAt(x)))) x++; int y=CMath.s_int(back.substring(1,x).trim()); if((V.size()>0)&&(y>=0)) { if(y>=V.size()) return null; O=V.elementAt(y); if(O instanceof Environmental) return (Environmental)O; } str=O.toString(); // will fall through } } else if(O!=null) str=O.toString(); // will fall through else return null; } else switch(str.charAt(1)) { case 'a': return (lastKnownLocation!=null)?lastKnownLocation.getArea():null; case 'N': case 'n': return source; case 'I': case 'i': return scripted; case 'T': case 't': return target; case 'O': case 'o': return primaryItem; case 'P': case 'p': return secondaryItem; case 'd': case 'D': return lastKnownLocation; case 'F': case 'f': if((monster!=null)&&(monster.amFollowing()!=null)) return monster.amFollowing(); return null; case 'r': case 'R': return getFirstPC(monster,null,lastKnownLocation); case 'c': case 'C': return getFirstAnyone(monster,null,lastKnownLocation); case 'w': return primaryItem!=null?primaryItem.owner():null; case 'W': return secondaryItem!=null?secondaryItem.owner():null; case 'x': case 'X': if(lastKnownLocation!=null) { if((str.length()>2)&&(Directions.getGoodDirectionCode(""+str.charAt(2))>=0)) return lastKnownLocation.getExitInDir(Directions.getGoodDirectionCode(""+str.charAt(2))); int i=0; Exit E=null; while(((++i)<100)||(E!=null)) E=lastKnownLocation.getExitInDir(CMLib.dice().roll(1,Directions.NUM_DIRECTIONS,-1)); return E; } return null; } } if(lastKnownLocation!=null) { str=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,str); Environmental E=lastKnownLocation.fetchFromRoomFavorMOBs(null,str,Item.WORNREQ_ANY); if(E==null) E=lastKnownLocation.fetchFromMOBRoomFavorsItems(monster,null,str,Item.WORNREQ_ANY); if(E==null) E=lastKnownLocation.fetchAnyItem(str); if((E==null)&&(monster!=null)) E=monster.fetchInventory(str); return E; } return null; } private String makeNamedString(Object O) { if(O instanceof Vector) return makeParsableString((Vector)O); else if(O instanceof Room) return ((Room)O).roomTitle(); else if(O instanceof Environmental) return ((Environmental)O).Name(); else if(O!=null) return O.toString(); return ""; } private String makeParsableString(Vector V) { if((V==null)||(V.size()==0)) return ""; if(V.firstElement() instanceof String) return CMParms.combineWithQuotes(V,0); StringBuffer ret=new StringBuffer(""); String S=null; for(int v=0;v<V.size();v++) { S=makeNamedString(V.elementAt(v)).trim(); if(S.length()==0) ret.append("? "); else if(S.indexOf(" ")>=0) ret.append("\""+S+"\" "); else ret.append(S+" "); } return ret.toString(); } public String varify(MOB source, Environmental target, MOB monster, Item primaryItem, Item secondaryItem, String msg, Object[] tmp, String varifyable) { int t=varifyable.indexOf("$"); if((monster!=null)&&(monster.location()!=null)) lastKnownLocation=monster.location(); if(lastKnownLocation==null) lastKnownLocation=source.location(); MOB randMOB=null; while((t>=0)&&(t<varifyable.length()-1)) { char c=varifyable.charAt(t+1); String middle=""; String front=varifyable.substring(0,t); String back=varifyable.substring(t+2); if(Character.isDigit(c)) middle=makeNamedString(tmp[CMath.s_int(Character.toString(c))]); else switch(c) { case 'a': if(lastKnownLocation!=null) middle=lastKnownLocation.getArea().name(); break; case 'c': case 'C': randMOB=getFirstAnyone(monster,randMOB,lastKnownLocation); if(randMOB!=null) middle=randMOB.name(); break; case 'i': if(monster!=null) middle=monster.name(); break; case 'I': if(monster!=null) middle=monster.displayText(); break; case 'n': case 'N': if(source!=null) middle=source.name(); break; case 't': case 'T': if(target!=null) middle=target.name(); break; case 'y': if(source!=null) middle=source.charStats().sirmadam(); break; case 'Y': if((target!=null)&&(target instanceof MOB)) middle=((MOB)target).charStats().sirmadam(); break; case 'r': case 'R': randMOB=getFirstPC(monster,randMOB,lastKnownLocation); if(randMOB!=null) middle=randMOB.name(); break; case 'j': if(monster!=null) middle=monster.charStats().heshe(); break; case 'f': if((monster!=null)&&(monster.amFollowing()!=null)) middle=monster.amFollowing().name(); break; case 'F': if((monster!=null)&&(monster.amFollowing()!=null)) middle=monster.amFollowing().charStats().heshe(); break; case 'e': if(source!=null) middle=source.charStats().heshe(); break; case 'E': if((target!=null)&&(target instanceof MOB)) middle=((MOB)target).charStats().heshe(); break; case 'J': randMOB=getFirstPC(monster,randMOB,lastKnownLocation); if(randMOB!=null) middle=randMOB.charStats().heshe(); break; case 'k': if(monster!=null) middle=monster.charStats().hisher(); break; case 'm': if(source!=null) middle=source.charStats().hisher(); break; case 'M': if((target!=null)&&(target instanceof MOB)) middle=((MOB)target).charStats().hisher(); break; case 'K': randMOB=getFirstPC(monster,randMOB,lastKnownLocation); if(randMOB!=null) middle=randMOB.charStats().hisher(); break; case 'o': case 'O': if(primaryItem!=null) middle=primaryItem.name(); break; case 'g': middle=((msg==null)?"":msg.toLowerCase()); break; case 'G': middle=((msg==null)?"":msg); break; case 'd': middle=(lastKnownLocation!=null)?lastKnownLocation.roomTitle():""; break; case 'D': middle=(lastKnownLocation!=null)?lastKnownLocation.roomDescription():""; break; case 'p': case 'P': if(secondaryItem!=null) middle=secondaryItem.name(); break; case 'w': middle=primaryItem!=null?primaryItem.owner().Name():middle; break; case 'W': middle=secondaryItem!=null?secondaryItem.owner().Name():middle; break; case 'l': if(lastKnownLocation!=null) { StringBuffer str=new StringBuffer(""); for(int i=0;i<lastKnownLocation.numInhabitants();i++) { MOB M=lastKnownLocation.fetchInhabitant(i); if((M!=null)&&(M!=monster)&&(CMLib.flags().canBeSeenBy(M,monster))) str.append("\""+M.name()+"\" "); } middle=str.toString(); break; } case 'L': if(lastKnownLocation!=null) { StringBuffer str=new StringBuffer(""); for(int i=0;i<lastKnownLocation.numItems();i++) { Item I=lastKnownLocation.fetchItem(i); if((I!=null)&&(I.container()==null)&&(CMLib.flags().canBeSeenBy(I,monster))) str.append("\""+I.name()+"\" "); } middle=str.toString(); break; } case '<': { int x=back.indexOf(">"); if(x>=0) { String mid=back.substring(0,x); int y=mid.indexOf(" "); Environmental E=null; String arg1=""; if(y>=0) { arg1=mid.substring(0,y).trim(); E=getArgumentItem(arg1,source,monster,monster,target,primaryItem,secondaryItem,msg,tmp); mid=mid.substring(y+1).trim(); } if(arg1.length()>0) middle=getVar(E,arg1,mid,source,target,monster,primaryItem,secondaryItem,msg,tmp); back=back.substring(x+1); } } break; case '[': { middle=""; int x=back.indexOf("]"); if(x>=0) { String mid=back.substring(0,x); int y=mid.indexOf(" "); if(y>0) { int num=CMath.s_int(mid.substring(0,y).trim()); mid=mid.substring(y+1).trim(); Quest Q=getQuest(mid); if(Q!=null) middle=Q.getQuestItemName(num); } back=back.substring(x+1); } } break; case '{': { middle=""; int x=back.indexOf("}"); if(x>=0) { String mid=back.substring(0,x).trim(); int y=mid.indexOf(" "); if(y>0) { int num=CMath.s_int(mid.substring(0,y).trim()); mid=mid.substring(y+1).trim(); Quest Q=getQuest(mid); if(Q!=null) middle=Q.getQuestMobName(num); } back=back.substring(x+1); } } break; case '%': { middle=""; int x=back.indexOf("%"); if(x>=0) { middle=functify(monster,source,target,monster,primaryItem,secondaryItem,msg,tmp,back.substring(0,x).trim()); back=back.substring(x+1); } } break; //case 'a': case 'A': // unnecessary, since, in coffeemud, this is part of the name break; case 'x': case 'X': if(lastKnownLocation!=null) { middle=""; Exit E=null; int dir=-1; if((t<varifyable.length()-2)&&(Directions.getGoodDirectionCode(""+varifyable.charAt(t+2))>=0)) { dir=Directions.getGoodDirectionCode(""+varifyable.charAt(t+2)); E=lastKnownLocation.getExitInDir(dir); } else { int i=0; while(((++i)<100)||(E!=null)) { dir=CMLib.dice().roll(1,Directions.NUM_DIRECTIONS,-1); E=lastKnownLocation.getExitInDir(dir); } } if((dir>=0)&&(E!=null)) { if(c=='x') middle=Directions.getDirectionName(dir); else middle=E.name(); } } break; } if((middle.length()>0) &&(back.startsWith(".")) &&(back.length()>1)) { if(back.charAt(1)=='$') back=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,back); if((back.length()>1)&&Character.isDigit(back.charAt(1))) { int x=1; while((x<back.length()) &&(Character.isDigit(back.charAt(x)))) x++; int y=CMath.s_int(back.substring(1,x).trim()); back=back.substring(x); boolean rest=back.startsWith(".."); if(rest) back=back.substring(2); Vector V=CMParms.parse(middle); if((V.size()>0)&&(y>=0)) { if(y>=V.size()) middle=""; else if(rest) middle=CMParms.combine(V,y); else middle=(String)V.elementAt(y); } } } varifyable=front+middle+back; t=varifyable.indexOf("$"); } return varifyable; } public static DVector getScriptVarSet(String mobname, String varname) { DVector set=new DVector(2); if(mobname.equals("*")) { Vector V=Resources.findResourceKeys("SCRIPTVAR-"); for(int v=0;v<V.size();v++) { String key=(String)V.elementAt(v); if(key.startsWith("SCRIPTVAR-")) { Hashtable H=(Hashtable)Resources.getResource(key); if(varname.equals("*")) { for(Enumeration e=H.keys();e.hasMoreElements();) { String vn=(String)e.nextElement(); set.addElement(key.substring(10),vn); } } else set.addElement(key.substring(10),varname); } } } else { Hashtable H=(Hashtable)Resources.getResource("SCRIPTVAR-"+mobname); if(varname.equals("*")) { for(Enumeration e=H.keys();e.hasMoreElements();) { String vn=(String)e.nextElement(); set.addElement(mobname,vn); } } else set.addElement(mobname,varname); } return set; } public String getStatValue(Environmental E, String arg2) { boolean found=false; String val=""; for(int i=0;i<E.getStatCodes().length;i++) { if(E.getStatCodes()[i].equalsIgnoreCase(arg2)) { val=E.getStat(arg2); found=true; break; } } if((!found)&&(E instanceof MOB)) { MOB M=(MOB)E; for(int i=0;i<CharStats.STAT_DESCS.length;i++) if(CharStats.STAT_DESCS[i].equalsIgnoreCase(arg2)) { val=""+M.charStats().getStat(CharStats.STAT_DESCS[i]); found=true; break; } if(!found) for(int i=0;i<M.curState().getStatCodes().length;i++) if(M.curState().getStatCodes()[i].equalsIgnoreCase(arg2)) { val=M.curState().getStat(M.curState().getStatCodes()[i]); found=true; break; } if(!found) for(int i=0;i<M.envStats().getCodes().length;i++) if(M.envStats().getCodes()[i].equalsIgnoreCase(arg2)) { val=M.envStats().getStat(M.envStats().getCodes()[i]); found=true; break; } if((!found)&&(M.playerStats()!=null)) for(int i=0;i<M.playerStats().getStatCodes().length;i++) if(M.playerStats().getStatCodes()[i].equalsIgnoreCase(arg2)) { val=M.playerStats().getStat(M.playerStats().getStatCodes()[i]); found=true; break; } if((!found)&&(arg2.toUpperCase().startsWith("BASE"))) for(int i=0;i<M.baseState().getStatCodes().length;i++) if(M.baseState().getStatCodes()[i].equalsIgnoreCase(arg2.substring(4))) { val=M.baseState().getStat(M.baseState().getStatCodes()[i]); found=true; break; } } if(!found)return null; return val; } public String getGStatValue(Environmental E, String arg2) { if(E==null) return null; boolean found=false; String val=""; for(int i=0;i<E.getStatCodes().length;i++) { if(E.getStatCodes()[i].equalsIgnoreCase(arg2)) { val=E.getStat(arg2); found=true; break; } } if(!found) if(E instanceof MOB) { for(int i=0;i<CMObjectBuilder.GENMOBCODES.length;i++) { if(CMObjectBuilder.GENMOBCODES[i].equalsIgnoreCase(arg2)) { val=CMLib.coffeeMaker().getGenMobStat((MOB)E,CMObjectBuilder.GENMOBCODES[i]); found=true; break; } } if(!found) { MOB M=(MOB)E; for(int i=0;i<CharStats.STAT_DESCS.length;i++) if(CharStats.STAT_DESCS[i].equalsIgnoreCase(arg2)) { val=""+M.charStats().getStat(CharStats.STAT_DESCS[i]); found=true; break; } if(!found) for(int i=0;i<M.curState().getStatCodes().length;i++) if(M.curState().getStatCodes()[i].equalsIgnoreCase(arg2)) { val=M.curState().getStat(M.curState().getStatCodes()[i]); found=true; break; } if(!found) for(int i=0;i<M.envStats().getCodes().length;i++) if(M.envStats().getCodes()[i].equalsIgnoreCase(arg2)) { val=M.envStats().getStat(M.envStats().getCodes()[i]); found=true; break; } if((!found)&&(M.playerStats()!=null)) for(int i=0;i<M.playerStats().getStatCodes().length;i++) if(M.playerStats().getStatCodes()[i].equalsIgnoreCase(arg2)) { val=M.playerStats().getStat(M.playerStats().getStatCodes()[i]); found=true; break; } if((!found)&&(arg2.toUpperCase().startsWith("BASE"))) for(int i=0;i<M.baseState().getStatCodes().length;i++) if(M.baseState().getStatCodes()[i].equalsIgnoreCase(arg2.substring(4))) { val=M.baseState().getStat(M.baseState().getStatCodes()[i]); found=true; break; } } } else if(E instanceof Item) { for(int i=0;i<CMObjectBuilder.GENITEMCODES.length;i++) { if(CMObjectBuilder.GENITEMCODES[i].equalsIgnoreCase(arg2)) { val=CMLib.coffeeMaker().getGenItemStat((Item)E,CMObjectBuilder.GENITEMCODES[i]); found=true; break; } } } if(found) return val; return null; } public static void mpsetvar(String name, String key, String val) { DVector V=getScriptVarSet(name,key); for(int v=0;v<V.size();v++) { name=(String)V.elementAt(v,1); key=((String)V.elementAt(v,2)).toUpperCase(); Hashtable H=(Hashtable)Resources.getResource("SCRIPTVAR-"+name); if(H==null) { if(val.length()==0) continue; H=new Hashtable(); Resources.submitResource("SCRIPTVAR-"+name,H); } if(val.equals("++")) { String num=(String)H.get(key); if(num==null) num="0"; val=new Integer(CMath.s_int(num.trim())+1).toString(); } else if(val.equals("--")) { String num=(String)H.get(key); if(num==null) num="0"; val=new Integer(CMath.s_int(num.trim())-1).toString(); } else if(val.startsWith("+")) { // add via +number form val=val.substring(1); int amount=CMath.s_int(val.trim()); String num=(String)H.get(key); val=new Integer(CMath.s_int(num.trim())+amount).toString(); } else if(val.startsWith("-")) { // subtract -number form val=val.substring(1); int amount=CMath.s_int(val.trim()); String num=(String)H.get(key); val=new Integer(CMath.s_int(num.trim())-amount).toString(); } else if(val.startsWith("*")) { // multiply via *number form val=val.substring(1); int amount=CMath.s_int(val.trim()); String num=(String)H.get(key); val=new Integer(CMath.s_int(num.trim())*amount).toString(); } else if(val.startsWith("/")) { // divide /number form val=val.substring(1); int amount=CMath.s_int(val.trim()); String num=(String)H.get(key); val=new Integer(CMath.s_int(num.trim())/amount).toString(); } if(H.containsKey(key)) H.remove(key); if(val.trim().length()>0) H.put(key,val); if(H.size()==0) Resources.removeResource("SCRIPTVAR-"+name); } } public boolean eval(Environmental scripted, MOB source, Environmental target, MOB monster, Item primaryItem, Item secondaryItem, String msg, Object[] tmp, String evaluable) { Vector formatCheck=CMParms.parse(evaluable); for(int i=1;i<(formatCheck.size()-1);i++) if((" == >= > < <= => =< != ".indexOf(" "+((String)formatCheck.elementAt(i))+" ")>=0) &&(((String)formatCheck.elementAt(i-1)).endsWith(")"))) { String ps=(String)formatCheck.elementAt(i-1); ps=ps.substring(0,ps.length()-1); if(ps.length()==0) ps=" "; formatCheck.setElementAt(ps,i-1); String os=null; if((((String)formatCheck.elementAt(i+1)).startsWith("'") ||((String)formatCheck.elementAt(i+1)).startsWith("`"))) { os=""; while((i<(formatCheck.size()-1)) &&((!((String)formatCheck.elementAt(i+1)).endsWith("'")) &&(!((String)formatCheck.elementAt(i+1)).endsWith("`")))) { os+=((String)formatCheck.elementAt(i+1))+" "; formatCheck.removeElementAt(i+1); } os=(os+((String)formatCheck.elementAt(i+1))).trim(); } else if((i==(formatCheck.size()-3)) &&(((String)formatCheck.lastElement()).indexOf("(")<0)) { os=((String)formatCheck.elementAt(i+1)) +" "+((String)formatCheck.elementAt(i+2)); formatCheck.removeElementAt(i+2); } else os=(String)formatCheck.elementAt(i+1); os=os+")"; formatCheck.setElementAt(os,i+1); i+=2; } evaluable=CMParms.combine(formatCheck,0); String uevaluable=evaluable.toUpperCase().trim(); boolean returnable=false; boolean lastreturnable=true; int joined=0; while(evaluable.length()>0) { int y=evaluable.indexOf("("); int z=y+1; int numy=1; while((y>=0)&&(numy>0)&&(z<evaluable.length())) { if(evaluable.charAt(z)=='(') numy++; else if(evaluable.charAt(z)==')') numy--; z++; } if((y<0)||(numy>0)||(z<=y)) { scriptableError(scripted,"EVAL","Format",evaluable); return false; } z--; String preFab=uevaluable.substring(0,y).trim(); Integer funcCode=(Integer)funcH.get(preFab); if(funcCode==null) funcCode=new Integer(0); if(y==0) { int depth=0; int i=0; while((++i)<evaluable.length()) { char c=evaluable.charAt(i); if((c==')')&&(depth==0)) { String expr=evaluable.substring(1,i); evaluable=evaluable.substring(i+1).trim(); uevaluable=uevaluable.substring(i+1).trim(); returnable=eval(scripted,source,target,monster,primaryItem,secondaryItem,msg,tmp,expr); switch(joined) { case 1: returnable=lastreturnable&&returnable; break; case 2: returnable=lastreturnable||returnable; break; case 4: returnable=!returnable; break; case 5: returnable=lastreturnable&&(!returnable); break; case 6: returnable=lastreturnable||(!returnable); break; default: break; } joined=0; break; } else if(c=='(') depth++; else if(c==')') depth--; } z=evaluable.indexOf(")"); } else if(evaluable.startsWith("!")) { joined=joined|4; evaluable=evaluable.substring(1).trim(); uevaluable=uevaluable.substring(1).trim(); } else if(uevaluable.startsWith("AND ")) { joined=1; lastreturnable=returnable; evaluable=evaluable.substring(4).trim(); uevaluable=uevaluable.substring(4).trim(); } else if(uevaluable.startsWith("OR ")) { joined=2; lastreturnable=returnable; evaluable=evaluable.substring(3).trim(); uevaluable=uevaluable.substring(3).trim(); } else if((y<0)||(z<y)) { scriptableError(scripted,"()","Syntax",evaluable); break; } else { tickStatus=Tickable.STATUS_MISC+funcCode.intValue(); switch(funcCode.intValue()) { case 1: // rand { int arg=CMath.s_int(evaluable.substring(y+1,z).trim()); if(CMLib.dice().rollPercentage()<arg) returnable=true; else returnable=false; break; } case 2: // has { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),0)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(arg2.length()==0) { scriptableError(scripted,"HAS","Syntax",evaluable); return returnable; } Environmental E2=getArgumentItem(arg2,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E==null) returnable=false; else if(E instanceof MOB) { if(E2!=null) returnable=((MOB)E).isMine(E2); else returnable=(((MOB)E).fetchInventory(arg2)!=null); } else if(E instanceof Item) returnable=CMLib.english().containsString(E.name(),arg2); else if(E instanceof Room) { if(E2 instanceof Item) returnable=((Room)E).isContent((Item)E2); else returnable=(((Room)E).fetchItem(null,arg2)!=null); } else returnable=false; break; } case 74: // hasnum { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String item=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),1)); String cmp=CMParms.getCleanBit(evaluable.substring(y+1,z),2); String value=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),2)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((value.length()==0)||(item.length()==0)||(cmp.length()==0)) { scriptableError(scripted,"HASNUM","Syntax",evaluable); return returnable; } Item I=null; int num=0; if(E==null) returnable=false; else if(E instanceof MOB) { MOB M=(MOB)E; for(int i=0;i<M.inventorySize();i++) { I=M.fetchInventory(i); if(I==null) break; if((item.equalsIgnoreCase("all")) ||(CMLib.english().containsString(I.Name(),item))) num++; } returnable=simpleEval(scripted,""+num,value,cmp,"HASNUM"); } else if(E instanceof Item) { num=CMLib.english().containsString(E.name(),item)?1:0; returnable=simpleEval(scripted,""+num,value,cmp,"HASNUM"); } else if(E instanceof Room) { Room R=(Room)E; for(int i=0;i<R.numItems();i++) { I=R.fetchItem(i); if(I==null) break; if((item.equalsIgnoreCase("all")) ||(CMLib.english().containsString(I.Name(),item))) num++; } returnable=simpleEval(scripted,""+num,value,cmp,"HASNUM"); } else returnable=false; break; } case 67: // hastitle { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),0)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(arg2.length()==0) { scriptableError(scripted,"HASTITLE","Syntax",evaluable); return returnable; } if(E instanceof MOB) { MOB M=(MOB)E; returnable=(M.playerStats()!=null)&&(M.playerStats().getTitles().contains(arg2)); } else returnable=false; break; } case 3: // worn { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),0)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(arg2.length()==0) { scriptableError(scripted,"WORN","Syntax",evaluable); return returnable; } if(E==null) returnable=false; else if(E instanceof MOB) returnable=(((MOB)E).fetchWornItem(arg2)!=null); else if(E instanceof Item) returnable=(CMLib.english().containsString(E.name(),arg2)&&(!((Item)E).amWearingAt(Item.IN_INVENTORY))); else returnable=false; break; } case 4: // isnpc { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E==null)||(!(E instanceof MOB))) returnable=false; else returnable=((MOB)E).isMonster(); break; } case 87: // isbirthday { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E==null)||(!(E instanceof MOB))) returnable=false; else { MOB mob=(MOB)E; int tage=mob.baseCharStats().getMyRace().getAgingChart()[Race.AGE_YOUNGADULT] +CMClass.globalClock().getYear() -mob.playerStats().getBirthday()[2]; int month=CMClass.globalClock().getMonth(); int day=CMClass.globalClock().getDayOfMonth(); int bday=mob.playerStats().getBirthday()[0]; int bmonth=mob.playerStats().getBirthday()[1]; if((tage>mob.baseCharStats().getStat(CharStats.STAT_AGE)) &&((month==bmonth)&&(day==bday))) returnable=true; else returnable=false; } break; } case 5: // ispc { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E==null)||(!(E instanceof MOB))) returnable=false; else returnable=!((MOB)E).isMonster(); break; } case 6: // isgood { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E==null)||(!(E instanceof MOB))) returnable=false; else returnable=CMLib.flags().isGood(E); break; } case 8: // isevil { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E==null)||(!(E instanceof MOB))) returnable=false; else returnable=CMLib.flags().isEvil(E); break; } case 9: // isneutral { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E==null)||(!(E instanceof MOB))) returnable=false; else returnable=CMLib.flags().isNeutral(E); break; } case 54: // isalive { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&((E instanceof MOB))&&(!((MOB)E).amDead())) returnable=true; else returnable=false; break; } case 58: // isable { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getPastBitClean(evaluable.substring(y+1,z),0); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&((E instanceof MOB))&&(!((MOB)E).amDead())) { ExpertiseLibrary X=(ExpertiseLibrary)CMLib.expertises().findDefinition(arg2,true); if(X!=null) returnable=((MOB)E).fetchExpertise(X.ID())!=null; else returnable=((MOB)E).findAbility(arg2)!=null; } else returnable=false; break; } case 59: // isopen { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); int dir=Directions.getGoodDirectionCode(arg1); returnable=false; if(dir<0) { Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&(E instanceof Container)) returnable=((Container)E).isOpen(); else if((E!=null)&&(E instanceof Exit)) returnable=((Exit)E).isOpen(); } else if(lastKnownLocation!=null) { Exit E=lastKnownLocation.getExitInDir(dir); if(E!=null) returnable= E.isOpen(); } break; } case 60: // islocked { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); int dir=Directions.getGoodDirectionCode(arg1); returnable=false; if(dir<0) { Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&(E instanceof Container)) returnable=((Container)E).isLocked(); else if((E!=null)&&(E instanceof Exit)) returnable=((Exit)E).isLocked(); } else if(lastKnownLocation!=null) { Exit E=lastKnownLocation.getExitInDir(dir); if(E!=null) returnable= E.isLocked(); } break; } case 10: // isfight { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E==null)||(!(E instanceof MOB))) returnable=false; else returnable=((MOB)E).isInCombat(); break; } case 11: // isimmort { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E==null)||(!(E instanceof MOB))) returnable=false; else returnable=CMSecurity.isAllowed(((MOB)E),lastKnownLocation,"IMMORT"); break; } case 12: // ischarmed { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E==null)||(!(E instanceof MOB))) returnable=false; else returnable=CMLib.flags().flaggedAffects(E,Ability.FLAG_CHARMING).size()>0; break; } case 15: // isfollow { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E==null)||(!(E instanceof MOB))) returnable=false; else if(((MOB)E).amFollowing()==null) returnable=false; else if(((MOB)E).amFollowing().location()!=lastKnownLocation) returnable=false; else returnable=true; break; } case 73: // isservant { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E==null)||(!(E instanceof MOB))||(lastKnownLocation==null)) returnable=false; else if((((MOB)E).getLiegeID()==null)||(((MOB)E).getLiegeID().length()==0)) returnable=false; else if(lastKnownLocation.fetchInhabitant("$"+((MOB)E).getLiegeID()+"$")==null) returnable=false; else returnable=true; break; } case 55: // ispkill { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E==null)||(!(E instanceof MOB))) returnable=false; else if(CMath.bset(((MOB)E).getBitmap(),MOB.ATT_PLAYERKILL)) returnable=true; else returnable=false; break; } case 7: // isname { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),0)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E==null) returnable=false; else returnable=CMLib.english().containsString(E.name(),arg2); break; } case 56: // name { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBit(evaluable.substring(y+1,z),1)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E==null) returnable=false; else returnable=simpleEvalStr(scripted,E.Name(),arg3,arg2,"NAME"); break; } case 75: // currency { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBit(evaluable.substring(y+1,z),1)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E==null) returnable=false; else returnable=simpleEvalStr(scripted,CMLib.beanCounter().getCurrency(E),arg3,arg2,"CURRENCY"); break; } case 61: // strin { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),0)); Vector V=CMParms.parse(arg1.toUpperCase()); returnable=V.contains(arg2.toUpperCase()); break; } case 62: // callfunc { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),0)); String found=null; boolean validFunc=false; Vector scripts=getScripts(); for(int v=0;v<scripts.size();v++) { Vector script2=(Vector)scripts.elementAt(v); if(script2.size()<1) continue; String trigger=((String)script2.elementAt(0)).toUpperCase().trim(); if(getTriggerCode(trigger)==17) { String fnamed=CMParms.getCleanBit(trigger,1); if(fnamed.equalsIgnoreCase(arg1)) { validFunc=true; found= execute(scripted, source, target, monster, primaryItem, secondaryItem, script2, varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,arg2), tmp); if(found==null) found=""; break; } } } if(!validFunc) scriptableError(scripted,"CALLFUNC","Unknown","Function: "+arg1); else returnable=!(found.trim().length()==0); break; } case 14: // affected { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),0)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E==null) returnable=false; else returnable=(E.fetchEffect(arg2)!=null); break; } case 69: // isbehave { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),0)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E==null) returnable=false; else returnable=(E.fetchBehavior(arg2)!=null); break; } case 70: // ipaddress { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBit(evaluable.substring(y+1,z),1)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E==null)||(!(E instanceof MOB))||(((MOB)E).isMonster())) returnable=false; else returnable=simpleEvalStr(scripted,((MOB)E).session().getAddress(),arg3,arg2,"ADDRESS"); break; } case 28: // questwinner { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String arg2=CMParms.getPastBitClean(evaluable.substring(y+1,z),0); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); Quest Q=getQuest(arg2); if(Q==null) returnable=false; else { if(E!=null) arg1=E.Name(); returnable=Q.wasWinner(arg1); } break; } case 29: // questmob { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String arg2=CMParms.getPastBitClean(evaluable.substring(y+1,z),0); Quest Q=getQuest(arg2); if(Q==null) returnable=false; else returnable=(Q.wasQuestMob(arg1)>=0); break; } case 31: // isquestmobalive { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String arg2=CMParms.getPastBitClean(evaluable.substring(y+1,z),0); Quest Q=getQuest(arg2); if(Q==null) returnable=false; else { MOB M=null; if(CMath.s_int(arg1.trim())>0) M=Q.getQuestMob(CMath.s_int(arg1.trim())); else M=Q.getQuestMob(Q.wasQuestMob(arg1)); if(M==null) returnable=false; else returnable=!M.amDead(); } break; } case 32: // nummobsinarea { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)).toUpperCase(); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1)); int num=0; Vector MASK=null; if((arg3.toUpperCase().startsWith("MASK")&&(arg3.substring(4).trim().startsWith("=")))) { arg3=arg3.substring(4).trim(); arg3=arg3.substring(1).trim(); MASK=CMLib.masking().maskCompile(arg3); } for(Enumeration e=lastKnownLocation.getArea().getProperMap();e.hasMoreElements();) { Room R=(Room)e.nextElement(); for(int m=0;m<R.numInhabitants();m++) { MOB M=R.fetchInhabitant(m); if(M==null) continue; if(MASK!=null) { if(CMLib.masking().maskCheck(MASK,M,true)) num++; } else if(CMLib.english().containsString(M.name(),arg1)) num++; } } returnable=simpleEval(scripted,""+num,arg3,arg2,"NUMMOBSINAREA"); break; } case 33: // nummobs { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)).toUpperCase(); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1)); int num=0; Vector MASK=null; if((arg3.toUpperCase().startsWith("MASK")&&(arg3.substring(4).trim().startsWith("=")))) { arg3=arg3.substring(4).trim(); arg3=arg3.substring(1).trim(); MASK=CMLib.masking().maskCompile(arg3); } try { for(Enumeration e=CMLib.map().rooms();e.hasMoreElements();) { Room R=(Room)e.nextElement(); for(int m=0;m<R.numInhabitants();m++) { MOB M=R.fetchInhabitant(m); if(M==null) continue; if(MASK!=null) { if(CMLib.masking().maskCheck(MASK,M,true)) num++; } else if(CMLib.english().containsString(M.name(),arg1)) num++; } } }catch(NoSuchElementException nse){} returnable=simpleEval(scripted,""+num,arg3,arg2,"NUMMOBS"); break; } case 34: // numracesinarea { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)).toUpperCase(); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1)); int num=0; Room R=null; MOB M=null; for(Enumeration e=lastKnownLocation.getArea().getProperMap();e.hasMoreElements();) { R=(Room)e.nextElement(); for(int m=0;m<R.numInhabitants();m++) { M=R.fetchInhabitant(m); if((M!=null)&&(M.charStats().raceName().equalsIgnoreCase(arg1))) num++; } } returnable=simpleEval(scripted,""+num,arg3,arg2,"NUMRACESINAREA"); break; } case 35: // numraces { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)).toUpperCase(); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1)); int num=0; try { for(Enumeration e=CMLib.map().rooms();e.hasMoreElements();) { Room R=(Room)e.nextElement(); for(int m=0;m<R.numInhabitants();m++) { MOB M=R.fetchInhabitant(m); if((M!=null)&&(M.charStats().raceName().equalsIgnoreCase(arg1))) num++; } } }catch(NoSuchElementException nse){} returnable=simpleEval(scripted,""+num,arg3,arg2,"NUMRACES"); break; } case 30: // questobj { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String arg2=CMParms.getPastBitClean(evaluable.substring(y+1,z),0); Quest Q=getQuest(arg2); if(Q==null) returnable=false; else returnable=(Q.wasQuestItem(arg1)>=0); break; } case 85: // islike { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String arg2=CMParms.getPastBitClean(evaluable.substring(y+1,z),0); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E==null) returnable=false; else returnable=CMLib.masking().maskCheck(arg2, E,false); break; } case 86: // strcontains { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String arg2=CMParms.getPastBitClean(evaluable.substring(y+1,z),0); returnable=CMParms.stringContains(arg1,arg2)>=0; break; } case 16: // hitprcnt { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((arg2.length()==0)||(arg3.length()==0)) { scriptableError(scripted,"HITPRCNT","Syntax",evaluable); return returnable; } if((E==null)||(!(E instanceof MOB))) returnable=false; else { double hitPctD=CMath.div(((MOB)E).curState().getHitPoints(),((MOB)E).maxState().getHitPoints()); int val1=(int)Math.round(hitPctD*100.0); returnable=simpleEval(scripted,""+val1,arg3,arg2,"HITPRCNT"); } break; } case 50: // isseason { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.cleanBit(evaluable.substring(y+1,z))); returnable=false; if(monster.location()!=null) for(int a=0;a<TimeClock.SEASON_DESCS.length;a++) if((TimeClock.SEASON_DESCS[a]).startsWith(arg1.toUpperCase()) &&(monster.location().getArea().getTimeObj().getSeasonCode()==a)) {returnable=true; break;} break; } case 51: // isweather { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.cleanBit(evaluable.substring(y+1,z))); returnable=false; if(monster.location()!=null) for(int a=0;a<Climate.WEATHER_DESCS.length;a++) if((Climate.WEATHER_DESCS[a]).startsWith(arg1.toUpperCase()) &&(monster.location().getArea().getClimateObj().weatherType(monster.location())==a)) {returnable=true; break;} break; } case 57: // ismoon { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.cleanBit(evaluable.substring(y+1,z))); returnable=false; if(monster.location()!=null) { if(arg1.length()==0) returnable=monster.location().getArea().getClimateObj().canSeeTheStars(monster.location()); else for(int a=0;a<TimeClock.PHASE_DESC.length;a++) if((TimeClock.PHASE_DESC[a]).startsWith(arg1.toUpperCase()) &&(monster.location().getArea().getTimeObj().getMoonPhase()==a)) { returnable=true; break; } } break; } case 38: // istime { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.cleanBit(evaluable.substring(y+1,z))); if(monster.location()==null) returnable=false; else if(("daytime").startsWith(arg1.toLowerCase()) &&(monster.location().getArea().getTimeObj().getTODCode()==TimeClock.TIME_DAY)) returnable=true; else if(("dawn").startsWith(arg1.toLowerCase()) &&(monster.location().getArea().getTimeObj().getTODCode()==TimeClock.TIME_DAWN)) returnable=true; else if(("dusk").startsWith(arg1.toLowerCase()) &&(monster.location().getArea().getTimeObj().getTODCode()==TimeClock.TIME_DUSK)) returnable=true; else if(("nighttime").startsWith(arg1.toLowerCase()) &&(monster.location().getArea().getTimeObj().getTODCode()==TimeClock.TIME_NIGHT)) returnable=true; else if((monster.location().getArea().getTimeObj().getTODCode()==CMath.s_int(arg1.trim()))) returnable=true; else returnable=false; break; } case 39: // isday { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.cleanBit(evaluable.substring(y+1,z))); if((monster.location()!=null)&&(monster.location().getArea().getTimeObj().getDayOfMonth()==CMath.s_int(arg1.trim()))) returnable=true; else returnable=false; break; } case 45: // nummobsroom { int num=0; int startbit=0; if(lastKnownLocation!=null) { num=lastKnownLocation.numInhabitants(); if((CMParms.numBits(evaluable.substring(y+1,z))>2) &&(!CMath.isInteger(CMParms.getCleanBit(evaluable.substring(y+1,z),1).trim()))) { String name=CMParms.getCleanBit(evaluable.substring(y+1,z),0); startbit++; if(!name.equalsIgnoreCase("*")) { num=0; Vector MASK=null; if((name.toUpperCase().startsWith("MASK")&&(name.substring(4).trim().startsWith("=")))) { name=name.substring(4).trim(); name=name.substring(1).trim(); MASK=CMLib.masking().maskCompile(name); } for(int i=0;i<lastKnownLocation.numInhabitants();i++) { MOB M=lastKnownLocation.fetchInhabitant(i); if(M==null) continue; if(MASK!=null) { if(CMLib.masking().maskCheck(MASK,M,true)) num++; } else if(CMLib.english().containsString(M.Name(),name) ||CMLib.english().containsString(M.displayText(),name)) num++; } } } } String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),startbit)); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),startbit)); if(lastKnownLocation!=null) returnable=simpleEval(scripted,""+num,arg2,arg1,"NUMMOBSROOM"); break; } case 63: // numpcsroom { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),0)); if(lastKnownLocation!=null) returnable=simpleEval(scripted,""+lastKnownLocation.numPCInhabitants(),arg2,arg1,"NUMPCSROOM"); break; } case 79: // numpcsarea { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),0)); if(lastKnownLocation!=null) { int num=0; for(int s=0;s<CMLib.sessions().size();s++) { Session S=CMLib.sessions().elementAt(s); if((S!=null)&&(S.mob()!=null)&&(S.mob().location()!=null)&&(S.mob().location().getArea()==lastKnownLocation.getArea())) num++; } returnable=simpleEval(scripted,""+num,arg2,arg1,"NUMPCSAREA"); } break; } case 77: // explored { String whom=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String where=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),1)); String cmp=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),2)); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),2)); Environmental E=getArgumentItem(whom,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E==null)||(!(E instanceof MOB))) { scriptableError(scripted,"EXPLORED","Unknown Code",whom); return returnable; } Area A=null; if(!where.equalsIgnoreCase("world")) { Environmental E2=getArgumentItem(where,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E2 instanceof Area) A=(Area)E2; else A=CMLib.map().getArea(where); if(A==null) { scriptableError(scripted,"EXPLORED","Unknown Area",where); return returnable; } } if(lastKnownLocation!=null) { int pct=0; MOB M=(MOB)E; if(M.playerStats()!=null) pct=M.playerStats().percentVisited(M,A); returnable=simpleEval(scripted,""+pct,arg2,cmp,"EXPLORED"); } break; } case 72: // faction { String whom=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),1)); String cmp=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),2)); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),3)); Environmental E=getArgumentItem(whom,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); Faction F=CMLib.factions().getFaction(arg1); if((E==null)||(!(E instanceof MOB))) { scriptableError(scripted,"FACTION","Unknown Code",whom); return returnable; } if(F==null) { scriptableError(scripted,"FACTION","Unknown Faction",arg1); return returnable; } MOB M=(MOB)E; String value=null; if(!M.hasFaction(F.factionID())) value=""; else { int myfac=M.fetchFaction(F.factionID()); if(CMath.isNumber(arg2.trim())) value=new Integer(myfac).toString(); else { Faction.FactionRange FR=CMLib.factions().getRange(F.factionID(),myfac); if(FR==null) value=""; else value=FR.name(); } } if(lastKnownLocation!=null) returnable=simpleEval(scripted,value,arg2,cmp,"FACTION"); break; } case 46: // numitemsroom { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),0)); int ct=0; if(lastKnownLocation!=null) for(int i=0;i<lastKnownLocation.numItems();i++) { Item I=lastKnownLocation.fetchItem(i); if((I!=null)&&(I.container()==null)) ct++; } returnable=simpleEval(scripted,""+ct,arg2,arg1,"NUMITEMSROOM"); break; } case 47: //mobitem { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),1)); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1)); MOB M=null; if(lastKnownLocation!=null) M=lastKnownLocation.fetchInhabitant(CMath.s_int(arg1.trim())-1); Item which=null; int ct=1; if(M!=null) for(int i=0;i<M.inventorySize();i++) { Item I=M.fetchInventory(i); if((I!=null)&&(I.container()==null)) { if(ct==CMath.s_int(arg2.trim())) { which=I; break;} ct++; } } if(which==null) returnable=false; else returnable=(CMLib.english().containsString(which.name(),arg3) ||CMLib.english().containsString(which.Name(),arg3) ||CMLib.english().containsString(which.displayText(),arg3)); break; } case 49: // hastattoo { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getPastBitClean(evaluable.substring(y+1,z),0); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(arg2.length()==0) { scriptableError(scripted,"HASTATTOO","Syntax",evaluable); break; } else if((E!=null)&&(E instanceof MOB)) returnable=(((MOB)E).fetchTattoo(arg2)!=null); else returnable=false; break; } case 48: // numitemsmob { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),1)); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1)); MOB which=null; if(lastKnownLocation!=null) which=lastKnownLocation.fetchInhabitant(CMath.s_int(arg1.trim())-1); int ct=1; if(which!=null) for(int i=0;i<which.inventorySize();i++) { Item I=which.fetchInventory(i); if((I!=null)&&(I.container()==null)) ct++; } returnable=simpleEval(scripted,""+ct,arg3,arg2,"NUMITEMSMOB"); break; } case 43: // roommob { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),0)); Environmental which=null; if(lastKnownLocation!=null) which=lastKnownLocation.fetchInhabitant(CMath.s_int(arg1.trim())-1); if(which==null) returnable=false; else returnable=(CMLib.english().containsString(which.name(),arg2) ||CMLib.english().containsString(which.Name(),arg2) ||CMLib.english().containsString(which.displayText(),arg2)); break; } case 44: // roomitem { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),0)); Environmental which=null; int ct=1; if(lastKnownLocation!=null) for(int i=0;i<lastKnownLocation.numItems();i++) { Item I=lastKnownLocation.fetchItem(i); if((I!=null)&&(I.container()==null)) { if(ct==CMath.s_int(arg1.trim())) { which=I; break;} ct++; } } if(which==null) returnable=false; else returnable=(CMLib.english().containsString(which.name(),arg2) ||CMLib.english().containsString(which.Name(),arg2) ||CMLib.english().containsString(which.displayText(),arg2)); break; } case 36: // ishere { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.cleanBit(evaluable.substring(y+1,z))); if(lastKnownLocation!=null) returnable=((lastKnownLocation.fetchAnyItem(arg1)!=null)||(lastKnownLocation.fetchInhabitant(arg1)!=null)); else returnable=false; break; } case 17: // inroom { String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String comp="=="; Environmental E=monster; if((" == >= > < <= => =< != ".indexOf(" "+CMParms.getCleanBit(evaluable.substring(y+1,z),1)+" ")>=0)) { E=getArgumentItem(CMParms.getCleanBit(evaluable.substring(y+1,z),0),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); comp=CMParms.getCleanBit(evaluable.substring(y+1,z),1); arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1)); } else { scriptableError(scripted,"INROOM","Syntax",evaluable); return returnable; } Room R=null; if(arg2.startsWith("$")) R=CMLib.map().roomLocation(this.getArgumentItem(arg2,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp)); if(R==null) R=getRoom(arg2,lastKnownLocation); if(E==null) returnable=false; else { Room R2=CMLib.map().roomLocation(E); if((R==null)&&((arg2.length()==0)||(R2==null))) returnable=true; else if((R==null)||(R2==null)) returnable=false; else returnable=simpleEvalStr(scripted,CMLib.map().getExtendedRoomID(R2),CMLib.map().getExtendedRoomID(R),comp,"INROOM"); } break; } case 89: // isrecall { String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String comp="=="; Environmental E=monster; if((" == >= > < <= => =< != ".indexOf(" "+CMParms.getCleanBit(evaluable.substring(y+1,z),1)+" ")>=0)) { E=getArgumentItem(CMParms.getCleanBit(evaluable.substring(y+1,z),0),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); comp=CMParms.getCleanBit(evaluable.substring(y+1,z),1); arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1)); } else { scriptableError(scripted,"ISRECALL","Syntax",evaluable); return returnable; } Room R=null; if(arg2.startsWith("$")) R=CMLib.map().getStartRoom(this.getArgumentItem(arg2,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp)); if(R==null) R=getRoom(arg2,lastKnownLocation); if(E==null) returnable=false; else { Room R2=CMLib.map().getStartRoom(E); if((R==null)&&((arg2.length()==0)||(R2==null))) returnable=true; else if((R==null)||(R2==null)) returnable=false; else returnable=simpleEvalStr(scripted,CMLib.map().getExtendedRoomID(R2),CMLib.map().getExtendedRoomID(R),comp,"ISRECALL"); } break; } case 37: // inlocale { String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.cleanBit(evaluable.substring(y+1,z))); Environmental E=monster; if((E==null)||(!(E instanceof MOB))) returnable=false; else if(arg2.length()==0) returnable=true; else if(CMClass.classID(((MOB)E).location()).toUpperCase().indexOf(arg2.toUpperCase())>=0) returnable=true; else returnable=false; break; } case 18: // sex { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0).toUpperCase()); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=CMParms.getPastBitClean(evaluable.substring(y+1,z),1).toUpperCase(); if(CMath.isNumber(arg3.trim())) switch(CMath.s_int(arg3.trim())) { case 0: arg3="NEUTER"; break; case 1: arg3="MALE"; break; case 2: arg3="FEMALE"; break; } Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((arg2.length()==0)||(arg3.length()==0)) { scriptableError(scripted,"SEX","Syntax",evaluable); return returnable; } if((E==null)||(!(E instanceof MOB))) returnable=false; else { String sex=(""+((char)((MOB)E).charStats().getStat(CharStats.STAT_GENDER))).toUpperCase(); if(arg2.equals("==")) returnable=arg3.startsWith(sex); else if(arg2.equals("!=")) returnable=!arg3.startsWith(sex); else { scriptableError(scripted,"SEX","Syntax",evaluable); return returnable; } } break; } case 13: // stat { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=CMParms.getCleanBit(evaluable.substring(y+1,z),2); String arg4=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBit(evaluable.substring(y+1,z),2)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((arg2.length()==0)||(arg3.length()==0)) { scriptableError(scripted,"STAT","Syntax",evaluable); break; } if(E==null) returnable=false; else { String val=getStatValue(E,arg2); if(val==null) { scriptableError(scripted,"STAT","Syntax","Unknown stat: "+arg2+" for "+E.name()); break; } if(arg3.equals("==")) returnable=val.equalsIgnoreCase(arg4); else if(arg3.equals("!=")) returnable=!val.equalsIgnoreCase(arg4); else returnable=simpleEval(scripted,val,arg4,arg3,"STAT"); } break; } case 52: // gstat { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=CMParms.getCleanBit(evaluable.substring(y+1,z),2); String arg4=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBit(evaluable.substring(y+1,z),2)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((arg2.length()==0)||(arg3.length()==0)) { scriptableError(scripted,"GSTAT","Syntax",evaluable); break; } if(E==null) returnable=false; else { String val=getGStatValue(E,arg2); if(val==null) { scriptableError(scripted,"GSTAT","Syntax","Unknown stat: "+arg2+" for "+E.name()); break; } if(arg3.equals("==")) returnable=val.equalsIgnoreCase(arg4); else if(arg3.equals("!=")) returnable=!val.equalsIgnoreCase(arg4); else returnable=simpleEval(scripted,val,arg4,arg3,"GSTAT"); } break; } case 19: // position { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=CMParms.getPastBitClean(evaluable.substring(y+1,z),1).toUpperCase(); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((arg2.length()==0)||(arg3.length()==0)) { scriptableError(scripted,"POSITION","Syntax",evaluable); return returnable; } if((E==null)||(!(E instanceof MOB))) returnable=false; else { String sex="STANDING"; if(CMLib.flags().isSleeping(E)) sex="SLEEPING"; else if(CMLib.flags().isSitting(E)) sex="SITTING"; if(arg2.equals("==")) returnable=sex.startsWith(arg3); else if(arg2.equals("!=")) returnable=!sex.startsWith(arg3); else { scriptableError(scripted,"POSITION","Syntax",evaluable); return returnable; } } break; } case 20: // level { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((arg2.length()==0)||(arg3.length()==0)) { scriptableError(scripted,"LEVEL","Syntax",evaluable); return returnable; } if(E==null) returnable=false; else { int val1=E.envStats().level(); returnable=simpleEval(scripted,""+val1,arg3,arg2,"LEVEL"); } break; } case 80: // questpoints { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((arg2.length()==0)||(arg3.length()==0)) { scriptableError(scripted,"QUESTPOINTS","Syntax",evaluable); return returnable; } if((E==null)||(!(E instanceof MOB))) returnable=false; else { int val1=((MOB)E).getQuestPoint(); returnable=simpleEval(scripted,""+val1,arg3,arg2,"QUESTPOINTS"); } break; } case 83: // qvar { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),1)); String arg3=CMParms.getCleanBit(evaluable.substring(y+1,z),2); String arg4=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),2)); Quest Q=getQuest(arg1); if((arg2.length()==0)||(arg3.length()==0)) { scriptableError(scripted,"QUESTPOINTS","Syntax",evaluable); return returnable; } if(Q==null) returnable=false; else returnable=simpleEvalStr(scripted,Q.getStat(arg2),arg4,arg3,"QVAR"); break; } case 84: // math { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1)); if(!CMath.isMathExpression(arg1)) { scriptableError(scripted,"MATH","Syntax",evaluable); return returnable; } if(!CMath.isMathExpression(arg3)) { scriptableError(scripted,"MATH","Syntax",evaluable); return returnable; } returnable=simpleExpressionEval(scripted,arg1,arg3,arg2,"MATH"); break; } case 81: // trains { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((arg2.length()==0)||(arg3.length()==0)) { scriptableError(scripted,"TRAINS","Syntax",evaluable); return returnable; } if((E==null)||(!(E instanceof MOB))) returnable=false; else { int val1=((MOB)E).getTrains(); returnable=simpleEval(scripted,""+val1,arg3,arg2,"TRAINS"); } break; } case 82: // pracs { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((arg2.length()==0)||(arg3.length()==0)) { scriptableError(scripted,"PRACS","Syntax",evaluable); return returnable; } if((E==null)||(!(E instanceof MOB))) returnable=false; else { int val1=((MOB)E).getPractices(); returnable=simpleEval(scripted,""+val1,arg3,arg2,"PRACS"); } break; } case 66: // clanrank { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((arg2.length()==0)||(arg3.length()==0)) { scriptableError(scripted,"CLANRANK","Syntax",evaluable); return returnable; } if(E==null) returnable=false; else { int val1=(E instanceof MOB)?((MOB)E).getClanRole():-1; returnable=simpleEval(scripted,""+val1,arg3,arg2,"CLANRANK"); } break; } case 64: // deity { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1).toUpperCase()); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(arg2.length()==0) { scriptableError(scripted,"DEITY","Syntax",evaluable); return returnable; } if((E==null)||(!(E instanceof MOB))) returnable=false; else { String sex=((MOB)E).getWorshipCharID(); if(arg2.equals("==")) returnable=sex.equalsIgnoreCase(arg3); else if(arg2.equals("!=")) returnable=!sex.equalsIgnoreCase(arg3); else { scriptableError(scripted,"DEITY","Syntax",evaluable); return returnable; } } break; } case 68: // clandata { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=CMParms.getCleanBit(evaluable.substring(y+1,z),2); String arg4=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),2).toUpperCase()); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((arg2.length()==0)||(arg3.length()==0)) { scriptableError(scripted,"CLANDATA","Syntax",evaluable); return returnable; } String clanID=null; if((E!=null)&&(E instanceof MOB)) clanID=((MOB)E).getClanID(); else clanID=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,arg1); Clan C=CMLib.clans().findClan(clanID); if(C!=null) { int whichVar=-1; for(int i=0;i<clanVars.length;i++) if(arg2.equalsIgnoreCase(clanVars[i])) { whichVar=i; break;} String whichVal=""; switch(whichVar) { case 0: whichVal=C.getAcceptanceSettings(); break; case 1: whichVal=C.getDetail(monster); break; case 2: whichVal=C.getDonation(); break; case 3: whichVal=""+C.getExp(); break; case 4: whichVal=Clan.GVT_DESCS[C.getGovernment()]; break; case 5: whichVal=C.getMorgue(); break; case 6: whichVal=C.getPolitics(); break; case 7: whichVal=C.getPremise(); break; case 8: whichVal=C.getRecall(); break; case 9: whichVal=""+C.getSize(); break; // size case 10: whichVal=Clan.CLANSTATUS_DESC[C.getStatus()]; break; case 11: whichVal=""+C.getTaxes(); break; case 12: whichVal=""+C.getTrophies(); break; case 13: whichVal=""+C.getType(); break; // type case 14: { Vector areas=C.getControlledAreas(); StringBuffer list=new StringBuffer(""); for(int i=0;i<areas.size();i++) list.append("\""+((Environmental)areas.elementAt(i)).name()+"\" "); whichVal=list.toString().trim(); break; // areas } case 15: { DVector members=C.getMemberList(); StringBuffer list=new StringBuffer(""); for(int i=0;i<members.size();i++) list.append("\""+((String)members.elementAt(i,1))+"\" "); whichVal=list.toString().trim(); break; // memberlist } case 16: MOB M=C.getResponsibleMember(); if(M!=null) whichVal=M.Name(); break; // topmember default: scriptableError(scripted,"CLANDATA","RunTime",arg2+" is not a valid clan variable."); break; } if(CMath.isNumber(whichVal.trim())&&CMath.isNumber(arg4.trim())) returnable=simpleEval(scripted,whichVal,arg4,arg3,"CLANDATA"); else returnable=simpleEvalStr(scripted,whichVal,arg4,arg3,"CLANDATA"); } break; } case 65: // clan { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1).toUpperCase()); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(arg2.length()==0) { scriptableError(scripted,"CLAN","Syntax",evaluable); return returnable; } if((E==null)||(!(E instanceof MOB))) returnable=false; else { String sex=((MOB)E).getClanID(); if(arg2.equals("==")) returnable=sex.equalsIgnoreCase(arg3); else if(arg2.equals("!=")) returnable=!sex.equalsIgnoreCase(arg3); else { scriptableError(scripted,"CLAN","Syntax",evaluable); return returnable; } } break; } case 88: // mood { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1).toUpperCase()); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(arg2.length()==0) { scriptableError(scripted,"MOOD","Syntax",evaluable); return returnable; } if((E==null)||(!(E instanceof MOB))) returnable=false; else if(E.fetchEffect("Mood")!=null) { String sex=E.fetchEffect("Mood").text(); if(arg2.equals("==")) returnable=sex.equalsIgnoreCase(arg3); else if(arg2.equals("!=")) returnable=!sex.equalsIgnoreCase(arg3); else { scriptableError(scripted,"MOOD","Syntax",evaluable); return returnable; } } break; } case 21: // class { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1).toUpperCase()); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((arg2.length()==0)||(arg3.length()==0)) { scriptableError(scripted,"CLASS","Syntax",evaluable); return returnable; } if((E==null)||(!(E instanceof MOB))) returnable=false; else { String sex=((MOB)E).charStats().displayClassName().toUpperCase(); if(arg2.equals("==")) returnable=sex.startsWith(arg3); else if(arg2.equals("!=")) returnable=!sex.startsWith(arg3); else { scriptableError(scripted,"CLASS","Syntax",evaluable); return returnable; } } break; } case 22: // baseclass { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1).toUpperCase()); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((arg2.length()==0)||(arg3.length()==0)) { scriptableError(scripted,"CLASS","Syntax",evaluable); return returnable; } if((E==null)||(!(E instanceof MOB))) returnable=false; else { String sex=((MOB)E).charStats().getCurrentClass().baseClass().toUpperCase(); if(arg2.equals("==")) returnable=sex.startsWith(arg3); else if(arg2.equals("!=")) returnable=!sex.startsWith(arg3); else { scriptableError(scripted,"CLASS","Syntax",evaluable); return returnable; } } break; } case 23: // race { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1).toUpperCase()); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((arg2.length()==0)||(arg3.length()==0)) { scriptableError(scripted,"RACE","Syntax",evaluable); return returnable; } if((E==null)||(!(E instanceof MOB))) returnable=false; else { String sex=((MOB)E).charStats().raceName().toUpperCase(); if(arg2.equals("==")) returnable=sex.startsWith(arg3); else if(arg2.equals("!=")) returnable=!sex.startsWith(arg3); else { scriptableError(scripted,"RACE","Syntax",evaluable); return returnable; } } break; } case 24: //racecat { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1).toUpperCase()); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((arg2.length()==0)||(arg3.length()==0)) { scriptableError(scripted,"RACECAT","Syntax",evaluable); return returnable; } if((E==null)||(!(E instanceof MOB))) returnable=false; else { String sex=((MOB)E).charStats().getMyRace().racialCategory().toUpperCase(); if(arg2.equals("==")) returnable=sex.startsWith(arg3); else if(arg2.equals("!=")) returnable=!sex.startsWith(arg3); else { scriptableError(scripted,"RACECAT","Syntax",evaluable); return returnable; } } break; } case 25: // goldamt { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((arg2.length()==0)||(arg3.length()==0)) { scriptableError(scripted,"GOLDAMT","Syntax",evaluable); break; } if(E==null) returnable=false; else { int val1=0; if(E instanceof MOB) val1=(int)Math.round(CMLib.beanCounter().getTotalAbsoluteValue((MOB)E,CMLib.beanCounter().getCurrency(scripted))); else if(E instanceof Coins) val1=(int)Math.round(((Coins)E).getTotalValue()); else if(E instanceof Item) val1=((Item)E).value(); else { scriptableError(scripted,"GOLDAMT","Syntax",evaluable); return returnable; } returnable=simpleEval(scripted,""+val1,arg3,arg2,"GOLDAMT"); } break; } case 78: // exp { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((arg2.length()==0)||(arg3.length()==0)) { scriptableError(scripted,"EXP","Syntax",evaluable); break; } if((E==null)||(!(E instanceof MOB))) returnable=false; else { int val1=((MOB)E).getExperience(); returnable=simpleEval(scripted,""+val1,arg3,arg2,"EXP"); } break; } case 76: // value { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),1)); String arg3=CMParms.getCleanBit(evaluable.substring(y+1,z),2); String arg4=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),2)); if((arg2.length()==0)||(arg3.length()==0)||(arg4.length()==0)) { scriptableError(scripted,"VALUE","Syntax",evaluable); break; } if(!CMLib.beanCounter().getAllCurrencies().contains(arg2.toUpperCase())) { scriptableError(scripted,"VALUE","Syntax",arg2+" is not a valid designated currency."); break; } if(E==null) returnable=false; else { int val1=0; if(E instanceof MOB) val1=(int)Math.round(CMLib.beanCounter().getTotalAbsoluteValue((MOB)E,arg2.toUpperCase())); else if(E instanceof Coins) { if(((Coins)E).getCurrency().equalsIgnoreCase(arg2)) val1=(int)Math.round(((Coins)E).getTotalValue()); } else if(E instanceof Item) val1=((Item)E).value(); else { scriptableError(scripted,"VALUE","Syntax",evaluable); return returnable; } returnable=simpleEval(scripted,""+val1,arg4,arg3,"GOLDAMT"); } break; } case 26: // objtype { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1).toUpperCase()); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((arg2.length()==0)||(arg3.length()==0)) { scriptableError(scripted,"OBJTYPE","Syntax",evaluable); return returnable; } if(E==null) returnable=false; else { String sex=CMClass.classID(E).toUpperCase(); if(arg2.equals("==")) returnable=sex.indexOf(arg3)>=0; else if(arg2.equals("!=")) returnable=sex.indexOf(arg3)<0; else { scriptableError(scripted,"OBJTYPE","Syntax",evaluable); return returnable; } } break; } case 27: // var { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1).toUpperCase(); String arg3=CMParms.getCleanBit(evaluable.substring(y+1,z),2); String arg4=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBit(evaluable.substring(y+1,z),2)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((arg2.length()==0)||(arg3.length()==0)) { scriptableError(scripted,"VAR","Syntax",evaluable); return returnable; } String val=getVar(E,arg1,arg2,source,target,monster,primaryItem,secondaryItem,msg,tmp); if(arg3.equals("==")) returnable=val.equals(arg4); else if(arg3.equals("!=")) returnable=!val.equals(arg4); else if(arg3.equals(">")) returnable=CMath.s_int(val.trim())>CMath.s_int(arg4.trim()); else if(arg3.equals("<")) returnable=CMath.s_int(val.trim())<CMath.s_int(arg4.trim()); else if(arg3.equals(">=")) returnable=CMath.s_int(val.trim())>=CMath.s_int(arg4.trim()); else if(arg3.equals("<=")) returnable=CMath.s_int(val.trim())<=CMath.s_int(arg4.trim()); else { scriptableError(scripted,"VAR","Syntax",evaluable); return returnable; } break; } case 41: // eval { String val=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String arg3=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg4=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBit(evaluable.substring(y+1,z),1)); if(arg3.length()==0) { scriptableError(scripted,"EVAL","Syntax",evaluable); return returnable; } if(arg3.equals("==")) returnable=val.equals(arg4); else if(arg3.equals("!=")) returnable=!val.equals(arg4); else if(arg3.equals(">")) returnable=CMath.s_int(val.trim())>CMath.s_int(arg4.trim()); else if(arg3.equals("<")) returnable=CMath.s_int(val.trim())<CMath.s_int(arg4.trim()); else if(arg3.equals(">=")) returnable=CMath.s_int(val.trim())>=CMath.s_int(arg4.trim()); else if(arg3.equals("<=")) returnable=CMath.s_int(val.trim())<=CMath.s_int(arg4.trim()); else { scriptableError(scripted,"EVAL","Syntax",evaluable); return returnable; } break; } case 40: // number { String val=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.cleanBit(evaluable.substring(y+1,z))).trim(); boolean isnumber=(val.length()>0); for(int i=0;i<val.length();i++) if(!Character.isDigit(val.charAt(i))) { isnumber=false; break;} returnable=isnumber; break; } case 42: // randnum { String arg1s=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)).toUpperCase().trim(); int arg1=0; if(CMath.isMathExpression(arg1s.trim())) arg1=CMath.s_parseIntExpression(arg1s.trim()); else arg1=CMParms.parse(arg1s.trim()).size(); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3s=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1)).trim(); int arg3=0; if(CMath.isMathExpression(arg3s.trim())) arg3=CMath.s_parseIntExpression(arg3s.trim()); else arg3=CMParms.parse(arg3s.trim()).size(); arg3=CMLib.dice().roll(1,arg3,0); returnable=simpleEval(scripted,""+arg1,""+arg3,arg2,"RANDNUM"); break; } case 71: // rand0num { String arg1s=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)).toUpperCase().trim(); int arg1=0; if(CMath.isMathExpression(arg1s)) arg1=CMath.s_parseIntExpression(arg1s); else arg1=CMParms.parse(arg1s).size(); String arg2=CMParms.getCleanBit(evaluable.substring(y+1,z),1); String arg3s=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),1)).trim(); int arg3=0; if(CMath.isMathExpression(arg3s)) arg3=CMath.s_parseIntExpression(arg3s); else arg3=CMParms.parse(arg3s).size(); arg3=CMLib.dice().roll(1,arg3,-1); returnable=simpleEval(scripted,""+arg1,""+arg3,arg2,"RAND0NUM"); break; } case 53: // incontainer { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); String arg2=CMParms.getPastBitClean(evaluable.substring(y+1,z),0); Environmental E2=getArgumentItem(arg2,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E==null) returnable=false; else if(E instanceof MOB) { if(arg2.length()==0) returnable=(((MOB)E).riding()==null); else if(E2!=null) returnable=(((MOB)E).riding()==E2); else returnable=false; } else if(E instanceof Item) { if(arg2.length()==0) returnable=(((Item)E).container()==null); else if(E2!=null) returnable=(((Item)E).container()==E2); else returnable=false; } else returnable=false; break; } default: scriptableError(scripted,"Unknown Eval",preFab,evaluable); return returnable; } if((z>=0)&&(z<=evaluable.length())) { evaluable=evaluable.substring(z+1).trim(); uevaluable=uevaluable.substring(z+1).trim(); } switch(joined) { case 1: returnable=lastreturnable&&returnable; break; case 2: returnable=lastreturnable||returnable; break; case 4: returnable=!returnable; break; case 5: returnable=lastreturnable&&(!returnable); break; case 6: returnable=lastreturnable||(!returnable); break; default: break; } joined=0; } } return returnable; } public String functify(Environmental scripted, MOB source, Environmental target, MOB monster, Item primaryItem, Item secondaryItem, String msg, Object[] tmp, String evaluable) { String uevaluable=evaluable.toUpperCase().trim(); StringBuffer results = new StringBuffer(""); while(evaluable.length()>0) { int y=evaluable.indexOf("("); int z=evaluable.indexOf(")"); String preFab=(y>=0)?uevaluable.substring(0,y).trim():""; Integer funcCode=(Integer)funcH.get(preFab); if(funcCode==null) funcCode=new Integer(0); if(y==0) { int depth=0; int i=0; while((++i)<evaluable.length()) { char c=evaluable.charAt(i); if((c==')')&&(depth==0)) { String expr=evaluable.substring(1,i); evaluable=evaluable.substring(i+1); uevaluable=uevaluable.substring(i+1); results.append(functify(scripted,source,target,monster,primaryItem,secondaryItem,msg,tmp,expr)); break; } else if(c=='(') depth++; else if(c==')') depth--; } z=evaluable.indexOf(")"); } else if((y<0)||(z<y)) { scriptableError(scripted,"()","Syntax",evaluable); break; } else { tickStatus=Tickable.STATUS_MISC2+funcCode.intValue(); switch(funcCode.intValue()) { case 1: // rand { results.append(CMLib.dice().rollPercentage()); break; } case 2: // has { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.cleanBit(evaluable.substring(y+1,z))); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); Vector choices=new Vector(); if(E==null) choices=new Vector(); else if(E instanceof MOB) { for(int i=0;i<((MOB)E).inventorySize();i++) { Item I=((MOB)E).fetchInventory(i); if((I!=null)&&(I.amWearingAt(Item.IN_INVENTORY))&&(I.container()==null)) choices.addElement(I); } } else if(E instanceof Item) { choices.addElement(E); if(E instanceof Container) choices=((Container)E).getContents(); } else if(E instanceof Room) { for(int i=0;i<((Room)E).numItems();i++) { Item I=((Room)E).fetchItem(i); if((I!=null)&&(I.container()==null)) choices.addElement(I); } } if(choices.size()>0) results.append(((Item)choices.elementAt(CMLib.dice().roll(1,choices.size(),-1))).name()); break; } case 74: // hasnum { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String item=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),1)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((item.length()==0)||(E==null)) scriptableError(scripted,"HASNUM","Syntax",evaluable); else { Item I=null; int num=0; if(E instanceof MOB) { MOB M=(MOB)E; for(int i=0;i<M.inventorySize();i++) { I=M.fetchInventory(i); if(I==null) break; if((item.equalsIgnoreCase("all")) ||(CMLib.english().containsString(I.Name(),item))) num++; } results.append(""+num); } else if(E instanceof Item) { num=CMLib.english().containsString(E.name(),item)?1:0; results.append(""+num); } else if(E instanceof Room) { Room R=(Room)E; for(int i=0;i<R.numItems();i++) { I=R.fetchItem(i); if(I==null) break; if((item.equalsIgnoreCase("all")) ||(CMLib.english().containsString(I.Name(),item))) num++; } results.append(""+num); } } break; } case 3: // worn { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.cleanBit(evaluable.substring(y+1,z))); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); Vector choices=new Vector(); if(E==null) choices=new Vector(); else if(E instanceof MOB) { for(int i=0;i<((MOB)E).inventorySize();i++) { Item I=((MOB)E).fetchInventory(i); if((I!=null)&&(!I.amWearingAt(Item.IN_INVENTORY))&&(I.container()==null)) choices.addElement(I); } } else if((E instanceof Item)&&(!(((Item)E).amWearingAt(Item.IN_INVENTORY)))) { choices.addElement(E); if(E instanceof Container) choices=((Container)E).getContents(); } if(choices.size()>0) results.append(((Item)choices.elementAt(CMLib.dice().roll(1,choices.size(),-1))).name()); break; } case 4: // isnpc case 5: // ispc results.append("[unimplemented function]"); break; case 87: // isbirthday { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&(E instanceof MOB)&&(((MOB)E).playerStats()!=null)&&(((MOB)E).playerStats().getBirthday()!=null)) { MOB mob=(MOB)E; TimeClock C=CMClass.globalClock(); int day=C.getDayOfMonth(); int month=C.getMonth(); int year=C.getYear(); int bday=mob.playerStats().getBirthday()[0]; int bmonth=mob.playerStats().getBirthday()[1]; if((month>bmonth)||((month==bmonth)&&(day>bday))) year++; StringBuffer timeDesc=new StringBuffer(""); if(C.getDaysInWeek()>0) { long x=((long)year)*((long)C.getMonthsInYear())*C.getDaysInMonth(); x=x+((long)(bmonth-1))*((long)C.getDaysInMonth()); x=x+bmonth; timeDesc.append(C.getWeekNames()[(int)(x%C.getDaysInWeek())]+", "); } timeDesc.append("the "+bday+CMath.numAppendage(bday)); timeDesc.append(" day of "+C.getMonthNames()[bmonth-1]); if(C.getYearNames().length>0) timeDesc.append(", "+CMStrings.replaceAll(C.getYearNames()[year%C.getYearNames().length],"#",""+year)); results.append(timeDesc.toString()); } break; } case 6: // isgood { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&((E instanceof MOB))) { Faction.FactionRange FR=CMLib.factions().getRange(CMLib.factions().AlignID(),((MOB)E).fetchFaction(CMLib.factions().AlignID())); if(FR!=null) results.append(FR.name()); else results.append(((MOB)E).fetchFaction(CMLib.factions().AlignID())); } break; } case 8: // isevil { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&((E instanceof MOB))) results.append(CMStrings.capitalizeAndLower(CMLib.flags().getAlignmentName(E)).toLowerCase()); break; } case 9: // isneutral { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&((E instanceof MOB))) results.append(((MOB)E).fetchFaction(CMLib.factions().AlignID())); break; } case 11: // isimmort results.append("[unimplemented function]"); break; case 54: // isalive { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&((E instanceof MOB))&&(!((MOB)E).amDead())) results.append(((MOB)E).healthText(null)); else results.append(E.name()+" is dead."); break; } case 58: // isable { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getPastBitClean(evaluable.substring(y+1,z),0); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&((E instanceof MOB))&&(!((MOB)E).amDead())) { ExpertiseLibrary X=(ExpertiseLibrary)CMLib.expertises().findDefinition(arg2,true); if(X!=null) { String s=((MOB)E).fetchExpertise(X.ID()); if(s!=null) results.append(s); } else { Ability A=((MOB)E).findAbility(arg2); if(A!=null) results.append(""+A.proficiency()); } } break; } case 59: // isopen { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); int dir=Directions.getGoodDirectionCode(arg1); boolean returnable=false; if(dir<0) { Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&(E instanceof Container)) returnable=((Container)E).isOpen(); else if((E!=null)&&(E instanceof Exit)) returnable=((Exit)E).isOpen(); } else if(lastKnownLocation!=null) { Exit E=lastKnownLocation.getExitInDir(dir); if(E!=null) returnable= E.isOpen(); } results.append(""+returnable); break; } case 60: // islocked { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); int dir=Directions.getGoodDirectionCode(arg1); if(dir<0) { Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&(E instanceof Container)) results.append(((Container)E).keyName()); else if((E!=null)&&(E instanceof Exit)) results.append(((Exit)E).keyName()); } else if(lastKnownLocation!=null) { Exit E=lastKnownLocation.getExitInDir(dir); if(E!=null) results.append(E.keyName()); } break; } case 62: // callfunc { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),0)); String found=null; boolean validFunc=false; Vector scripts=getScripts(); for(int v=0;v<scripts.size();v++) { Vector script2=(Vector)scripts.elementAt(v); if(script2.size()<1) continue; String trigger=((String)script2.elementAt(0)).toUpperCase().trim(); if(getTriggerCode(trigger)==17) { String fnamed=CMParms.getCleanBit(trigger,1); if(fnamed.equalsIgnoreCase(arg1)) { validFunc=true; found= execute(scripted, source, target, monster, primaryItem, secondaryItem, script2, varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,arg2), tmp); if(found==null) found=""; break; } } } if(!validFunc) scriptableError(scripted,"CALLFUNC","Unknown","Function: "+arg1); else results.append(found); break; } case 61: // strin { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),0)); Vector V=CMParms.parse(arg1.toUpperCase()); results.append(V.indexOf(arg2.toUpperCase())); break; } case 55: // ispkill { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E==null)||(!(E instanceof MOB))) results.append("false"); else if(CMath.bset(((MOB)E).getBitmap(),MOB.ATT_PLAYERKILL)) results.append("true"); else results.append("false"); break; } case 10: // isfight { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&((E instanceof MOB))&&(((MOB)E).isInCombat())) results.append(((MOB)E).getVictim().name()); break; } case 12: // ischarmed { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E!=null) { Vector V=CMLib.flags().flaggedAffects(E,Ability.FLAG_CHARMING); for(int v=0;v<V.size();v++) results.append((((Ability)V.elementAt(v)).name())+" "); } break; } case 15: // isfollow { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentMOB(arg1,source,monster,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&(E instanceof MOB)&&(((MOB)E).amFollowing()!=null) &&(((MOB)E).amFollowing().location()==lastKnownLocation)) results.append(((MOB)E).amFollowing().name()); break; } case 73: // isservant { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentMOB(arg1,source,monster,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&(E instanceof MOB)&&(((MOB)E).getLiegeID()!=null)&&(((MOB)E).getLiegeID().length()>0)) results.append(((MOB)E).getLiegeID()); break; } case 56: // name case 7: // isname { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E!=null) results.append(E.name()); break; } case 75: // currency { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E!=null)results.append(CMLib.beanCounter().getCurrency(E)); break; } case 14: // affected { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E instanceof MOB) { if(((MOB)E).numAllEffects()>0) results.append(E.fetchEffect(CMLib.dice().roll(1,((MOB)E).numAllEffects(),-1)).name()); } else if(E.numEffects()>0) results.append(E.fetchEffect(CMLib.dice().roll(1,E.numEffects(),-1)).name()); break; } case 69: // isbehave { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); for(int i=0;i<E.numBehaviors();i++) results.append(E.fetchBehavior(i).ID()+" "); break; } case 70: // ipaddress { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&(E instanceof MOB)&&(!((MOB)E).isMonster())) results.append(((MOB)E).session().getAddress()); break; } case 28: // questwinner case 29: // questmob case 31: // isquestmobalive results.append("[unimplemented function]"); break; case 32: // nummobsinarea { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.cleanBit(evaluable.substring(y+1,z))); int num=0; Vector MASK=null; if((arg1.toUpperCase().startsWith("MASK")&&(arg1.substring(4).trim().startsWith("=")))) { arg1=arg1.substring(4).trim(); arg1=arg1.substring(1).trim(); MASK=CMLib.masking().maskCompile(arg1); } for(Enumeration e=lastKnownLocation.getArea().getProperMap();e.hasMoreElements();) { Room R=(Room)e.nextElement(); for(int m=0;m<R.numInhabitants();m++) { MOB M=R.fetchInhabitant(m); if(M==null) continue; if(MASK!=null) { if(CMLib.masking().maskCheck(MASK,M,true)) num++; } else if(CMLib.english().containsString(M.name(),arg1)) num++; } } results.append(num); break; } case 33: // nummobs { int num=0; String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.cleanBit(evaluable.substring(y+1,z))); Vector MASK=null; if((arg1.toUpperCase().startsWith("MASK")&&(arg1.substring(4).trim().startsWith("=")))) { arg1=arg1.substring(4).trim(); arg1=arg1.substring(1).trim(); MASK=CMLib.masking().maskCompile(arg1); } try { for(Enumeration e=CMLib.map().rooms();e.hasMoreElements();) { Room R=(Room)e.nextElement(); for(int m=0;m<R.numInhabitants();m++) { MOB M=R.fetchInhabitant(m); if(M==null) continue; if(MASK!=null) { if(CMLib.masking().maskCheck(MASK,M,true)) num++; } else if(CMLib.english().containsString(M.name(),arg1)) num++; } } }catch(NoSuchElementException nse){} results.append(num); break; } case 34: // numracesinarea { int num=0; String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.cleanBit(evaluable.substring(y+1,z))); Room R=null; MOB M=null; for(Enumeration e=lastKnownLocation.getArea().getProperMap();e.hasMoreElements();) { R=(Room)e.nextElement(); for(int m=0;m<R.numInhabitants();m++) { M=R.fetchInhabitant(m); if((M!=null)&&(M.charStats().raceName().equalsIgnoreCase(arg1))) num++; } } results.append(num); break; } case 35: // numraces { int num=0; String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.cleanBit(evaluable.substring(y+1,z))); Room R=null; MOB M=null; try { for(Enumeration e=CMLib.map().rooms();e.hasMoreElements();) { R=(Room)e.nextElement(); for(int m=0;m<R.numInhabitants();m++) { M=R.fetchInhabitant(m); if((M!=null)&&(M.charStats().raceName().equalsIgnoreCase(arg1))) num++; } } }catch(NoSuchElementException nse){} results.append(num); break; } case 30: // questobj results.append("[unimplemented function]"); break; case 16: // hitprcnt { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&(E instanceof MOB)) { double hitPctD=CMath.div(((MOB)E).curState().getHitPoints(),((MOB)E).maxState().getHitPoints()); int val1=(int)Math.round(hitPctD*100.0); results.append(val1); } break; } case 50: // isseason { if(monster.location()!=null) results.append(TimeClock.SEASON_DESCS[monster.location().getArea().getTimeObj().getSeasonCode()]); break; } case 51: // isweather { if(monster.location()!=null) results.append(Climate.WEATHER_DESCS[monster.location().getArea().getClimateObj().weatherType(monster.location())]); break; } case 57: // ismoon { if(monster.location()!=null) results.append(TimeClock.PHASE_DESC[monster.location().getArea().getTimeObj().getMoonPhase()]); break; } case 38: // istime { if(lastKnownLocation!=null) results.append(TimeClock.TOD_DESC[lastKnownLocation.getArea().getTimeObj().getTODCode()].toLowerCase()); break; } case 39: // isday { if(lastKnownLocation!=null) results.append(""+lastKnownLocation.getArea().getTimeObj().getDayOfMonth()); break; } case 43: // roommob { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.cleanBit(evaluable.substring(y+1,z))); Environmental which=null; if(lastKnownLocation!=null) which=lastKnownLocation.fetchInhabitant(CMath.s_int(arg1.trim())-1); if(which!=null) results.append(which.name()); break; } case 44: // roomitem { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.cleanBit(evaluable.substring(y+1,z))); Environmental which=null; int ct=1; if(lastKnownLocation!=null) for(int i=0;i<lastKnownLocation.numItems();i++) { Item I=lastKnownLocation.fetchItem(i); if((I!=null)&&(I.container()==null)) { if(ct==CMath.s_int(arg1.trim())) { which=I; break;} ct++; } } if(which!=null) results.append(which.name()); break; } case 45: // nummobsroom { int num=0; if(lastKnownLocation!=null) { num=lastKnownLocation.numInhabitants(); String name=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.cleanBit(evaluable.substring(y+1,z))); if((name.length()>0)&&(!name.equalsIgnoreCase("*"))) { num=0; Vector MASK=null; if((name.toUpperCase().startsWith("MASK")&&(name.substring(4).trim().startsWith("=")))) { name=name.substring(4).trim(); name=name.substring(1).trim(); MASK=CMLib.masking().maskCompile(name); } for(int i=0;i<lastKnownLocation.numInhabitants();i++) { MOB M=lastKnownLocation.fetchInhabitant(i); if(M==null) continue; if(MASK!=null) { if(CMLib.masking().maskCheck(MASK,M,true)) num++; } else if(CMLib.english().containsString(M.Name(),name) ||CMLib.english().containsString(M.displayText(),name)) num++; } } } results.append(""+num); break; } case 63: // numpcsroom { if(lastKnownLocation!=null) results.append(""+lastKnownLocation.numPCInhabitants()); break; } case 79: // numpcsarea { if(lastKnownLocation!=null) { int num=0; for(int s=0;s<CMLib.sessions().size();s++) { Session S=CMLib.sessions().elementAt(s); if((S!=null)&&(S.mob()!=null)&&(S.mob().location()!=null)&&(S.mob().location().getArea()==lastKnownLocation.getArea())) num++; } results.append(""+num); } break; } case 77: // explored { String whom=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String where=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),1)); Environmental E=getArgumentItem(whom,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E instanceof MOB) { Area A=null; if(!where.equalsIgnoreCase("world")) { Environmental E2=getArgumentItem(where,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E2 instanceof Area) A=(Area)E2; else A=CMLib.map().getArea(where); } if((lastKnownLocation!=null) &&((A!=null)||(where.equalsIgnoreCase("world")))) { int pct=0; MOB M=(MOB)E; if(M.playerStats()!=null) pct=M.playerStats().percentVisited(M,A); results.append(""+pct); } } break; } case 72: // faction { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getPastBit(evaluable.substring(y+1,z),0); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); Faction F=CMLib.factions().getFaction(arg2); if(F==null) scriptableError(scripted,"FACTION","Unknown Faction",arg1); else if((E!=null)&&(E instanceof MOB)&&(((MOB)E).hasFaction(F.factionID()))) { int value=((MOB)E).fetchFaction(F.factionID()); Faction.FactionRange FR=CMLib.factions().getRange(F.factionID(),value); if(FR!=null) results.append(FR.name()); } break; } case 46: // numitemsroom { int ct=0; if(lastKnownLocation!=null) for(int i=0;i<lastKnownLocation.numItems();i++) { Item I=lastKnownLocation.fetchItem(i); if((I!=null)&&(I.container()==null)) ct++; } results.append(""+ct); break; } case 47: //mobitem { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(evaluable.substring(y+1,z),0)); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),0)); MOB M=null; if(lastKnownLocation!=null) M=lastKnownLocation.fetchInhabitant(CMath.s_int(arg1.trim())-1); Item which=null; int ct=1; if(M!=null) for(int i=0;i<M.inventorySize();i++) { Item I=M.fetchInventory(i); if((I!=null)&&(I.container()==null)) { if(ct==CMath.s_int(arg2.trim())) { which=I; break;} ct++; } } if(which!=null) results.append(which.name()); break; } case 48: // numitemsmob { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.cleanBit(evaluable.substring(y+1,z))); MOB which=null; if(lastKnownLocation!=null) which=lastKnownLocation.fetchInhabitant(CMath.s_int(arg1.trim())-1); int ct=1; if(which!=null) for(int i=0;i<which.inventorySize();i++) { Item I=which.fetchInventory(i); if((I!=null)&&(I.container()==null)) ct++; } results.append(""+ct); break; } case 36: // ishere { if(lastKnownLocation!=null) results.append(lastKnownLocation.getArea().name()); break; } case 17: // inroom { if(lastKnownLocation!=null) results.append(CMLib.map().getExtendedRoomID(lastKnownLocation)); break; } case 89: // isrecall { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E!=null) results.append(CMLib.map().getExtendedRoomID(CMLib.map().getStartRoom(E))); break; } case 37: // inlocale { if(lastKnownLocation!=null) results.append(lastKnownLocation.name()); break; } case 18: // sex { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&(E instanceof MOB)) results.append(((MOB)E).charStats().genderName()); break; } case 13: // stat { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getPastBitClean(evaluable.substring(y+1,z),0); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E!=null) { String val=getStatValue(E,arg2); if(val==null) { scriptableError(scripted,"STAT","Syntax","Unknown stat: "+arg2+" for "+E.name()); break; } results.append(val); break; } break; } case 52: // gstat { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getPastBitClean(evaluable.substring(y+1,z),0); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E!=null) { String val=getGStatValue(E,arg2); if(val==null) { scriptableError(scripted,"GSTAT","Syntax","Unknown stat: "+arg2+" for "+E.name()); break; } results.append(val); break; } break; } case 19: // position { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&(E instanceof MOB)) { String sex="STANDING"; if(CMLib.flags().isSleeping(E)) sex="SLEEPING"; else if(CMLib.flags().isSitting(E)) sex="SITTING"; results.append(sex); break; } break; } case 20: // level { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E!=null) results.append(E.envStats().level()); break; } case 80: // questpoints { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E instanceof MOB) results.append(((MOB)E).getQuestPoint()); break; } case 83: // qvar { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),0)); if((arg1.length()!=0)&&(arg2.length()!=0)) { Quest Q=getQuest(arg1); if(Q!=null) results.append(Q.getStat(arg2)); } break; } case 84: // math { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); results.append(""+Math.round(CMath.s_parseMathExpression(arg1))); } case 85: // islike { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); results.append(CMLib.masking().maskDesc(arg1)); break; } case 86: // strcontains { results.append("[unimplemented function]"); break; } case 81: // trains { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E instanceof MOB) results.append(((MOB)E).getTrains()); break; } case 82: // pracs { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E instanceof MOB) results.append(((MOB)E).getPractices()); break; } case 68: // clandata { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getPastBitClean(evaluable.substring(y+1,z),0); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); String clanID=null; if((E!=null)&&(E instanceof MOB)) clanID=((MOB)E).getClanID(); else clanID=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,arg1); Clan C=CMLib.clans().findClan(clanID); if(C!=null) { int whichVar=-1; for(int i=0;i<clanVars.length;i++) if(arg2.equalsIgnoreCase(clanVars[i])) { whichVar=i; break;} String whichVal=""; switch(whichVar) { case 0: whichVal=C.getAcceptanceSettings(); break; case 1: whichVal=C.getDetail(monster); break; case 2: whichVal=C.getDonation(); break; case 3: whichVal=""+C.getExp(); break; case 4: whichVal=Clan.GVT_DESCS[C.getGovernment()]; break; case 5: whichVal=C.getMorgue(); break; case 6: whichVal=C.getPolitics(); break; case 7: whichVal=C.getPremise(); break; case 8: whichVal=C.getRecall(); break; case 9: whichVal=""+C.getSize(); break; // size case 10: whichVal=Clan.CLANSTATUS_DESC[C.getStatus()]; break; case 11: whichVal=""+C.getTaxes(); break; case 12: whichVal=""+C.getTrophies(); break; case 13: whichVal=""+C.getType(); break; // type case 14: { Vector areas=C.getControlledAreas(); StringBuffer list=new StringBuffer(""); for(int i=0;i<areas.size();i++) list.append("\""+((Environmental)areas.elementAt(i)).name()+"\" "); whichVal=list.toString().trim(); break; // areas } case 15: { DVector members=C.getMemberList(); StringBuffer list=new StringBuffer(""); for(int i=0;i<members.size();i++) list.append("\""+((String)members.elementAt(i,1))+"\" "); whichVal=list.toString().trim(); break; // memberlist } case 16: MOB M=C.getResponsibleMember(); if(M!=null) whichVal=M.Name(); break; // topmember default: scriptableError(scripted,"CLANDATA","RunTime",arg2+" is not a valid clan variable."); break; } results.append(whichVal); } break; } case 67: // hastitle { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(evaluable.substring(y+1,z),0)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((arg2.length()>0)&&(E instanceof MOB)&&(((MOB)E).playerStats()!=null)) { MOB M=(MOB)E; results.append(M.playerStats().getActiveTitle()); } break; } case 66: // clanrank { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&(E instanceof MOB)) results.append(((MOB)E).getClanRole()+""); break; } case 21: // class { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&(E instanceof MOB)) results.append(((MOB)E).charStats().displayClassName()); break; } case 64: // deity { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&(E instanceof MOB)) { String sex=((MOB)E).getWorshipCharID(); results.append(sex); } break; } case 65: // clan { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&(E instanceof MOB)) { String sex=((MOB)E).getClanID(); results.append(sex); } break; } case 88: // mood { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&(E instanceof MOB)&&(E.fetchEffect("Mood")!=null)) results.append(CMStrings.capitalizeAndLower(E.fetchEffect("Mood").text())); break; } case 22: // baseclass { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&(E instanceof MOB)) results.append(((MOB)E).charStats().getCurrentClass().baseClass()); break; } case 23: // race { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&(E instanceof MOB)) results.append(((MOB)E).charStats().raceName()); break; } case 24: //racecat { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((E!=null)&&(E instanceof MOB)) results.append(((MOB)E).charStats().getMyRace().racialCategory()); break; } case 25: // goldamt { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E==null) results.append(false); else { int val1=0; if(E instanceof MOB) val1=(int)Math.round(CMLib.beanCounter().getTotalAbsoluteValue((MOB)E,CMLib.beanCounter().getCurrency(scripted))); else if(E instanceof Coins) val1=(int)Math.round(((Coins)E).getTotalValue()); else if(E instanceof Item) val1=((Item)E).value(); else { scriptableError(scripted,"GOLDAMT","Syntax",evaluable); return results.toString(); } results.append(val1); } break; } case 78: // exp { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E==null) results.append(false); else { int val1=0; if(E instanceof MOB) val1=((MOB)E).getExperience(); results.append(val1); } break; } case 76: // value { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getPastBitClean(evaluable.substring(y+1,z),0); if(!CMLib.beanCounter().getAllCurrencies().contains(arg2.toUpperCase())) { scriptableError(scripted,"VALUE","Syntax",arg2+" is not a valid designated currency."); return results.toString(); } Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E==null) results.append(false); else { int val1=0; if(E instanceof MOB) val1=(int)Math.round(CMLib.beanCounter().getTotalAbsoluteValue((MOB)E,arg2)); else if(E instanceof Coins) { if(((Coins)E).getCurrency().equalsIgnoreCase(arg2)) val1=(int)Math.round(((Coins)E).getTotalValue()); } else if(E instanceof Item) val1=((Item)E).value(); else { scriptableError(scripted,"GOLDAMT","Syntax",evaluable); return results.toString(); } results.append(val1); } break; } case 26: // objtype { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E!=null) { String sex=CMClass.classID(E).toLowerCase(); results.append(sex); } break; } case 53: // incontainer { String arg1=CMParms.cleanBit(evaluable.substring(y+1,z)); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E!=null) { if(E instanceof MOB) { if(((MOB)E).riding()!=null) results.append(((MOB)E).riding().Name()); } else if(E instanceof Item) { if(((Item)E).riding()!=null) results.append(((Item)E).container().Name()); } } break; } case 27: // var { String arg1=CMParms.getCleanBit(evaluable.substring(y+1,z),0); String arg2=CMParms.getPastBitClean(evaluable.substring(y+1,z),0).toUpperCase(); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); String val=getVar(E,arg1,arg2,source,target,monster,primaryItem,secondaryItem,msg,tmp); results.append(val); break; } case 41: // eval results.append("[unimplemented function]"); break; case 40: // number { String val=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.cleanBit(evaluable.substring(y+1,z))).trim(); boolean isnumber=(val.length()>0); for(int i=0;i<val.length();i++) if(!Character.isDigit(val.charAt(i))) { isnumber=false; break;} if(isnumber) results.append(CMath.s_long(val.trim())); break; } case 42: // randnum { String arg1String=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.cleanBit(evaluable.substring(y+1,z))).toUpperCase(); int arg1=0; if(CMath.isMathExpression(arg1String)) arg1=CMath.s_parseIntExpression(arg1String.trim()); else arg1=CMParms.parse(arg1String.trim()).size(); results.append(CMLib.dice().roll(1,arg1,0)); break; } case 71: // rand0num { String arg1String=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.cleanBit(evaluable.substring(y+1,z))).toUpperCase(); int arg1=0; if(CMath.isMathExpression(arg1String)) arg1=CMath.s_parseIntExpression(arg1String.trim()); else arg1=CMParms.parse(arg1String.trim()).size(); results.append(CMLib.dice().roll(1,arg1,-1)); break; } default: scriptableError(scripted,"Unknown Val",preFab,evaluable); return results.toString(); } } if((z>=0)&&(z<=evaluable.length())) { evaluable=evaluable.substring(z+1).trim(); uevaluable=uevaluable.substring(z+1).trim(); } } return results.toString(); } protected MOB getFirstPC(MOB monster, MOB randMOB, Room room) { if((randMOB!=null)&&(randMOB!=monster)) return randMOB; MOB M=null; if(room!=null) for(int p=0;p<room.numInhabitants();p++) { M=room.fetchInhabitant(p); if((!M.isMonster())&&(M!=monster)) { HashSet seen=new HashSet(); while((M.amFollowing()!=null)&&(!M.amFollowing().isMonster())&&(!seen.contains(M))) { seen.add(M); M=M.amFollowing(); } return M; } } return null; } protected MOB getFirstAnyone(MOB monster, MOB randMOB, Room room) { if((randMOB!=null)&&(randMOB!=monster)) return randMOB; MOB M=null; if(room!=null) for(int p=0;p<room.numInhabitants();p++) { M=room.fetchInhabitant(p); if(M!=monster) { HashSet seen=new HashSet(); while((M.amFollowing()!=null)&&(!M.amFollowing().isMonster())&&(!seen.contains(M))) { seen.add(M); M=M.amFollowing(); } return M; } } return null; } public String execute(Environmental scripted, MOB source, Environmental target, MOB monster, Item primaryItem, Item secondaryItem, Vector script, String msg, Object[] tmp) { tickStatus=Tickable.STATUS_START; for(int si=1;si<script.size();si++) { String s=((String)script.elementAt(si)).trim(); String cmd=CMParms.getCleanBit(s,0).toUpperCase(); Integer methCode=(Integer)methH.get(cmd); if((methCode==null)&&(cmd.startsWith("MP"))) for(int i=0;i<methods.length;i++) if(methods[i].startsWith(cmd)) methCode=new Integer(i); if(methCode==null) methCode=new Integer(0); tickStatus=Tickable.STATUS_MISC3+methCode.intValue(); if(cmd.length()==0) continue; switch(methCode.intValue()) { case 57: // <SCRIPT> { StringBuffer jscript=new StringBuffer(""); while((++si)<script.size()) { s=((String)script.elementAt(si)).trim(); cmd=CMParms.getCleanBit(s,0).toUpperCase(); if(cmd.equalsIgnoreCase("</SCRIPT>")) break; jscript.append(s+"\n"); } if(CMSecurity.isApprovedJScript(jscript)) { Context cx = Context.enter(); try { JScriptEvent scope = new JScriptEvent(scripted,source,target,monster,primaryItem,secondaryItem,msg); cx.initStandardObjects(scope); String[] names = { "host", "source", "target", "monster", "item", "item2", "message" ,"getVar", "setVar", "toJavaString","setPlayerSetOverride"}; scope.defineFunctionProperties(names, JScriptEvent.class, ScriptableObject.DONTENUM); cx.evaluateString(scope, jscript.toString(),"<cmd>", 1, null); } catch(Exception e) { Log.errOut("Scriptable",scripted.name()+"/"+CMLib.map().getExtendedRoomID(lastKnownLocation)+"/JSCRIPT Error: "+e.getMessage()); } Context.exit(); } else if(CMProps.getIntVar(CMProps.SYSTEMI_JSCRIPTS)==1) { if(lastKnownLocation!=null) lastKnownLocation.showHappens(CMMsg.MSG_OK_ACTION,"A Javascript was not authorized. Contact an Admin to use MODIFY JSCRIPT to authorize this script."); } break; } case 19: // if { String conditionStr=(s.substring(2).trim()); boolean condition=eval(scripted,source,target,monster,primaryItem,secondaryItem,msg,tmp,conditionStr); Vector V=new Vector(); V.addElement(""); int depth=0; boolean foundendif=false; boolean ignoreUntilEndScript=false; si++; while(si<script.size()) { s=((String)script.elementAt(si)).trim(); cmd=CMParms.getCleanBit(s,0).toUpperCase(); if(cmd.equals("<SCRIPT>")) ignoreUntilEndScript=true; else if(cmd.equals("</SCRIPT>")) ignoreUntilEndScript=false; else if(ignoreUntilEndScript){} else if(cmd.equals("ENDIF")&&(depth==0)) { foundendif=true; break; } else if(cmd.equals("ELSE")&&(depth==0)) { condition=!condition; if(s.substring(4).trim().length()>0) { script.setElementAt("ELSE",si); script.insertElementAt(s.substring(4).trim(),si+1); } } else { if(condition) V.addElement(s); if(cmd.equals("IF")) depth++; else if(cmd.equals("ENDIF")) depth--; } si++; } if(!foundendif) { scriptableError(scripted,"IF","Syntax"," Without ENDIF!"); tickStatus=Tickable.STATUS_END; return null; } if(V.size()>1) { //source.tell("Starting "+conditionStr); //for(int v=0;v<V.size();v++) // source.tell("Statement "+((String)V.elementAt(v))); String response=execute(scripted,source,target,monster,primaryItem,secondaryItem,V,msg,tmp); if(response!=null) { tickStatus=Tickable.STATUS_END; return response; } //source.tell("Stopping "+conditionStr); } break; } case 70: // switch { String var=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(s,0)).trim(); Vector V=new Vector(); V.addElement(""); int depth=0; boolean foundendif=false; boolean ignoreUntilEndScript=false; boolean inCase=false; boolean matchedCase=false; si++; String s2=null; while(si<script.size()) { s=((String)script.elementAt(si)).trim(); cmd=CMParms.getCleanBit(s,0).toUpperCase(); if(cmd.equals("<SCRIPT>")) ignoreUntilEndScript=true; else if(cmd.equals("</SCRIPT>")) ignoreUntilEndScript=false; else if(ignoreUntilEndScript){} else if(cmd.equals("ENDSWITCH")&&(depth==0)) { foundendif=true; break; } else if(cmd.equals("CASE")&&(depth==0)) { s2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(s,0)).trim(); inCase=var.equalsIgnoreCase(s2); matchedCase=matchedCase||inCase; } else if(cmd.equals("DEFAULT")&&(depth==0)) { inCase=!matchedCase; } else { if(inCase) V.addElement(s); if(cmd.equals("SWITCH")) depth++; else if(cmd.equals("ENDSWITCH")) depth--; } si++; } if(!foundendif) { scriptableError(scripted,"SWITCH","Syntax"," Without ENDSWITCH!"); tickStatus=Tickable.STATUS_END; return null; } if(V.size()>1) { String response=execute(scripted,source,target,monster,primaryItem,secondaryItem,V,msg,tmp); if(response!=null) { tickStatus=Tickable.STATUS_END; return response; } } break; } case 62: // for x = 1 to 100 { if(CMParms.numBits(s)<6) { scriptableError(scripted,"FOR","Syntax","5 parms required!"); tickStatus=Tickable.STATUS_END; return null; } String varStr=CMParms.getBit(s,1); if((varStr.length()!=2)||(varStr.charAt(0)!='$')||(!Character.isDigit(varStr.charAt(1)))) { scriptableError(scripted,"FOR","Syntax","'"+varStr+"' is not a tmp var $1, $2.."); tickStatus=Tickable.STATUS_END; return null; } int whichVar=CMath.s_int(Character.toString(varStr.charAt(1))); if((tmp[whichVar] instanceof String) &&(((String)tmp[whichVar]).length()>1) &&(((String)tmp[whichVar]).startsWith(" ")) &&(CMath.isInteger(((String)tmp[whichVar]).trim()))) { scriptableError(scripted,"FOR","Syntax","'"+whichVar+"' is already in use! Use a different one!"); tickStatus=Tickable.STATUS_END; return null; } if((!CMParms.getBit(s,2).equals("="))&&(!CMParms.getBit(s,4).equalsIgnoreCase("to"))) { scriptableError(scripted,"FOR","Syntax","'"+s+"' is illegal for syntax!"); tickStatus=Tickable.STATUS_END; return null; } String from=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(s,3).trim()).trim(); String to=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(s,4).trim()).trim(); if((!CMath.isInteger(from))||(!CMath.isInteger(to))) { scriptableError(scripted,"FOR","Syntax","'"+from+"-"+to+"' is illegal range!"); tickStatus=Tickable.STATUS_END; return null; } Vector V=new Vector(); V.addElement(""); int depth=0; boolean foundnext=false; boolean ignoreUntilEndScript=false; si++; while(si<script.size()) { s=((String)script.elementAt(si)).trim(); cmd=CMParms.getCleanBit(s,0).toUpperCase(); if(cmd.equals("<SCRIPT>")) ignoreUntilEndScript=true; else if(cmd.equals("</SCRIPT>")) ignoreUntilEndScript=false; else if(ignoreUntilEndScript){} else if(cmd.equals("NEXT")&&(depth==0)) { foundnext=true; break; } else { V.addElement(s); if(cmd.equals("FOR")) depth++; else if(cmd.equals("NEXT")) depth--; } si++; } if(!foundnext) { scriptableError(scripted,"FOR","Syntax"," Without NEXT!"); tickStatus=Tickable.STATUS_END; return null; } if(V.size()>1) { //source.tell("Starting "+conditionStr); //for(int v=0;v<V.size();v++) // source.tell("Statement "+((String)V.elementAt(v))); int toInt=CMath.s_int(to); int fromInt=CMath.s_int(from); int increment=(toInt>=fromInt)?1:-1; String response=null; for(int forLoop=fromInt;forLoop!=toInt;forLoop+=increment) { tmp[whichVar]=" "+forLoop; response=execute(scripted,source,target,monster,primaryItem,secondaryItem,V,msg,tmp); if(response!=null) break; } tmp[whichVar]=" "+toInt; response=execute(scripted,source,target,monster,primaryItem,secondaryItem,V,msg,tmp); if(response!=null) { tickStatus=Tickable.STATUS_END; return response; } tmp[whichVar]=null; //source.tell("Stopping "+conditionStr); } break; } case 50: // break; tickStatus=Tickable.STATUS_END; return null; case 1: // mpasound { String echo=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,s.substring(8).trim()); //lastKnownLocation.showSource(monster,null,CMMsg.MSG_OK_ACTION,echo); for(int d=0;d<Directions.NUM_DIRECTIONS;d++) { Room R2=lastKnownLocation.getRoomInDir(d); Exit E2=lastKnownLocation.getExitInDir(d); if((R2!=null)&&(E2!=null)&&(E2.isOpen())) R2.showOthers(monster,null,null,CMMsg.MSG_OK_ACTION,echo); } break; } case 4: // mpjunk { s=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,s.substring(6).trim()); if(s.equalsIgnoreCase("all")) { while(monster.inventorySize()>0) { Item I=monster.fetchInventory(0); if(I!=null) I.destroy(); } } else { Item I=monster.fetchInventory(s); if(I!=null) I.destroy(); } break; } case 2: // mpecho { if(lastKnownLocation!=null) lastKnownLocation.show(monster,null,CMMsg.MSG_OK_ACTION,varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,s.substring(6).trim())); break; } case 13: // mpunaffect { Environmental newTarget=getArgumentItem(CMParms.getCleanBit(s,1),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); String which=CMParms.getPastBitClean(s,1); if(newTarget!=null) if(which.equalsIgnoreCase("all")||(which.length()==0)) { for(int a=newTarget.numEffects()-1;a>=0;a--) { Ability A=newTarget.fetchEffect(a); if(A!=null) A.unInvoke(); } } else { Ability A=newTarget.fetchEffect(which); if(A!=null) { if((newTarget instanceof MOB)&&(!((MOB)newTarget).isMonster())&&(A!=null)) Log.sysOut("Scriptable",newTarget.Name()+" was MPUNAFFECTED by "+A.Name()); A.unInvoke(); if(newTarget.fetchEffect(which)==A) newTarget.delEffect(A); } } break; } case 3: // mpslay { Environmental newTarget=getArgumentItem(CMParms.getPastBitClean(s,0),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((newTarget!=null)&&(newTarget instanceof MOB)) CMLib.combat().postDeath(monster,(MOB)newTarget,null); break; } case 16: // mpset { Environmental newTarget=getArgumentItem(CMParms.getCleanBit(s,1),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); String arg2=CMParms.getCleanBit(s,2); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBit(s,2)); if(newTarget!=null) { if((newTarget instanceof MOB)&&(!((MOB)newTarget).isMonster())) Log.sysOut("Scriptable",newTarget.Name()+" has "+arg2+" MPSETTED to "+arg3); boolean found=false; for(int i=0;i<newTarget.getStatCodes().length;i++) { if(newTarget.getStatCodes()[i].equalsIgnoreCase(arg2)) { newTarget.setStat(arg2,arg3); found=true; break; } } if((!found)&&(newTarget instanceof MOB)) { MOB M=(MOB)newTarget; for(int i=0;i<CharStats.STAT_DESCS.length;i++) if(CharStats.STAT_DESCS[i].equalsIgnoreCase(arg2)) { M.baseCharStats().setStat(i,CMath.s_int(arg3.trim())); M.recoverCharStats(); if(arg2.equalsIgnoreCase("RACE")) M.charStats().getMyRace().startRacing(M,false); found=true; break; } if(!found) for(int i=0;i<M.curState().getStatCodes().length;i++) if(M.curState().getStatCodes()[i].equalsIgnoreCase(arg2)) { M.curState().setStat(arg2,arg3); found=true; break; } if(!found) for(int i=0;i<M.baseEnvStats().getCodes().length;i++) if(M.baseEnvStats().getCodes()[i].equalsIgnoreCase(arg2)) { M.baseEnvStats().setStat(arg2,arg3); found=true; break; } if((!found)&&(M.playerStats()!=null)) for(int i=0;i<M.playerStats().getStatCodes().length;i++) if(M.playerStats().getStatCodes()[i].equalsIgnoreCase(arg2)) { M.playerStats().setStat(arg2,arg3); found=true; break; } if((!found)&&(arg2.toUpperCase().startsWith("BASE"))) for(int i=0;i<M.baseState().getStatCodes().length;i++) if(M.baseState().getStatCodes()[i].equalsIgnoreCase(arg2.substring(4))) { M.baseState().setStat(arg2.substring(4),arg3); found=true; break; } } if(!found) { scriptableError(scripted,"MPSET","Syntax","Unknown stat: "+arg2+" for "+newTarget.Name()); break; } if(newTarget instanceof MOB) ((MOB)newTarget).recoverCharStats(); newTarget.recoverEnvStats(); if(newTarget instanceof MOB) { ((MOB)newTarget).recoverMaxState(); if(arg2.equalsIgnoreCase("LEVEL")) { ((MOB)newTarget).baseCharStats().getCurrentClass().fillOutMOB(((MOB)newTarget),((MOB)newTarget).baseEnvStats().level()); ((MOB)newTarget).recoverMaxState(); ((MOB)newTarget).recoverCharStats(); ((MOB)newTarget).recoverEnvStats(); ((MOB)newTarget).resetToMaxState(); } } } break; } case 63: // mpargset { String arg1=CMParms.getCleanBit(s,1); String arg2=CMParms.getPastBitClean(s,1); if((arg1.length()!=2)||(!arg1.startsWith("$"))) { scriptableError(scripted,"MPARGSET","Syntax","Invalid argument var: "+arg1+" for "+scripted.Name()); break; } Object O=getArgumentMOB(arg2,source,monster,target,primaryItem,secondaryItem,msg,tmp); if(O==null) O=getArgumentItem(arg2,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((O==null)&&(!arg2.trim().startsWith("$"))) O=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,arg2); char c=arg1.charAt(1); if(Character.isDigit(c)) { if((O instanceof String)&&(((String)O).equalsIgnoreCase("null"))) O=null; tmp[CMath.s_int(Character.toString(c))]=O; } else switch(arg1.charAt(1)) { case 'N': case 'n': if(O instanceof MOB) source=(MOB)O; break; case 'I': case 'i': if(O instanceof Environmental) scripted=(Environmental)O; if(O instanceof MOB) monster=(MOB)O; break; case 'T': case 't': if(O instanceof Environmental) target=(Environmental)O; break; case 'O': case 'o': if(O instanceof Item) primaryItem=(Item)O; break; case 'P': case 'p': if(O instanceof Item) secondaryItem=(Item)O; break; case 'd': case 'D': if(O instanceof Room) lastKnownLocation=(Room)O; break; default: scriptableError(scripted,"MPARGSET","Syntax","Invalid argument var: "+arg1+" for "+scripted.Name()); break; } break; } case 35: // mpgset { Environmental newTarget=getArgumentItem(CMParms.getCleanBit(s,1),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); String arg2=CMParms.getCleanBit(s,2); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBit(s,2)); if(newTarget!=null) { if((newTarget instanceof MOB)&&(!((MOB)newTarget).isMonster())) Log.sysOut("Scriptable",newTarget.Name()+" has "+arg2+" MPGSETTED to "+arg3); boolean found=false; for(int i=0;i<newTarget.getStatCodes().length;i++) { if(newTarget.getStatCodes()[i].equalsIgnoreCase(arg2)) { newTarget.setStat(newTarget.getStatCodes()[i],arg3); found=true; break; } } if(!found) if(newTarget instanceof MOB) { for(int i=0;i<CMObjectBuilder.GENMOBCODES.length;i++) { if(CMObjectBuilder.GENMOBCODES[i].equalsIgnoreCase(arg2)) { CMLib.coffeeMaker().setGenMobStat((MOB)newTarget,CMObjectBuilder.GENMOBCODES[i],arg3); found=true; break; } } if(!found) { MOB M=(MOB)newTarget; for(int i=0;i<CharStats.STAT_DESCS.length;i++) { if(CharStats.STAT_DESCS[i].equalsIgnoreCase(arg2)) { if((arg3.length()==1)&&(Character.isLetter(arg3.charAt(0)))) M.baseCharStats().setStat(i,arg3.charAt(0)); else M.baseCharStats().setStat(i,CMath.s_int(arg3.trim())); M.recoverCharStats(); if(arg2.equalsIgnoreCase("RACE")) M.charStats().getMyRace().startRacing(M,false); found=true; break; } } if(!found) for(int i=0;i<M.curState().getStatCodes().length;i++) { if(M.curState().getStatCodes()[i].equalsIgnoreCase(arg2)) { M.curState().setStat(arg2,arg3); found=true; break; } } if(!found) for(int i=0;i<M.baseEnvStats().getCodes().length;i++) { if(M.baseEnvStats().getCodes()[i].equalsIgnoreCase(arg2)) { M.baseEnvStats().setStat(arg2,arg3); found=true; break; } } if((!found)&&(M.playerStats()!=null)) for(int i=0;i<M.playerStats().getStatCodes().length;i++) if(M.playerStats().getStatCodes()[i].equalsIgnoreCase(arg2)) { M.playerStats().setStat(arg2,arg3); found=true; break; } if((!found)&&(arg2.toUpperCase().startsWith("BASE"))) for(int i=0;i<M.baseState().getStatCodes().length;i++) if(M.baseState().getStatCodes()[i].equalsIgnoreCase(arg2.substring(4))) { M.baseState().setStat(arg2.substring(4),arg3); found=true; break; } } } else if(newTarget instanceof Item) { for(int i=0;i<CMObjectBuilder.GENITEMCODES.length;i++) { if(CMObjectBuilder.GENITEMCODES[i].equalsIgnoreCase(arg2)) { CMLib.coffeeMaker().setGenItemStat((Item)newTarget,CMObjectBuilder.GENITEMCODES[i],arg3); found=true; break; } } } if(!found) { scriptableError(scripted,"MPGSET","Syntax","Unknown stat: "+arg2+" for "+newTarget.Name()); break; } if(newTarget instanceof MOB) ((MOB)newTarget).recoverCharStats(); newTarget.recoverEnvStats(); if(newTarget instanceof MOB) { ((MOB)newTarget).recoverMaxState(); if(arg2.equalsIgnoreCase("LEVEL")) { ((MOB)newTarget).baseCharStats().getCurrentClass().fillOutMOB(((MOB)newTarget),((MOB)newTarget).baseEnvStats().level()); ((MOB)newTarget).recoverMaxState(); ((MOB)newTarget).recoverCharStats(); ((MOB)newTarget).recoverEnvStats(); ((MOB)newTarget).resetToMaxState(); } } } break; } case 11: // mpexp { Environmental newTarget=getArgumentItem(CMParms.getCleanBit(s,1),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); String amtStr=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(s,1)).trim(); int t=CMath.s_int(amtStr); if((newTarget!=null)&&(newTarget instanceof MOB)) { if((amtStr.endsWith("%")) &&(((MOB)newTarget).getExpNeededLevel()<Integer.MAX_VALUE)) { int baseLevel=newTarget.baseEnvStats().level(); int lastLevelExpNeeded=(baseLevel<=1)?0:CMLib.leveler().getLevelExperience(baseLevel-1); int thisLevelExpNeeded=CMLib.leveler().getLevelExperience(baseLevel); t=(int)Math.round(CMath.mul(thisLevelExpNeeded-lastLevelExpNeeded, CMath.div(CMath.s_int(amtStr.substring(0,amtStr.length()-1)),100.0))); } if(t!=0) CMLib.leveler().postExperience((MOB)newTarget,null,null,t,false); } break; } case 59: // mpquestpoints { Environmental newTarget=getArgumentItem(CMParms.getCleanBit(s,1),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); String val=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(s,1)); if(newTarget instanceof MOB) { if(CMath.isNumber(val.trim())) ((MOB)newTarget).setQuestPoint(CMath.s_int(val.trim())); else if(val.startsWith("++")&&(CMath.isNumber(val.substring(2).trim()))) ((MOB)newTarget).setQuestPoint(((MOB)newTarget).getQuestPoint()+CMath.s_int(val.substring(2).trim())); else if(val.startsWith("--")&&(CMath.isNumber(val.substring(2).trim()))) ((MOB)newTarget).setQuestPoint(((MOB)newTarget).getQuestPoint()-CMath.s_int(val.substring(2).trim())); else scriptableError(scripted,"QUESTPOINTS","Syntax","Bad syntax "+val+" for "+scripted.Name()); } break; } case 65: // MPQSET { String qstr=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(s,1)); String var=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(s,2)); String val=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(s,2)); Quest Q=getQuest(qstr); if(Q==null) scriptableError(scripted,"QUESTPOINTS","Syntax","Unknown quest "+qstr+" for "+scripted.Name()); else Q.setStat(var,val); break; } case 66: // MPLOG { String type=CMParms.getCleanBit(s,1).toUpperCase(); String head=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(s,2)); String val=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(s,2)); if(type.startsWith("E")) Log.errOut(head,val); else if(type.startsWith("I")||type.startsWith("S")) Log.infoOut(head,val); else if(type.startsWith("D")) Log.debugOut(head,val); else scriptableError(scripted,"MPLOG","Syntax","Unknown log type "+type+" for "+scripted.Name()); break; } case 67: // MPCHANNEL { String channel=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(s,1)); boolean sysmsg=channel.startsWith("!"); if(sysmsg) channel=channel.substring(1); String val=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(s,1)); if(CMLib.channels().getChannelCodeNumber(channel)<0) scriptableError(scripted,"MPCHANNEL","Syntax","Unknown channel "+channel+" for "+scripted.Name()); else CMLib.commands().postChannel(monster,channel,val,sysmsg); break; } case 68: // cd { String scriptname=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(s,1)); if(!new CMFile(Resources.makeFileResourceName(scriptname),null,false,true).exists()) scriptableError(scripted,"MPUNLOADSCRIPT","Runtime","File does not exist: "+Resources.makeFileResourceName(scriptname)); else { Vector delThese=new Vector(); boolean foundKey=false; scriptname=scriptname.toUpperCase().trim(); String parmname=scriptname; Vector V=Resources.findResourceKeys(parmname); for(Enumeration e=V.elements();e.hasMoreElements();) { String key=(String)e.nextElement(); if(key.startsWith("PARSEDPRG: ")&&(key.toUpperCase().endsWith(parmname))) { foundKey=true; delThese.addElement(key);} } if(foundKey) for(int i=0;i<delThese.size();i++) Resources.removeResource((String)delThese.elementAt(i)); } break; } case 60: // trains { Environmental newTarget=getArgumentItem(CMParms.getCleanBit(s,1),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); String val=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(s,1)); if(newTarget instanceof MOB) { if(CMath.isNumber(val.trim())) ((MOB)newTarget).setTrains(CMath.s_int(val.trim())); else if(val.startsWith("++")&&(CMath.isNumber(val.substring(2).trim()))) ((MOB)newTarget).setTrains(((MOB)newTarget).getTrains()+CMath.s_int(val.substring(2).trim())); else if(val.startsWith("--")&&(CMath.isNumber(val.substring(2).trim()))) ((MOB)newTarget).setTrains(((MOB)newTarget).getTrains()-CMath.s_int(val.substring(2).trim())); else scriptableError(scripted,"TRAINS","Syntax","Bad syntax "+val+" for "+scripted.Name()); } break; } case 61: // pracs { Environmental newTarget=getArgumentItem(CMParms.getCleanBit(s,1),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); String val=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(s,1)); if(newTarget instanceof MOB) { if(CMath.isNumber(val.trim())) ((MOB)newTarget).setPractices(CMath.s_int(val.trim())); else if(val.startsWith("++")&&(CMath.isNumber(val.substring(2).trim()))) ((MOB)newTarget).setPractices(((MOB)newTarget).getPractices()+CMath.s_int(val.substring(2).trim())); else if(val.startsWith("--")&&(CMath.isNumber(val.substring(2).trim()))) ((MOB)newTarget).setPractices(((MOB)newTarget).getPractices()-CMath.s_int(val.substring(2).trim())); else scriptableError(scripted,"PRACS","Syntax","Bad syntax "+val+" for "+scripted.Name()); } break; } case 5: // mpmload { s=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(s,0).trim()); Vector Ms=new Vector(); MOB m=CMClass.getMOB(s); if(m!=null) Ms.addElement(m); if(lastKnownLocation!=null) { if(Ms.size()==0) findSomethingCalledThis(s,monster,lastKnownLocation,Ms,true); for(int i=0;i<Ms.size();i++) { if(Ms.elementAt(i) instanceof MOB) { m=(MOB)((MOB)Ms.elementAt(i)).copyOf(); m.text(); m.recoverEnvStats(); m.recoverCharStats(); m.resetToMaxState(); m.bringToLife(lastKnownLocation,true); } } } break; } case 6: // mpoload { // if not mob if(scripted instanceof MOB) { s=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(s,0).trim()); int containerIndex=s.toUpperCase().indexOf(" INTO "); Container container=null; if(containerIndex>=0) { Vector containers=new Vector(); findSomethingCalledThis(s.substring(containerIndex+6).trim(),monster,lastKnownLocation,containers,false); for(int c=0;c<containers.size();c++) if((containers.elementAt(c) instanceof Container) &&(((Container)containers.elementAt(c)).capacity()>0)) { container=(Container)containers.elementAt(c); s=s.substring(0,containerIndex).trim(); break; } } long coins=CMLib.english().numPossibleGold(null,s); if(coins>0) { String currency=CMLib.english().numPossibleGoldCurrency(scripted,s); double denom=CMLib.english().numPossibleGoldDenomination(scripted,currency,s); Coins C=CMLib.beanCounter().makeCurrency(currency,denom,coins); monster.addInventory(C); C.putCoinsBack(); } else if(lastKnownLocation!=null) { Vector Is=new Vector(); Item m=CMClass.getItem(s); if(m!=null) Is.addElement(m); else findSomethingCalledThis(s,(MOB)scripted,lastKnownLocation,Is,false); for(int i=0;i<Is.size();i++) { if(Is.elementAt(i) instanceof Item) { m=(Item)Is.elementAt(i); if((m!=null)&&(!(m instanceof ArchonOnly))) { m=(Item)m.copyOf(); m.recoverEnvStats(); m.setContainer(container); if(container instanceof MOB) ((MOB)container.owner()).addInventory(m); else if(container instanceof Room) ((Room)container.owner()).addItemRefuse(m,Item.REFUSE_PLAYER_DROP); else monster.addInventory(m); } } } lastKnownLocation.recoverRoomStats(); monster.recoverCharStats(); monster.recoverEnvStats(); monster.recoverMaxState(); } break; } } case 41: // mpoloadroom { s=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(s,0).trim()); if(lastKnownLocation!=null) { Vector Is=new Vector(); int containerIndex=s.toUpperCase().indexOf(" INTO "); Container container=null; if(containerIndex>=0) { Vector containers=new Vector(); findSomethingCalledThis(s.substring(containerIndex+6).trim(),null,lastKnownLocation,containers,false); for(int c=0;c<containers.size();c++) if((containers.elementAt(c) instanceof Container) &&(((Container)containers.elementAt(c)).capacity()>0)) { container=(Container)containers.elementAt(c); s=s.substring(0,containerIndex).trim(); break; } } long coins=CMLib.english().numPossibleGold(null,s); if(coins>0) { String currency=CMLib.english().numPossibleGoldCurrency(monster,s); double denom=CMLib.english().numPossibleGoldDenomination(monster,currency,s); Coins C=CMLib.beanCounter().makeCurrency(currency,denom,coins); Is.addElement(C); } else { Item I=CMClass.getItem(s); if(I!=null) Is.addElement(I); else findSomethingCalledThis(s,monster,lastKnownLocation,Is,false); } for(int i=0;i<Is.size();i++) { if(Is.elementAt(i) instanceof Item) { Item I=(Item)Is.elementAt(i); if((I!=null)&&(!(I instanceof ArchonOnly))) { I=(Item)I.copyOf(); I.recoverEnvStats(); lastKnownLocation.addItemRefuse(I,Item.REFUSE_MONSTER_EQ); I.setContainer(container); if(I instanceof Coins) ((Coins)I).putCoinsBack(); if(I instanceof RawMaterial) ((RawMaterial)I).rebundle(); } } } lastKnownLocation.recoverRoomStats(); } break; } case 42: // mphide { Environmental newTarget=getArgumentItem(CMParms.getCleanBit(s,1),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(newTarget!=null) { newTarget.baseEnvStats().setDisposition(newTarget.baseEnvStats().disposition()|EnvStats.IS_NOT_SEEN); newTarget.recoverEnvStats(); if(lastKnownLocation!=null) lastKnownLocation.recoverRoomStats(); } break; } case 58: // mpreset { String arg=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(s,0)); if(arg.equalsIgnoreCase("area")) { if(lastKnownLocation!=null) CMLib.map().resetArea(lastKnownLocation.getArea()); } else if(arg.equalsIgnoreCase("room")) { if(lastKnownLocation!=null) CMLib.map().resetRoom(lastKnownLocation); } else { Room R=CMLib.map().getRoom(arg); if(R!=null) CMLib.map().resetRoom(R); else { Area A=CMLib.map().findArea(arg); if(A!=null) CMLib.map().resetArea(A); else scriptableError(scripted,"MPRESET","Syntax","Unknown location: "+arg+" for "+scripted.Name()); } } break; } case 56: // mpstop { Environmental newTarget=getArgumentItem(CMParms.getCleanBit(s,1),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(newTarget instanceof MOB) { MOB mob=(MOB)newTarget; Ability A=null; for(int a=mob.numEffects();a>=0;a--) { A=mob.fetchEffect(a); if(((A.classificationCode()&Ability.ALL_ACODES)==Ability.ACODE_COMMON_SKILL) &&(A.canBeUninvoked()) &&(!A.isAutoInvoked())) A.unInvoke(); } mob.makePeace(); if(lastKnownLocation!=null) lastKnownLocation.recoverRoomStats(); } break; } case 43: // mpunhide { Environmental newTarget=getArgumentItem(CMParms.getCleanBit(s,1),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((newTarget!=null)&&(CMath.bset(newTarget.baseEnvStats().disposition(),EnvStats.IS_NOT_SEEN))) { newTarget.baseEnvStats().setDisposition(newTarget.baseEnvStats().disposition()-EnvStats.IS_NOT_SEEN); newTarget.recoverEnvStats(); if(lastKnownLocation!=null) lastKnownLocation.recoverRoomStats(); } break; } case 44: // mpopen { Environmental newTarget=getArgumentItem(CMParms.getCleanBit(s,1),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((newTarget instanceof Exit)&&(((Exit)newTarget).hasADoor())) { Exit E=(Exit)newTarget; E.setDoorsNLocks(E.hasADoor(),true,E.defaultsClosed(),E.hasALock(),false,E.defaultsLocked()); if(lastKnownLocation!=null) lastKnownLocation.recoverRoomStats(); } else if((newTarget instanceof Container)&&(((Container)newTarget).hasALid())) { Container E=(Container)newTarget; E.setLidsNLocks(E.hasALid(),true,E.hasALock(),false); if(lastKnownLocation!=null) lastKnownLocation.recoverRoomStats(); } break; } case 45: // mpclose { Environmental newTarget=getArgumentItem(CMParms.getCleanBit(s,1),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((newTarget instanceof Exit)&&(((Exit)newTarget).hasADoor())&&(((Exit)newTarget).isOpen())) { Exit E=(Exit)newTarget; E.setDoorsNLocks(E.hasADoor(),false,E.defaultsClosed(),E.hasALock(),false,E.defaultsLocked()); if(lastKnownLocation!=null) lastKnownLocation.recoverRoomStats(); } else if((newTarget instanceof Container)&&(((Container)newTarget).hasALid())&&(((Container)newTarget).isOpen())) { Container E=(Container)newTarget; E.setLidsNLocks(E.hasALid(),false,E.hasALock(),false); if(lastKnownLocation!=null) lastKnownLocation.recoverRoomStats(); } break; } case 46: // mplock { Environmental newTarget=getArgumentItem(CMParms.getCleanBit(s,1),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((newTarget instanceof Exit)&&(((Exit)newTarget).hasALock())) { Exit E=(Exit)newTarget; E.setDoorsNLocks(E.hasADoor(),false,E.defaultsClosed(),E.hasALock(),true,E.defaultsLocked()); if(lastKnownLocation!=null) lastKnownLocation.recoverRoomStats(); } else if((newTarget instanceof Container)&&(((Container)newTarget).hasALock())) { Container E=(Container)newTarget; E.setLidsNLocks(E.hasALid(),false,E.hasALock(),true); if(lastKnownLocation!=null) lastKnownLocation.recoverRoomStats(); } break; } case 47: // mpunlock { Environmental newTarget=getArgumentItem(CMParms.getCleanBit(s,1),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((newTarget instanceof Exit)&&(((Exit)newTarget).isLocked())) { Exit E=(Exit)newTarget; E.setDoorsNLocks(E.hasADoor(),false,E.defaultsClosed(),E.hasALock(),false,E.defaultsLocked()); if(lastKnownLocation!=null) lastKnownLocation.recoverRoomStats(); } else if((newTarget instanceof Container)&&(((Container)newTarget).isLocked())) { Container E=(Container)newTarget; E.setLidsNLocks(E.hasALid(),false,E.hasALock(),false); if(lastKnownLocation!=null) lastKnownLocation.recoverRoomStats(); } break; } case 48: // return tickStatus=Tickable.STATUS_END; return varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,s.substring(6).trim()); case 7: // mpechoat { String parm=CMParms.getCleanBit(s,1); Environmental newTarget=getArgumentMOB(parm,source,monster,target,primaryItem,secondaryItem,msg,tmp); if((newTarget!=null)&&(newTarget instanceof MOB)&&(lastKnownLocation!=null)) { s=CMParms.getPastBit(s,1).trim(); if(newTarget==monster) lastKnownLocation.showSource(monster,null,null,CMMsg.MSG_OK_ACTION,varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,s)); else lastKnownLocation.show(monster,newTarget,null,CMMsg.MSG_OK_ACTION,null,CMMsg.MSG_OK_ACTION,varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,s),CMMsg.NO_EFFECT,null); } else if(parm.equalsIgnoreCase("world")) { lastKnownLocation.showSource(monster,null,CMMsg.MSG_OK_ACTION,varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBit(s,1).trim())); for(Enumeration e=CMLib.map().rooms();e.hasMoreElements();) { Room R=(Room)e.nextElement(); if(R.numInhabitants()>0) R.showOthers(monster,null,CMMsg.MSG_OK_ACTION,varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,s)); } } else if(parm.equalsIgnoreCase("area")&&(lastKnownLocation!=null)) { lastKnownLocation.showSource(monster,null,CMMsg.MSG_OK_ACTION,varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBit(s,1).trim())); for(Enumeration e=lastKnownLocation.getArea().getProperMap();e.hasMoreElements();) { Room R=(Room)e.nextElement(); if(R.numInhabitants()>0) R.showOthers(monster,null,CMMsg.MSG_OK_ACTION,varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,s)); } } else if(CMLib.map().getRoom(parm)!=null) CMLib.map().getRoom(parm).show(monster,null,CMMsg.MSG_OK_ACTION,varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBit(s,1).trim())); else if(CMLib.map().findArea(parm)!=null) { lastKnownLocation.showSource(monster,null,CMMsg.MSG_OK_ACTION,varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBit(s,1).trim())); for(Enumeration e=CMLib.map().findArea(parm).getMetroMap();e.hasMoreElements();) { Room R=(Room)e.nextElement(); if(R.numInhabitants()>0) R.showOthers(monster,null,CMMsg.MSG_OK_ACTION,varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBit(s,1).trim())); } } break; } case 8: // mpechoaround { Environmental newTarget=getArgumentMOB(CMParms.getCleanBit(s,1),source,monster,target,primaryItem,secondaryItem,msg,tmp); if((newTarget!=null)&&(newTarget instanceof MOB)&&(lastKnownLocation!=null)) { s=CMParms.getPastBit(s,1).trim(); lastKnownLocation.showOthers((MOB)newTarget,null,CMMsg.MSG_OK_ACTION,varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,s)); } break; } case 9: // mpcast { String cast=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(s,1)); Environmental newTarget=getArgumentItem(CMParms.getCleanBit(s,2),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); Ability A=null; if(cast!=null) A=CMClass.findAbility(cast); if((newTarget!=null)&&(A!=null)) { A.setProficiency(100); A.invoke(monster,newTarget,false,0); } break; } case 30: // mpaffect { String cast=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(s,1)); Environmental newTarget=getArgumentItem(CMParms.getCleanBit(s,2),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); String m2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBit(s,2)); Ability A=null; if(cast!=null) A=CMClass.findAbility(cast); if((newTarget!=null)&&(A!=null)) { if((newTarget instanceof MOB)&&(!((MOB)newTarget).isMonster())&&(A!=null)) Log.sysOut("Scriptable",newTarget.Name()+" was MPAFFECTED by "+A.Name()); A.setMiscText(m2); if((A.classificationCode()&Ability.ALL_ACODES)==Ability.ACODE_PROPERTY) newTarget.addNonUninvokableEffect(A); else A.invoke(monster,CMParms.parse(m2),newTarget,true,0); } break; } case 31: // mpbehave { String cast=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(s,1)); Environmental newTarget=getArgumentItem(CMParms.getCleanBit(s,2),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); String m2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(s,2)); Behavior A=null; if((cast!=null)&&(newTarget!=null)) { A=newTarget.fetchBehavior(cast); if(A==null) A=CMClass.getBehavior(cast); } if((newTarget!=null)&&(A!=null)) { if((newTarget instanceof MOB)&&(!((MOB)newTarget).isMonster())&&(A!=null)) Log.sysOut("Scriptable",newTarget.Name()+" was MPBEHAVED with "+A.name()); A.setParms(m2); if(newTarget.fetchBehavior(A.ID())==null) newTarget.addBehavior(A); } break; } case 32: // mpunbehave { String cast=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(s,1)); Environmental newTarget=getArgumentItem(CMParms.getCleanBit(s,2),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(newTarget!=null) { Behavior A=newTarget.fetchBehavior(cast); if(A!=null) newTarget.delBehavior(A); if((newTarget instanceof MOB)&&(!((MOB)newTarget).isMonster())&&(A!=null)) Log.sysOut("Scriptable",newTarget.Name()+" was MPUNBEHAVED with "+A.name()); } break; } case 33: // mptattoo { Environmental newTarget=getArgumentItem(CMParms.getCleanBit(s,1),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); String tattooName=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(s,2)); if((newTarget!=null)&&(tattooName.length()>0)&&(newTarget instanceof MOB)) { MOB themob=(MOB)newTarget; boolean tattooMinus=tattooName.startsWith("-"); if(tattooMinus) tattooName=tattooName.substring(1); String tattoo=tattooName; if((tattoo.length()>0) &&(Character.isDigit(tattoo.charAt(0))) &&(tattoo.indexOf(" ")>0) &&(CMath.isNumber(tattoo.substring(0,tattoo.indexOf(" ")).trim()))) tattoo=tattoo.substring(tattoo.indexOf(" ")+1).trim(); if(themob.fetchTattoo(tattoo)!=null) { if(tattooMinus) themob.delTattoo(tattooName); } else if(!tattooMinus) themob.addTattoo(tattooName); } break; } case 55: // mpnotrigger { String trigger=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(s,1)); String time=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(s,2)); int triggerCode=-1; for(int i=0;i<progs.length;i++) if(trigger.equalsIgnoreCase(progs[i])) triggerCode=i; if(triggerCode<0) scriptableError(scripted,"MPNOTRIGGER","RunTime",trigger+" is not a valid trigger name."); else if(!CMath.isInteger(time.trim())) scriptableError(scripted,"MPNOTRIGGER","RunTime",time+" is not a valid milisecond time."); else { noTrigger.remove(new Integer(triggerCode)); noTrigger.put(new Integer(triggerCode),new Long(System.currentTimeMillis()+CMath.s_long(time.trim()))); } break; } case 54: // mpfaction { Environmental newTarget=getArgumentItem(CMParms.getCleanBit(s,1),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); String faction=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(s,2)); String range=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(s,2)); Faction F=CMLib.factions().getFaction(faction); if((newTarget!=null)&&(F!=null)&&(newTarget instanceof MOB)) { MOB themob=(MOB)newTarget; if((range.startsWith("--"))&&(CMath.isInteger(range.substring(2).trim()))) range=""+(themob.fetchFaction(faction)-CMath.s_int(range.substring(2).trim())); else if((range.startsWith("+"))&&(CMath.isInteger(range.substring(1).trim()))) range=""+(themob.fetchFaction(faction)+CMath.s_int(range.substring(1).trim())); if(CMath.isInteger(range.trim())) themob.addFaction(F.factionID(),CMath.s_int(range.trim())); else { Vector V=CMLib.factions().getRanges(F.factionID()); Faction.FactionRange FR=null; for(int v=0;v<V.size();v++) { Faction.FactionRange FR2=(Faction.FactionRange)V.elementAt(v); if(FR2.name().equalsIgnoreCase(range)) { FR=FR2; break;} } if(FR==null) scriptableError(scripted,"MPFACTION","RunTime",range+" is not a valid range for "+F.name()+"."); else themob.addFaction(F.factionID(),FR.low()+((FR.high()-FR.low())/2)); } } break; } case 49: // mptitle { Environmental newTarget=getArgumentItem(CMParms.getCleanBit(s,1),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); String tattooName=CMParms.getPastBitClean(s,1); if((newTarget!=null)&&(tattooName.length()>0)&&(newTarget instanceof MOB)) { MOB themob=(MOB)newTarget; boolean tattooMinus=tattooName.startsWith("-"); if(tattooMinus) tattooName=tattooName.substring(1); String tattoo=tattooName; if((tattoo.length()>0) &&(Character.isDigit(tattoo.charAt(0))) &&(tattoo.indexOf(" ")>0) &&(CMath.isNumber(tattoo.substring(0,tattoo.indexOf(" ")).trim()))) tattoo=tattoo.substring(tattoo.indexOf(" ")+1).trim(); if(themob.playerStats()!=null) { if(themob.playerStats().getTitles().contains(tattoo)) { if(tattooMinus) themob.playerStats().getTitles().removeElement(tattooName); } else if(!tattooMinus) themob.playerStats().getTitles().insertElementAt(tattooName,0); } } break; } case 10: // mpkill { Environmental newTarget=getArgumentMOB(CMParms.getCleanBit(s,1),source,monster,target,primaryItem,secondaryItem,msg,tmp); if((newTarget!=null)&&(newTarget instanceof MOB)) monster.setVictim((MOB)newTarget); break; } case 51: // mpsetclandata { Environmental newTarget=getArgumentItem(CMParms.getCleanBit(s,1),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); String clanID=null; if((newTarget!=null)&&(newTarget instanceof MOB)) clanID=((MOB)newTarget).getClanID(); else clanID=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(s,1)); String clanvar=CMParms.getCleanBit(s,2); String clanval=CMParms.getPastBitClean(s,2); Clan C=CMLib.clans().getClan(clanID); if(C!=null) { int whichVar=-1; for(int i=0;i<clanVars.length;i++) if(clanvar.equalsIgnoreCase(clanVars[i])) { whichVar=i; break;} boolean nosave=false; switch(whichVar) { case 0: C.setAcceptanceSettings(clanval); break; case 1: nosave=true; break; // detail case 2: C.setDonation(clanval); break; case 3: C.setExp(CMath.s_long(clanval.trim())); break; case 4: C.setGovernment(CMath.s_int(clanval.trim())); break; case 5: C.setMorgue(clanval); break; case 6: C.setPolitics(clanval); break; case 7: C.setPremise(clanval); break; case 8: C.setRecall(clanval); break; case 9: nosave=true; break; // size case 10: C.setStatus(CMath.s_int(clanval.trim())); break; case 11: C.setTaxes(CMath.s_double(clanval.trim())); break; case 12: C.setTrophies(CMath.s_int(clanval.trim())); break; case 13: nosave=true; break; // type case 14: nosave=true; break; // areas case 15: nosave=true; break; // memberlist case 16: nosave=true; break; // topmember default: scriptableError(scripted,"MPSETCLANDATA","RunTime",clanvar+" is not a valid clan variable."); nosave=true; break; } if(!nosave) C.update(); } break; } case 52: // mpplayerclass { Environmental newTarget=getArgumentItem(CMParms.getCleanBit(s,1),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if((newTarget!=null)&&(newTarget instanceof MOB)) { Vector V=CMParms.parse(CMParms.getPastBit(s,1)); for(int i=0;i<V.size();i++) { if(CMath.isInteger(((String)V.elementAt(i)).trim())) ((MOB)newTarget).baseCharStats().setClassLevel(((MOB)newTarget).baseCharStats().getCurrentClass(),CMath.s_int(((String)V.elementAt(i)).trim())); else { CharClass C=CMClass.findCharClass((String)V.elementAt(i)); if(C!=null) ((MOB)newTarget).baseCharStats().setCurrentClass(C); } } ((MOB)newTarget).recoverCharStats(); } break; } case 12: // mppurge { if(lastKnownLocation!=null) { String s2=CMParms.getPastBitClean(s,0).trim(); Environmental E=null; if(s2.equalsIgnoreCase("self")||s2.equalsIgnoreCase("me")) E=scripted; else E=getArgumentItem(s2,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E!=null) { if(E instanceof MOB) { if(!((MOB)E).isMonster()) { if(((MOB)E).getStartRoom()!=null) ((MOB)E).getStartRoom().bringMobHere((MOB)E,false); ((MOB)E).session().setKillFlag(true); } else if(((MOB)E).getStartRoom()!=null) ((MOB)E).killMeDead(false); else ((MOB)E).destroy(); } else if(E instanceof Item) { Environmental oE=((Item)E).owner(); ((Item)E).destroy(); if(oE!=null) oE.recoverEnvStats(); } } lastKnownLocation.recoverRoomStats(); } break; } case 14: // mpgoto { s=s.substring(6).trim(); if((s.length()>0)&&(lastKnownLocation!=null)) { Room goHere=null; if(s.startsWith("$")) goHere=CMLib.map().roomLocation(this.getArgumentItem(s,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp)); if(goHere==null) goHere=getRoom(varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,s),lastKnownLocation); if(goHere!=null) { if(scripted instanceof MOB) goHere.bringMobHere((MOB)scripted,true); else if(scripted instanceof Item) goHere.bringItemHere((Item)scripted,Item.REFUSE_PLAYER_DROP,true); else { goHere.bringMobHere(monster,true); if(!(scripted instanceof MOB)) goHere.delInhabitant(monster); } if(CMLib.map().roomLocation(scripted)==goHere) lastKnownLocation=goHere; } } break; } case 15: // mpat if(lastKnownLocation!=null) { Room lastPlace=lastKnownLocation; String roomName=CMParms.getCleanBit(s,1); if(roomName.length()>0) { s=CMParms.getPastBit(s,1).trim(); Room goHere=null; if(roomName.startsWith("$")) goHere=CMLib.map().roomLocation(this.getArgumentItem(roomName,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp)); if(goHere==null) goHere=getRoom(varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,roomName),lastKnownLocation); if(goHere!=null) { goHere.bringMobHere(monster,true); Vector V=new Vector(); V.addElement(""); V.addElement(s.trim()); lastKnownLocation=goHere; execute(scripted,source,target,monster,primaryItem,secondaryItem,V,msg,tmp); lastKnownLocation=lastPlace; lastPlace.bringMobHere(monster,true); if(!(scripted instanceof MOB)) { goHere.delInhabitant(monster); lastPlace.delInhabitant(monster); } } } break; } case 17: // mptransfer { String mobName=CMParms.getCleanBit(s,1); String roomName=""; Room newRoom=null; if(CMParms.numBits(s)>2) { roomName=CMParms.getPastBit(s,1); if(roomName.startsWith("$")) newRoom=CMLib.map().roomLocation(this.getArgumentItem(roomName,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp)); } if((roomName.length()==0)&&(lastKnownLocation!=null)) roomName=lastKnownLocation.roomID(); if(roomName.length()>0) { if(newRoom==null) newRoom=getRoom(varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,roomName),lastKnownLocation); if(newRoom!=null) { Vector V=new Vector(); if(mobName.startsWith("$")) { Environmental E=getArgumentItem(mobName,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E!=null) V.addElement(E); } if(V.size()==0) { mobName=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,mobName); if(mobName.equalsIgnoreCase("all")) { if(lastKnownLocation!=null) { for(int x=0;x<lastKnownLocation.numInhabitants();x++) { MOB m=lastKnownLocation.fetchInhabitant(x); if((m!=null)&&(m!=monster)&&(!V.contains(m))) V.addElement(m); } } } else { MOB findOne=null; Area A=null; if(lastKnownLocation!=null) { findOne=lastKnownLocation.fetchInhabitant(mobName); A=lastKnownLocation.getArea(); if((findOne!=null)&&(findOne!=monster)) V.addElement(findOne); } if(findOne==null) { findOne=CMLib.map().getPlayer(mobName); if((findOne!=null)&&(!CMLib.flags().isInTheGame(findOne,true))) findOne=null; if((findOne!=null)&&(findOne!=monster)) V.addElement(findOne); } if((findOne==null)&&(A!=null)) for(Enumeration r=A.getProperMap();r.hasMoreElements();) { Room R=(Room)r.nextElement(); findOne=R.fetchInhabitant(mobName); if((findOne!=null)&&(findOne!=monster)) V.addElement(findOne); } } } for(int v=0;v<V.size();v++) { if(V.elementAt(v) instanceof MOB) { MOB mob=(MOB)V.elementAt(v); HashSet H=mob.getGroupMembers(new HashSet()); for(Iterator e=H.iterator();e.hasNext();) { MOB M=(MOB)e.next(); if((!V.contains(M))&&(M.location()==mob.location())) V.addElement(M); } } } for(int v=0;v<V.size();v++) { if(V.elementAt(v) instanceof MOB) { MOB follower=(MOB)V.elementAt(v); Room thisRoom=follower.location(); CMMsg enterMsg=CMClass.getMsg(follower,newRoom,null,CMMsg.MSG_ENTER,null,CMMsg.MSG_ENTER,null,CMMsg.MSG_ENTER,"<S-NAME> appears in a puff of smoke."+CMProps.msp("appear.wav",10)); CMMsg leaveMsg=CMClass.getMsg(follower,thisRoom,null,CMMsg.MSG_LEAVE,"<S-NAME> disappear(s) in a puff of smoke."); if(thisRoom.okMessage(follower,leaveMsg)&&newRoom.okMessage(follower,enterMsg)) { if(follower.isInCombat()) { CMLib.commands().postFlee(follower,("NOWHERE")); follower.makePeace(); } thisRoom.send(follower,leaveMsg); newRoom.bringMobHere(follower,false); newRoom.send(follower,enterMsg); follower.tell("\n\r\n\r"); CMLib.commands().postLook(follower,true); } } else if((V.elementAt(v) instanceof Item) &&(newRoom!=CMLib.map().roomLocation((Environmental)V.elementAt(v)))) newRoom.bringItemHere((Item)V.elementAt(v),Item.REFUSE_PLAYER_DROP,true); if(V.elementAt(v)==scripted) lastKnownLocation=newRoom; } } } break; } case 25: // mpbeacon { String roomName=CMParms.getCleanBit(s,1); Room newRoom=null; if((roomName.length()>0)&&(lastKnownLocation!=null)) { s=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBit(s,1)); if(roomName.startsWith("$")) newRoom=CMLib.map().roomLocation(this.getArgumentItem(roomName,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp)); if(newRoom==null) newRoom=getRoom(varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,roomName),lastKnownLocation); if((newRoom!=null)&&(lastKnownLocation!=null)) { Vector V=new Vector(); if(s.equalsIgnoreCase("all")) { for(int x=0;x<lastKnownLocation.numInhabitants();x++) { MOB m=lastKnownLocation.fetchInhabitant(x); if((m!=null)&&(m!=monster)&&(!m.isMonster())&&(!V.contains(m))) V.addElement(m); } } else { MOB findOne=lastKnownLocation.fetchInhabitant(s); if((findOne!=null)&&(findOne!=monster)&&(!findOne.isMonster())) V.addElement(findOne); } for(int v=0;v<V.size();v++) { MOB follower=(MOB)V.elementAt(v); if(!follower.isMonster()) follower.setStartRoom(newRoom); } } } break; } case 18: // mpforce { Environmental newTarget=getArgumentMOB(CMParms.getCleanBit(s,1),source,monster,target,primaryItem,secondaryItem,msg,tmp); s=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBit(s,1)); if((newTarget!=null)&&(newTarget instanceof MOB)) { Vector V=CMParms.parse(s); ((MOB)newTarget).doCommand(V); } } case 20: // mpsetvar { String which=CMParms.getCleanBit(s,1); Environmental E=getArgumentItem(which,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(s,2)); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBit(s,2)); if(!which.equals("*")) { if(E==null) which=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,which); else if(E instanceof Room) which=CMLib.map().getExtendedRoomID((Room)E); else which=E.Name(); } if((which.length()>0)&&(arg2.length()>0)) mpsetvar(which,arg2,arg3); break; } case 36: // mpsavevar { String which=CMParms.getCleanBit(s,1); String arg2=CMParms.getCleanBit(s,2).toUpperCase(); Environmental E=getArgumentItem(which,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); which=getVarHost(E,which,source,target,monster,primaryItem,secondaryItem,msg,tmp); if((which.length()>0)&&(arg2.length()>0)) { DVector V=getScriptVarSet(which,arg2); for(int v=0;v<V.size();v++) { which=(String)V.elementAt(0,1); arg2=((String)V.elementAt(0,2)).toUpperCase(); Hashtable H=(Hashtable)Resources.getResource("SCRIPTVAR-"+which); String val=""; if(H!=null) { val=(String)H.get(arg2); if(val==null) val=""; } if(val.length()>0) CMLib.database().DBReCreateData(which,"SCRIPTABLEVARS",arg2,val); else CMLib.database().DBDeleteData(which,"SCRIPTABLEVARS",arg2); } } break; } case 39: // mploadvar { String which=CMParms.getCleanBit(s,1); String arg2=CMParms.getCleanBit(s,2).toUpperCase(); Environmental E=getArgumentItem(which,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(arg2.length()>0) { Vector V=null; which=getVarHost(E,which,source,target,monster,primaryItem,secondaryItem,msg,tmp); if(arg2.equals("*")) V=CMLib.database().DBReadData(which,"SCRIPTABLEVARS"); else V=CMLib.database().DBReadData(which,"SCRIPTABLEVARS",arg2); if((V!=null)&&(V.size()>0)) { V=(Vector)V.firstElement(); if(V.size()>3) mpsetvar(which,arg2,(String)V.elementAt(3)); } } break; } case 40: // MPM2I2M { String arg1=CMParms.getCleanBit(s,1); Environmental E=getArgumentItem(arg1,source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); if(E instanceof MOB) { String arg2=""; String arg3=""; if(CMParms.numBits(s)>2) { arg2=CMParms.getCleanBit(s,2); if(CMParms.numBits(s)>3) arg3=CMParms.getPastBit(s,2); } CagedAnimal caged=(CagedAnimal)CMClass.getItem("GenCaged"); if(caged!=null) { ((Item)caged).baseEnvStats().setAbility(1); ((Item)caged).recoverEnvStats(); } if((caged!=null)&&caged.cageMe((MOB)E)&&(lastKnownLocation!=null)) { if(arg2.length()>0) ((Item)caged).setName(arg2); if(arg3.length()>0) ((Item)caged).setDisplayText(arg3); lastKnownLocation.addItemRefuse((Item)caged,Item.REFUSE_PLAYER_DROP); ((MOB)E).killMeDead(false); } } else if(E instanceof CagedAnimal) { MOB M=((CagedAnimal)E).unCageMe(); if((M!=null)&&(lastKnownLocation!=null)) { M.bringToLife(lastKnownLocation,true); ((Item)E).destroy(); } } else scriptableError(scripted,"MPM2I2M","RunTime",arg1+" is not a mob or a caged item."); break; } case 28: // mpdamage { Environmental newTarget=getArgumentItem(CMParms.getCleanBit(s,1),source,monster,scripted,target,primaryItem,secondaryItem,msg,tmp); String arg2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(s,2)); String arg3=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(s,3)); String arg4=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(s,3)); if((newTarget!=null)&&(arg2.length()>0)) { if(newTarget instanceof MOB) { MOB E=(MOB)newTarget; int min=CMath.s_int(arg2.trim()); int max=CMath.s_int(arg3.trim()); if(max<min) max=min; if(min>0) { int dmg=(max==min)?min:CMLib.dice().roll(1,max-min,min); if((dmg>=E.curState().getHitPoints())&&(!arg4.equalsIgnoreCase("kill"))) dmg=E.curState().getHitPoints()-1; if(dmg>0) CMLib.combat().postDamage(E,E,null,dmg,CMMsg.MASK_ALWAYS|CMMsg.TYP_CAST_SPELL,-1,null); } } else if(newTarget instanceof Item) { Item E=(Item)newTarget; int min=CMath.s_int(arg2.trim()); int max=CMath.s_int(arg3.trim()); if(max<min) max=min; if(min>0) { int dmg=(max==min)?min:CMLib.dice().roll(1,max-min,min); boolean destroy=false; if(E.subjectToWearAndTear()) { if((dmg>=E.usesRemaining())&&(!arg4.equalsIgnoreCase("kill"))) dmg=E.usesRemaining()-1; if(dmg>0) E.setUsesRemaining(E.usesRemaining()-dmg); if(E.usesRemaining()<=0) destroy=true; } else if(arg4.equalsIgnoreCase("kill")) destroy=true; if(destroy) { if(lastKnownLocation!=null) lastKnownLocation.showHappens(CMMsg.MSG_OK_VISUAL,E.name()+" is destroyed!"); E.destroy(); } } } } break; } case 29: // mptrackto { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBit(s,0)); Ability A=CMClass.getAbility("Skill_Track"); if(A!=null) { altStatusTickable=A; A.invoke(monster,CMParms.parse(arg1),null,true,0); altStatusTickable=null; } break; } case 53: // mpwalkto { String arg1=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(s,0)); Ability A=CMClass.getAbility("Skill_Track"); if(A!=null) { altStatusTickable=A; A.invoke(monster,CMParms.parse(arg1+" LANDONLY"),null,true,0); altStatusTickable=null; } break; } case 21: //MPENDQUEST { s=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(s,0).trim()); Quest Q=getQuest(s); if(Q!=null) Q.stopQuest(); else scriptableError(scripted,"MPENDQUEST","Unknown","Quest: "+s); break; } case 69: // MPSTEPQUEST { s=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(s,0).trim()); Quest Q=getQuest(s); if(Q!=null) Q.stepQuest(); else scriptableError(scripted,"MPSTEPQUEST","Unknown","Quest: "+s); break; } case 23: //MPSTARTQUEST { s=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(s,0).trim()); Quest Q=getQuest(s); if(Q!=null) Q.startQuest(); else scriptableError(scripted,"MPSTARTQUEST","Unknown","Quest: "+s); break; } case 64: //MPLOADQUESTOBJ { String questName=CMParms.getCleanBit(s,1).trim(); questName=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,questName); Quest Q=getQuest(questName); if(Q==null) { scriptableError(scripted,"MPLOADQUESTOBJ","Unknown","Quest: "+questName); break; } Object O=Q.getQuestObject(varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(s,2))); if(O==null) { scriptableError(scripted,"MPLOADQUESTOBJ","Unknown","Unknown var "+CMParms.getCleanBit(s,2)+" for Quest: "+questName); break; } String varArg=CMParms.getPastBit(s,2); if((varArg.length()!=2)||(!varArg.startsWith("$"))) { scriptableError(scripted,"MPLOADQUESTOBJ","Syntax","Invalid argument var: "+varArg+" for "+scripted.Name()); break; } char c=varArg.charAt(1); if(Character.isDigit(c)) tmp[CMath.s_int(Character.toString(c))]=O; else switch(c) { case 'N': case 'n': if(O instanceof MOB) source=(MOB)O; break; case 'I': case 'i': if(O instanceof Environmental) scripted=(Environmental)O; if(O instanceof MOB) monster=(MOB)O; break; case 'T': case 't': if(O instanceof Environmental) target=(Environmental)O; break; case 'O': case 'o': if(O instanceof Item) primaryItem=(Item)O; break; case 'P': case 'p': if(O instanceof Item) secondaryItem=(Item)O; break; case 'd': case 'D': if(O instanceof Room) lastKnownLocation=(Room)O; break; default: scriptableError(scripted,"MPLOADQUESTOBJ","Syntax","Invalid argument var: "+varArg+" for "+scripted.Name()); break; } break; } case 22: //MPQUESTWIN { String whoName=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(s,1)); MOB M=null; if(lastKnownLocation!=null) M=lastKnownLocation.fetchInhabitant(whoName); if(M==null) M=CMLib.map().getPlayer(whoName); if(M!=null) whoName=M.Name(); if(whoName.length()>0) { s=CMParms.getPastBitClean(s,1); Quest Q=getQuest(s); if(Q!=null) Q.declareWinner(whoName); else scriptableError(scripted,"MYQUESTWIN","Unknown","Quest: "+s); } break; } case 24: // MPCALLFUNC { String named=CMParms.getCleanBit(s,1); String parms=CMParms.getPastBit(s,1).trim(); boolean found=false; Vector scripts=getScripts(); for(int v=0;v<scripts.size();v++) { Vector script2=(Vector)scripts.elementAt(v); if(script2.size()<1) continue; String trigger=((String)script2.elementAt(0)).toUpperCase().trim(); if(getTriggerCode(trigger)==17) { String fnamed=CMParms.getCleanBit(trigger,1); if(fnamed.equalsIgnoreCase(named)) { found=true; execute(scripted, source, target, monster, primaryItem, secondaryItem, script2, varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,parms), tmp); break; } } } if(!found) scriptableError(scripted,"MPCALLFUNC","Unknown","Function: "+named); break; } case 27: // MPWHILE { String conditionStr=(s.substring(2).trim()); int x=conditionStr.indexOf("("); if(x<0) { scriptableError(scripted,"MPWHILE","Unknown","Condition: "+s); break; } conditionStr=conditionStr.substring(x+1); x=-1; int depth=0; for(int i=0;i<conditionStr.length();i++) if(conditionStr.charAt(i)=='(') depth++; else if((conditionStr.charAt(i)==')')&&((--depth)<0)) { x=i; break; } if(x<0) { scriptableError(scripted,"MPWHILE","Syntax"," no closing ')': "+s); break; } String cmd2=conditionStr.substring(x+1).trim(); conditionStr=conditionStr.substring(0,x); Vector vscript=new Vector(); vscript.addElement("FUNCTION_PROG MPWHILE_"+Math.random()); vscript.addElement(cmd2); long time=System.currentTimeMillis(); while((eval(scripted,source,target,monster,primaryItem,secondaryItem,msg,tmp,conditionStr))&&((System.currentTimeMillis()-time)<4000)) execute(scripted,source,target,monster,primaryItem,secondaryItem,vscript,msg,tmp); if((System.currentTimeMillis()-time)>=4000) { scriptableError(scripted,"MPWHILE","RunTime","4 second limit exceeded: "+conditionStr); break; } break; } case 26: // MPALARM { String time=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(s,1)); String parms=CMParms.getPastBit(s,1).trim(); if(CMath.s_int(time.trim())<=0) { scriptableError(scripted,"MPALARM","Syntax","Bad time "+time); break; } if(parms.length()==0) { scriptableError(scripted,"MPALARM","Syntax","No command!"); break; } Vector vscript=new Vector(); vscript.addElement("FUNCTION_PROG ALARM_"+time+Math.random()); vscript.addElement(parms); que.insertElementAt(new ScriptableResponse(scripted,source,target,monster,primaryItem,secondaryItem,vscript,CMath.s_int(time.trim()),msg),0); break; } case 37: // mpenable { Environmental newTarget=getArgumentMOB(CMParms.getCleanBit(s,1),source,monster,target,primaryItem,secondaryItem,msg,tmp); String cast=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(s,2)); String p2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getCleanBit(s,3)); String m2=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBit(s,3)); Ability A=null; if(cast!=null) { if(newTarget instanceof MOB) A=((MOB)newTarget).fetchAbility(cast); if(A==null) A=CMClass.getAbility(cast); if(A==null) { ExpertiseLibrary.ExpertiseDefinition D=CMLib.expertises().findDefinition(cast,false); if(D==null) scriptableError(scripted,"MPENABLE","Syntax","Unknown skill/expertise: "+cast); else if((newTarget!=null)&&(newTarget instanceof MOB)) ((MOB)newTarget).addExpertise(D.ID); } } if((newTarget!=null) &&(A!=null) &&(newTarget instanceof MOB)) { if(!((MOB)newTarget).isMonster()) Log.sysOut("Scriptable",newTarget.Name()+" was MPENABLED with "+A.Name()); if(p2.trim().startsWith("++")) p2=""+(CMath.s_int(p2.trim().substring(2))+A.proficiency()); else if(p2.trim().startsWith("--")) p2=""+(A.proficiency()-CMath.s_int(p2.trim().substring(2))); A.setProficiency(CMath.s_int(p2.trim())); A.setMiscText(m2); if(((MOB)newTarget).fetchAbility(A.ID())==null) ((MOB)newTarget).addAbility(A); } break; } case 38: // mpdisable { Environmental newTarget=getArgumentMOB(CMParms.getCleanBit(s,1),source,monster,target,primaryItem,secondaryItem,msg,tmp); String cast=varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,CMParms.getPastBitClean(s,1)); if((newTarget!=null)&&(newTarget instanceof MOB)) { Ability A=((MOB)newTarget).findAbility(cast); if(A!=null)((MOB)newTarget).delAbility(A); if((!((MOB)newTarget).isMonster())&&(A!=null)) Log.sysOut("Scriptable",newTarget.Name()+" was MPDISABLED with "+A.Name()); ExpertiseLibrary.ExpertiseDefinition D=CMLib.expertises().findDefinition(cast,false); if((newTarget!=null)&&(newTarget instanceof MOB)&&(D!=null)) ((MOB)newTarget).delExpertise(D.ID); } break; } default: if(cmd.length()>0) { Vector V=CMParms.parse(varify(source,target,monster,primaryItem,secondaryItem,msg,tmp,s)); if(V.size()>0) monster.doCommand(V); } break; } } tickStatus=Tickable.STATUS_END; return null; } protected static final Vector empty=new Vector(); protected Vector getScripts() { if(CMSecurity.isDisabled("SCRIPTABLE")) return empty; Vector scripts=null; if(getParms().length()>100) scripts=(Vector)Resources.getResource("PARSEDPRG: "+getParms().substring(0,100)+getParms().length()+getParms().hashCode()); else scripts=(Vector)Resources.getResource("PARSEDPRG: "+getParms()); if(scripts==null) { String script=getParms(); script=CMStrings.replaceAll(script,"`","'"); scripts=parseScripts(script); if(getParms().length()>100) Resources.submitResource("PARSEDPRG: "+getParms().substring(0,100)+getParms().length()+getParms().hashCode(),scripts); else Resources.submitResource("PARSEDPRG: "+getParms(),scripts); } return scripts; } public boolean match(String str, String patt) { if(patt.trim().equalsIgnoreCase("ALL")) return true; if(patt.length()==0) return true; if(str.length()==0) return false; if(str.equalsIgnoreCase(patt)) return true; return false; } private Item makeCheapItem(Environmental E) { Item product=null; if(E instanceof Item) product=(Item)E; else { product=CMClass.getItem("StdItem"); product.setName(E.Name()); product.setDisplayText(E.displayText()); product.setDescription(E.description()); product.setBaseEnvStats((EnvStats)E.baseEnvStats().copyOf()); product.recoverEnvStats(); } return product; } public boolean okMessage(Environmental affecting, CMMsg msg) { if(!super.okMessage(affecting,msg)) return false; if((affecting==null)||(msg.source()==null)) return true; Vector scripts=getScripts(); Vector script=null; boolean tryIt=false; String trigger=null; int triggerCode=0; String str=null; for(int v=0;v<scripts.size();v++) { tryIt=false; script=(Vector)scripts.elementAt(v); if(script.size()<1) continue; trigger=((String)script.elementAt(0)).toUpperCase().trim(); triggerCode=getTriggerCode(trigger); switch(triggerCode) { case 42: // cnclmsg_prog if(canTrigger(42)) { trigger=trigger.substring(12).trim(); String command=CMParms.getCleanBit(trigger,0).toUpperCase().trim(); if(msg.isSource(command)||msg.isTarget(command)||msg.isOthers(command)) { trigger=CMParms.getPastBit(trigger.trim(),0).trim().toUpperCase(); str=""; if((msg.source().session()!=null)&&(msg.source().session().previousCMD()!=null)) str=" "+CMParms.combine(msg.source().session().previousCMD(),0).toUpperCase()+" "; if(CMParms.getCleanBit(trigger,0).equalsIgnoreCase("p")) { trigger=trigger.substring(1).trim(); if(match(str.trim(),trigger)) tryIt=true; } else if((trigger.length()==0)||(trigger.equalsIgnoreCase("all"))) tryIt=true; else { int num=CMParms.numBits(trigger); for(int i=0;i<num;i++) { String t=CMParms.getCleanBit(trigger,i).trim(); if(str.indexOf(" "+t+" ")>=0) { str=(t.trim()+" "+str.trim()).trim(); tryIt=true; break; } } } } } break; } if(tryIt) { MOB monster=getScriptableMOB(affecting); if(lastKnownLocation==null) lastKnownLocation=msg.source().location(); if((monster==null)||(monster.amDead())||(lastKnownLocation==null)) return true; Item defaultItem=(affecting instanceof Item)?(Item)affecting:null; Item Tool=null; if(msg.tool() instanceof Item) Tool=(Item)msg.tool(); if(Tool==null) Tool=defaultItem; String resp=null; if(msg.target() instanceof MOB) resp=execute(affecting,msg.source(),msg.target(),monster,Tool,defaultItem,script,str,new Object[10]); else if(msg.target() instanceof Item) resp=execute(affecting,msg.source(),msg.target(),monster,Tool,(Item)msg.target(),script,str,new Object[10]); else resp=execute(affecting,msg.source(),msg.target(),monster,Tool,defaultItem,script,str,new Object[10]); if((resp!=null)&&(resp.equalsIgnoreCase("CANCEL"))) return false; } } return true; } public void executeMsg(Environmental affecting, CMMsg msg) { super.executeMsg(affecting,msg); if((affecting==null)||(msg.source()==null)) return; MOB monster=getScriptableMOB(affecting); if(lastKnownLocation==null) lastKnownLocation=msg.source().location(); if((monster==null)||(monster.amDead())||(lastKnownLocation==null)) return; Item defaultItem=(affecting instanceof Item)?(Item)affecting:null; MOB eventMob=monster; if((defaultItem!=null)&&(defaultItem.owner() instanceof MOB)) eventMob=(MOB)defaultItem.owner(); Vector scripts=getScripts(); if(msg.amITarget(eventMob) &&(!msg.amISource(monster)) &&(msg.targetMinor()==CMMsg.TYP_DAMAGE) &&(msg.source()!=monster)) lastToHurtMe=msg.source(); Vector script=null; for(int v=0;v<scripts.size();v++) { script=(Vector)scripts.elementAt(v); if(script.size()<1) continue; String trigger=((String)script.elementAt(0)).toUpperCase().trim(); int triggerCode=getTriggerCode(trigger); int targetMinorTrigger=-1; switch(triggerCode) { case 1: // greet_prog if((msg.targetMinor()==CMMsg.TYP_ENTER) &&(msg.amITarget(lastKnownLocation)) &&(!msg.amISource(eventMob)) &&(canFreelyBehaveNormal(monster)||(!(affecting instanceof MOB))) &&canTrigger(1) &&((!(affecting instanceof MOB))||CMLib.flags().canSenseMoving(msg.source(),(MOB)affecting))) { int prcnt=CMath.s_int(CMParms.getCleanBit(trigger,1).trim()); if(CMLib.dice().rollPercentage()<prcnt) { que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,defaultItem,null,script,1,null)); return; } } break; case 2: // all_greet_prog if((msg.targetMinor()==CMMsg.TYP_ENTER)&&canTrigger(2) &&(msg.amITarget(lastKnownLocation)) &&(!msg.amISource(eventMob)) &&(canActAtAll(monster))) { int prcnt=CMath.s_int(CMParms.getCleanBit(trigger,1).trim()); if(CMLib.dice().rollPercentage()<prcnt) { que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,defaultItem,null,script,1,null)); return; } } break; case 3: // speech_prog if(((msg.sourceMinor()==CMMsg.TYP_SPEAK)||(msg.targetMinor()==CMMsg.TYP_SPEAK))&&canTrigger(3) &&(!msg.amISource(monster)) &&(((msg.othersMessage()!=null)&&((msg.tool()==null)||(!(msg.tool() instanceof Ability))||((((Ability)msg.tool()).classificationCode()&Ability.ALL_ACODES)!=Ability.ACODE_LANGUAGE))) ||((msg.target()==monster)&&(msg.targetMessage()!=null)&&(msg.tool()==null))) &&(canFreelyBehaveNormal(monster)||(!(affecting instanceof MOB)))) { String str=null; if(msg.othersMessage()!=null) str=CMStrings.replaceAll(CMStrings.getSayFromMessage(msg.othersMessage().toUpperCase()),"`","'"); else str=CMStrings.replaceAll(CMStrings.getSayFromMessage(msg.targetMessage().toUpperCase()),"`","'"); str=(" "+str+" ").toUpperCase(); str=CMStrings.removeColors(str); str=CMStrings.replaceAll(str,"\n\r"," "); trigger=trigger.substring(11).trim(); if((trigger.length()==0)||(trigger.equalsIgnoreCase("all"))) { que.addElement(new ScriptableResponse(affecting,msg.source(),msg.target(),monster,defaultItem,null,script,1,str)); return; } else if(CMParms.getCleanBit(trigger,0).equalsIgnoreCase("p")) { trigger=trigger.substring(1).trim(); if(match(str.trim(),trigger)) { que.addElement(new ScriptableResponse(affecting,msg.source(),msg.target(),monster,defaultItem,null,script,1,str)); return; } } else { int num=CMParms.numBits(trigger); for(int i=0;i<num;i++) { String t=CMParms.getCleanBit(trigger,i); int x=str.indexOf(" "+t+" "); if(x>=0) { que.addElement(new ScriptableResponse(affecting,msg.source(),msg.target(),monster,defaultItem,null,script,1,str.substring(x).trim())); return; } } } } break; case 4: // give_prog if((msg.targetMinor()==CMMsg.TYP_GIVE) &&canTrigger(4) &&((msg.amITarget(monster)) ||(msg.tool()==affecting) ||(affecting instanceof Room) ||(affecting instanceof Area)) &&(!msg.amISource(monster)) &&(msg.tool() instanceof Item) &&(canFreelyBehaveNormal(monster)||(!(affecting instanceof MOB)))) { trigger=trigger.substring(9).trim(); if(CMParms.getCleanBit(trigger,0).equalsIgnoreCase("p")) { trigger=trigger.substring(1).trim().toUpperCase(); if((trigger.equalsIgnoreCase(msg.tool().Name())) ||(msg.tool().ID().equalsIgnoreCase(trigger)) ||(trigger.equalsIgnoreCase("ALL"))) { que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,(Item)msg.tool(),defaultItem,script,1,null)); return; } } else { int num=CMParms.numBits(trigger); for(int i=0;i<num;i++) { String t=CMParms.getCleanBit(trigger,i).toUpperCase(); if(((" "+msg.tool().Name().toUpperCase()+" ").indexOf(" "+t+" ")>=0) ||(msg.tool().ID().equalsIgnoreCase(t)) ||(t.equalsIgnoreCase("ALL"))) { que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,(Item)msg.tool(),defaultItem,script,1,null)); return; } } } } break; case 40: // llook_prog if((msg.targetMinor()==CMMsg.TYP_EXAMINE)&&canTrigger(40) &&((msg.amITarget(affecting))||(affecting instanceof Area)) &&(!msg.amISource(monster)) &&(canFreelyBehaveNormal(monster)||(!(affecting instanceof MOB)))) { trigger=trigger.substring(10).trim(); if(CMParms.getCleanBit(trigger,0).equalsIgnoreCase("p")) { trigger=trigger.substring(1).trim().toUpperCase(); if(((" "+trigger+" ").indexOf(msg.target().Name().toUpperCase())>=0) ||(msg.target().ID().equalsIgnoreCase(trigger)) ||(trigger.equalsIgnoreCase("ALL"))) { que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,(Item)msg.target(),defaultItem,script,1,null)); return; } } else { int num=CMParms.numBits(trigger); for(int i=0;i<num;i++) { String t=CMParms.getCleanBit(trigger,i).toUpperCase(); if(((" "+msg.target().Name().toUpperCase()+" ").indexOf(" "+t+" ")>=0) ||(msg.target().ID().equalsIgnoreCase(t)) ||(t.equalsIgnoreCase("ALL"))) { que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,(Item)msg.target(),defaultItem,script,1,null)); return; } } } } break; case 41: // execmsg_prog if(canTrigger(41)) { trigger=trigger.substring(12).trim(); String command=CMParms.getCleanBit(trigger,0).toUpperCase().trim(); if(msg.isSource(command)||msg.isTarget(command)||msg.isOthers(command)) { trigger=CMParms.getPastBit(trigger.trim(),0).trim().toUpperCase(); String str=""; if((msg.source().session()!=null)&&(msg.source().session().previousCMD()!=null)) str=" "+CMParms.combine(msg.source().session().previousCMD(),0).toUpperCase()+" "; boolean doIt=false; if(CMParms.getCleanBit(trigger,0).equalsIgnoreCase("p")) { trigger=trigger.substring(1).trim(); if(match(str.trim(),trigger)) doIt=true; } else if(trigger.trim().equalsIgnoreCase("ALL")||(trigger.trim().length()==0)) doIt=true; else { int num=CMParms.numBits(trigger); for(int i=0;i<num;i++) { String t=CMParms.getCleanBit(trigger,i).trim(); if(str.indexOf(" "+t+" ")>=0) { str=(t.trim()+" "+str.trim()).trim(); doIt=true; break; } } } if(doIt) { Item Tool=null; if(msg.tool() instanceof Item) Tool=(Item)msg.tool(); if(Tool==null) Tool=defaultItem; if(msg.target() instanceof MOB) que.addElement(new ScriptableResponse(affecting,msg.source(),msg.target(),monster,Tool,defaultItem,script,1,str)); else if(msg.target() instanceof Item) que.addElement(new ScriptableResponse(affecting,msg.source(),msg.target(),monster,Tool,(Item)msg.target(),script,1,str)); else que.addElement(new ScriptableResponse(affecting,msg.source(),msg.target(),monster,Tool,defaultItem,script,1,str)); return; } } } break; case 39: // look_prog if((msg.targetMinor()==CMMsg.TYP_LOOK)&&canTrigger(39) &&((msg.amITarget(affecting))||(affecting instanceof Area)) &&(!msg.amISource(monster)) &&(canFreelyBehaveNormal(monster)||(!(affecting instanceof MOB)))) { trigger=trigger.substring(9).trim(); if(CMParms.getCleanBit(trigger,0).equalsIgnoreCase("p")) { trigger=trigger.substring(1).trim().toUpperCase(); if(((" "+trigger+" ").indexOf(msg.target().Name().toUpperCase())>=0) ||(msg.target().ID().equalsIgnoreCase(trigger)) ||(trigger.equalsIgnoreCase("ALL"))) { que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,(Item)msg.target(),defaultItem,script,1,null)); return; } } else { int num=CMParms.numBits(trigger); for(int i=0;i<num;i++) { String t=CMParms.getCleanBit(trigger,i).toUpperCase(); if(((" "+msg.target().Name().toUpperCase()+" ").indexOf(" "+t+" ")>=0) ||(msg.target().ID().equalsIgnoreCase(t)) ||(t.equalsIgnoreCase("ALL"))) { que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,(Item)msg.target(),defaultItem,script,1,null)); return; } } } } break; case 20: // get_prog if((msg.targetMinor()==CMMsg.TYP_GET)&&canTrigger(20) &&((msg.amITarget(affecting))||(affecting instanceof Room)||(affecting instanceof Area)||(affecting instanceof MOB)) &&(!msg.amISource(monster)) &&(msg.target() instanceof Item) &&(canFreelyBehaveNormal(monster)||(!(affecting instanceof MOB)))) { trigger=trigger.substring(8).trim(); if(CMParms.getCleanBit(trigger,0).equalsIgnoreCase("p")) { trigger=trigger.substring(1).trim().toUpperCase(); if(((" "+trigger+" ").indexOf(msg.target().Name().toUpperCase())>=0) ||(msg.target().ID().equalsIgnoreCase(trigger)) ||(trigger.equalsIgnoreCase("ALL"))) { que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,(Item)msg.target(),defaultItem,script,1,null)); return; } } else { int num=CMParms.numBits(trigger); for(int i=0;i<num;i++) { String t=CMParms.getCleanBit(trigger,i).toUpperCase(); if(((" "+msg.target().Name().toUpperCase()+" ").indexOf(" "+t+" ")>=0) ||(msg.target().ID().equalsIgnoreCase(t)) ||(t.equalsIgnoreCase("ALL"))) { que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,(Item)msg.target(),defaultItem,script,1,null)); return; } } } } break; case 22: // drop_prog if((msg.targetMinor()==CMMsg.TYP_DROP)&&canTrigger(22) &&((msg.amITarget(affecting))||(affecting instanceof Room)||(affecting instanceof Area)||(affecting instanceof MOB)) &&(!msg.amISource(monster)) &&(msg.target() instanceof Item) &&(canFreelyBehaveNormal(monster)||(!(affecting instanceof MOB)))) { trigger=trigger.substring(9).trim(); if(CMParms.getCleanBit(trigger,0).equalsIgnoreCase("p")) { trigger=trigger.substring(1).trim().toUpperCase(); if(((" "+trigger+" ").indexOf(msg.target().Name().toUpperCase())>=0) ||(msg.target().ID().equalsIgnoreCase(trigger)) ||(trigger.equalsIgnoreCase("ALL"))) { if(msg.target() instanceof Coins) execute(affecting,msg.source(),monster,monster,(Item)msg.target(),(Item)((Item)msg.target()).copyOf(),script,null,new Object[10]); else que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,(Item)msg.target(),defaultItem,script,1,null)); return; } } else { int num=CMParms.numBits(trigger); for(int i=0;i<num;i++) { String t=CMParms.getCleanBit(trigger,i).toUpperCase(); if(((" "+msg.target().Name().toUpperCase()+" ").indexOf(" "+t+" ")>=0) ||(msg.target().ID().equalsIgnoreCase(t)) ||(t.equalsIgnoreCase("ALL"))) { if(msg.target() instanceof Coins) execute(affecting,msg.source(),monster,monster,(Item)msg.target(),(Item)((Item)msg.target()).copyOf(),script,null,new Object[10]); else que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,(Item)msg.target(),defaultItem,script,1,null)); return; } } } } break; case 24: // remove_prog if((msg.targetMinor()==CMMsg.TYP_REMOVE)&&canTrigger(24) &&((msg.amITarget(affecting))||(affecting instanceof Room)||(affecting instanceof Area)||(affecting instanceof MOB)) &&(!msg.amISource(monster)) &&(msg.target() instanceof Item) &&(canFreelyBehaveNormal(monster)||(!(affecting instanceof MOB)))) { trigger=trigger.substring(11).trim(); if(CMParms.getCleanBit(trigger,0).equalsIgnoreCase("p")) { trigger=trigger.substring(1).trim().toUpperCase(); if(((" "+trigger+" ").indexOf(msg.target().Name().toUpperCase())>=0) ||(msg.target().ID().equalsIgnoreCase(trigger)) ||(trigger.equalsIgnoreCase("ALL"))) { que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,(Item)msg.target(),defaultItem,script,1,null)); return; } } else { int num=CMParms.numBits(trigger); for(int i=0;i<num;i++) { String t=CMParms.getCleanBit(trigger,i).toUpperCase(); if(((" "+msg.target().Name().toUpperCase()+" ").indexOf(" "+t+" ")>=0) ||(msg.target().ID().equalsIgnoreCase(t)) ||(t.equalsIgnoreCase("ALL"))) { que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,(Item)msg.target(),defaultItem,script,1,null)); return; } } } } break; case 34: // open_prog if(targetMinorTrigger<0) targetMinorTrigger=CMMsg.TYP_OPEN; case 35: // close_prog if(targetMinorTrigger<0) targetMinorTrigger=CMMsg.TYP_CLOSE; case 36: // lock_prog if(targetMinorTrigger<0) targetMinorTrigger=CMMsg.TYP_LOCK; case 37: // unlock_prog { if(targetMinorTrigger<0) targetMinorTrigger=CMMsg.TYP_UNLOCK; if((msg.targetMinor()==targetMinorTrigger)&&canTrigger(triggerCode) &&((msg.amITarget(affecting))||(affecting instanceof Room)||(affecting instanceof Area)||(affecting instanceof MOB)) &&(!msg.amISource(monster)) &&(canFreelyBehaveNormal(monster)||(!(affecting instanceof MOB)))) { switch(triggerCode) { case 34: case 36: trigger=trigger.substring(9).trim(); break; case 35: trigger=trigger.substring(10).trim(); break; case 37: trigger=trigger.substring(11).trim(); break; } Item I=(msg.target() instanceof Item)?(Item)msg.target():defaultItem; if(CMParms.getCleanBit(trigger,0).equalsIgnoreCase("p")) { trigger=trigger.substring(1).trim().toUpperCase(); if(((" "+trigger+" ").indexOf(msg.target().Name().toUpperCase())>=0) ||(msg.target().ID().equalsIgnoreCase(trigger)) ||(trigger.equalsIgnoreCase("ALL"))) { que.addElement(new ScriptableResponse(affecting,msg.source(),msg.target(),monster,I,defaultItem,script,1,null)); return; } } else { int num=CMParms.numBits(trigger); for(int i=0;i<num;i++) { String t=CMParms.getCleanBit(trigger,i).toUpperCase(); if(((" "+msg.target().Name().toUpperCase()+" ").indexOf(" "+t+" ")>=0) ||(msg.target().ID().equalsIgnoreCase(t)) ||(t.equalsIgnoreCase("ALL"))) { que.addElement(new ScriptableResponse(affecting,msg.source(),msg.target(),monster,I,defaultItem,script,1,null)); return; } } } } break; } case 25: // consume_prog if(((msg.targetMinor()==CMMsg.TYP_EAT)||(msg.targetMinor()==CMMsg.TYP_DRINK)) &&((msg.amITarget(affecting))||(affecting instanceof Room)||(affecting instanceof Area)||(affecting instanceof MOB)) &&(!msg.amISource(monster))&&canTrigger(25) &&(msg.target() instanceof Item) &&(canFreelyBehaveNormal(monster)||(!(affecting instanceof MOB)))) { trigger=trigger.substring(12).trim(); if(CMParms.getCleanBit(trigger,0).equalsIgnoreCase("p")) { trigger=trigger.substring(1).trim().toUpperCase(); if(((" "+trigger+" ").indexOf(msg.target().Name().toUpperCase())>=0) ||(msg.target().ID().equalsIgnoreCase(trigger)) ||(trigger.equalsIgnoreCase("ALL"))) { que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,(Item)msg.target(),defaultItem,script,1,null)); return; } } else { int num=CMParms.numBits(trigger); for(int i=0;i<num;i++) { String t=CMParms.getCleanBit(trigger,i).toUpperCase(); if(((" "+msg.target().Name().toUpperCase()+" ").indexOf(" "+t+" ")>=0) ||(msg.target().ID().equalsIgnoreCase(t)) ||(t.equalsIgnoreCase("ALL"))) { que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,(Item)msg.target(),defaultItem,script,1,null)); return; } } } } break; case 21: // put_prog if((msg.targetMinor()==CMMsg.TYP_PUT)&&canTrigger(21) &&((msg.amITarget(affecting))||(affecting instanceof Room)||(affecting instanceof Area)||(affecting instanceof MOB)) &&(msg.tool() instanceof Item) &&(!msg.amISource(monster)) &&(msg.target() instanceof Item) &&(canFreelyBehaveNormal(monster)||(!(affecting instanceof MOB)))) { trigger=trigger.substring(8).trim(); if(CMParms.getCleanBit(trigger,0).equalsIgnoreCase("p")) { trigger=trigger.substring(1).trim().toUpperCase(); if(((" "+trigger+" ").indexOf(msg.tool().Name().toUpperCase())>=0) ||(msg.tool().ID().equalsIgnoreCase(trigger)) ||(trigger.equalsIgnoreCase("ALL"))) { if((msg.tool() instanceof Coins)&&(((Item)msg.target()).owner() instanceof Room)) execute(affecting,msg.source(),monster,monster,(Item)msg.target(),(Item)((Item)msg.target()).copyOf(),script,null,new Object[10]); else que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,(Item)msg.target(),(Item)msg.tool(),script,1,null)); return; } } else { int num=CMParms.numBits(trigger); for(int i=0;i<num;i++) { String t=CMParms.getCleanBit(trigger,i).toUpperCase(); if(((" "+msg.tool().Name().toUpperCase()+" ").indexOf(" "+t+" ")>=0) ||(msg.tool().ID().equalsIgnoreCase(t)) ||(t.equalsIgnoreCase("ALL"))) { if((msg.tool() instanceof Coins)&&(((Item)msg.target()).owner() instanceof Room)) execute(affecting,msg.source(),monster,monster,(Item)msg.target(),(Item)((Item)msg.target()).copyOf(),script,null,new Object[10]); else que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,(Item)msg.target(),(Item)msg.tool(),script,1,null)); return; } } } } break; case 27: // buy_prog if((msg.targetMinor()==CMMsg.TYP_BUY)&&canTrigger(27) &&((!(affecting instanceof ShopKeeper)) ||msg.amITarget(affecting)) &&(!msg.amISource(monster)) &&(canFreelyBehaveNormal(monster)||(!(affecting instanceof MOB)))) { trigger=trigger.substring(8).trim(); if(CMParms.getCleanBit(trigger,0).equalsIgnoreCase("p")) { trigger=trigger.substring(1).trim().toUpperCase(); if(((" "+trigger+" ").indexOf(msg.tool().Name().toUpperCase())>=0) ||(msg.tool().ID().equalsIgnoreCase(trigger)) ||(trigger.equalsIgnoreCase("ALL"))) { Item product=makeCheapItem(msg.tool()); if((product instanceof Coins) &&(product.owner() instanceof Room)) execute(affecting,msg.source(),monster,monster,product,(Item)product.copyOf(),script,null,new Object[10]); else que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,product,product,script,1,null)); return; } } else { int num=CMParms.numBits(trigger); for(int i=0;i<num;i++) { String t=CMParms.getCleanBit(trigger,i).toUpperCase(); if(((" "+msg.tool().Name().toUpperCase()+" ").indexOf(" "+t+" ")>=0) ||(msg.tool().ID().equalsIgnoreCase(t)) ||(t.equalsIgnoreCase("ALL"))) { Item product=makeCheapItem(msg.tool()); if((product instanceof Coins) &&(product.owner() instanceof Room)) execute(affecting,msg.source(),monster,monster,product,(Item)product.copyOf(),script,null,new Object[10]); else que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,product,product,script,1,null)); return; } } } } break; case 28: // sell_prog if((msg.targetMinor()==CMMsg.TYP_SELL)&&canTrigger(28) &&((msg.amITarget(affecting))||(!(affecting instanceof ShopKeeper))) &&(!msg.amISource(monster)) &&(canFreelyBehaveNormal(monster)||(!(affecting instanceof MOB)))) { trigger=trigger.substring(8).trim(); if(CMParms.getCleanBit(trigger,0).equalsIgnoreCase("p")) { trigger=trigger.substring(1).trim().toUpperCase(); if(((" "+trigger+" ").indexOf(msg.tool().Name().toUpperCase())>=0) ||(msg.tool().ID().equalsIgnoreCase(trigger)) ||(trigger.equalsIgnoreCase("ALL"))) { Item product=makeCheapItem(msg.tool()); if((product instanceof Coins) &&(product.owner() instanceof Room)) execute(affecting,msg.source(),monster,monster,product,(Item)product.copyOf(),script,null,new Object[10]); else que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,product,product,script,1,null)); return; } } else { int num=CMParms.numBits(trigger); for(int i=0;i<num;i++) { String t=CMParms.getCleanBit(trigger,i).toUpperCase(); if(((" "+msg.tool().Name().toUpperCase()+" ").indexOf(" "+t+" ")>=0) ||(msg.tool().ID().equalsIgnoreCase(t)) ||(t.equalsIgnoreCase("ALL"))) { Item product=makeCheapItem(msg.tool()); if((product instanceof Coins) &&(product.owner() instanceof Room)) execute(affecting,msg.source(),monster,monster,product,(Item)product.copyOf(),script,null,new Object[10]); else que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,product,product,script,1,null)); return; } } } } break; case 23: // wear_prog if(((msg.targetMinor()==CMMsg.TYP_WEAR) ||(msg.targetMinor()==CMMsg.TYP_HOLD) ||(msg.targetMinor()==CMMsg.TYP_WIELD)) &&((msg.amITarget(affecting))||(affecting instanceof Room)||(affecting instanceof Area)||(affecting instanceof MOB)) &&(!msg.amISource(monster))&&canTrigger(23) &&(msg.target() instanceof Item) &&(canFreelyBehaveNormal(monster)||(!(affecting instanceof MOB)))) { trigger=trigger.substring(9).trim(); if(CMParms.getCleanBit(trigger,0).equalsIgnoreCase("p")) { trigger=trigger.substring(1).trim().toUpperCase(); if(((" "+trigger+" ").indexOf(msg.target().Name().toUpperCase())>=0) ||(msg.target().ID().equalsIgnoreCase(trigger)) ||(trigger.equalsIgnoreCase("ALL"))) { que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,(Item)msg.target(),defaultItem,script,1,null)); return; } } else { int num=CMParms.numBits(trigger); for(int i=0;i<num;i++) { String t=CMParms.getCleanBit(trigger,i).toUpperCase(); if(((" "+msg.target().Name().toUpperCase()+" ").indexOf(" "+t+" ")>=0) ||(msg.target().ID().equalsIgnoreCase(t)) ||(t.equalsIgnoreCase("ALL"))) { que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,(Item)msg.target(),defaultItem,script,1,null)); return; } } } } break; case 19: // bribe_prog if((msg.targetMinor()==CMMsg.TYP_GIVE) &&(msg.amITarget(eventMob)||(!(affecting instanceof MOB))) &&(!msg.amISource(monster))&&canTrigger(19) &&(msg.tool() instanceof Coins) &&(canFreelyBehaveNormal(monster)||(!(affecting instanceof MOB)))) { trigger=trigger.substring(10).trim(); if(trigger.toUpperCase().startsWith("ANY")) trigger=trigger.substring(3).trim(); else if(!((Coins)msg.tool()).getCurrency().equals(CMLib.beanCounter().getCurrency(monster))) break; double t=0.0; if(CMath.isDouble(trigger.trim())) t=CMath.s_double(trigger.trim()); else t=new Integer(CMath.s_int(trigger.trim())).doubleValue(); if((((Coins)msg.tool()).getTotalValue()>=t) ||(trigger.equalsIgnoreCase("ALL"))) { que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,(Item)msg.tool(),defaultItem,script,1,null)); return; } } break; case 8: // entry_prog if((msg.targetMinor()==CMMsg.TYP_ENTER)&&canTrigger(8) &&(msg.amISource(eventMob) ||(msg.target()==affecting) ||(msg.tool()==affecting) ||(affecting instanceof Item)) &&(canFreelyBehaveNormal(monster)||(!(affecting instanceof MOB)))) { int prcnt=CMath.s_int(CMParms.getCleanBit(trigger,1).trim()); if(CMLib.dice().rollPercentage()<prcnt) { que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,defaultItem,null,script,1,null)); return; } } break; case 9: // exit prog if((msg.targetMinor()==CMMsg.TYP_LEAVE)&&canTrigger(9) &&(msg.amITarget(lastKnownLocation)) &&(!msg.amISource(eventMob)) &&(canFreelyBehaveNormal(monster)||(!(affecting instanceof MOB)))) { int prcnt=CMath.s_int(CMParms.getCleanBit(trigger,1).trim()); if(CMLib.dice().rollPercentage()<prcnt) { que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,defaultItem,null,script,1,null)); return; } } break; case 10: // death prog if((msg.sourceMinor()==CMMsg.TYP_DEATH)&&canTrigger(10) &&(msg.amISource(eventMob)||(!(affecting instanceof MOB)))) { MOB ded=msg.source(); MOB src=lastToHurtMe; if(msg.tool() instanceof MOB) src=(MOB)msg.tool(); if((src==null)||(src.location()!=monster.location())) src=ded; execute(affecting,src,ded,ded,defaultItem,null,script,null,new Object[10]); return; } break; case 44: // kill prog if((msg.sourceMinor()==CMMsg.TYP_DEATH)&&canTrigger(44) &&((msg.tool()==affecting)||(!(affecting instanceof MOB)))) { MOB ded=msg.source(); MOB src=lastToHurtMe; if(msg.tool() instanceof MOB) src=(MOB)msg.tool(); if((src==null)||(src.location()!=monster.location())) src=ded; execute(affecting,src,ded,ded,defaultItem,null,script,null,new Object[10]); return; } break; case 26: // damage prog if((msg.targetMinor()==CMMsg.TYP_DAMAGE)&&canTrigger(26) &&(msg.amITarget(eventMob)||(msg.tool()==affecting))) { Item I=null; if(msg.tool() instanceof Item) I=(Item)msg.tool(); execute(affecting,msg.source(),msg.target(),eventMob,defaultItem,I,script,""+msg.value(),new Object[10]); return; } break; case 29: // login_prog if(!registeredSpecialEvents.contains(new Integer(CMMsg.TYP_LOGIN))) { CMLib.map().addGlobalHandler(affecting,CMMsg.TYP_LOGIN); registeredSpecialEvents.add(new Integer(CMMsg.TYP_LOGIN)); } if((msg.sourceMinor()==CMMsg.TYP_LOGIN)&&canTrigger(29) &&(canFreelyBehaveNormal(monster)||(!(affecting instanceof MOB))) &&(!CMLib.flags().isCloaked(msg.source()))) { int prcnt=CMath.s_int(CMParms.getCleanBit(trigger,1).trim()); if(CMLib.dice().rollPercentage()<prcnt) { que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,defaultItem,null,script,1,null)); return; } } break; case 32: // level_prog if(!registeredSpecialEvents.contains(new Integer(CMMsg.TYP_LEVEL))) { CMLib.map().addGlobalHandler(affecting,CMMsg.TYP_LEVEL); registeredSpecialEvents.add(new Integer(CMMsg.TYP_LEVEL)); } if((msg.sourceMinor()==CMMsg.TYP_LEVEL)&&canTrigger(32) &&(canFreelyBehaveNormal(monster)||(!(affecting instanceof MOB))) &&(!CMLib.flags().isCloaked(msg.source()))) { int prcnt=CMath.s_int(CMParms.getCleanBit(trigger,1).trim()); if(CMLib.dice().rollPercentage()<prcnt) { que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,defaultItem,null,script,1,null)); return; } } break; case 30: // logoff_prog if((msg.sourceMinor()==CMMsg.TYP_QUIT)&&canTrigger(30) &&(canFreelyBehaveNormal(monster)||(!(affecting instanceof MOB))) &&(!CMLib.flags().isCloaked(msg.source()))) { int prcnt=CMath.s_int(CMParms.getCleanBit(trigger,1).trim()); if(CMLib.dice().rollPercentage()<prcnt) { que.addElement(new ScriptableResponse(affecting,msg.source(),monster,monster,defaultItem,null,script,1,null)); return; } } break; case 12: // mask_prog if(!canTrigger(12)) break; case 18: // act_prog if((!msg.amISource(monster)) ||((triggerCode==18)&&(!canTrigger(18)))) break; case 43: // imask_prog if((triggerCode!=43)||(msg.amISource(monster)&&canTrigger(43))) { boolean doIt=false; String str=msg.othersMessage(); if(str==null) str=msg.targetMessage(); if(str==null) str=msg.sourceMessage(); if(str==null) break; str=CMLib.coffeeFilter().fullOutFilter(null,monster,msg.source(),msg.target(),msg.tool(),str,false); str=CMStrings.removeColors(str); str=" "+CMStrings.replaceAll(str,"\n\r"," ").toUpperCase().trim()+" "; trigger=CMParms.getPastBit(trigger.trim(),0).trim().toUpperCase(); if((trigger.length()==0)||(trigger.equalsIgnoreCase("all"))) doIt=true; else if(CMParms.getCleanBit(trigger,0).equalsIgnoreCase("p")) { trigger=trigger.substring(1).trim(); if(match(str.trim(),trigger)) doIt=true; } else { int num=CMParms.numBits(trigger); for(int i=0;i<num;i++) { String t=CMParms.getCleanBit(trigger,i).trim(); if(str.indexOf(" "+t+" ")>=0) { str=t; doIt=true; break; } } } if(doIt) { Item Tool=null; if(msg.tool() instanceof Item) Tool=(Item)msg.tool(); if(Tool==null) Tool=defaultItem; if(msg.target() instanceof MOB) que.addElement(new ScriptableResponse(affecting,msg.source(),msg.target(),monster,Tool,defaultItem,script,1,str)); else if(msg.target() instanceof Item) que.addElement(new ScriptableResponse(affecting,msg.source(),null,monster,Tool,(Item)msg.target(),script,1,str)); else que.addElement(new ScriptableResponse(affecting,msg.source(),null,monster,Tool,defaultItem,script,1,str)); return; } } break; case 38: // social prog if(!msg.amISource(monster) &&canTrigger(38) &&(msg.tool() instanceof Social)) { trigger=CMParms.getPastBit(trigger.trim(),0); if(((Social)msg.tool()).Name().toUpperCase().startsWith(trigger.toUpperCase())) { Item Tool=defaultItem; if(msg.target() instanceof MOB) que.addElement(new ScriptableResponse(affecting,msg.source(),msg.target(),monster,Tool,defaultItem,script,1,msg.tool().Name())); else if(msg.target() instanceof Item) que.addElement(new ScriptableResponse(affecting,msg.source(),null,monster,Tool,(Item)msg.target(),script,1,msg.tool().Name())); else que.addElement(new ScriptableResponse(affecting,msg.source(),null,monster,Tool,defaultItem,script,1,msg.tool().Name())); return; } } break; case 33: // channel prog if(!registeredSpecialEvents.contains(new Integer(CMMsg.TYP_CHANNEL))) { CMLib.map().addGlobalHandler(affecting,CMMsg.TYP_CHANNEL); registeredSpecialEvents.add(new Integer(CMMsg.TYP_CHANNEL)); } if(!msg.amISource(monster) &&(CMath.bset(msg.othersMajor(),CMMsg.MASK_CHANNEL)) &&canTrigger(33)) { boolean doIt=false; String channel=CMParms.getBit(trigger.trim(),1); int channelInt=msg.othersMinor()-CMMsg.TYP_CHANNEL; String str=null; if(channel.equalsIgnoreCase(CMLib.channels().getChannelName(channelInt))) { str=msg.sourceMessage(); if(str==null) str=msg.othersMessage(); if(str==null) str=msg.targetMessage(); if(str==null) break; str=CMLib.coffeeFilter().fullOutFilter(null,monster,msg.source(),msg.target(),msg.tool(),str,false).toUpperCase().trim(); int dex=str.indexOf("["+channel+"]"); if(dex>0) str=str.substring(dex+2+channel.length()).trim(); else { dex=str.indexOf("'"); int edex=str.lastIndexOf("'"); if(edex>dex) str=str.substring(dex+1,edex); } str=" "+CMStrings.removeColors(str)+" "; str=CMStrings.replaceAll(str,"\n\r"," "); trigger=CMParms.getPastBit(trigger.trim(),1); if((trigger.length()==0)||(trigger.equalsIgnoreCase("all"))) doIt=true; else if(CMParms.getCleanBit(trigger,0).equalsIgnoreCase("p")) { trigger=trigger.substring(1).trim().toUpperCase(); if(match(str.trim(),trigger)) doIt=true; } else { int num=CMParms.numBits(trigger); for(int i=0;i<num;i++) { String t=CMParms.getCleanBit(trigger,i).trim(); if(str.indexOf(" "+t+" ")>=0) { str=t; doIt=true; break; } } } } if(doIt) { Item Tool=null; if(msg.tool() instanceof Item) Tool=(Item)msg.tool(); if(Tool==null) Tool=defaultItem; if(msg.target() instanceof MOB) que.addElement(new ScriptableResponse(affecting,msg.source(),msg.target(),monster,Tool,defaultItem,script,1,str)); else if(msg.target() instanceof Item) que.addElement(new ScriptableResponse(affecting,msg.source(),null,monster,Tool,(Item)msg.target(),script,1,str)); else que.addElement(new ScriptableResponse(affecting,msg.source(),null,monster,Tool,defaultItem,script,1,str)); return; } } break; case 31: // regmask prog if(!msg.amISource(monster)&&canTrigger(31)) { boolean doIt=false; String str=msg.othersMessage(); if(str==null) str=msg.targetMessage(); if(str==null) str=msg.sourceMessage(); if(str==null) break; str=CMLib.coffeeFilter().fullOutFilter(null,monster,msg.source(),msg.target(),msg.tool(),str,false); trigger=CMParms.getPastBit(trigger.trim(),0); if(CMParms.getCleanBit(trigger,0).equalsIgnoreCase("p")) doIt=str.trim().equals(trigger.substring(1).trim()); else { Pattern P=(Pattern)patterns.get(trigger); if(P==null) { P=Pattern.compile(trigger, Pattern.CASE_INSENSITIVE | Pattern.DOTALL); patterns.put(trigger,P); } Matcher M=P.matcher(str); doIt=M.find(); if(doIt) str=str.substring(M.start()).trim(); } if(doIt) { Item Tool=null; if(msg.tool() instanceof Item) Tool=(Item)msg.tool(); if(Tool==null) Tool=defaultItem; if(msg.target() instanceof MOB) que.addElement(new ScriptableResponse(affecting,msg.source(),msg.target(),monster,Tool,defaultItem,script,1,str)); else if(msg.target() instanceof Item) que.addElement(new ScriptableResponse(affecting,msg.source(),null,monster,Tool,(Item)msg.target(),script,1,str)); else que.addElement(new ScriptableResponse(affecting,msg.source(),null,monster,Tool,defaultItem,script,1,str)); return; } } break; } } } protected int getTriggerCode(String trigger) { int x=trigger.indexOf(" "); Integer I=null; if(x<0) I=(Integer)progH.get(trigger.toUpperCase().trim()); else I=(Integer)progH.get(trigger.substring(0,x).toUpperCase().trim()); if(I==null) return 0; return I.intValue(); } public MOB backupMOB=null; public MOB getScriptableMOB(Tickable ticking) { MOB mob=null; if(ticking instanceof MOB) { mob=(MOB)ticking; if(!mob.amDead()) lastKnownLocation=mob.location(); } else if(ticking instanceof Environmental) { Room R=CMLib.map().roomLocation((Environmental)ticking); if(R!=null) lastKnownLocation=R; if((backupMOB==null)||(backupMOB.amDestroyed())||(backupMOB.amDead())) { backupMOB=CMClass.getMOB("StdMOB"); if(backupMOB!=null) { backupMOB.setName(ticking.name()); backupMOB.setDisplayText(ticking.name()+" is here."); backupMOB.setDescription(""); mob=backupMOB; if(backupMOB.location()!=lastKnownLocation) backupMOB.setLocation(lastKnownLocation); } } else { mob=backupMOB; if(backupMOB.location()!=lastKnownLocation) backupMOB.setLocation(lastKnownLocation); } } return mob; } public boolean canTrigger(int triggerCode) { Long L=(Long)noTrigger.get(new Integer(triggerCode)); if(L==null) return true; if(System.currentTimeMillis()<L.longValue()) return false; noTrigger.remove(new Integer(triggerCode)); return true; } public boolean tick(Tickable ticking, int tickID) { super.tick(ticking,tickID); if(!CMProps.getBoolVar(CMProps.SYSTEMB_MUDSTARTED)) return false; MOB mob=getScriptableMOB(ticking); Item defaultItem=(ticking instanceof Item)?(Item)ticking:null; if((mob==null)||(lastKnownLocation==null)) { altStatusTickable=null; return true; } Environmental affecting=(ticking instanceof Environmental)?((Environmental)ticking):null; Vector scripts=getScripts(); int triggerCode=-1; for(int thisScriptIndex=0;thisScriptIndex<scripts.size();thisScriptIndex++) { Vector script=(Vector)scripts.elementAt(thisScriptIndex); String trigger=""; if(script.size()>0) trigger=((String)script.elementAt(0)).toUpperCase().trim(); triggerCode=getTriggerCode(trigger); tickStatus=Tickable.STATUS_BEHAVIOR+triggerCode; switch(triggerCode) { case 5: // rand_Prog if((!mob.amDead())&&canTrigger(5)) { int prcnt=CMath.s_int(CMParms.getCleanBit(trigger,1).trim()); if(CMLib.dice().rollPercentage()<prcnt) execute(affecting,mob,mob,mob,defaultItem,null,script,null,new Object[10]); } break; case 16: // delay_prog if((!mob.amDead())&&canTrigger(16)) { int targetTick=-1; if(delayTargetTimes.containsKey(new Integer(thisScriptIndex))) targetTick=((Integer)delayTargetTimes.get(new Integer(thisScriptIndex))).intValue(); else { int low=CMath.s_int(CMParms.getCleanBit(trigger,1).trim()); int high=CMath.s_int(CMParms.getCleanBit(trigger,2).trim()); if(high<low) high=low; targetTick=CMLib.dice().roll(1,high-low+1,low-1); delayTargetTimes.put(new Integer(thisScriptIndex),new Integer(targetTick)); } int delayProgCounter=0; if(delayProgCounters.containsKey(new Integer(thisScriptIndex))) delayProgCounter=((Integer)delayProgCounters.get(new Integer(thisScriptIndex))).intValue(); else delayProgCounters.put(new Integer(thisScriptIndex),new Integer(0)); if(delayProgCounter==targetTick) { execute(affecting,mob,mob,mob,defaultItem,null,script,null,new Object[10]); delayProgCounter=-1; } delayProgCounters.remove(new Integer(thisScriptIndex)); delayProgCounters.put(new Integer(thisScriptIndex),new Integer(delayProgCounter+1)); } break; case 7: // fightProg if((mob.isInCombat())&&(!mob.amDead())&&canTrigger(7)) { int prcnt=CMath.s_int(CMParms.getCleanBit(trigger,1).trim()); if(CMLib.dice().rollPercentage()<prcnt) execute(affecting,mob.getVictim(),mob,mob,defaultItem,null,script,null,new Object[10]); } else if((ticking instanceof Item) &&canTrigger(7) &&(((Item)ticking).owner() instanceof MOB) &&(((MOB)((Item)ticking).owner()).isInCombat())) { int prcnt=CMath.s_int(CMParms.getCleanBit(trigger,1).trim()); if(CMLib.dice().rollPercentage()<prcnt) { MOB M=(MOB)((Item)ticking).owner(); if(!M.amDead()) execute(affecting,M,mob.getVictim(),mob,defaultItem,null,script,null,new Object[10]); } } break; case 11: // hitprcnt if((mob.isInCombat())&&(!mob.amDead())&&canTrigger(11)) { int floor=(int)Math.round(CMath.mul(CMath.div(CMath.s_int(CMParms.getCleanBit(trigger,1).trim()),100.0),mob.maxState().getHitPoints())); if(mob.curState().getHitPoints()<=floor) execute(affecting,mob.getVictim(),mob,mob,defaultItem,null,script,null,new Object[10]); } else if((ticking instanceof Item) &&canTrigger(11) &&(((Item)ticking).owner() instanceof MOB) &&(((MOB)((Item)ticking).owner()).isInCombat())) { MOB M=(MOB)((Item)ticking).owner(); if(!M.amDead()) { int floor=(int)Math.round(CMath.mul(CMath.div(CMath.s_int(CMParms.getCleanBit(trigger,1).trim()),100.0),M.maxState().getHitPoints())); if(M.curState().getHitPoints()<=floor) execute(affecting,M,mob.getVictim(),mob,defaultItem,null,script,null,new Object[10]); } } break; case 6: // once_prog if(!oncesDone.contains(script)&&canTrigger(6)) { oncesDone.addElement(script); execute(affecting,mob,mob,mob,defaultItem,null,script,null,new Object[10]); } break; case 14: // time_prog if((mob.location()!=null) &&canTrigger(14) &&(!mob.amDead())) { int lastTimeProgDone=-1; if(lastTimeProgsDone.containsKey(new Integer(thisScriptIndex))) lastTimeProgDone=((Integer)lastTimeProgsDone.get(new Integer(thisScriptIndex))).intValue(); int time=mob.location().getArea().getTimeObj().getTimeOfDay(); if(lastTimeProgDone!=time) { boolean done=false; for(int i=1;i<CMParms.numBits(trigger);i++) { if(time==CMath.s_int(CMParms.getCleanBit(trigger,i).trim())) { done=true; execute(affecting,mob,mob,mob,defaultItem,null,script,null,new Object[10]); lastTimeProgsDone.remove(new Integer(thisScriptIndex)); lastTimeProgsDone.put(new Integer(thisScriptIndex),new Integer(time)); break; } } if(!done) lastTimeProgsDone.remove(new Integer(thisScriptIndex)); } } break; case 15: // day_prog if((mob.location()!=null)&&canTrigger(15) &&(!mob.amDead())) { int lastDayProgDone=-1; if(lastDayProgsDone.containsKey(new Integer(thisScriptIndex))) lastDayProgDone=((Integer)lastDayProgsDone.get(new Integer(thisScriptIndex))).intValue(); int day=mob.location().getArea().getTimeObj().getDayOfMonth(); if(lastDayProgDone!=day) { boolean done=false; for(int i=1;i<CMParms.numBits(trigger);i++) { if(day==CMath.s_int(CMParms.getCleanBit(trigger,i).trim())) { done=true; execute(affecting,mob,mob,mob,defaultItem,null,script,null,new Object[10]); lastDayProgsDone.remove(new Integer(thisScriptIndex)); lastDayProgsDone.put(new Integer(thisScriptIndex),new Integer(day)); break; } } if(!done) lastDayProgsDone.remove(new Integer(thisScriptIndex)); } } break; case 13: // quest time prog if(!oncesDone.contains(script)&&canTrigger(13)) { Quest Q=getQuest(CMParms.getCleanBit(trigger,1)); if((Q!=null)&&(Q.running())&&(!Q.stopping())) { int time=CMath.s_int(CMParms.getCleanBit(trigger,2).trim()); if(time>=Q.minsRemaining()) { oncesDone.addElement(script); execute(affecting,mob,mob,mob,defaultItem,null,script,null,new Object[10]); } } } break; default: break; } } tickStatus=Tickable.STATUS_BEHAVIOR+100; dequeResponses(); altStatusTickable=null; return true; } public void dequeResponses() { try{ tickStatus=Tickable.STATUS_BEHAVIOR+100; for(int q=que.size()-1;q>=0;q--) { ScriptableResponse SB=null; try{SB=(ScriptableResponse)que.elementAt(q);}catch(ArrayIndexOutOfBoundsException x){continue;} if(SB.checkTimeToExecute()) { execute(SB.h,SB.s,SB.t,SB.m,SB.pi,SB.si,SB.scr,SB.message,new Object[10]); que.removeElement(SB); } } }catch(Exception e){Log.errOut("Scriptable",e);} } }