package com.planet_ink.coffee_mud.WebMacros; 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.Libraries.interfaces.*; import com.planet_ink.coffee_mud.Common.interfaces.*; import com.planet_ink.coffee_mud.Exits.interfaces.*; import com.planet_ink.coffee_mud.Items.interfaces.*; import com.planet_ink.coffee_mud.Locales.interfaces.*; import com.planet_ink.coffee_mud.MOBS.interfaces.*; import com.planet_ink.coffee_mud.Races.interfaces.*; import java.util.*; /* Copyright 2000-2010 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. */ @SuppressWarnings("unchecked") public class AbilityData extends StdWebMacro { public String name() {return this.getClass().getName().substring(this.getClass().getName().lastIndexOf('.')+1);} // valid parms include help, ranges, quality, target, alignment, domain, // qualifyQ, auto public String runMacro(ExternalHTTPRequests httpReq, String parm) { Hashtable parms=parseParms(parm); String replaceCommand=httpReq.getRequestParameter("REPLACE"); if((replaceCommand != null) && (replaceCommand.length()>0) && (replaceCommand.indexOf('=')>0)) { int eq=replaceCommand.indexOf('='); String field=replaceCommand.substring(0,eq); String value=replaceCommand.substring(eq+1); httpReq.addRequestParameters(field, value); httpReq.addRequestParameters("REPLACE",""); } String last=httpReq.getRequestParameter("ABILITY"); if(last==null) return " @break@"; Ability A=null; String newAbilityID=httpReq.getRequestParameter("NEWABILITY"); if(A==null) A=(Ability)httpReq.getRequestObjects().get("ABILITY-"+last); if((A==null) &&(newAbilityID!=null) &&(newAbilityID.length()>0) &&(CMClass.getAbility(newAbilityID)==null)) { A=(Ability)CMClass.getAbility("GenAbility").copyOf(); A.setStat("CLASS9",newAbilityID); last=newAbilityID; httpReq.addRequestParameters("ABILITY",newAbilityID); } if(last.length()>0) { if(A==null) A=CMClass.getAbility(last); if(parms.containsKey("ISNEWABILITY")) return ""+(CMClass.getAbility(last)==null); if(A!=null) { StringBuffer str=new StringBuffer(""); if(parms.containsKey("ISGENERIC")) { Ability A2=CMClass.getAbility(A.ID()); return ""+((A2!=null)&&(A2.isGeneric())); } if(parms.containsKey("NAME")) { String old=httpReq.getRequestParameter("NAME"); if(old==null) old=A.name(); str.append(old+", "); } if(parms.containsKey("GENHELP")) { String old=httpReq.getRequestParameter("GENHELP"); if(old==null) old=A.getStat("HELP"); str.append(old+", "); } // here starts CLASSIFICATION if(parms.containsKey("CLASSIFICATION_ACODE")) { String old=httpReq.getRequestParameter("CLASSIFICATION_ACODE"); if(old==null) old=""+(A.classificationCode()&Ability.ALL_ACODES); for(int i=0;i<Ability.ACODE_DESCS.length;i++) str.append("<OPTION VALUE=\""+i+"\""+((CMath.s_int(old)==i)?" SELECTED":"")+">"+CMStrings.capitalizeAndLower(Ability.ACODE_DESCS[i])); str.append(", "); } if(parms.containsKey("CLASSIFICATION_DOMAIN")) { String old=httpReq.getRequestParameter("CLASSIFICATION_DOMAIN"); if(old==null) old=""+((A.classificationCode()&Ability.ALL_DOMAINS)>>5); for(int i=0;i<Ability.DOMAIN_DESCS.length;i++) str.append("<OPTION VALUE=\""+i+"\""+((CMath.s_int(old)==i)?" SELECTED":"")+">"+CMStrings.capitalizeAndLower(Ability.DOMAIN_DESCS[i])); str.append(", "); } // here ends CLASSIFICATION if(parms.containsKey("TRIGSTR")) { String old=httpReq.getRequestParameter("TRIGSTR"); if(old==null) old=CMParms.toStringList(A.triggerStrings()); // remember to sort by longest->shortest on put-back str.append(old.toUpperCase().trim()+", "); } if(parms.containsKey("MINRANGE")) { String old=httpReq.getRequestParameter("MINRANGE"); if(old==null) old=""+A.minRange(); for(int i=0;i<Ability.RANGE_CHOICES.length;i++) str.append("<OPTION VALUE=\""+i+"\""+((CMath.s_int(old)==i)?" SELECTED":"")+">"+CMStrings.capitalizeAndLower(Ability.RANGE_CHOICES[i])); str.append(", "); } if(parms.containsKey("MAXRANGE")) { String old=httpReq.getRequestParameter("MAXRANGE"); if(old==null) old=""+A.maxRange(); for(int i=0;i<Ability.RANGE_CHOICES.length;i++) str.append("<OPTION VALUE=\""+i+"\""+((CMath.s_int(old)==i)?" SELECTED":"")+">"+CMStrings.capitalizeAndLower(Ability.RANGE_CHOICES[i])); str.append(", "); } if(parms.containsKey("DISPLAY")) // affected string { String old=httpReq.getRequestParameter("DISPLAY"); if(old==null) old=A.displayText(); str.append(old+", "); } if(parms.containsKey("AUTOINVOKE")) { String old=httpReq.getRequestParameter("AUTOINVOKE"); if(old==null) old=A.getStat("AUTOINVOKE"); else old=""+old.equalsIgnoreCase("on"); str.append(CMath.s_bool(old)?"CHECKED":""); str.append(", "); } if(parms.containsKey("ABILITY_FLAGS")) { Vector list=new Vector(); if(httpReq.isRequestParameter("ABILITY_FLAGS")) { String id=""; int num=0; for(;httpReq.isRequestParameter("ABILITY_FLAGS"+id);id=""+(++num)) list.addElement(httpReq.getRequestParameter("ABILITY_FLAGS"+id)); } else list=CMParms.parseCommas(A.getStat("FLAGS"),true); for(int i=0;i<Ability.FLAG_DESCS.length;i++) str.append("<OPTION VALUE=\""+Ability.FLAG_DESCS[i]+"\""+(list.contains(Ability.FLAG_DESCS[i])?" SELECTED":"")+">"+CMStrings.capitalizeAndLower(Ability.FLAG_DESCS[i])); str.append(", "); } if(parms.containsKey("CUSTOMOVERRIDEMANA")) { String old=httpReq.getRequestParameter("OVERRIDEMANA"); if(old==null) old=""+A.getStat("OVERRIDEMANA"); int x=CMath.s_int(old); if((x>0) && (x<Integer.MAX_VALUE-101)) str.append(old+", "); } if(parms.containsKey("OVERRIDEMANA")) { String old=httpReq.getRequestParameter("OVERRIDEMANA"); if(old==null) old=""+A.getStat("OVERRIDEMANA"); int o=CMath.s_int(old); str.append("<OPTION VALUE=\"-1\""+((o==-1)?" SELECTED":"")+">Use Default"); str.append("<OPTION VALUE=\"0\""+((o==0)?" SELECTED":"")+">None (free skill)"); str.append("<OPTION VALUE=\"\""+(((o>0)&&(o<Integer.MAX_VALUE-101))?" SELECTED":"")+"\">Custom Value"); str.append("<OPTION VALUE=\""+Integer.MAX_VALUE+"\""+((o==Integer.MAX_VALUE)?" SELECTED":"")+">All Mana"); for(int v=Integer.MAX_VALUE-5;v>=Integer.MAX_VALUE-95;v-=5) { str.append("<OPTION VALUE=\""+v+"\""+(((o>(v-5))&&(o<=v))?" SELECTED":"")+">"+(Integer.MAX_VALUE-v)+"%"); } str.append(", "); } if(parms.containsKey("USAGEMASK")) { Vector list=new Vector(); if(httpReq.isRequestParameter("USAGEMASK")) { String id=""; int num=0; for(;httpReq.isRequestParameter("USAGEMASK"+id);id=""+(++num)) list.addElement(httpReq.getRequestParameter("USAGEMASK"+id)); } else list=CMParms.parseCommas(A.getStat("USAGEMASK"),true); for(int i=0;i<Ability.USAGE_DESCS.length;i++) str.append("<OPTION VALUE=\""+Ability.USAGE_DESCS[i]+"\""+(list.contains(Ability.USAGE_DESCS[i])?" SELECTED":"")+">"+CMStrings.capitalizeAndLower(Ability.USAGE_DESCS[i])); str.append(", "); } if(parms.containsKey("CANAFFECTMASK")) { Vector list=new Vector(); if(httpReq.isRequestParameter("CANAFFECTMASK")) { String id=""; int num=0; for(;httpReq.isRequestParameter("CANAFFECTMASK"+id);id=""+(++num)) list.addElement(httpReq.getRequestParameter("CANAFFECTMASK"+id)); } else list=CMParms.parseCommas(A.getStat("CANAFFECTMASK"),true); for(int i=0;i<Ability.CAN_DESCS.length;i++) str.append("<OPTION VALUE=\""+Ability.CAN_DESCS[i]+"\""+(list.contains(Ability.CAN_DESCS[i])?" SELECTED":"")+">"+CMStrings.capitalizeAndLower(Ability.CAN_DESCS[i])); str.append(", "); } if(parms.containsKey("CANTARGETMASK")) { Vector list=new Vector(); if(httpReq.isRequestParameter("CANTARGETMASK")) { String id=""; int num=0; for(;httpReq.isRequestParameter("CANTARGETMASK"+id);id=""+(++num)) list.addElement(httpReq.getRequestParameter("CANTARGETMASK"+id)); } else list=CMParms.parseCommas(A.getStat("CANTARGETMASK"),true); for(int i=0;i<Ability.CAN_DESCS.length;i++) str.append("<OPTION VALUE=\""+Ability.CAN_DESCS[i]+"\""+(list.contains(Ability.CAN_DESCS[i])?" SELECTED":"")+">"+CMStrings.capitalizeAndLower(Ability.CAN_DESCS[i])); str.append(", "); } if(parms.containsKey("VQUALITY")) //QUALITY { String old=httpReq.getRequestParameter("VQUALITY"); if(old==null) old=""+A.abstractQuality(); for(int i=0;i<Ability.QUALITY_DESCS.length;i++) str.append("<OPTION VALUE=\""+i+"\""+((CMath.s_int(old)==i)?" SELECTED":"")+">"+CMStrings.capitalizeAndLower(Ability.QUALITY_DESCS[i])); str.append(", "); } if(parms.containsKey("HERESTATS")) // affect adj: Prop_HereAdjuster { String old=httpReq.getRequestParameter("HERESTATS"); if(old==null) old=A.getStat("HERESTATS"); str.append(old+", "); } if(parms.containsKey("SCRIPT")) { String old=httpReq.getRequestParameter("SCRIPT"); if(old==null) old=A.getStat("SCRIPT"); str.append(old+", "); } if(parms.containsKey("CASTMASK")) { String old=httpReq.getRequestParameter("CASTMASK"); if(old==null) old=A.getStat("CASTMASK"); str.append(old+", "); } if(parms.containsKey("TARGETMASK")) { String old=httpReq.getRequestParameter("TARGETMASK"); if(old==null) old=A.getStat("TARGETMASK"); str.append(old+", "); } if(parms.containsKey("FIZZLEMSG")) { String old=httpReq.getRequestParameter("FIZZLEMSG"); if(old==null) old=A.getStat("FIZZLEMSG"); str.append(old+", "); } if(parms.containsKey("AUTOCASTMSG")) { String old=httpReq.getRequestParameter("AUTOCASTMSG"); if(old==null) old=A.getStat("AUTOCASTMSG"); str.append(old+", "); } if(parms.containsKey("CASTMSG")) { String old=httpReq.getRequestParameter("CASTMSG"); if(old==null) old=A.getStat("CASTMSG"); str.append(old+", "); } if(parms.containsKey("POSTCASTMSG")) { String old=httpReq.getRequestParameter("POSTCASTMSG"); if(old==null) old=A.getStat("POSTCASTMSG"); str.append(old+", "); } if(parms.containsKey("ATTACKCODE")) { String old=httpReq.getRequestParameter("ATTACKCODE"); if(old==null) old=""+CMParms.indexOf(CMMsg.TYPE_DESCS,A.getStat("ATTACKCODE")); for(int i=0;i<CMMsg.TYPE_DESCS.length;i++) str.append("<OPTION VALUE=\""+i+"\""+((CMath.s_int(old)==i)?" SELECTED":"")+">"+CMStrings.capitalizeAndLower(CMMsg.TYPE_DESCS[i])); str.append(", "); } if(parms.containsKey("POSTCASTAFFECT")) { Vector list=new Vector(); if(httpReq.isRequestParameter("POSTCASTAFFECT")) { String id=""; int num=0; for(;httpReq.isRequestParameter("POSTCASTAFFECT"+id);id=""+(++num)) list.addElement(httpReq.getRequestParameter("POSTCASTAFFECT"+id).toUpperCase()); } else list=CMParms.parseSemicolons(A.getStat("POSTCASTAFFECT").toUpperCase(),true); for(Enumeration e=CMClass.abilities();e.hasMoreElements();) { Ability A2=(Ability)e.nextElement(); String AID=A2.ID(); String ANAME=A2.name(); str.append("<OPTION VALUE=\""+AID+"\""+(list.contains(AID.toUpperCase())?" SELECTED":"")+">"+ANAME); } str.append(", "); } if(parms.containsKey("POSTCASTABILITY")) { Vector list=new Vector(); if(httpReq.isRequestParameter("POSTCASTABILITY")) { String id=""; int num=0; for(;httpReq.isRequestParameter("POSTCASTABILITY"+id);id=""+(++num)) list.addElement(httpReq.getRequestParameter("POSTCASTABILITY"+id).toUpperCase()); } else list=CMParms.parseSemicolons(A.getStat("POSTCASTABILITY").toUpperCase(),true); for(Enumeration e=CMClass.abilities();e.hasMoreElements();) { Ability A2=(Ability)e.nextElement(); String AID=A2.ID(); String ANAME=A2.name(); str.append("<OPTION VALUE=\""+AID+"\""+(list.contains(AID.toUpperCase())?" SELECTED":"")+">"+ANAME); } str.append(", "); } if(parms.containsKey("POSTCASTDAMAGE")) { /* Enter a damage or healing formula. Use +/-*()?. @x1=caster level, @x2=target level. Formula evaluates >0 for damage, <0 for healing. Requires Can Target!" */ String old=httpReq.getRequestParameter("POSTCASTDAMAGE"); if(old==null) old=A.getStat("POSTCASTDAMAGE"); str.append(old+", "); } /*********************************************************************************/ /*********************************************************************************/ // here begins the old display data parms if(parms.containsKey("HELP")) { StringBuffer s=CMLib.help().getHelpText(A.ID(),null,false); if(s==null) s=CMLib.help().getHelpText(A.Name(),null,false); int limit=70; if(parms.containsKey("LIMIT")) limit=CMath.s_int((String)parms.get("LIMIT")); str.append(helpHelp(s,limit)); } if(parms.containsKey("RANGES")) { int min=A.minRange(); int max=A.maxRange(); if(min+max==0) str.append("Touch, or not applicable, "); else { if(min==0) str.append("Touch"); else str.append("Range "+min); if(max>0) str.append(" - Range "+max); str.append(", "); } } if(parms.containsKey("QUALITY")) { switch(A.abstractQuality()) { case Ability.QUALITY_MALICIOUS: str.append("Malicious, "); break; case Ability.QUALITY_BENEFICIAL_OTHERS: case Ability.QUALITY_BENEFICIAL_SELF: str.append("Always Beneficial, "); break; case Ability.QUALITY_OK_OTHERS: case Ability.QUALITY_OK_SELF: str.append("Sometimes Beneficial, "); break; case Ability.QUALITY_INDIFFERENT: str.append("Circumstantial, "); break; } } if(parms.containsKey("AUTO")) { if(A.isAutoInvoked()) str.append("Automatic, "); else str.append("Requires invocation, "); } if(parms.containsKey("TARGET")) { switch(A.abstractQuality()) { case Ability.QUALITY_INDIFFERENT: str.append("Item or Room, "); break; case Ability.QUALITY_MALICIOUS: str.append("Others, "); break; case Ability.QUALITY_BENEFICIAL_OTHERS: case Ability.QUALITY_OK_OTHERS: str.append("Caster or others, "); break; case Ability.QUALITY_BENEFICIAL_SELF: case Ability.QUALITY_OK_SELF: str.append("Caster only, "); break; } } if(parms.containsKey("ALIGNMENT")) { String rangeDesc=null; for(Enumeration e=CMLib.factions().factionSet().elements();e.hasMoreElements();) { Faction F=(Faction)e.nextElement(); rangeDesc=F.usageFactorRangeDescription(A); if(rangeDesc.length()>0) str.append(rangeDesc+", "); } } if(parms.containsKey("ALLOWS")) { Vector allows=CMLib.ableMapper().getAbilityAllowsList(A.ID()); Ability A2=null; if((allows!=null)&&(allows.size()>0)) { ExpertiseLibrary.ExpertiseDefinition def=null; for(int a=0;a<allows.size();a++) { String allowStr=(String)allows.elementAt(a); def=CMLib.expertises().getDefinition(allowStr); if(def!=null) str.append(def.name+", "); else { A2=CMClass.getAbility(allowStr); if(A2!=null) str.append(A2.Name()+", "); } } } } if(parms.containsKey("DOMAIN")) { StringBuffer thang=new StringBuffer(""); if((A.classificationCode()&Ability.ALL_DOMAINS)!=0) { int domain=A.classificationCode()&Ability.ALL_DOMAINS; domain=domain>>5; thang.append(Ability.DOMAIN_DESCS[domain].toLowerCase().replace('_',' ')); } else thang.append(Ability.ACODE_DESCS[A.classificationCode()&Ability.ALL_ACODES].toLowerCase()); if(thang.length()>0) { thang.setCharAt(0,Character.toUpperCase(thang.charAt(0))); int x=thang.toString().indexOf("/"); if(x>0) thang.setCharAt(x+1,Character.toUpperCase(thang.charAt(x+1))); str.append(thang.toString()+", "); } } if(parms.containsKey("TYPENDOMAIN")) { StringBuffer thang=new StringBuffer(""); thang.append(CMStrings.capitalizeAndLower(Ability.ACODE_DESCS[A.classificationCode()&Ability.ALL_ACODES])); if((A.classificationCode()&Ability.ALL_DOMAINS)!=0) { int domain=A.classificationCode()&Ability.ALL_DOMAINS; domain=domain>>5; thang.append(": "+CMStrings.capitalizeAndLower(Ability.DOMAIN_DESCS[domain]).replace('_',' ')); } if(thang.length()>0) { thang.setCharAt(0,Character.toUpperCase(thang.charAt(0))); int x=thang.toString().indexOf("/"); while(x>0){ thang.setCharAt(x+1,Character.toUpperCase(thang.charAt(x+1))); x=thang.toString().indexOf("/",x+1); } str.append(thang.toString()+", "); } } if(parms.containsKey("QLEVEL")) { String className=httpReq.getRequestParameter("CLASS"); int level=0; if((className!=null)&&(className.length()>0)) level=CMLib.ableMapper().getQualifyingLevel(className,true,A.ID()); else level=CMLib.ableMapper().getQualifyingLevel("Archon",true,A.ID()); str.append(level+", "); } if(parms.containsKey("QUALIFYQ")&&(httpReq.isRequestParameter("CLASS"))) { String className=httpReq.getRequestParameter("CLASS"); if((className!=null)&&(className.length()>0)) { boolean defaultGain=CMLib.ableMapper().getDefaultGain(className,true,A.ID()); if(!defaultGain) str.append("(Qualify), "); } } String strstr=str.toString(); if(strstr.endsWith(", ")) strstr=strstr.substring(0,strstr.length()-2); return clearWebMacros(strstr); } } return ""; } }