package com.planet_ink.coffee_mud.WebMacros.grinder;
import com.planet_ink.coffee_web.interfaces.*;
import com.planet_ink.coffee_mud.core.interfaces.*;
import com.planet_ink.coffee_mud.core.*;
import com.planet_ink.coffee_mud.core.collections.*;
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 2002-2016 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(Enumeration<Area> a, Area pickedA, MOB mob, boolean noInstances)
{
final StringBuffer AreaList=new StringBuffer("");
final boolean anywhere=(CMSecurity.isAllowedAnywhere(mob,CMSecurity.SecFlag.CMDROOMS)||CMSecurity.isAllowedAnywhere(mob,CMSecurity.SecFlag.CMDAREAS));
final boolean everywhere=(CMSecurity.isASysOp(mob)||CMSecurity.isAllowedEverywhere(mob,CMSecurity.SecFlag.CMDROOMS)||CMSecurity.isAllowedEverywhere(mob,CMSecurity.SecFlag.CMDAREAS));
for(;a.hasMoreElements();)
{
final Area A=a.nextElement();
if((everywhere||(A.amISubOp(mob.Name())&&anywhere))
&&((!noInstances)||(!CMath.bset(A.flags(), Area.FLAG_INSTANCE_CHILD))))
{
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 doBehavs(PhysicalAgent E, HTTPRequest httpReq, java.util.Map<String,String> parms)
{
E.delAllBehaviors();
if(httpReq.isUrlParameter("BEHAV1"))
{
int num=1;
String behav=httpReq.getUrlParameter("BEHAV"+num);
String theparm=httpReq.getUrlParameter("BDATA"+num);
while((behav!=null)&&(theparm!=null))
{
if(behav.length()>0)
{
final Behavior B=CMClass.getBehavior(behav);
if(B==null)
return "Unknown behavior '"+behav+"'.";
B.setParms(theparm);
E.addBehavior(B);
B.startBehavior(E);
}
num++;
behav=httpReq.getUrlParameter("BEHAV"+num);
theparm=httpReq.getUrlParameter("BDATA"+num);
}
}
return "";
}
public static String doAffects(Physical P, HTTPRequest httpReq, java.util.Map<String,String> parms)
{
P.delAllEffects(false);
if(httpReq.isUrlParameter("AFFECT1"))
{
int num=1;
String aff=httpReq.getUrlParameter("AFFECT"+num);
String theparm=httpReq.getUrlParameter("ADATA"+num);
while((aff!=null)&&(theparm!=null))
{
if(aff.length()>0)
{
final Ability B=CMClass.getAbility(aff);
if(B==null)
return "Unknown Effect '"+aff+"'.";
B.setMiscText(theparm);
P.addNonUninvokableEffect(B);
}
num++;
aff=httpReq.getUrlParameter("AFFECT"+num);
theparm=httpReq.getUrlParameter("ADATA"+num);
}
}
return "";
}
public static String modifyArea(HTTPRequest httpReq, java.util.Map<String,String> parms)
{
final Vector<Area> areasNeedingUpdates=new Vector<Area>();
final String last=httpReq.getUrlParameter("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<Room> allMyDamnRooms=null;
String oldName=null;
// class!
final String className=httpReq.getUrlParameter("CLASSES");
if((className==null)||(className.length()==0))
return "Please select a class type for this area.";
if(!className.equalsIgnoreCase(CMClass.classID(A)))
{
allMyDamnRooms=new Vector<Room>();
for(final Enumeration<Room> r=A.getProperMap();r.hasMoreElements();)
allMyDamnRooms.addElement(r.nextElement());
final 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;
areasNeedingUpdates.remove(oldA);
areasNeedingUpdates.addElement(A);
}
// name
String name=httpReq.getUrlParameter("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)||(CMLib.map().getShip(name)!=null))
return "The name you chose is already in use. Please enter another.";
allMyDamnRooms=new Vector<Room>();
for(final Enumeration<Room> r=A.getCompleteMap();r.hasMoreElements();)
allMyDamnRooms.addElement(r.nextElement());
CMLib.map().delArea(A);
oldName=A.Name();
CMLib.database().DBDeleteArea(A);
A=CMClass.getAreaType(A.ID());
A.setName(name);
CMLib.map().addArea(A);
CMLib.database().DBCreateArea(A);
redoAllMyDamnRooms=true;
httpReq.addFakeUrlParameter("AREA",A.Name());
}
// climate
if(httpReq.isUrlParameter("CLIMATE"))
{
int climate=CMath.s_int(httpReq.getUrlParameter("CLIMATE"));
if(climate>=0)
{
for(int i=1;;i++)
if(httpReq.isUrlParameter("CLIMATE"+(Integer.toString(i))))
{
final int newVal=CMath.s_int(httpReq.getUrlParameter("CLIMATE"+(Integer.toString(i))));
if(newVal<0)
{
climate=-1;
break;
}
climate=climate|newVal;
}
else
break;
}
A.setClimateType(climate);
}
else
A.setClimateType(-1);
// atmosphere
if(httpReq.isUrlParameter("ATMOSPHERE"))
A.setAtmosphere(CMath.s_int(httpReq.getUrlParameter("ATMOSPHERE")));
// tech level
if(httpReq.isUrlParameter("THEME"))
A.setTheme(CMath.s_int(httpReq.getUrlParameter("THEME")));
// modify subop list
for(final Enumeration<String> s=A.subOps();s.hasMoreElements();)
A.delSubOp(s.nextElement());
for(int i=1;;i++)
if(httpReq.isUrlParameter("SUBOP"+(Integer.toString(i))))
A.addSubOp(httpReq.getUrlParameter("SUBOP"+(Integer.toString(i))));
else
break;
int num=1;
if(httpReq.isUrlParameter("BLURBFLAG1"))
{
final Vector<String> prics=new Vector<String>();
String DOUBLE=httpReq.getUrlParameter("BLURBFLAG"+num);
String MASK=httpReq.getUrlParameter("BLURB"+num);
while((DOUBLE!=null)&&(MASK!=null))
{
if(DOUBLE.trim().length()>0)
prics.addElement((DOUBLE.toUpperCase().trim()+" "+MASK).trim());
num++;
DOUBLE=httpReq.getUrlParameter("BLURBFLAG"+num);
MASK=httpReq.getUrlParameter("BLURB"+num);
}
for(final Enumeration<String> f=A.areaBlurbFlags();f.hasMoreElements();)
A.delBlurbFlag(f.nextElement());
for(int v=0;v<prics.size();v++)
A.addBlurbFlag(prics.elementAt(v));
}
// description
String desc=httpReq.getUrlParameter("DESCRIPTION");
if(desc==null)
desc="";
A.setDescription(CMLib.coffeeFilter().safetyFilter(desc));
// image
String img=httpReq.getUrlParameter("IMAGE");
if(img==null)
img="";
A.setImage(CMLib.coffeeFilter().safetyFilter(img));
// gridy
final String gridy=httpReq.getUrlParameter("GRIDY");
if((gridy!=null)&&(A instanceof GridZones))
((GridZones)A).setYGridSize(CMath.s_int(gridy));
// gridx
final String gridx=httpReq.getUrlParameter("GRIDX");
if((gridx!=null)&&(A instanceof GridZones))
((GridZones)A).setXGridSize(CMath.s_int(gridx));
// author
String author=httpReq.getUrlParameter("AUTHOR");
if(author==null)
author="";
A.setAuthorID(CMLib.coffeeFilter().safetyFilter(author));
// currency
String currency=httpReq.getUrlParameter("CURRENCY");
if(currency==null)
currency="";
A.setCurrency(CMLib.coffeeFilter().safetyFilter(currency));
// SHOPPREJ
String SHOPPREJ=httpReq.getUrlParameter("SHOPPREJ");
if(SHOPPREJ==null)
SHOPPREJ="";
A.setPrejudiceFactors(CMLib.coffeeFilter().safetyFilter(SHOPPREJ));
// BUDGET
String BUDGET=httpReq.getUrlParameter("BUDGET");
if(BUDGET==null)
BUDGET="";
A.setBudget(CMLib.coffeeFilter().safetyFilter(BUDGET));
// DEVALRATE
String DEVALRATE=httpReq.getUrlParameter("DEVALRATE");
if(DEVALRATE==null)
DEVALRATE="";
A.setDevalueRate(CMLib.coffeeFilter().safetyFilter(DEVALRATE));
// INVRESETRATE
String INVRESETRATE=httpReq.getUrlParameter("INVRESETRATE");
if(INVRESETRATE==null)
INVRESETRATE="0";
A.setInvResetRate(CMath.s_int(CMLib.coffeeFilter().safetyFilter(INVRESETRATE)));
// IGNOREMASK
String IGNOREMASK=httpReq.getUrlParameter("IGNOREMASK");
if(IGNOREMASK==null)
IGNOREMASK="";
A.setIgnoreMask(CMLib.coffeeFilter().safetyFilter(IGNOREMASK));
if(A instanceof AutoGenArea)
{
String AGXMLPATH=httpReq.getUrlParameter("AGXMLPATH");
if(AGXMLPATH==null)
AGXMLPATH="";
((AutoGenArea) A).setGeneratorXmlPath(CMLib.coffeeFilter().safetyFilter(AGXMLPATH));
String AGAUTOVAR=httpReq.getUrlParameter("AGAUTOVAR");
if(AGAUTOVAR==null)
AGAUTOVAR="";
((AutoGenArea) A).setAutoGenVariables(CMLib.coffeeFilter().safetyFilter(AGAUTOVAR));
}
// PRICEFACTORS
num=1;
if(httpReq.isUrlParameter("IPRIC1"))
{
final Vector<String> prics=new Vector<String>();
String DOUBLE=httpReq.getUrlParameter("IPRIC"+num);
String MASK=httpReq.getUrlParameter("IPRICM"+num);
while((DOUBLE!=null)&&(MASK!=null))
{
if(CMath.isNumber(DOUBLE))
prics.addElement((DOUBLE+" "+MASK).trim());
num++;
DOUBLE=httpReq.getUrlParameter("IPRIC"+num);
MASK=httpReq.getUrlParameter("IPRICM"+num);
}
((Economics)A).setItemPricingAdjustments(CMParms.toStringArray(prics));
}
// modify Parent Area list
while(A.getParents().hasMoreElements())
A.removeParent(A.getParents().nextElement());
for(int i=1;;i++)
if(httpReq.isUrlParameter("PARENT"+(Integer.toString(i))))
{
final Area parent=CMLib.map().getArea(httpReq.getUrlParameter("PARENT"+(Integer.toString(i))));
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.";
}
}
else
break;
// modify Child Area list
while(A.getChildren().hasMoreElements())
A.removeChild(A.getChildren().nextElement());
for(int i=1;;i++)
if(httpReq.isUrlParameter("CHILDREN"+(Integer.toString(i))))
{
final Area child=CMLib.map().getArea(httpReq.getUrlParameter("CHILDREN"+(Integer.toString(i))));
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.";
}
else
break;
}
String error=GrinderAreas.doAffects(A,httpReq,parms);
if(error.length()>0)
return error;
error=GrinderAreas.doBehavs(A,httpReq,parms);
if(error.length()>0)
return error;
if((redoAllMyDamnRooms)&&(allMyDamnRooms!=null))
CMLib.map().renameRooms(A,oldName,allMyDamnRooms);
for(int i=0;i<areasNeedingUpdates.size();i++) // will always include A
{
final Area A2=areasNeedingUpdates.elementAt(i);
if(CMLib.flags().isSavable(A2))
{
CMLib.database().DBUpdateArea(A2.Name(),A2);
CMLib.coffeeMaker().addAutoPropsToAreaIfNecessary(A2);
}
}
return "";
}
}