package com.planet_ink.coffee_mud.WebMacros.grinder;
import com.planet_ink.coffee_web.interfaces.*;
import com.planet_ink.coffee_mud.WebMacros.RoomData;
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.
*/
@SuppressWarnings({"unchecked","rawtypes"})
public class GrinderMobs
{
public enum MOBDataField
{
NAME,CLASSES,DISPLAYTEXT,DESCRIPTION,
LEVEL(false),ABILITY(false),REJUV(false),MISCTEXT(false),
RACE,GENDER,HEIGHT,WEIGHT,
SPEED,ATTACK,DAMAGE,ARMOR,
ALIGNMENT,MONEY,ISRIDEABLE,RIDEABLETYPE,
MOBSHELD,ISSHOPKEEPER,SHOPKEEPERTYPE,ISGENERIC,
ISBANKER,COININT,ITEMINT,BANKNAME,SHOPPREJ,
ISDEITY,CLEREQ,CLERIT,WORREQ,WORRIT,
CLESIN,WORSIN,CLEPOW,CURSES,POWERS,
CLANID,TATTOOS,EXPERTISES,
BUDGET,DEVALRATE,INVRESETRATE,IMAGE,
ISPOSTMAN,POSTCHAIN,POSTMIN,POSTLBS,
POSTHOLD,POSTNEW,POSTHELD,IGNOREMASK,
LOANINT,SVCRIT,AUCCHAIN,LIVELIST,TIMELIST,
TIMELISTPCT,LIVECUT,TIMECUT,MAXDAYS,
MINDAYS,ISAUCTION,DEITYID,VARMONEY,
CATACAT;
public boolean isGenField;
private MOBDataField(boolean isGeneric)
{
this.isGenField=isGeneric;
}
private MOBDataField()
{
isGenField = true;
}
}
public static String senses(Physical P, HTTPRequest httpReq, java.util.Map<String,String> parms)
{
P.basePhyStats().setSensesMask(0);
for(int d=0;d<PhyStats.CAN_SEE_CODES.length;d++)
{
final String parm=httpReq.getUrlParameter(PhyStats.CAN_SEE_CODES[d]);
if((parm!=null)&&(parm.equals("on")))
P.basePhyStats().setSensesMask(P.basePhyStats().sensesMask()|(1<<d));
}
return "";
}
public static void happilyAddItem(Item I, MOB M)
{
if(I.subjectToWearAndTear() && ((I.usesRemaining()<1)||(I.usesRemaining()>100)))
I.setUsesRemaining(100);
I.recoverPhyStats();
M.addItem(I);
M.recoverPhyStats();
M.recoverCharStats();
M.recoverMaxState();
}
public static String abilities(MOB M, HTTPRequest httpReq, java.util.Map<String,String> parms)
{
final boolean player=M.playerStats()!=null;
final LinkedList<Ability> onesToDel=new LinkedList<Ability>();
for(int a=0;a<M.numAbilities();a++)
{
final Ability A=M.fetchAbility(a);
if((A!=null)&&((!player)||(A.isSavable())))
onesToDel.add(A);
}
for (final Ability A : onesToDel)
{
if(M.fetchEffect(A.ID())!=null)
M.delEffect(M.fetchEffect(A.ID()));
M.delAbility(A);
}
if(httpReq.isUrlParameter("ABLES1"))
{
int num=1;
String aff=httpReq.getUrlParameter("ABLES"+num);
while(aff!=null)
{
if(aff.length()>0)
{
final Ability B=CMClass.getAbility(aff);
if(B==null)
return "Unknown Ability '"+aff+"'.";
else
{
if(player)
{
String prof=httpReq.getUrlParameter("ABPOF"+num);
if(prof==null)
prof="0";
String txt=httpReq.getUrlParameter("ABTXT"+num);
if(txt==null)
txt="";
B.setProficiency(CMath.s_int(prof));
B.setMiscText(txt);
}
M.addAbility(B);
B.autoInvocation(M, false);
}
}
num++;
aff=httpReq.getUrlParameter("ABLES"+num);
}
}
return "";
}
public static String factions(MOB E, HTTPRequest httpReq, java.util.Map<String,String> parms)
{
for(final Enumeration e=E.factions();e.hasMoreElements();)
{
final String strip=(String)e.nextElement();
E.removeFaction(strip);
}
if(httpReq.isUrlParameter("FACTION1"))
{
int num=1;
String whichFaction=httpReq.getUrlParameter("FACTION"+num);
String howMuch=httpReq.getUrlParameter("FACTDATA"+num);
while((whichFaction!=null)&&(howMuch!=null))
{
if(whichFaction.length()>0)
{
final Faction F=CMLib.factions().getFaction(whichFaction);
if(F!=null)
{
int amt=Integer.valueOf(howMuch).intValue();
if(amt<F.minimum())
amt=F.minimum();
if(amt>F.maximum())
amt=F.maximum();
E.addFaction(F.factionID(),amt);
}
}
num++;
whichFaction=httpReq.getUrlParameter("FACTION"+num);
howMuch=httpReq.getUrlParameter("FACTDATA"+num);
}
}
return "";
}
public static String blessings(Deity E, HTTPRequest httpReq, java.util.Map<String,String> parms)
{
while(E.numBlessings()>0)
{
final Ability A=E.fetchBlessing(0);
if(A!=null)
E.delBlessing(A);
}
if(httpReq.isUrlParameter("BLESS1"))
{
int num=1;
String aff=httpReq.getUrlParameter("BLESS"+num);
while(aff!=null)
{
if(aff.length()>0)
{
final boolean clericOnly=(httpReq.isUrlParameter("BLONLY"+num))&&(httpReq.getUrlParameter("BLONLY"+num)).equalsIgnoreCase("on");
final Ability B=CMClass.getAbility(aff);
if(B==null)
return "Unknown Blessing '"+aff+"'.";
else
E.addBlessing(B,clericOnly);
}
num++;
aff=httpReq.getUrlParameter("BLESS"+num);
}
}
return "";
}
public static String clans(MOB E, HTTPRequest httpReq, java.util.Map<String,String> parms)
{
final List<String> clans=new Vector<String>();
for(final Pair<Clan,Integer> p : E.clans())
clans.add(p.first.clanID());
for(final String clanID : clans)
E.setClan(clanID, -1);
if(httpReq.isUrlParameter("CLAN1"))
{
int num=1;
String aff=httpReq.getUrlParameter("CLAN"+num);
while(aff!=null)
{
if(aff.length()>0)
{
final int role=CMath.s_int(httpReq.getUrlParameter("CLANROLE"+num));
final Clan C=CMLib.clans().getClan(aff);
if(C==null)
return "Unknown Clan '"+aff+"'.";
else
E.setClan(C.clanID(), role);
}
num++;
aff=httpReq.getUrlParameter("CLAN"+num);
}
}
return "";
}
public static String curses(Deity E, HTTPRequest httpReq, java.util.Map<String,String> parms)
{
while(E.numCurses()>0)
{
final Ability A=E.fetchCurse(0);
if(A!=null)
E.delCurse(A);
}
if(httpReq.isUrlParameter("CURSE1"))
{
int num=1;
String aff=httpReq.getUrlParameter("CURSE"+num);
while(aff!=null)
{
if(aff.length()>0)
{
final Ability B=CMClass.getAbility(aff);
final boolean clericOnly=(httpReq.isUrlParameter("CUONLY"+num))&&(httpReq.getUrlParameter("CUONLY"+num)).equalsIgnoreCase("on");
if(B==null)
return "Unknown Curse '"+aff+"'.";
else
E.addCurse(B,clericOnly);
}
num++;
aff=httpReq.getUrlParameter("CURSE"+num);
}
}
return "";
}
public static String expertiseList(MOB E, HTTPRequest httpReq, java.util.Map<String,String> parms)
{
E.delAllExpertises();
if(httpReq.isUrlParameter("EXPER1"))
{
int num=1;
String aff=httpReq.getUrlParameter("EXPER"+num);
while(aff!=null)
{
if(aff.length()>0)
{
final ExpertiseLibrary.ExpertiseDefinition def=CMLib.expertises().getDefinition(aff);
if(def==null)
return "Unknown Expertise '"+aff+"'.";
else
E.addExpertise(def.ID());
}
num++;
aff=httpReq.getUrlParameter("EXPER"+num);
}
}
return "";
}
public static String items(MOB M, Vector<Item> allitems, HTTPRequest httpReq)
{
if(httpReq.isUrlParameter("ITEM1"))
{
final Vector<Item> items=new Vector<Item>();
final Vector<String> cstrings=new Vector<String>();
for(int i=1;;i++)
{
final String MATCHING=httpReq.getUrlParameter("ITEM"+i);
final String WORN=httpReq.getUrlParameter("ITEMWORN"+i);
if(MATCHING==null)
break;
Item I2=RoomData.getItemFromAnywhere(allitems,MATCHING);
if(I2!=null)
{
if(!CMath.isNumber(MATCHING))
I2=(Item)I2.copyOf();
if(I2!=null)
{
CMLib.flags().setSavable(I2, true);
final boolean worn=((WORN!=null)&&(WORN.equalsIgnoreCase("on")));
I2.setContainer(null);
I2.unWear();
if(worn)
I2.wearEvenIfImpossible(M);
happilyAddItem(I2,M);
items.addElement(I2);
I2.setContainer(null);
final String CONTAINER=httpReq.getUrlParameter("ITEMCONT"+i);
cstrings.addElement((CONTAINER==null)?"":CONTAINER);
}
}
}
for(int i=0;i<cstrings.size();i++)
{
final String CONTAINER=cstrings.elementAt(i);
if(CONTAINER.length()==0)
continue;
final Item I2=items.elementAt(i);
final Item C2=(Item)CMLib.english().fetchEnvironmental(items,CONTAINER,true);
if(C2 instanceof Container)
I2.setContainer((Container)C2);
}
for(int i=0;i<allitems.size();i++)
{
final Item I=allitems.elementAt(i);
if(!M.isMine(I))
{
I.setOwner(M);
I.destroy();
}
}
for(int i=0;i<M.numItems();i++)
{
final Item I=M.getItem(i);
if((I.container()!=null)&&(!M.isMine(I.container())))
I.setContainer(null);
}
return "";
}
return "No Item Data!";
}
public static String powers(Deity E, HTTPRequest httpReq, java.util.Map<String,String> parms)
{
while(E.numPowers()>0)
{
final Ability A=E.fetchPower(0);
if(A!=null)
E.delPower(A);
}
if(httpReq.isUrlParameter("POWER1"))
{
int num=1;
String aff=httpReq.getUrlParameter("POWER"+num);
while(aff!=null)
{
if(aff.length()>0)
{
final Ability B=CMClass.getAbility(aff);
if(B==null)
return "Unknown Power '"+aff+"'.";
else
E.addPower(B);
}
num++;
aff=httpReq.getUrlParameter("POWER"+num);
}
}
return "";
}
public static String editMob(HTTPRequest httpReq, java.util.Map<String,String> parms, MOB whom, Room R)
{
final String mobCode=httpReq.getUrlParameter("MOB");
if(mobCode==null)
return "@break@";
final String newClassID=httpReq.getUrlParameter("CLASSES");
CatalogLibrary.CataData cataData=null;
synchronized(("SYNC"+((R!=null)?R.roomID():"null")).intern())
{
if(R!=null)
{
R=CMLib.map().getRoom(R);
CMLib.map().resetRoom(R);
}
MOB M=null;
if(mobCode.equals("NEW")||mobCode.equals("NEWDEITY")||mobCode.startsWith("NEWCATA-"))
M=CMClass.getMOB(newClassID);
else
M=RoomData.getMOBFromCode(R,mobCode);
if(M==null)
{
final StringBuffer str=new StringBuffer("No MOB?!");
str.append(" Got: "+mobCode);
str.append(", Includes: ");
if(R!=null)
{
for(int m=0;m<R.numInhabitants();m++)
{
final MOB M2=R.fetchInhabitant(m);
if((M2!=null)&&(M2.isSavable()))
str.append(M2.Name()+"="+RoomData.getMOBCode(R,M2));
}
}
return str.toString();
}
final MOB oldM=M;
if((newClassID!=null)&&(!newClassID.equals(CMClass.classID(M))))
M=CMClass.getMOB(newClassID);
M.setStartRoom(R);
final Vector<Item> allitems=new Vector<Item>();
while(oldM.numItems()>0)
{
final Item I=oldM.getItem(0);
allitems.addElement(I);
oldM.delItem(I);
}
MOB copyMOB=(MOB)M.copyOf();
for(MOBDataField o : MOBDataField.values())
{
final String parmName=o.name();
boolean generic=o.isGenField;
String old=httpReq.getUrlParameter(parmName);
if(old==null)
old="";
if((M.isGeneric()||(!generic)))
switch(o)
{
case NAME: // name
M.setName(old);
break;
case CLASSES: // classes
break;
case DISPLAYTEXT: // displaytext
M.setDisplayText(old);
break;
case DESCRIPTION: // description
M.setDescription(old);
break;
case LEVEL: // level
M.basePhyStats().setLevel(CMath.s_int(old));
break;
case ABILITY: // ability;
M.basePhyStats().setAbility(CMath.s_int(old));
break;
case REJUV: // rejuv;
M.basePhyStats().setRejuv(CMath.s_int(old));
break;
case MISCTEXT: // misctext
if(!M.isGeneric())
M.setMiscText(old);
break;
case RACE: // race
M.baseCharStats().setMyRace(CMClass.getRace(old));
break;
case GENDER: // gender
M.baseCharStats().setStat(CharStats.STAT_GENDER,old.charAt(0));
break;
case HEIGHT: // height
M.basePhyStats().setHeight(CMath.s_int(old));
break;
case WEIGHT: // weight;
M.basePhyStats().setWeight(CMath.s_int(old));
break;
case SPEED: // speed
double d=CMath.s_double(old);
if(d<0.0)
d=1.0;
M.basePhyStats().setSpeed(d);
break;
case ATTACK: // attack
M.basePhyStats().setAttackAdjustment(CMath.s_int(old));
break;
case DAMAGE: // damage
M.basePhyStats().setDamage(CMath.s_int(old));
break;
case ARMOR: // armor
M.basePhyStats().setArmor(CMath.s_int(old));
break;
case ALIGNMENT: // alignment
for(final Faction.Align v : Faction.Align.values())
if(old.equalsIgnoreCase(v.toString()))
CMLib.factions().setAlignment(M,v);
break;
case MONEY: // money
CMLib.beanCounter().setMoney(M,CMath.s_int(old));
break;
case ISRIDEABLE: // is rideable
break;
case RIDEABLETYPE: // rideable type
if(M instanceof Rideable)
((Rideable)M).setRideBasis(CMath.s_int(old));
break;
case MOBSHELD: // mobs held
if(M instanceof Rideable)
((Rideable)M).setRiderCapacity(CMath.s_int(old));
break;
case ISSHOPKEEPER: // is shopkeeper
break;
case SHOPKEEPERTYPE: // shopkeeper type
if(M instanceof ShopKeeper)
{
((ShopKeeper)M).setWhatIsSoldMask(0);
((ShopKeeper)M).addSoldType(CMath.s_int(old));
int x=1;
while(httpReq.getUrlParameter(parmName+x)!=null)
{
((ShopKeeper)M).addSoldType(CMath.s_int(httpReq.getUrlParameter(parmName+x)));
x++;
}
}
break;
case ISGENERIC: // is generic
break;
case ISBANKER: // is banker
break;
case COININT: // coin interest
if(M instanceof Banker)
((Banker)M).setCoinInterest(CMath.s_double(old));
break;
case ITEMINT: // item interest
if(M instanceof Banker)
((Banker)M).setItemInterest(CMath.s_double(old));
break;
case BANKNAME: // bank name
if(M instanceof Banker)
((Banker)M).setBankChain(old);
break;
case SHOPPREJ: // shopkeeper prejudices
if(M instanceof ShopKeeper)
((ShopKeeper)M).setPrejudiceFactors(old);
break;
case ISDEITY: // is deity
break;
case CLEREQ: // cleric requirements
if(M instanceof Deity)
((Deity)M).setClericRequirements(old);
break;
case CLERIT: // cleric ritual
if(M instanceof Deity)
((Deity)M).setClericRitual(old);
break;
case WORREQ: // worshipper requirements
if(M instanceof Deity)
((Deity)M).setWorshipRequirements(old);
break;
case WORRIT: // worshipper ritual
if(M instanceof Deity)
((Deity)M).setWorshipRitual(old);
break;
case CLESIN: // cleric sins
if(M instanceof Deity)
((Deity)M).setClericSin(old);
break;
case WORSIN: // worshipper sins
if(M instanceof Deity)
((Deity)M).setWorshipSin(old);
break;
case CLEPOW: // cleric power
if(M instanceof Deity)
((Deity)M).setClericPowerup(old);
break;
case CURSES: // curses
break;
case POWERS: // powers
break;
case CLANID: // clanid
{
final List<String> list=CMParms.parseCommas(old,true);
M.setClan("", Integer.MIN_VALUE); // signal to clear the list
for(String entry : list)
{
entry=entry.trim();
String clanID=entry;
int role=-1;
final int x=entry.lastIndexOf('(');
if(x>0)
{
clanID=entry.substring(0,x).trim();
if(entry.endsWith(")"))
role=CMath.s_int(entry.substring(x+1,entry.length()-1));
else
role=CMath.s_int(entry.substring(x+1));
}
Clan C=CMLib.clans().getClan(clanID);
if(C==null)
C=CMLib.clans().findClan(clanID);
if(C!=null)
{
if(role<0)
role=C.getGovernment().getAcceptPos();
M.setClan(C.clanID(), role);
}
}
break;
}
case TATTOOS: // tattoos
{
final List<String> V=CMParms.parseSemicolons(old,true);
for(final Enumeration<Tattoo> e=M.tattoos();e.hasMoreElements();)
M.delTattoo(e.nextElement());
for(int v=0;v<V.size();v++)
M.addTattoo(CMLib.database().parseTattoo(V.get(v)));
}
break;
case EXPERTISES: // expertises
{
final List<String> V=CMParms.parseSemicolons(old,true);
M.delAllExpertises();
for(int v=0;v<V.size();v++)
M.addExpertise(V.get(v));
}
break;
case BUDGET: // budget
if(M instanceof ShopKeeper)
((ShopKeeper)M).setBudget(old);
break;
case DEVALRATE: // devaluation rate
if(M instanceof ShopKeeper)
((ShopKeeper)M).setDevalueRate(old);
break;
case INVRESETRATE: // inventory reset rate
if(M instanceof ShopKeeper)
((ShopKeeper)M).setInvResetRate(CMath.s_int(old));
break;
case IMAGE: // image
M.setImage(old);
break;
case ISPOSTMAN: // is postman
break;
case POSTCHAIN: // postal chain
if(M instanceof PostOffice)
((PostOffice)M).setPostalChain(old);
break;
case POSTMIN: // minimum postage
if(M instanceof PostOffice)
((PostOffice)M).setMinimumPostage(CMath.s_double(old));
break;
case POSTLBS: // postage per pound after first
if(M instanceof PostOffice)
((PostOffice)M).setPostagePerPound(CMath.s_double(old));
break;
case POSTHOLD: // holding fee per pound per month
if(M instanceof PostOffice)
((PostOffice)M).setHoldFeePerPound(CMath.s_double(old));
break;
case POSTNEW: // new box fee
if(M instanceof PostOffice)
((PostOffice)M).setFeeForNewBox(CMath.s_double(old));
break;
case POSTHELD: // maximum months held
if(M instanceof PostOffice)
((PostOffice)M).setMaxMudMonthsHeld(CMath.s_int(old));
break;
case IGNOREMASK: // shopkeeper ignore mask
if(M instanceof ShopKeeper)
((ShopKeeper)M).setIgnoreMask(old);
break;
case LOANINT: // loan interest
if((M instanceof Banker)&&(old.length()>0))
((Banker)M).setLoanInterest(CMath.s_double(old));
break;
case SVCRIT: // service ritual
if(M instanceof Deity)
((Deity)M).setServiceRitual(old);
break;
case AUCCHAIN: // auction house
if(M instanceof Auctioneer)
((Auctioneer)M).setAuctionHouse(old);
break;
case LIVELIST: // live list
//if(M instanceof Auctioneer)
// if(old.length()==0)
// ((Auctioneer)M).setLiveListingPrice(-1.0);
// else
// ((Auctioneer)M).setLiveListingPrice(CMath.s_double(old));
break;
case TIMELIST: // timed list
if(M instanceof Auctioneer)
if(old.length()==0)
((Auctioneer)M).setTimedListingPrice(-1.0);
else
((Auctioneer)M).setTimedListingPrice(CMath.s_double(old));
break;
case TIMELISTPCT: // timed list pct
if(M instanceof Auctioneer)
if(old.length()==0)
((Auctioneer)M).setTimedListingPct(-1.0);
else
((Auctioneer)M).setTimedListingPct(CMath.s_pct(old));
break;
case LIVECUT: // live cut
//if(M instanceof Auctioneer)
// if(old.length()==0)
// ((Auctioneer)M).setLiveFinalCutPct(-1.0);
// else
// ((Auctioneer)M).setLiveFinalCutPct(CMath.s_pct(old));
break;
case TIMECUT: // timed cut
if(M instanceof Auctioneer)
if(old.length()==0)
((Auctioneer)M).setTimedFinalCutPct(-1.0);
else
((Auctioneer)M).setTimedFinalCutPct(CMath.s_pct(old));
break;
case MAXDAYS: // max days
if(M instanceof Auctioneer)
if(old.length()==0)
((Auctioneer)M).setMaxTimedAuctionDays(-1);
else
((Auctioneer)M).setMaxTimedAuctionDays(CMath.s_int(old));
break;
case MINDAYS: // min days
if(M instanceof Auctioneer)
if(old.length()==0)
((Auctioneer)M).setMinTimedAuctionDays(-1);
else
((Auctioneer)M).setMinTimedAuctionDays(CMath.s_int(old));
break;
case ISAUCTION: // is auction
break;
case DEITYID: // deity
/*
if(old.length()==0)
M.setWorshipCharID("");
else
if(CMLib.map().getDeity(old)!=null)
M.setWorshipCharID(CMLib.map().getDeity(old).Name());
*/
break;
case VARMONEY: // money variation
M.setMoneyVariation(CMath.s_double(old));
break;
case CATACAT: // catacat
if(mobCode.startsWith("CATALOG-")||mobCode.startsWith("NEWCATA-"))
{
if(cataData==null)
cataData=CMLib.catalog().sampleCataData("");
cataData.setCategory(old.toUpperCase().trim());
}
break;
}
}
if(M.isGeneric())
{
String error=GrinderExits.dispositions(M,httpReq,parms);
if(error.length()>0)
return error;
error=GrinderMobs.senses(M,httpReq,parms);
if(error.length()>0)
return error;
error=GrinderAreas.doAffects(M,httpReq,parms);
if(error.length()>0)
return error;
error=GrinderAreas.doBehavs(M,httpReq,parms);
if(error.length()>0)
return error;
error=GrinderMobs.factions(M,httpReq,parms);
if(error.length()>0)
return error;
error=GrinderMobs.abilities(M,httpReq,parms);
if(error.length()>0)
return error;
error=GrinderMobs.clans(M,httpReq,parms);
if(error.length()>0)
return error;
if(M instanceof Deity)
{
error=GrinderMobs.blessings((Deity)M,httpReq,parms);
if(error.length()>0)
return error;
error=GrinderMobs.curses((Deity)M,httpReq,parms);
if(error.length()>0)
return error;
error=GrinderMobs.powers((Deity)M,httpReq,parms);
if(error.length()>0)
return error;
}
error=GrinderMobs.items(M,allitems,httpReq);
if(error.length()>0)
return error;
if((M instanceof ShopKeeper)
&&(httpReq.isUrlParameter("SHP1")))
{
final ShopKeeper SK=(ShopKeeper)M;
final XVector inventory=new XVector(SK.getShop().getStoreInventory());
SK.getShop().emptyAllShelves();
int num=1;
String MATCHING=httpReq.getUrlParameter("SHP"+num);
String theparm=httpReq.getUrlParameter("SDATA"+num);
String theprice=httpReq.getUrlParameter("SPRIC"+num);
while((MATCHING!=null)&&(theparm!=null))
{
if(CMath.isNumber(MATCHING)&&(inventory.size()>0))
{
final Environmental O=(Environmental)inventory.elementAt(CMath.s_int(MATCHING)-1);
if(O!=null)
SK.getShop().addStoreInventory(O,CMath.s_int(theparm),CMath.s_int(theprice));
}
else
if(MATCHING.startsWith("CATALOG-"))
{
Environmental O=RoomData.getMOBFromCatalog(MATCHING);
if(O==null)
O=RoomData.getItemFromAnywhere(null,MATCHING);
if(O!=null)
SK.getShop().addStoreInventory((Environmental)O.copyOf(),CMath.s_int(theparm),CMath.s_int(theprice));
}
else
if(MATCHING.indexOf('@')>0)
{
Environmental O=null;
for (final MOB M2 : RoomData.getMOBCache())
{
if(MATCHING.equals(""+M2))
{ O=M2; break; }
}
if(O==null)
O=RoomData.getItemFromAnywhere(null,MATCHING);
if(O!=null)
SK.getShop().addStoreInventory((Environmental)O.copyOf(),CMath.s_int(theparm),CMath.s_int(theprice));
}
else
{
Environmental O=null;
for(final Enumeration m=CMClass.mobTypes();m.hasMoreElements();)
{
final MOB M2=(MOB)m.nextElement();
if(CMClass.classID(M2).equals(MATCHING)&&(!M2.isGeneric()))
{ O=(MOB)M2.copyOf(); break; }
}
if(O==null)
for(final Enumeration<Ability> a=CMClass.abilities();a.hasMoreElements();)
{
final Ability A2=a.nextElement();
if(CMClass.classID(A2).equals(MATCHING))
{ O=(Ability)A2.copyOf(); break; }
}
if(O==null)
O=RoomData.getItemFromAnywhere(null,MATCHING);
if(O!=null)
SK.getShop().addStoreInventory((Environmental)O.copyOf(),CMath.s_int(theparm),CMath.s_int(theprice));
}
num++;
MATCHING=httpReq.getUrlParameter("SHP"+num);
theparm=httpReq.getUrlParameter("SDATA"+num);
theprice=httpReq.getUrlParameter("SPRIC"+num);
}
}
int num=1;
if((M instanceof Economics)
&&(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)M).setItemPricingAdjustments(CMParms.toStringArray(prics));
}
}
M.recoverPhyStats();
M.recoverCharStats();
M.recoverMaxState();
M.resetToMaxState();
M.text();
String newMobCode=null;
if(R==null)
{
if(mobCode.startsWith("CATALOG-")||mobCode.startsWith("NEWCATA-"))
{
final MOB M2=CMLib.catalog().getCatalogMob(mobCode.substring(8));
if((M2!=null)&&(!M.Name().equalsIgnoreCase(M2.Name())))
M.setName(M2.Name());
newMobCode=mobCode;
if(M2==null)
{
String category=null;
if(cataData!=null)
category=cataData.category();
CMLib.catalog().addCatalog(category,M);
Log.infoOut("GrinderItems",whom.Name()+" created catalog MOB "+M.Name());
}
else
{
if(cataData!=null)
{
final CatalogLibrary.CataData data=CMLib.catalog().getCatalogMobData(M.Name());
data.build(cataData.data(null));
}
CMLib.catalog().updateCatalog(M);
Log.infoOut("GrinderItems",whom.Name()+" updated catalog MOB "+M.Name());
}
copyMOB=M;
}
else
{
RoomData.contributeMOBs(new XVector(M));
final MOB M2=RoomData.getReferenceMOB(M);
newMobCode=RoomData.getMOBCode(RoomData.getMOBCache(),M2);
}
}
else
{
if(mobCode.equals("NEW")||mobCode.equals("NEWDEITY"))
{
M.bringToLife(R,true);
}
else
if(M!=oldM)
{
oldM.destroy();
R.delInhabitant(oldM);
M.bringToLife(R,true);
}
R.recoverRoomStats();
CMLib.database().DBUpdateMOBs(R);
newMobCode=RoomData.getMOBCode(R,M);
}
httpReq.addFakeUrlParameter("MOB",newMobCode);
if(!copyMOB.sameAs(M))
Log.sysOut("Grinder",whom.Name()+" modified mob "+copyMOB.Name()+((R!=null)?" in room "+R.roomID():"")+".");
}
return "";
}
}