package com.planet_ink.coffee_mud.WebMacros.grinder;
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-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 GrinderAreas
{
public static String getAreaList(Area pickedA, MOB mob)
{
StringBuffer AreaList=new StringBuffer("");
boolean anywhere=(CMSecurity.isAllowedAnywhere(mob,"CMDROOMS")||CMSecurity.isAllowedAnywhere(mob,"CMDAREAS"));
boolean everywhere=(CMSecurity.isASysOp(mob)||CMSecurity.isAllowedEverywhere(mob,"CMDROOMS")||CMSecurity.isAllowedEverywhere(mob,"CMDAREAS"));
for(Enumeration a=CMLib.map().sortedAreas();a.hasMoreElements();)
{
Area A=(Area)a.nextElement();
if(everywhere||(A.amISubOp(mob.Name())&&anywhere))
if((pickedA!=null)&&(pickedA==A))
AreaList.append("<OPTION SELECTED VALUE=\""+A.Name()+"\">"+A.name());
else
AreaList.append("<OPTION VALUE=\""+A.Name()+"\">"+A.name());
}
return AreaList.toString();
}
public static String doAffectsNBehavs(Environmental E, ExternalHTTPRequests httpReq, Hashtable parms)
{
while(E.numBehaviors()>0)
E.delBehavior(E.fetchBehavior(0));
if(httpReq.isRequestParameter("BEHAV1"))
{
int num=1;
String behav=httpReq.getRequestParameter("BEHAV"+num);
String theparm=httpReq.getRequestParameter("BDATA"+num);
while((behav!=null)&&(theparm!=null))
{
if(behav.length()>0)
{
Behavior B=CMClass.getBehavior(behav);
if(theparm==null) theparm="";
if(B==null) return "Unknown behavior '"+behav+"'.";
B.setParms(theparm);
E.addBehavior(B);
B.startBehavior(E);
}
num++;
behav=httpReq.getRequestParameter("BEHAV"+num);
theparm=httpReq.getRequestParameter("BDATA"+num);
}
}
while(E.numEffects()>0)
E.delEffect(E.fetchEffect(0));
if(httpReq.isRequestParameter("AFFECT1"))
{
int num=1;
String aff=httpReq.getRequestParameter("AFFECT"+num);
String theparm=httpReq.getRequestParameter("ADATA"+num);
while((aff!=null)&&(theparm!=null))
{
if(aff.length()>0)
{
Ability B=CMClass.getAbility(aff);
if(theparm==null) theparm="";
if(B==null) return "Unknown Effect '"+aff+"'.";
B.setMiscText(theparm);
E.addNonUninvokableEffect(B);
}
num++;
aff=httpReq.getRequestParameter("AFFECT"+num);
theparm=httpReq.getRequestParameter("ADATA"+num);
}
}
return "";
}
public static String modifyArea(ExternalHTTPRequests httpReq, Hashtable parms)
{
Vector areasNeedingUpdates=new Vector();
String last=httpReq.getRequestParameter("AREA");
if((last==null)||(last.length()==0)) return "Old area name not defined!";
Area A=CMLib.map().getArea(last);
if(A==null) return "Old Area not defined!";
areasNeedingUpdates.addElement(A);
boolean redoAllMyDamnRooms=false;
Vector allMyDamnRooms=null;
String oldName=null;
// class!
String className=httpReq.getRequestParameter("CLASSES");
if((className==null)||(className.length()==0))
return "Please select a class type for this area.";
if(!className.equalsIgnoreCase(CMClass.className(A)))
{
allMyDamnRooms=new Vector();
for(Enumeration r=A.getProperMap();r.hasMoreElements();)
allMyDamnRooms.addElement(r.nextElement());
Area oldA=A;
A=CMClass.getAreaType(className);
if(A==null)
return "The class you chose does not exist. Choose another.";
CMLib.map().delArea(oldA);
CMLib.map().addArea(A);
A.setName(oldA.Name());
redoAllMyDamnRooms=true;
}
// name
String name=httpReq.getRequestParameter("NAME");
if((name==null)||(name.length()==0))
return "Please enter a name for this area.";
name=name.trim();
if(!name.equals(A.Name().trim()))
{
if(CMLib.map().getArea(name)!=null)
return "The name you chose is already in use. Please enter another.";
allMyDamnRooms=new Vector();
for(Enumeration r=A.getCompleteMap();r.hasMoreElements();)
allMyDamnRooms.addElement(r.nextElement());
CMLib.map().delArea(A);
oldName=A.Name();
CMLib.database().DBDeleteArea(A);
A=CMLib.database().DBCreateArea(name,CMClass.className(A));
A.setName(name);
redoAllMyDamnRooms=true;
httpReq.addRequestParameters("AREA",A.Name());
}
// climate
if(httpReq.isRequestParameter("CLIMATE"))
{
int climate=CMath.s_int(httpReq.getRequestParameter("CLIMATE"));
for(int i=1;;i++)
if(httpReq.isRequestParameter("CLIMATE"+(new Integer(i).toString())))
climate=climate|CMath.s_int(httpReq.getRequestParameter("CLIMATE"+(new Integer(i).toString())));
else
break;
A.setClimateType(climate);
}
// tech level
if(httpReq.isRequestParameter("TECHLEVEL"))
A.setClimateType(CMath.s_int(httpReq.getRequestParameter("TECHLEVEL")));
// modify subop list
String subOps=httpReq.getRequestParameter("SUBOPS");
Vector V=A.getSubOpVectorList();
for(int v=0;v<V.size();v++)
A.delSubOp((String)V.elementAt(v));
if((subOps!=null)&&(subOps.length()>0))
{
A.addSubOp(subOps);
for(int i=1;;i++)
if(httpReq.isRequestParameter("SUBOPS"+(new Integer(i).toString())))
A.addSubOp(httpReq.getRequestParameter("SUBOPS"+(new Integer(i).toString())));
else
break;
}
// description
String desc=httpReq.getRequestParameter("DESCRIPTION");
if(desc==null)desc="";
A.setDescription(CMLib.coffeeFilter().safetyFilter(desc));
// image
String img=httpReq.getRequestParameter("IMAGE");
if(img==null)img="";
A.setImage(CMLib.coffeeFilter().safetyFilter(img));
// gridy
String gridy=httpReq.getRequestParameter("GRIDY");
if((gridy!=null)&&(A instanceof GridZones))
((GridZones)A).setYGridSize(CMath.s_int(gridy));
// gridx
String gridx=httpReq.getRequestParameter("GRIDX");
if((gridx!=null)&&(A instanceof GridZones))
((GridZones)A).setXGridSize(CMath.s_int(gridy));
// author
String author=httpReq.getRequestParameter("AUTHOR");
if(author==null)author="";
A.setAuthorID(CMLib.coffeeFilter().safetyFilter(author));
// currency
String currency=httpReq.getRequestParameter("CURRENCY");
if(currency==null)currency="";
A.setCurrency(CMLib.coffeeFilter().safetyFilter(currency));
// modify Child Area list
String parents=httpReq.getRequestParameter("PARENT");
for(int v=0;v<A.getNumParents();v++)
A.removeParent(v);
if((parents!=null)&&(parents.length()>0))
{
Area parent=CMLib.map().getArea(parents);
if(parent!=null)
{
if(A.canParent(parent))
{
A.addParent(parent);
parent.addChild(A);
areasNeedingUpdates.addElement(parent);
}
else
return "The area, '"+parent.Name()+"', cannot be added as a parent, as this would create a circular reference.";
}
for(int i=1;;i++)
if(httpReq.isRequestParameter("PARENT"+(new Integer(i).toString())))
{
parent=CMLib.map().getArea(httpReq.getRequestParameter("PARENT"+(new Integer(i).toString())));
if(parent==null)
Log.errOut("Grinder", "Error - Area '"+httpReq.getRequestParameter("PARENT"+(new Integer(i).toString()))+"' not found by CMMap");
else
{
if(A.canParent(parent))
{
A.addParent(parent);
parent.addChild(A);
areasNeedingUpdates.addElement(parent);
}
else
return "The area, '"+parent.Name()+"', cannot be added as a parent, as this would create a circular reference.";
}
}
else
break;
}
// modify Child Area list
String children=httpReq.getRequestParameter("CHILDREN");
for(int v=0;v<A.getNumChildren();v++)
A.removeChild(v);
if((children!=null)&&(children.length()>0))
{
Area child=CMLib.map().getArea(children);
if(child!=null)
{
if(A.canChild(child))
{
A.addChild(child);
child.addParent(A);
areasNeedingUpdates.addElement(child);
}
else
return "The area, '"+child.Name()+"', cannot be added as a child, as this would create a circular reference.";
}
for(int i=1;;i++)
if(httpReq.isRequestParameter("CHILDREN"+(new Integer(i).toString())))
{
child=CMLib.map().getArea(httpReq.getRequestParameter("CHILDREN"+(new Integer(i).toString())));
if(child==null)
Log.errOut("Grinder", "Error - Area '"+httpReq.getRequestParameter("CHILDREN"+(new Integer(i).toString()))+"' not found by CMMap");
else
{
if(A.canChild(child))
{
A.addChild(child);
child.addParent(A);
areasNeedingUpdates.addElement(child);
}
else
return "The area, '"+child.Name()+"', cannot be added as a child, as this would create a circular reference.";
}
}
else
break;
}
// archive file
String file=httpReq.getRequestParameter("ARCHP");
if(file==null)file="";
A.setArchivePath(file);
String err=GrinderAreas.doAffectsNBehavs(A,httpReq,parms);
if(err.length()>0) return err;
if((redoAllMyDamnRooms)&&(allMyDamnRooms!=null))
CMLib.map().renameRooms(A,oldName,allMyDamnRooms);
for(int i=0;i<areasNeedingUpdates.size();i++) // will always include A
{
Area A2=(Area)areasNeedingUpdates.elementAt(i);
CMLib.database().DBUpdateArea(A2.Name(),A2);
CMLib.coffeeMaker().addAutoPropsToAreaIfNecessary(A2);
}
return "";
}
}