/
com/planet_ink/coffee_mud/Abilities/
com/planet_ink/coffee_mud/Abilities/Common/
com/planet_ink/coffee_mud/Abilities/Diseases/
com/planet_ink/coffee_mud/Abilities/Druid/
com/planet_ink/coffee_mud/Abilities/Fighter/
com/planet_ink/coffee_mud/Abilities/Prayers/
com/planet_ink/coffee_mud/Abilities/Properties/
com/planet_ink/coffee_mud/Abilities/Skills/
com/planet_ink/coffee_mud/Abilities/Songs/
com/planet_ink/coffee_mud/Abilities/Spells/
com/planet_ink/coffee_mud/Abilities/Thief/
com/planet_ink/coffee_mud/Abilities/Traps/
com/planet_ink/coffee_mud/Areas/interfaces/
com/planet_ink/coffee_mud/Behaviors/
com/planet_ink/coffee_mud/CharClasses/interfaces/
com/planet_ink/coffee_mud/Commands/
com/planet_ink/coffee_mud/Commands/interfaces/
com/planet_ink/coffee_mud/Exits/interfaces/
com/planet_ink/coffee_mud/Items/Armor/
com/planet_ink/coffee_mud/Items/Basic/
com/planet_ink/coffee_mud/Items/MiscMagic/
com/planet_ink/coffee_mud/Items/Software/
com/planet_ink/coffee_mud/Items/Weapons/
com/planet_ink/coffee_mud/Libraries/interfaces/
com/planet_ink/coffee_mud/Locales/
com/planet_ink/coffee_mud/Locales/interfaces/
com/planet_ink/coffee_mud/MOBS/
com/planet_ink/coffee_mud/MOBS/interfaces/
com/planet_ink/coffee_mud/Races/
com/planet_ink/coffee_mud/Races/interfaces/
com/planet_ink/coffee_mud/WebMacros/
com/planet_ink/coffee_mud/WebMacros/interfaces/
com/planet_ink/coffee_mud/application/
com/planet_ink/coffee_mud/core/smtp/
com/planet_ink/siplet/applet/
lib/
resources/examples/
resources/fakedb/
resources/quests/delivery/
resources/quests/diseased/
resources/quests/drowning/
resources/quests/gobwar/
resources/quests/robbed/
resources/quests/smurfocide/
resources/quests/stolen/
resources/quests/templates/
resources/quests/templates/delivery/
resources/quests/templates/invasion/
resources/quests/treasurehunt/
resources/quests/vengeance/
resources/scripts/EN_TX/
web/
web/admin.templates/
web/admin/images/
web/pub.templates/
web/pub/images/mxp/
web/pub/sounds/
package com.planet_ink.coffee_mud.Commands;
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 java.util.*;
import java.io.ByteArrayInputStream;
import java.io.IOException;


/*
   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 BaseGenerics extends StdCommand
{
	private static final long maxLength=Long.MAX_VALUE;
	// showNumber should always be a valid number no less than 1
	// showFlag should be a valid number for editing, or -1 for skipping

	static void genName(MOB mob, Environmental E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","Name",showNumber+"",E.Name()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","enternewone"),"");
		if(newName.length()>0)
			E.setName(newName);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}

	static void genImage(MOB mob, Environmental E, int showNumber, int showFlag)
	throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","mxpfile",showNumber+"",E.rawImage()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","enterfile"),"");
		if(newName.length()>0)
			E.setImage(newName);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}

	static void genCorpseData(MOB mob, DeadBody E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","corpsedata",showNumber+"",E.mobName(),E.killerName()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
        mob.tell(getScr("BaseGenerics","deadMobname",E.mobName()));
		String newName=mob.session().prompt(getScr("BaseGenerics","enternewname"),"");
		if(newName.length()>0) E.setMobName(newName);
		else mob.tell(getScr("BaseGenerics","nochange"));
		mob.tell(getScr("BaseGenerics","deadMobd",E.mobDescription()));
		newName=mob.session().prompt(getScr("BaseGenerics","enterd"),"");
		if(newName.length()>0) E.setMobDescription(newName);
		else mob.tell(getScr("BaseGenerics","nochange"));
        mob.tell(getScr("BaseGenerics","deadmobplayercorpse",""+E.playerCorpse()));
        newName=mob.session().prompt(getScr("BaseGenerics","truefalse"),"");
        if((newName.length()>0)&&(newName.equalsIgnoreCase("true")||newName.equalsIgnoreCase("false")))
            E.setPlayerCorpse(Boolean.valueOf(newName.toLowerCase()).booleanValue());
        else mob.tell(getScr("BaseGenerics","nochange"));
        mob.tell(getScr("BaseGenerics","deadmobpkflag",""+E.mobPKFlag()));
        newName=mob.session().prompt(getScr("BaseGenerics","truefalse"),"");
        if((newName.length()>0)&&(newName.equalsIgnoreCase("true")||newName.equalsIgnoreCase("false")))
            E.setMobPKFlag(Boolean.valueOf(newName.toLowerCase()).booleanValue());
        else mob.tell(getScr("BaseGenerics","nochange"));
        genCharStats(mob,E.charStats());
		mob.tell(getScr("BaseGenerics","killersname",E.killerName()));
		newName=mob.session().prompt(getScr("BaseGenerics","enterk"),"");
		if(newName.length()>0) E.setKillerName(newName);
		else mob.tell(getScr("BaseGenerics","nochange"));
        mob.tell(getScr("BaseGenerics","deadmobkillerplayer",""+E.killerPlayer()));
        newName=mob.session().prompt(getScr("BaseGenerics","truefalse"),"");
        if((newName.length()>0)&&(newName.equalsIgnoreCase("true")||newName.equalsIgnoreCase("false")))
            E.setKillerPlayer(Boolean.valueOf(newName.toLowerCase()).booleanValue());
        else mob.tell(getScr("BaseGenerics","nochange"));
        mob.tell(getScr("BaseGenerics","deadmobtod",CMLib.time().date2String(E.timeOfDeath())));
        newName=mob.session().prompt(getScr("BaseGenerics","entvaluenew"),"");
        if(newName.length()>0) E.setTimeOfDeath(CMLib.time().string2Millis(newName));
        else mob.tell(getScr("BaseGenerics","nochange"));
        mob.tell(getScr("BaseGenerics","deadmoblastmsg",E.lastMessage()));
        newName=mob.session().prompt(getScr("BaseGenerics","entvaluenew"),"");
        if(newName.length()>0) E.setLastMessage(newName);
        else mob.tell(getScr("BaseGenerics","nochange"));
	}

	static void genAuthor(MOB mob, Area A, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","author",showNumber+"",A.getAuthorID()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","enternewone"),"");
		if(newName.length()>0)
			A.setAuthorID(newName);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}

	static void genPanelType(MOB mob, ShipComponent.ShipPanel S, int showNumber, int showFlag)
	throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		String componentType=CMStrings.capitalizeAndLower(ShipComponent.ShipPanel.COMPONENT_PANEL_DESC[S.panelType()].toLowerCase());
		mob.tell(getScr("BaseGenerics","paneltype",showNumber+"",componentType));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		boolean continueThis=true;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(continueThis))
		{
		    continueThis=false;
			String newName=mob.session().prompt(getScr("BaseGenerics","enter2"),"");
			if(newName.length()>0)
			{
			    if(newName.equalsIgnoreCase("?"))
			    {
			        mob.tell(getScr("BaseGenerics","comptypes",CMParms.toStringList(ShipComponent.ShipPanel.COMPONENT_PANEL_DESC)));
			        continueThis=true;
			    }
			    else
			    {
			        int newType=-1;
			        for(int i=0;i<ShipComponent.ShipPanel.COMPONENT_PANEL_DESC.length;i++)
			            if(ShipComponent.ShipPanel.COMPONENT_PANEL_DESC[i].equalsIgnoreCase(newName))
			                newType=i;
			        if(newType<0)
			        {
			            mob.tell(getScr("BaseGenerics","newnotrec",newName));
			            continueThis=true;
			        }
			        else
			            S.setPanelType(newType);
			    }
			}
			else
				mob.tell(getScr("BaseGenerics","nochange"));
		}
	}

	static void genCurrency(MOB mob, Area A, int showNumber, int showFlag)
	throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		String currencyName=A.getCurrency().length()==0?"Default":A.getCurrency();
		mob.tell(getScr("BaseGenerics","currencyname",showNumber+"",currencyName));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","entdef"),"");
		if(newName.length()>0)
		{
		    if(newName.equalsIgnoreCase("default"))
		        A.setCurrency("");
		    else
		    if((newName.indexOf("=")<0)&&(!CMLib.beanCounter().getAllCurrencies().contains(newName.trim().toUpperCase())))
		    {
		        Vector V=CMLib.beanCounter().getAllCurrencies();
		        mob.tell(getScr("BaseGenerics","currencyerr",newName.trim().toUpperCase(),CMParms.toStringList(V)));
		    }
		    else
		    if(newName.indexOf("=")>=0)
		        A.setCurrency(newName.trim());
		    else
				A.setCurrency(newName.toUpperCase().trim());
		}
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}

	static void genTimeClock(MOB mob, Area A, int showNumber, int showFlag)
	throws IOException
	{

		if((showFlag>0)&&(showFlag!=showNumber)) return;
		TimeClock TC=A.getTimeObj();
		StringBuffer report=new StringBuffer("");
		if(TC==CMClass.globalClock())
			report.append(getScr("BaseGenerics","defaultant"));
		else
		{
		    report.append(getScr("BaseGenerics","hrsday",TC.getHoursInDay()+""));
		    report.append(getScr("BaseGenerics","daysmn",TC.getDaysInMonth()+""));
		    report.append(getScr("BaseGenerics","mthyrs",TC.getMonthsInYear()+""));
		}
		mob.tell(getScr("BaseGenerics","calendar",showNumber+"",report.toString()));
		if(TC==CMClass.globalClock()) return;
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName="";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(newName.length()==0))
		{
			report=new StringBuffer(getScr("BaseGenerics","calset"));
		    report.append(getScr("BaseGenerics","hoursperday",TC.getHoursInDay()+""));
		    report.append(getScr("BaseGenerics","dawnhour",TC.getDawnToDusk()[TimeClock.TIME_DAWN]+""));
		    report.append(getScr("BaseGenerics","dayhour",TC.getDawnToDusk()[TimeClock.TIME_DAY]+""));
		    report.append(getScr("BaseGenerics","duskhour",TC.getDawnToDusk()[TimeClock.TIME_DUSK]+""));
		    report.append(getScr("BaseGenerics","nighthour",TC.getDawnToDusk()[TimeClock.TIME_NIGHT]+""));
		    report.append(getScr("BaseGenerics","weekdays",CMParms.toStringList(TC.getWeekNames())));
		    report.append(getScr("BaseGenerics","months",CMParms.toStringList(TC.getMonthNames())));
		    report.append(getScr("BaseGenerics","yeartitle",CMParms.toStringList(TC.getYearNames())));
		    mob.tell(report.toString());
			newName=mob.session().prompt(getScr("BaseGenerics","entchange"),"");
			if(newName.length()==0) break;
			int which=CMath.s_int(newName);

			if((which<0)||(which>8))
				mob.tell(getScr("BaseGenerics","invalid",which+""));
			else
			if(which<=5)
			{
			    newName="";
			    String newNum=mob.session().prompt(getScr("BaseGenerics","entnumb"),"");
			    int val=CMath.s_int(newNum);
			    if(newNum.length()==0)
			        mob.tell(getScr("BaseGenerics","nochange"));
			    else
				switch(which)
			    {
		        case 1:
		            TC.setHoursInDay(val);
		            break;
		        case 2:
		            TC.getDawnToDusk()[TimeClock.TIME_DAWN]=val;
		            break;
		        case 3:
		            if((val>=0)&&(TC.getDawnToDusk()[TimeClock.TIME_DAWN]>=val))
                        mob.tell(getScr("BaseGenerics","dawnerr"));
		            else
			            TC.getDawnToDusk()[TimeClock.TIME_DAY]=val;
		            break;
		        case 4:
		            if((val>=0)&&(TC.getDawnToDusk()[TimeClock.TIME_DAWN]>=val))
                        mob.tell(getScr("BaseGenerics","dawnerr"));
		            else
		            if((val>=0)&&(TC.getDawnToDusk()[TimeClock.TIME_DAY]>=val))
                        mob.tell(getScr("BaseGenerics","dayerr"));
		            else
			            TC.getDawnToDusk()[TimeClock.TIME_DUSK]=val;
		            break;
		        case 5:
		            if((val>=0)&&(TC.getDawnToDusk()[TimeClock.TIME_DAWN]>=val))
                        mob.tell(getScr("BaseGenerics","dawnerr"));
		            else
		            if((val>=0)&&(TC.getDawnToDusk()[TimeClock.TIME_DAY]>=val))
                        mob.tell(getScr("BaseGenerics","dayerr"));
		            else
		            if((val>=0)&&(TC.getDawnToDusk()[TimeClock.TIME_DUSK]>=val))
                        mob.tell(getScr("BaseGenerics","duskerr"));
		            else
			            TC.getDawnToDusk()[TimeClock.TIME_NIGHT]=val;
		            break;
			    }
			}
			else
			{
			    newName="";
			    String newNum=mob.session().prompt(getScr("BaseGenerics","entlist"),"");
			    if(newNum.length()==0)
			        mob.tell(getScr("BaseGenerics","nochange"));
			    else
			    switch(which)
			    {
		        case 6:
		            TC.setDaysInWeek(CMParms.toStringArray(CMParms.parseCommas(newNum,true)));
		            break;
		        case 7:
		            TC.setMonthsInYear(CMParms.toStringArray(CMParms.parseCommas(newNum,true)));
		            break;
		        case 8:
		            TC.setYearNames(CMParms.toStringArray(CMParms.parseCommas(newNum,true)));
		            break;
			    }
			}
		}
		TC.save();
	}

	static void genClan(MOB mob, MOB E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag<=0)||(showFlag==showNumber))
		{
			mob.tell(getScr("BaseGenerics","clanid",showNumber+"",E.getClanID()));
			if((showFlag==showNumber)||(showFlag<=-999))
			{
				String newName=mob.session().prompt(getScr("BaseGenerics","entnull"),"");
				if(newName.equalsIgnoreCase("null"))
					E.setClanID("");
				else
				if(newName.length()>0)
				{
					E.setClanID(newName);
					E.setClanRole(Clan.POS_MEMBER);
				}
				else
					mob.tell(getScr("BaseGenerics","nochange"));
			}
		}
		if(((showFlag<=0)||(showFlag==showNumber))
		   &&(!E.isMonster())
		   &&(E.getClanID().length()>0)
		   &&(CMLib.clans().getClan(E.getClanID())!=null))
		{

			Clan C=CMLib.clans().getClan(E.getClanID());
			mob.tell(getScr("BaseGenerics","clanrole",showNumber+"",CMLib.clans().getRoleName(C.getGovernment(),E.getClanRole(),true,false)));
			if((showFlag==showNumber)||(showFlag<=-999))
			{
				String newName=mob.session().prompt(getScr("BaseGenerics","enternewone"),"");
				if(newName.length()>0)
				{
					int newRole=-1;
					for(int i=0;i<Clan.ROL_DESCS[C.getGovernment()].length;i++)
						if(newName.equalsIgnoreCase(Clan.ROL_DESCS[C.getGovernment()][i]))
						{
							newRole=(int)CMath.pow(2,i-1);
							break;
						}
					if(newRole<0)
						mob.tell(getScr("BaseGenerics","errrole",CMParms.toStringList(Clan.ROL_DESCS[C.getGovernment()])));
					else
						E.setClanRole(newRole);
				}
				else
					mob.tell(getScr("BaseGenerics","nochange"));
			}
		}
	}

	static void genArchivePath(MOB mob, Area E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","arcfilename",showNumber+"",E.getArchivePath()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","entnull2"),"");
		if(newName.equalsIgnoreCase("null"))
			E.setArchivePath("");
		else
		if(newName.length()>0)
			E.setArchivePath(newName);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}

	public static Room changeRoomType(Room R, Room newRoom)
	{
		if((R==null)||(newRoom==null)) return R;
		synchronized(("SYNC"+R.roomID()).intern())
		{
			R=CMLib.map().getRoom(R);
			Room oldR=R;
			R=newRoom;
	        Vector oldBehavsNEffects=new Vector();
			for(int a=oldR.numEffects()-1;a>=0;a--)
			{
				Ability A=oldR.fetchEffect(a);
				if(A!=null)
				{
	                if(!A.canBeUninvoked())
	                {
	                    oldBehavsNEffects.addElement(A);
	                    oldR.delEffect(A);
	                }
	                else
	    				A.unInvoke();
				}
			}
	        for(int b=0;b<oldR.numBehaviors();b++)
	        {
	            Behavior B=oldR.fetchBehavior(b);
	            if(B!=null)
	                oldBehavsNEffects.addElement(B);
	        }
			CMLib.threads().deleteTick(oldR,-1);
			R.setRoomID(oldR.roomID());
			Area A=oldR.getArea();
			if(A!=null) A.delProperRoom(oldR);
			R.setArea(A);
			for(int d=0;d<R.rawDoors().length;d++)
				R.rawDoors()[d]=oldR.rawDoors()[d];
			for(int d=0;d<R.rawExits().length;d++)
				R.rawExits()[d]=oldR.rawExits()[d];
			R.setDisplayText(oldR.displayText());
			R.setDescription(oldR.description());
			if((R instanceof GridLocale)&&(oldR instanceof GridLocale))
			{
				((GridLocale)R).setXGridSize(((GridLocale)oldR).xGridSize());
				((GridLocale)R).setYGridSize(((GridLocale)oldR).yGridSize());
				((GridLocale)R).clearGrid(null);
			}
			Vector allmobs=new Vector();
			int skip=0;
			while(oldR.numInhabitants()>(skip))
			{
				MOB M=oldR.fetchInhabitant(skip);
				if(M.savable())
				{
					if(!allmobs.contains(M))
						allmobs.addElement(M);
					oldR.delInhabitant(M);
				}
				else
				if(oldR!=R)
				{
					oldR.delInhabitant(M);
					R.bringMobHere(M,true);
				}
				else
					skip++;
			}
			Vector allitems=new Vector();
			while(oldR.numItems()>0)
			{
				Item I=oldR.fetchItem(0);
				if(!allitems.contains(I))
					allitems.addElement(I);
				oldR.delItem(I);
			}
	
			for(int i=0;i<allitems.size();i++)
			{
				Item I=(Item)allitems.elementAt(i);
				if(!R.isContent(I))
				{
					if(I.subjectToWearAndTear())
						I.setUsesRemaining(100);
					I.recoverEnvStats();
					R.addItem(I);
					R.recoverRoomStats();
				}
			}
			for(int m=0;m<allmobs.size();m++)
			{
				MOB M=(MOB)allmobs.elementAt(m);
				if(!R.isInhabitant(M))
				{
					MOB M2=(MOB)M.copyOf();
					M2.setStartRoom(R);
					M2.setLocation(R);
	                long rejuv=Tickable.TICKS_PER_RLMIN+Tickable.TICKS_PER_RLMIN+(Tickable.TICKS_PER_RLMIN/2);
	                if(rejuv>(Tickable.TICKS_PER_RLMIN*20)) rejuv=(Tickable.TICKS_PER_RLMIN*20);
					M2.envStats().setRejuv((int)rejuv);
					M2.recoverCharStats();
					M2.recoverEnvStats();
					M2.recoverMaxState();
					M2.resetToMaxState();
					M2.bringToLife(R,true);
					R.recoverRoomStats();
					M.destroy();
				}
			}
	
			try
			{
				for(Enumeration r=CMLib.map().rooms();r.hasMoreElements();)
				{
					Room R2=(Room)r.nextElement();
					for(int d=0;d<R2.rawDoors().length;d++)
						if(R2.rawDoors()[d]==oldR)
						{
							R2.rawDoors()[d]=R;
							if(R2 instanceof GridLocale)
								((GridLocale)R2).buildGrid();
						}
				}
		    }catch(NoSuchElementException e){}
		    try
		    {
				for(Enumeration e=CMLib.map().players();e.hasMoreElements();)
				{
					MOB M=(MOB)e.nextElement();
					if(M.getStartRoom()==oldR)
						M.setStartRoom(R);
					else
					if(M.location()==oldR)
						M.setLocation(R);
				}
		    }catch(NoSuchElementException e){}
			R.getArea().fillInAreaRoom(R);
	        for(int i=0;i<oldBehavsNEffects.size();i++)
	        {
	            if(oldBehavsNEffects.elementAt(i) instanceof Behavior)
	                R.addBehavior((Behavior)oldBehavsNEffects.elementAt(i));
	            else
	                R.addNonUninvokableEffect((Ability)oldBehavsNEffects.elementAt(i));
	        }
			CMLib.database().DBUpdateRoom(R);
			CMLib.database().DBUpdateMOBs(R);
			CMLib.database().DBUpdateItems(R);
	        oldR.destroy();
	        R.getArea().addProperRoom(R); // necessary because of the destroy
			R.setImage(R.rawImage());
			R.startItemRejuv();
		}
		return R;
	}

	static Room genRoomType(MOB mob, Room R, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return R;
		mob.tell(getScr("BaseGenerics","type",showNumber+"",CMClass.className(R)));
		if((showFlag!=showNumber)&&(showFlag>-999)) return R;
		String newName="";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(newName.length()==0))
		{
			newName=mob.session().prompt(getScr("BaseGenerics","enter2"),"");
			if(newName.trim().equals("?"))
			{
				mob.tell(CMLib.lister().reallyList2Cols(CMClass.locales(),-1,null).toString()+"\n\r");
				newName="";
			}
			else
			if(newName.length()>0)
			{
				Room newRoom=CMClass.getLocale(newName);
				if(newRoom==null)
					mob.tell(getScr("BaseGenerics","newdontex",newName));
				else
				if(mob.session().confirm(getScr("BaseGenerics","roomcng",R.roomID()),"N"))
					R=changeRoomType(R,newRoom);
				R.recoverRoomStats();
			}
			else
			{
				mob.tell(getScr("BaseGenerics","nochange"));
				break;
			}
		}
		return R;
	}

	static void genDescription(MOB mob, Environmental E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","description",showNumber+"",E.description()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","entnull3"),"");
		if(newName.trim().equalsIgnoreCase("null"))
			E.setDescription("");
		else
		if(newName.length()>0)
			E.setDescription(newName);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}

	static void genNotes(MOB mob, MOB E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","notes",showNumber+"",(E.playerStats()!=null)?E.playerStats().notes():""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","some4"),"");
		if((newName.length()>0)&&(E.playerStats()!=null))
			E.playerStats().setNotes(newName);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}

	static void genPassword(MOB mob, MOB E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","pwd",showNumber+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","entreset"),"");
		if((newName.length()>0)&&(E.playerStats()!=null))
		{
			E.playerStats().setPassword(newName);
			CMLib.database().DBUpdatePassword(E);
		}
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}

	static void genEmail(MOB mob, MOB E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		if(E.playerStats()!=null)
			mob.tell(getScr("BaseGenerics","email",showNumber+"",E.playerStats().getEmail()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","enternewone"),"");
		if((newName.length()>0)&&(E.playerStats()!=null))
			E.playerStats().setEmail(newName);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}

	public static void genDisplayText(MOB mob, Environmental E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","display",showNumber+"",E.displayText()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=null;
		if(E instanceof Item)
			newName=mob.session().prompt(getScr("BaseGenerics","some1"),"");
		else
		if(E instanceof Exit)
			newName=mob.session().prompt(getScr("BaseGenerics","some2"),"");
		else
			newName=mob.session().prompt(getScr("BaseGenerics","some3"),"");
		if(newName.length()>0)
		{
			if(newName.trim().equalsIgnoreCase("null"))
				newName="";
			E.setDisplayText(newName);
		}
		else
			mob.tell(getScr("BaseGenerics","nochange"));
		if((E instanceof Item)&&(E.displayText().length()==0))
			mob.tell(getScr("BaseGenerics","blended"));
	}
	public static void genClosedText(MOB mob, Exit E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		if(E instanceof Item)
			mob.tell(getScr("BaseGenerics","exitclosedtxt",showNumber+"",E.closedText()));
		else
			mob.tell(getScr("BaseGenerics","closedtxt",showNumber+"",E.closedText()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","some5"),"");
		if(newName.equals("null"))
			E.setExitParams(E.doorName(),E.closeWord(),E.openWord(),"");
		else
		if(newName.length()>0)
			E.setExitParams(E.doorName(),E.closeWord(),E.openWord(),newName);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}
	public static void genDoorName(MOB mob, Exit E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		if(E instanceof Item)
			mob.tell(getScr("BaseGenerics","exitdir",showNumber+"",E.doorName()));
		else
			mob.tell(getScr("BaseGenerics","doorn",showNumber+"",E.doorName()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","some4"),"");
		if(newName.length()>0)
			E.setExitParams(newName,E.closeWord(),E.openWord(),E.closedText());
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}

	public static void genBurnout(MOB mob, Light E, int showNumber, int showFlag)
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","isdestroyed",showNumber+"",E.destroyedWhenBurnedOut()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		E.setDestroyedWhenBurntOut(!E.destroyedWhenBurnedOut());
	}

	public static void genOpenWord(MOB mob, Exit E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","openword",showNumber+"",E.openWord()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","some4"),"");
		if(newName.length()>0)
			E.setExitParams(E.doorName(),E.closeWord(),newName,E.closedText());
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}

	public static void genSubOps(MOB mob, Area A, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		String newName="Q";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(newName.length()>0))
		{
			mob.tell(getScr("BaseGenerics","aeastaffname",showNumber+"",A.getSubOpList()));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			newName=mob.session().prompt(getScr("BaseGenerics","addrem"),"");
			if(newName.length()>0)
			{
				if(A.amISubOp(newName))
				{
					A.delSubOp(newName);
					mob.tell(getScr("BaseGenerics","staffrem"));
				}
				else
				if(CMLib.database().DBUserSearch(null,newName))
				{
					A.addSubOp(newName);
					mob.tell(getScr("BaseGenerics","ataffadd"));
				}
				else
					mob.tell(getScr("BaseGenerics","usererr",newName));
			}
		}
	}

    public static void genParentAreas(MOB mob, Area A, int showNumber, int showFlag)
            throws IOException
    {
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		String newArea="Q";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(newArea.length()>0))
		{
		    mob.tell(getScr("BaseGenerics","parentareas",showNumber+"",A.getParentsList()));
		    if((showFlag!=showNumber)&&(showFlag>-999)) return;
		    newArea=mob.session().prompt(getScr("BaseGenerics","arearem"),"");
		    if(newArea.length()>0)
		    {
		        Area lookedUp=CMLib.map().getArea(newArea);
		        if(lookedUp!=null)
		        {
		            if (lookedUp.isChild(A))
					{
						// this new area is already a parent to A,
						// they must want it removed
						A.removeParent(lookedUp);
						lookedUp.removeChild(A);
						mob.tell(getScr("BaseGenerics","arearem", lookedUp.Name()+""));
		            }
		            else
					{
		                if(A.canParent(lookedUp))
						{
		                    A.addParent(lookedUp);
		                    lookedUp.addChild(A);
		                    mob.tell(getScr("BaseGenerics","areaadd",lookedUp.Name()+""));
		                }
		                else
		                {
		                    mob.tell(getScr("BaseGenerics","areaerr",lookedUp.Name()+"" ));
		                }
		            }
		        }
		        else
		            mob.tell(getScr("BaseGenerics","areaerr2",newArea));
		    }
		}
    }

    public static void genChildAreas(MOB mob, Area A, int showNumber, int showFlag)
            throws IOException
    {
        if((showFlag>0)&&(showFlag!=showNumber)) return;
        String newArea="Q";
        while((mob.session()!=null)&&(!mob.session().killFlag())&&(newArea.length()>0))
        {
            mob.tell(getScr("BaseGenerics","areachild",showNumber+"",A.getChildrenList()));
            if((showFlag!=showNumber)&&(showFlag>-999)) return;
            newArea=mob.session().prompt(getScr("BaseGenerics","arearem"),"");
            if(newArea.length()>0)
            {
                Area lookedUp=CMLib.map().getArea(newArea);
                if(lookedUp!=null)
                {
                    if (lookedUp.isParent(A))
					{
                        // this area is already a child to A, they must want it removed
                        A.removeChild(lookedUp);
                        lookedUp.removeParent(A);
                        mob.tell(getScr("BaseGenerics","arearem",lookedUp.Name()+""));
                    }
                    else
					{
                        if(A.canChild(lookedUp))
						{
                            A.addChild(lookedUp);
                            lookedUp.addParent(A);
                            mob.tell(getScr("BaseGenerics","areaadd", lookedUp.Name()+""));
                        }
                        else
                        {
                            mob.tell(getScr("BaseGenerics","areaerr", lookedUp.Name()+"" ));
                        }
                    }
                }
                else
                    mob.tell(getScr("BaseGenerics","areaerr2",newArea));
            }
        }
    }

	public static void genCloseWord(MOB mob, Exit E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","closeword",showNumber+"",E.closeWord()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","some4"),"");
		if(newName.length()>0)
			E.setExitParams(E.doorName(),newName,E.openWord(),E.closedText());
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}

	public static void genExitMisc(MOB mob, Exit E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		if(E.hasALock())
		{
			E.setReadable(false);
			mob.tell(getScr("BaseGenerics","asskeyitem",showNumber+"",E.keyName()));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			String newName=mob.session().prompt(getScr("BaseGenerics","some5"),"");
			if(newName.equalsIgnoreCase("null"))
				E.setKeyName("");
			else
			if(newName.length()>0)
				E.setKeyName(newName);
			else
				mob.tell(getScr("BaseGenerics","nochange"));
		}
		else
		{
			if((showFlag!=showNumber)&&(showFlag>-999))
			{
				if(!E.isReadable())
					mob.tell(getScr("BaseGenerics","dorrnread",showNumber+""));
				else
					mob.tell(getScr("BaseGenerics","dorread",showNumber+"",E.readableText()));
				return;
			}
			else
			if(genGenericPrompt(mob,getScr("BaseGenerics","msgreadble"),E.isReadable()))
			{
				E.setReadable(true);
				mob.tell(getScr("BaseGenerics","readabletxt",E.readableText()));
				String newName=mob.session().prompt(getScr("BaseGenerics","some5"),"");
				if(newName.equalsIgnoreCase("null"))
					E.setReadableText("");
				else
				if(newName.length()>0)
					E.setReadableText(newName);
				else
					mob.tell(getScr("BaseGenerics","nochange"));
			}
			else
				E.setReadable(false);
		}
	}

	public static void genReadable1(MOB mob, Item E, int showNumber, int showFlag)
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;

		if((E instanceof Wand)
		 ||(E instanceof SpellHolder)
		 ||(E instanceof Light)
		 ||(E instanceof Container)
		 ||(E instanceof Ammunition)
		 ||((E instanceof ClanItem)
			 &&((((ClanItem)E).ciType()==ClanItem.CI_GATHERITEM)
				 ||(((ClanItem)E).ciType()==ClanItem.CI_CRAFTITEM)
				 ||(((ClanItem)E).ciType()==ClanItem.CI_SPECIALAPRON)))
		 ||(E instanceof Key))
			CMLib.flags().setReadable(E,false);
		else
		if((CMClass.className(E).endsWith("Readable"))
		||(E instanceof Recipe)
		||(E instanceof com.planet_ink.coffee_mud.Items.interfaces.Map))
			CMLib.flags().setReadable(E,true);
		else
		if((showFlag!=showNumber)&&(showFlag>-999))
			mob.tell(getScr("BaseGenerics","itemread",showNumber+"",CMLib.flags().isReadable(E)+""));
		else
			CMLib.flags().setReadable(E,genGenericPrompt(mob,showNumber+getScr("BaseGenerics","msgitemr"),CMLib.flags().isReadable(E)));
	}

	public static void genReadable2(MOB mob, Item E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;

		if((CMLib.flags().isReadable(E))
		 ||(E instanceof SpellHolder)
		 ||(E instanceof Ammunition)
		 ||(E instanceof Recipe)
		 ||(E instanceof Exit)
		 ||(E instanceof Wand)
		 ||(E instanceof ClanItem)
		 ||(E instanceof Light)
		 ||(E instanceof Key))
		{
			boolean ok=false;
			while((mob.session()!=null)&&(!mob.session().killFlag())&&(!ok))
			{
				if(CMClass.className(E).endsWith("SuperPill"))
				{
					mob.tell(getScr("BaseGenerics","assspellorp",showNumber+"",E.readableText()));
					ok=true;
				}
				else
				if(E instanceof SpellHolder)
					mob.tell(getScr("BaseGenerics","assspell",showNumber+"",E.readableText()));
				else
				if(E instanceof Ammunition)
				{
					mob.tell(getScr("BaseGenerics","ammotype",showNumber+"",E.readableText()));
					ok=true;
				}
				else
				if(E instanceof Exit)
				{
					mob.tell(getScr("BaseGenerics","assroomid",showNumber+"",E.readableText()));
					ok=true;
				}
				else
				if(E instanceof Wand)
					mob.tell(getScr("BaseGenerics","asspellname",showNumber+"",E.readableText()));
				else
				if(E instanceof Key)
				{
					mob.tell(getScr("BaseGenerics","asskeycode",showNumber+"",E.readableText()));
					ok=true;
				}
				else
				if(E instanceof com.planet_ink.coffee_mud.Items.interfaces.Map)
				{
					mob.tell(getScr("BaseGenerics","assmaparea",showNumber+"",E.readableText()));
					ok=true;
				}
				else
				if(E instanceof Light)
				{
					mob.tell(getScr("BaseGenerics","lightdur",showNumber+"",CMath.s_int(E.readableText())+""));
					ok=true;
				}
				else
				{
					mob.tell(getScr("BaseGenerics","assreadtxt",showNumber+"",E.readableText())+"");
					ok=true;
				}

				if((showFlag!=showNumber)&&(showFlag>-999)) return;
				String newName=null;

				if((E instanceof Wand)
				||((E instanceof SpellHolder)&&(!(CMClass.className(E).endsWith("SuperPill")))))
				{
					newName=mob.session().prompt(getScr("BaseGenerics","some6"),"");
					if(newName.length()==0)
						ok=true;
					else
					{
						if(newName.equalsIgnoreCase("?"))
							mob.tell(CMLib.lister().reallyList(CMClass.abilities(),-1).toString());
						else
						if(E instanceof Wand)
						{
							if(CMClass.getAbility(newName)!=null)
								ok=true;
							else
								mob.tell(getScr("BaseGenerics","namenotrec",newName));
						}
						else
						if(E instanceof SpellHolder)
						{
							String oldName=newName;
							if(!newName.endsWith(";")) newName+=";";
							int x=newName.indexOf(";");
							while(x>=0)
							{
								String spellName=newName.substring(0,x).trim();
								if(CMClass.getAbility(spellName)!=null)
									ok=true;
								else
								{
									mob.tell(getScr("BaseGenerics","spellnotrec",spellName));
									break;
								}
								newName=newName.substring(x+1).trim();
								x=newName.indexOf(";");
							}
							newName=oldName;
						}
					}
				}
				else
					newName=mob.session().prompt(getScr("BaseGenerics","some5"),"");

				if(ok)
				{
					if(newName.equalsIgnoreCase("null"))
						E.setReadableText("");
					else
					if(newName.length()>0)
						E.setReadableText(newName);
					else
						mob.tell(getScr("BaseGenerics","nochange"));
				}
			}
		}
		else
		if(E instanceof Drink)
		{
			mob.session().println(showNumber+getScr("BaseGenerics","curliq")+" "+RawMaterial.RESOURCE_DESCS[((Drink)E).liquidType()&RawMaterial.RESOURCE_MASK]);
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			boolean q=false;
			while((mob.session()!=null)&&(!mob.session().killFlag())&&(!q))
			{
				String newType=mob.session().prompt(getScr("BaseGenerics","newtype"),RawMaterial.RESOURCE_DESCS[((Drink)E).liquidType()&RawMaterial.RESOURCE_MASK]);
				if(newType.equals("?"))
				{
					StringBuffer say=new StringBuffer("");
					for(int i=0;i<RawMaterial.RESOURCE_DESCS.length-1;i++)
						if((RawMaterial.RESOURCE_DATA[i][0]&RawMaterial.MATERIAL_MASK)==RawMaterial.MATERIAL_LIQUID)
							say.append(RawMaterial.RESOURCE_DESCS[i]+", ");
					mob.tell(say.toString().substring(0,say.length()-2));
					q=false;
				}
				else
				{
					q=true;
					int newValue=-1;
					for(int i=0;i<RawMaterial.RESOURCE_DESCS.length-1;i++)
						if((RawMaterial.RESOURCE_DATA[i][0]&RawMaterial.MATERIAL_MASK)==RawMaterial.MATERIAL_LIQUID)
							if(newType.equalsIgnoreCase(RawMaterial.RESOURCE_DESCS[i]))
								newValue=RawMaterial.RESOURCE_DATA[i][0];
					if(newValue>=0)
						((Drink)E).setLiquidType(newValue);
					else
						mob.tell(getScr("BaseGenerics","nochange"));
				}
			}
		}
	}

	public static void genRecipe(MOB mob, Recipe E, int showNumber, int showFlag)
	throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		String prompt=getScr("BaseGenerics","recipedata");
		mob.tell(showNumber+". "+prompt+": "+E.getCommonSkillID()+".");
		mob.tell(CMStrings.padRight(" ",(""+showNumber).length()+2+prompt.length())+": "+CMStrings.replaceAll(E.getRecipeCodeLine(),"\t",",")+".");
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		while(!mob.session().killFlag())
		{
			String newName=mob.session().prompt(getScr("BaseGenerics","entskillid"),"");
			if(newName.equalsIgnoreCase("?"))
			{
			    StringBuffer str=new StringBuffer("");
			    Ability A=null;
				for(Enumeration e=CMClass.abilities();e.hasMoreElements();)
				{
				 	A=(Ability)e.nextElement();
				 	if(((A.classificationCode()&Ability.ALL_ACODES)==Ability.ACODE_COMMON_SKILL)
				 	&&(CMath.bset(A.flags(),Ability.FLAG_CRAFTING)))
				 	    str.append(A.ID()+"\n\r");
				}
				mob.tell(getScr("BaseGenerics","comskill",str.toString()));
			}
			else
			if((newName.length()>0)
			&&(CMClass.getAbility(newName)!=null)
			&&(CMClass.getAbility(newName).classificationCode()==Ability.ACODE_COMMON_SKILL))
			{
			    E.setCommonSkillID(CMClass.getAbility(newName).ID());
			    break;
			}
			else
			if(newName.length()>0)
			    mob.tell(getScr("BaseGenerics","cskillerr",newName));
			else
			{
				mob.tell(getScr("BaseGenerics","nochange"));
				break;
			}
		}
		String newName=mob.session().prompt(getScr("BaseGenerics","entdataline"),"");
		if(newName.length()>0)
			E.setRecipeCodeLine(CMStrings.replaceAll(newName,",","\t"));
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}

	public static void genGettable(MOB mob, Item E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		if(E instanceof Potion)
			((Potion)E).setDrunk(false);

		String c="Q";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!c.equals("\n")))
		{
			mob.session().println(showNumber+getScr("BaseGenerics","gettable")+" "+(!CMath.bset(E.baseEnvStats().sensesMask(),EnvStats.SENSE_ITEMNOTGET)));
			mob.session().println("    "+getScr("BaseGenerics","droppable")+" "+(!CMath.bset(E.baseEnvStats().sensesMask(),EnvStats.SENSE_ITEMNODROP)));
			mob.session().println("    "+getScr("BaseGenerics","removable")+" "+(!CMath.bset(E.baseEnvStats().sensesMask(),EnvStats.SENSE_ITEMNOREMOVE)));
			mob.session().println("    "+getScr("BaseGenerics","nonlocatable")+" "+(((E.baseEnvStats().sensesMask()&EnvStats.SENSE_UNLOCATABLE)>0)?"true":"false"));
			if(E instanceof Weapon)
				mob.session().println("    "+getScr("BaseGenerics","twohanded")+" "+E.rawLogicalAnd());
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			c=mob.session().choose(getScr("BaseGenerics","msgabcde"),"ABCDE\n","\n").toUpperCase();
			switch(Character.toUpperCase(c.charAt(0)))
			{
			case 'A': CMLib.flags().setGettable(E,(CMath.bset(E.baseEnvStats().sensesMask(),EnvStats.SENSE_ITEMNOTGET))); break;
			case 'B': CMLib.flags().setDroppable(E,(CMath.bset(E.baseEnvStats().sensesMask(),EnvStats.SENSE_ITEMNODROP))); break;
			case 'C': CMLib.flags().setRemovable(E,(CMath.bset(E.baseEnvStats().sensesMask(),EnvStats.SENSE_ITEMNOREMOVE))); break;
			case 'D': if((E.baseEnvStats().sensesMask()&EnvStats.SENSE_UNLOCATABLE)>0)
						  E.baseEnvStats().setSensesMask(E.baseEnvStats().sensesMask()-EnvStats.SENSE_UNLOCATABLE);
					  else
						  E.baseEnvStats().setSensesMask(E.baseEnvStats().sensesMask()|EnvStats.SENSE_UNLOCATABLE);
					  break;
			case 'E': if(E instanceof Weapon)
						  E.setRawLogicalAnd(!E.rawLogicalAnd());
					  break;
			}
		}
	}

	public static void toggleDispositionMask(EnvStats E, int mask)
	{
		int current=E.disposition();
		if((current&mask)==0)
			E.setDisposition(current|mask);
		else
			E.setDisposition(current&((int)(EnvStats.ALLMASK-mask)));
	}

	public static void genDisposition(MOB mob, EnvStats E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		int[] disps={EnvStats.IS_INVISIBLE,
					 EnvStats.IS_HIDDEN,
					 EnvStats.IS_NOT_SEEN,
					 EnvStats.IS_BONUS,
					 EnvStats.IS_GLOWING,
					 EnvStats.IS_LIGHTSOURCE,
					 EnvStats.IS_FLYING,
					 EnvStats.IS_CLIMBING,
					 EnvStats.IS_SNEAKING,
					 EnvStats.IS_SWIMMING,
					 EnvStats.IS_EVIL,
					 EnvStats.IS_GOOD};
		String[] briefs={"invisible",
						 "hide",
						 "unseen",
						 "magical",
						 "glowing",
						 "lightsrc",
						 "fly",
						 "climb",
						 "sneak",
						 "swimmer",
						 "evil",
						 "good"};
		if((showFlag!=showNumber)&&(showFlag>-999))
		{
			StringBuffer buf=new StringBuffer(getScr("BaseGenerics","disptxt",showNumber+""));
			for(int i=0;i<disps.length;i++)
			{
				int mask=disps[i];
				if((E.disposition()&mask)!=0)
					buf.append(briefs[i]+" ");
			}
			mob.tell(buf.toString());
			return;
		}
		String c="Q";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!c.equals("\n")))
		{
			char letter='A';
			String letters="";
			for(int i=0;i<disps.length;i++)
			{
				int mask=disps[i];
				for(int num=0;num<EnvStats.dispositionsDesc.length;num++)
					if(mask==CMath.pow(2,num))
					{
						mob.session().println("    "+letter+") "+CMStrings.padRight(EnvStats.dispositionsDesc[num],20)+":"+((E.disposition()&mask)!=0));
						letters+=letter;
						break;
					}
				letter++;
			}
			c=mob.session().choose(getScr("BaseGenerics","msgabcde")+" ",letters+"\n","\n").toUpperCase();
			letter='A';
			for(int i=0;i<disps.length;i++)
			{
				int mask=disps[i];
				if(letter==Character.toUpperCase(c.charAt(0)))
				{
					toggleDispositionMask(E,mask);
					break;
				}
				letter++;
			}
		}
	}

	public static boolean genGenericPrompt(MOB mob, String prompt, boolean val)
	{
		try
		{
			prompt=CMStrings.padRight(prompt,35);
			if(val)
				prompt+="(Y/n): ";
			else
				prompt+="(y/N): ";

			return mob.session().confirm(prompt,val?"Y":"N");
		}
		catch(IOException e)
		{
			return val;
		}
	}

	public static void toggleSensesMask(EnvStats E, int mask)
	{
		int current=E.sensesMask();
		if((current&mask)==0)
			E.setSensesMask(current|mask);
		else
			E.setSensesMask(current&((int)(EnvStats.ALLMASK-mask)));
	}

	public static void toggleClimateMask(Area A, int mask)
	{
		int current=A.climateType();
		if((current&mask)==0)
			A.setClimateType(current|mask);
		else
			A.setClimateType(current&((int)(EnvStats.ALLMASK-mask)));
	}



	public static void genClimateType(MOB mob, Area A, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		String c="Q";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!c.equals("\n")))
		{
			mob.session().println(""+showNumber+getScr("BaseGenerics","climate"));
			mob.session().println("    "+getScr("BaseGenerics","wetrainy")+" "+((A.climateType()&Area.CLIMASK_WET)>0));
			mob.session().println("    "+getScr("BaseGenerics","exhot")+" "+((A.climateType()&Area.CLIMASK_HOT)>0));
			mob.session().println("    "+getScr("BaseGenerics","excold")+" "+((A.climateType()&Area.CLIMASK_COLD)>0));
			mob.session().println("    "+getScr("BaseGenerics","verywindy")+" "+((A.climateType()&Area.CLIMATE_WINDY)>0));
			mob.session().println("    "+getScr("BaseGenerics","verydry")+" "+((A.climateType()&Area.CLIMASK_DRY)>0));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			c=mob.session().choose(getScr("BaseGenerics","msgabcde")+" ","RHCWD\n","\n").toUpperCase();
			switch(c.charAt(0))
			{
			case 'C': toggleClimateMask(A,Area.CLIMASK_COLD); break;
			case 'H': toggleClimateMask(A,Area.CLIMASK_HOT); break;
			case 'R': toggleClimateMask(A,Area.CLIMASK_WET); break;
			case 'W': toggleClimateMask(A,Area.CLIMATE_WINDY); break;
			case 'D': toggleClimateMask(A,Area.CLIMASK_DRY); break;
			}
		}
	}

    public static void genCharStats(MOB mob, CharStats E)
    throws IOException
    {
        String c="Q";
        String commandStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()=+-";
        while((mob.session()!=null)&&(!mob.session().killFlag())&&(!c.equals("\n")))
        {
            for(int i=0;i<CharStats.STAT_DESCS.length;i++)
                if(i!=CharStats.STAT_GENDER)
                    mob.session().println("    "+commandStr.charAt(i)+") "+CMStrings.padRight(CharStats.STAT_DESCS[i],20)+":"+((E.getStat(i))));
            c=mob.session().choose(getScr("BaseGenerics","msgabcde")+" ",commandStr.substring(0,CharStats.STAT_DESCS.length)+"\n","\n").toUpperCase();
            int num=commandStr.indexOf(c);
            if(num>=0)
            {
                String newVal=mob.session().prompt(getScr("BaseGenerics","entnewvalue")+" "+CharStats.STAT_DESCS[num]+" ("+E.getStat(num)+"): ","");
                if(((CMath.s_int(newVal)>0)||(newVal.trim().equals("0")))
                &&(num!=CharStats.STAT_GENDER))
                    E.setStat(num,CMath.s_int(newVal));
                else
                    mob.tell(getScr("BaseGenerics","nochange"));
            }
        }
    }
    
    
	public static void genCharStats(MOB mob, MOB E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		if((showFlag!=showNumber)&&(showFlag>-999))
		{
			StringBuffer buf=new StringBuffer(showNumber+getScr("BaseGenerics","stats")+" ");
			for(int i=0;i<CharStats.NUM_BASE_STATS;i++)
				buf.append(CharStats.STAT_ABBR[i]+":"+E.baseCharStats().getStat(i)+" ");
			mob.tell(buf.toString());
			return;
		}
		String c="Q";
		String commandStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()=+-";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!c.equals("\n")))
		{
			for(int i=0;i<CharStats.STAT_DESCS.length;i++)
				if(i!=CharStats.STAT_GENDER)
					mob.session().println("    "+commandStr.charAt(i)+") "+CMStrings.padRight(CharStats.STAT_DESCS[i],20)+":"+((E.baseCharStats().getStat(i))));
			c=mob.session().choose(getScr("BaseGenerics","msgabcde")+" ",commandStr.substring(0,CharStats.STAT_DESCS.length)+"\n","\n").toUpperCase();
			int num=commandStr.indexOf(c);
			if(num>=0)
			{
				String newVal=mob.session().prompt(getScr("BaseGenerics","entnewvalue")+" "+CharStats.STAT_DESCS[num]+" ("+E.baseCharStats().getStat(num)+"): ","");
				if(((CMath.s_int(newVal)>0)||(newVal.trim().equals("0")))
				&&(num!=CharStats.STAT_GENDER))
				{
					E.baseCharStats().setStat(num,CMath.s_int(newVal));
					if((num==CharStats.STAT_AGE)&&(E.playerStats()!=null)&&(E.playerStats().getBirthday()!=null))
					    E.playerStats().getBirthday()[2]=CMClass.globalClock().getYear()-CMath.s_int(newVal);
				}
				else
					mob.tell(getScr("BaseGenerics","nochange"));
			}
		}
	}

	public static void genSensesMask(MOB mob, EnvStats E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		int[] senses={EnvStats.CAN_SEE_DARK,
					  EnvStats.CAN_SEE_HIDDEN,
					  EnvStats.CAN_SEE_INVISIBLE,
					  EnvStats.CAN_SEE_SNEAKERS,
					  EnvStats.CAN_SEE_INFRARED,
					  EnvStats.CAN_SEE_GOOD,
					  EnvStats.CAN_SEE_EVIL,
					  EnvStats.CAN_SEE_BONUS,
					  EnvStats.CAN_NOT_SPEAK,
					  EnvStats.CAN_NOT_HEAR,
					  EnvStats.CAN_NOT_SEE};
		String[] briefs={"darkvision",
						 "hidden",
						 "invisible",
						 "sneakers",
						 "infrared",
						 "good",
						 "evil",
						 "magic",
						 "MUTE",
						 "DEAF",
						 "BLIND"};
		if((showFlag!=showNumber)&&(showFlag>-999))
		{
			StringBuffer buf=new StringBuffer(showNumber+getScr("BaseGenerics","senses")+" ");
			for(int i=0;i<senses.length;i++)
			{
				int mask=senses[i];
				if((E.sensesMask()&mask)!=0)
					buf.append(briefs[i]+" ");
			}
			mob.tell(buf.toString());
			return;
		}
		String c="Q";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!c.equals("\n")))
		{
			char letter='A';
			String letters="";
			for(int i=0;i<senses.length;i++)
			{
				int mask=senses[i];
				for(int num=0;num<EnvStats.sensesDesc.length;num++)
					if(mask==CMath.pow(2,num))
					{
						letters+=letter;
						mob.session().println("    "+letter+") "+CMStrings.padRight(EnvStats.sensesDesc[num],20)+":"+((E.sensesMask()&mask)!=0));
						break;
					}
				letter++;
			}
			c=mob.session().choose(getScr("BaseGenerics","msgabcde")+" ",letters+"\n","\n").toUpperCase();
			letter='A';
			for(int i=0;i<senses.length;i++)
			{
				int mask=senses[i];
				if(letter==Character.toUpperCase(c.charAt(0)))
				{
					toggleSensesMask(E,mask);
					break;
				}
				letter++;
			}
		}
	}

	public static void genDoorsNLocks(MOB mob, Exit E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		boolean HasDoor=E.hasADoor();
		boolean Open=E.isOpen();
		boolean DefaultsClosed=E.defaultsClosed();
		boolean HasLock=E.hasALock();
		boolean Locked=E.isLocked();
		boolean DefaultsLocked=E.defaultsLocked();
		if((showFlag!=showNumber)&&(showFlag>-999)){
			mob.tell(showNumber+getScr("BaseGenerics","hasadoor")+" "+E.hasADoor()
					+getScr("BaseGenerics","hasalock")+" "+E.hasALock()
					+getScr("BaseGenerics","openticks")+" "+E.openDelayTicks());
			return;
		}

		if(genGenericPrompt(mob,getScr("BaseGenerics","hasadoor2"),E.hasADoor()))
		{
			HasDoor=true;
			DefaultsClosed=genGenericPrompt(mob,getScr("BaseGenerics","defclosed"),E.defaultsClosed());
			Open=!DefaultsClosed;
			if(genGenericPrompt(mob,getScr("BaseGenerics","hasalock2"),E.hasALock()))
			{
				HasLock=true;
				DefaultsLocked=genGenericPrompt(mob,getScr("BaseGenerics","deflocked"),E.defaultsLocked());
				Locked=DefaultsLocked;
			}
			else
			{
				HasLock=false;
				Locked=false;
				DefaultsLocked=false;
			}
			mob.tell(getScr("BaseGenerics","resetdticks",E.openDelayTicks()+""));
			int newLevel=CMath.s_int(mob.session().prompt(getScr("BaseGenerics","entdelay"),""));
			if(newLevel>0)
				E.setOpenDelayTicks(newLevel);
			else
				mob.tell(getScr("BaseGenerics","nochange"));
		}
		else
		{
			HasDoor=false;
			Open=true;
			DefaultsClosed=false;
			HasLock=false;
			Locked=false;
			DefaultsLocked=false;
		}
		E.setDoorsNLocks(HasDoor,Open,DefaultsClosed,HasLock,Locked,DefaultsLocked);
	}

	public static String makeContainerTypes(Container E)
	{
		String canContain=", "+Container.CONTAIN_DESCS[0];
		if(E.containTypes()>0)
		{
			canContain="";
			for(int i=0;i<20;i++)
				if(CMath.isSet((int)E.containTypes(),i))
					canContain+=", "+Container.CONTAIN_DESCS[i+1];
		}
		return canContain.substring(2);
	}


	public static void genLidsNLocks(MOB mob, Container E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		if((showFlag!=showNumber)&&(showFlag>-999)){
			mob.tell(showNumber+getScr("BaseGenerics","cancontaini")+" "+makeContainerTypes(E)
					+getScr("BaseGenerics","hasalid")+" "+E.hasALid()
					+getScr("BaseGenerics","hasalock")+" "+E.hasALock()
					+getScr("BaseGenerics","keycode")+" "+E.keyName());
			return;
		}
		String change="NO";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(change.length()>0))
		{
			mob.tell(getScr("BaseGenerics","cancontain",makeContainerTypes(E)));
			change=mob.session().prompt(getScr("BaseGenerics","typeaddrem"),"");
			if(change.length()==0) break;
			int found=-1;
			if(change.equalsIgnoreCase("?"))
				for(int i=0;i<Container.CONTAIN_DESCS.length;i++)
					mob.tell(Container.CONTAIN_DESCS[i]);
			else
			{
				for(int i=0;i<Container.CONTAIN_DESCS.length;i++)
					if(Container.CONTAIN_DESCS[i].startsWith(change.toUpperCase()))
						found=i;
				if(found<0)
					mob.tell(getScr("BaseGenerics","unktype"));
				else
				if(found==0)
					E.setContainTypes(0);
				else
				if(CMath.isSet((int)E.containTypes(),found-1))
					E.setContainTypes(E.containTypes()-CMath.pow(2,found-1));
				else
					E.setContainTypes(E.containTypes()|CMath.pow(2,found-1));
			}
		}

		if(genGenericPrompt(mob,getScr("BaseGenerics","hasalidmsg")+" " ,E.hasALid()))
		{
			E.setLidsNLocks(true,false,E.hasALock(),E.isLocked());
			if(genGenericPrompt(mob,getScr("BaseGenerics","hasalockmsg"),E.hasALock()))
			{
				E.setLidsNLocks(E.hasALid(),E.isOpen(),true,true);
				mob.tell(getScr("BaseGenerics","textkey",E.keyName()));
				String newName=mob.session().prompt(getScr("BaseGenerics","some4"),"");
				if(newName.length()>0)
					E.setKeyName(newName);
				else
					mob.tell(getScr("BaseGenerics","nochange"));
			}
			else
			{
				E.setKeyName("");
				E.setLidsNLocks(E.hasALid(),E.isOpen(),false,false);
			}
		}
		else
		{
			E.setKeyName("");
			E.setLidsNLocks(false,true,false,false);
		}
	}

	public static void genLevel(MOB mob, Environmental E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		if(E.baseEnvStats().level()<0)
			E.baseEnvStats().setLevel(1);
		mob.tell(getScr("BaseGenerics","leveltxt",showNumber+"",E.baseEnvStats().level()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		E.baseEnvStats().setLevel(getNumericData(mob,getScr("BaseGenerics","entlev"),E.baseEnvStats().level()));
	}

	public static void genRejuv(MOB mob, Environmental E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		if(E instanceof Item)
			mob.tell(getScr("BaseGenerics","rejuv",showNumber+"",E.baseEnvStats().rejuv()+""));
		else
			mob.tell(getScr("BaseGenerics","rejuvticks",showNumber+"",E.baseEnvStats().rejuv()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String rlevel=mob.session().prompt(getScr("BaseGenerics","entamount"),"");
		int newLevel=CMath.s_int(rlevel);
		if((newLevel>0)||(rlevel.trim().equals("0")))
		{
			E.baseEnvStats().setRejuv(newLevel);
			if((E.baseEnvStats().rejuv()==0)&&(E instanceof MOB))
			{
				E.baseEnvStats().setRejuv(Integer.MAX_VALUE);
				mob.tell(getScr("BaseGenerics","neverrej",E.Name()));
			}
		}
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}

	public static void genUses(MOB mob, Item E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","usesrema",showNumber+"",E.usesRemaining()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		E.setUsesRemaining(getNumericData(mob,getScr("BaseGenerics","entvaluenew"),E.usesRemaining()));
	}

	public static void genMaxUses(MOB mob, Wand E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","maxuses",showNumber+"",E.maxUses()+"" ));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		E.setMaxUses(getNumericData(mob,getScr("BaseGenerics","entvaluenew"),E.maxUses()));
	}

	public static void genCondition(MOB mob, Item E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","condition",showNumber+"",E.usesRemaining()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		E.setUsesRemaining(getNumericData(mob,getScr("BaseGenerics","entvaluenew"),E.usesRemaining()));
	}

	public static void genMiscSet(MOB mob, Environmental E)
		throws IOException
	{
		if(E instanceof ShopKeeper)
			modifyGenShopkeeper(mob,(ShopKeeper)E);
		else
		if(E instanceof MOB)
		{
			if(((MOB)E).isMonster())
				modifyGenMOB(mob,(MOB)E);
			else
				modifyPlayer(mob,(MOB)E);
		}
		else
		if((E instanceof Exit)&&(!(E instanceof Item)))
			modifyGenExit(mob,(Exit)E);
		else
		if(E instanceof com.planet_ink.coffee_mud.Items.interfaces.Map)
			modifyGenMap(mob,(com.planet_ink.coffee_mud.Items.interfaces.Map)E);
		else
		if(E instanceof Armor)
			modifyGenArmor(mob,(Armor)E);
		else
		if(E instanceof MusicalInstrument)
			modifyGenInstrument(mob,(MusicalInstrument)E);
		else
		if(E instanceof Food)
			modifyGenFood(mob,(Food)E);
		else
		if((E instanceof Drink)&&(E instanceof Item))
			modifyGenDrink(mob,(Drink)E);
		else
		if(E instanceof Weapon)
			modifyGenWeapon(mob,(Weapon)E);
		else
		if(E instanceof Container)
			modifyGenContainer(mob,(Container)E);
		else
		if(E instanceof Item)
		{
			if(E.ID().equals("GenWallpaper"))
				modifyGenWallpaper(mob,(Item)E);
			else
				modifyGenItem(mob,(Item)E);
		}
	}


	public static int getNumericData(MOB mob, String prompt, int oldValue)
		throws IOException
	{
		String value=mob.session().prompt(prompt,"");
		int numValue=CMath.s_int(value);
		if((numValue==0)&&(!value.trim().equals("0")))
		{
			mob.tell(getScr("BaseGenerics","nochange"));
			return oldValue;
		}
		return numValue;
	}

	public static boolean getBooleanData(MOB mob, String prompt, boolean oldValue)
	throws IOException
	{
		boolean bool=mob.session().confirm(prompt,oldValue?"Y":"N");
		if(bool==oldValue)
			mob.tell(getScr("BaseGenerics","nochange"));
		return bool;
	}
	
	public static long getLongData(MOB mob, String prompt, long oldValue)
	throws IOException
	{
		String value=mob.session().prompt(prompt,"");
		long numValue=CMath.s_long(value);
		if((numValue==0)&&(!value.trim().equals("0")))
		{
			mob.tell(getScr("BaseGenerics","nochange"));
			return oldValue;
		}
		return numValue;
	}

	public static String getTextData(MOB mob, String prompt, String oldValue)
	throws IOException
	{
		String value=mob.session().prompt(prompt,"").trim();
		if(value.length()==0)
		{
			mob.tell(getScr("BaseGenerics","nochange"));
			return oldValue;
		}
		if(value.equalsIgnoreCase("null"))
		    value="";
		return value;
	}

	public static double getDoubleData(MOB mob, String prompt, double oldValue)
		throws IOException
	{
		String value=mob.session().prompt(prompt,"");
		double numValue=CMath.s_double(value);
		if((numValue==0.0)&&(!value.trim().equals("0")))
		{
			mob.tell(getScr("BaseGenerics","nochange"));
			return oldValue;
		}
		return numValue;
	}

	public static void genMiscText(MOB mob, Environmental E, int showNumber, int showFlag)
		throws IOException
	{
		if(E.isGeneric())
			genMiscSet(mob,E);
		else
		{
			if((showFlag>0)&&(showFlag!=showNumber)) return;
			mob.tell(getScr("BaseGenerics","misctxt",showNumber+"",E.text()));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			String newText=mob.session().prompt(getScr("BaseGenerics","reent"),"");
			if(newText.equalsIgnoreCase("NULL"))
				E.setMiscText("");
			else
			if(newText.length()>0)
				E.setMiscText(newText);
			else
				mob.tell(getScr("BaseGenerics","nochange"));
		}

	}

	public static void genTitleRoom(MOB mob, LandTitle E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","landplotid",showNumber+"",E.landPropertyID()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newText="?!?!";
		while((mob.session()!=null)&&(!mob.session().killFlag())
			&&((newText.length()>0)&&(CMLib.map().getRoom(newText)==null)))
		{
			newText=mob.session().prompt(getScr("BaseGenerics","newprpid"),"");
			if((newText.length()==0)
			&&(CMLib.map().getRoom(newText)==null)
			&&(CMLib.map().getArea(newText)==null))
				mob.tell(getScr("BaseGenerics","roomiderror"));
		}
		if(newText.length()>0)
			E.setLandPropertyID(newText);
		else
			mob.tell(getScr("BaseGenerics","nochange"));

	}

	public static void genAbility(MOB mob, Environmental E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","magicalability",showNumber+"",E.baseEnvStats().ability()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		E.baseEnvStats().setAbility(getNumericData(mob,getScr("BaseGenerics","zeronomag"),E.baseEnvStats().ability()));
	}

	public static void genCoinStuff(MOB mob, Coins E, int showNumber, int showFlag)
	throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","moneydata",showNumber+"",E.getNumberOfCoins()+"",CMLib.beanCounter().getDenominationName(E.getCurrency(),E.getDenomination())));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		boolean gocontinue=true;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(gocontinue))
		{
		    gocontinue=false;
		    String oldCurrency=E.getCurrency();
		    if(oldCurrency.length()==0) oldCurrency="Default";
			oldCurrency=mob.session().prompt(getScr("BaseGenerics","entcurcode"),oldCurrency).trim().toUpperCase();
			if(oldCurrency.equalsIgnoreCase("Default"))
			{
			    if(E.getCurrency().length()>0)
				    E.setCurrency("");
			    else
			        mob.tell(getScr("BaseGenerics","nochange"));
			}
			else
			if((oldCurrency.length()==0)||(oldCurrency.equalsIgnoreCase(E.getCurrency())))
			    mob.tell(getScr("BaseGenerics","nochange"));
			else
			if(!CMLib.beanCounter().getAllCurrencies().contains(oldCurrency))
			{
			    Vector V=CMLib.beanCounter().getAllCurrencies();
			    for(int v=0;v<V.size();v++)
			        if(((String)V.elementAt(v)).length()==0)
			            V.setElementAt("Default",v);
			    mob.tell(getScr("BaseGenerics","currencyerr",oldCurrency,CMParms.toStringList(V)));
			    gocontinue=true;
			}
			else
			    E.setCurrency(oldCurrency.toUpperCase().trim());
		}
		gocontinue=true;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(gocontinue))
		{
		    gocontinue=false;
		    String newDenom=mob.session().prompt(getScr("BaseGenerics","entde"),""+E.getDenomination()).trim().toUpperCase();
			DVector DV=CMLib.beanCounter().getCurrencySet(E.getCurrency());
			if((newDenom.length()>0)
			&&(!CMath.isDouble(newDenom))
			&&(!newDenom.equalsIgnoreCase("?")))
			{
			    double denom=CMLib.english().matchAnyDenomination(E.getCurrency(),newDenom);
			    if(denom>0.0) newDenom=""+denom;
			}
		    if((newDenom.length()==0)
		    ||(CMath.isDouble(newDenom)
	            &&(!newDenom.equalsIgnoreCase("?"))
	            &&(CMath.s_double(newDenom)==E.getDenomination())))
			        mob.tell(getScr("BaseGenerics","nochange"));
		    else
			if((!CMath.isDouble(newDenom))
			||(newDenom.equalsIgnoreCase("?"))
			||((DV!=null)&&(!DV.contains(new Double(CMath.s_double(newDenom))))))
			{
			    StringBuffer allDenoms=new StringBuffer("");
			    for(int i=0;i<DV.size();i++)
			        allDenoms.append(((Double)DV.elementAt(i,1)).doubleValue()+"("+((String)DV.elementAt(i,2))+"), ");
			    if(allDenoms.toString().endsWith(", "))
			        allDenoms=new StringBuffer(allDenoms.substring(0,allDenoms.length()-2));
			    mob.tell(getScr("BaseGenerics","denomerr",newDenom,allDenoms.toString()));
			    gocontinue=true;
			}
			else
			    E.setDenomination(CMath.s_double(newDenom));
		}
		E.setNumberOfCoins(getLongData(mob,getScr("BaseGenerics","entstacksize"),E.getNumberOfCoins()));
	}

	public static void genHitPoints(MOB mob, MOB E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		if(E.isMonster())
			mob.tell(getScr("BaseGenerics","hitpointsmod",showNumber+"",E.baseEnvStats().ability()+""));
		else
			mob.tell(getScr("BaseGenerics","hitpointsmodp",showNumber+"",E.baseEnvStats().ability()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newLevelStr=mob.session().prompt(getScr("BaseGenerics","entvaluenew"),"");
		int newLevel=CMath.s_int(newLevelStr);
		if((newLevel!=0)||(newLevelStr.equals("0")))
			E.baseEnvStats().setAbility(newLevel);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}

	public static void genValue(MOB mob, Item E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","basevalue",showNumber+"",E.baseGoldValue()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		E.setBaseValue(getNumericData(mob,getScr("BaseGenerics","entvaluenew"),E.baseGoldValue()));
	}

	public static void genWeight(MOB mob, Environmental E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","weight",showNumber+"",E.baseEnvStats().weight()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		E.baseEnvStats().setWeight(getNumericData(mob,getScr("BaseGenerics","weightmsg"),E.baseEnvStats().weight()));
	}


	public static void genClanItem(MOB mob, ClanItem E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","clanline",showNumber+"",E.clanID(),ClanItem.CI_DESC[E.ciType()]));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String clanID=E.clanID();
		E.setClanID(mob.session().prompt(getScr("BaseGenerics","entclan"),clanID));
		if(E.clanID().equals(clanID))
			mob.tell(getScr("BaseGenerics","nochange"));
		String clanType=ClanItem.CI_DESC[E.ciType()];
		String s="?";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(s.equals("?")))
		{
			s=mob.session().prompt(getScr("BaseGenerics","newtype"),clanType);
			if(s.equalsIgnoreCase("?"))
				mob.tell(getScr("BaseGenerics","typesclan",CMParms.toStringList(ClanItem.CI_DESC)));
			else
			if(s.equalsIgnoreCase(clanType))
			{
				mob.tell(getScr("BaseGenerics","nochange"));
				break;
			}
			else
			{
				boolean found=false;
				for(int i=0;i<ClanItem.CI_DESC.length;i++)
					if(ClanItem.CI_DESC[i].equalsIgnoreCase(s))
					{ found=true; E.setCIType(i); break;}
				if(!found)
				{
					mob.tell(getScr("BaseGenerics","unknown",s));
					s="?";
				}
			}
		}
	}

	public static void genHeight(MOB mob, Environmental E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","height",showNumber+"",E.baseEnvStats().height()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		E.baseEnvStats().setHeight(getNumericData(mob,getScr("BaseGenerics","heightmsg"),E.baseEnvStats().height()));
	}


	public static void genSize(MOB mob, Armor E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","size",showNumber+"",E.baseEnvStats().height()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		E.baseEnvStats().setHeight(getNumericData(mob,getScr("BaseGenerics","entnewsize"),E.baseEnvStats().height()));
	}


	public static void genLayer(MOB mob, Armor E, int showNumber, int showFlag)
	throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber))  return;
		boolean seeThroughBool=CMath.bset(E.getLayerAttributes(),Armor.LAYERMASK_SEETHROUGH);
		boolean multiWearBool=CMath.bset(E.getLayerAttributes(),Armor.LAYERMASK_MULTIWEAR);
		String seeThroughStr=(!seeThroughBool)?" (opaque)":" (see-through)";
		String multiWearStr=multiWearBool?" (multi)":"";
		mob.tell(getScr("BaseGenerics","layer",showNumber+"",E.getClothingLayer()+"",seeThroughStr,multiWearStr));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		E.setClothingLayer((short)getNumericData(mob,getScr("BaseGenerics","newlayer"),E.getClothingLayer()));
		boolean newSeeThrough=getBooleanData(mob,getScr("BaseGenerics","newseethrough"),seeThroughBool);
		boolean multiWear=getBooleanData(mob,getScr("BaseGenerics","newmultiwear"),multiWearBool);
		E.setLayerAttributes((short)0);
		E.setLayerAttributes((short)(E.getLayerAttributes()|(newSeeThrough?Armor.LAYERMASK_SEETHROUGH:0)));
		E.setLayerAttributes((short)(E.getLayerAttributes()|(multiWear?Armor.LAYERMASK_MULTIWEAR:0)));
	}
	
	
	public static void genCapacity(MOB mob, Container E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","capacity",showNumber+"",E.capacity()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		E.setCapacity(getNumericData(mob,getScr("BaseGenerics","entnewcap"),E.capacity()));
	}

	public static void genAttack(MOB mob, Environmental E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","attackadj",showNumber+"",E.baseEnvStats().attackAdjustment()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		E.baseEnvStats().setAttackAdjustment(getNumericData(mob,getScr("BaseGenerics","entvaluenew"),E.baseEnvStats().attackAdjustment()));
	}

	public static void genDamage(MOB mob, Environmental E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","damagehit",showNumber+"",E.baseEnvStats().damage()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		E.baseEnvStats().setDamage(getNumericData(mob,getScr("BaseGenerics","entvaluenew"),E.baseEnvStats().damage()));
	}

	public static void genBanker1(MOB mob, Banker E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","coininter",showNumber+"",E.getCoinInterest()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		E.setCoinInterest(getDoubleData(mob,getScr("BaseGenerics","entvaluenew"),E.getCoinInterest()));
	}
	public static void genBanker2(MOB mob, Banker E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","iteminter",showNumber+"",E.getItemInterest()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		E.setItemInterest(getDoubleData(mob,getScr("BaseGenerics","entvaluenew"),E.getItemInterest()));
	}
	public static void genBanker3(MOB mob, Banker E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","bankchain",showNumber+"",E.bankChain()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newValue=mob.session().prompt(getScr("BaseGenerics","entnewchain"),"");
		if(newValue.length()>0)
			E.setBankChain(newValue);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}
	public static void genBanker4(MOB mob, Banker E, int showNumber, int showFlag)
	throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","loaninter",showNumber+"",E.getLoanInterest()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		E.setLoanInterest(getDoubleData(mob,getScr("BaseGenerics","entvaluenew"),E.getLoanInterest()));
	}

	public static void genSpeed(MOB mob, Environmental E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","attacksperound",showNumber+"",((int)Math.round(E.baseEnvStats().speed())+"")));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		E.baseEnvStats().setSpeed(getNumericData(mob,getScr("BaseGenerics","entvaluenew"),(int)Math.round(E.baseEnvStats().speed())));
	}

	public static void genArmor(MOB mob, Environmental E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		if(E instanceof MOB)
			mob.tell(getScr("BaseGenerics","armorlb",showNumber+"",E.baseEnvStats().armor()+""));
		else
			mob.tell(getScr("BaseGenerics","armorhb",showNumber+"",E.baseEnvStats().armor()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		E.baseEnvStats().setArmor(getNumericData(mob,getScr("BaseGenerics","entvaluenew"),E.baseEnvStats().armor()));
	}

	public static void genMoney(MOB mob, MOB E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","moneycounter",showNumber+"",CMLib.beanCounter().getMoney(E)+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		CMLib.beanCounter().setMoney(E,getNumericData(mob,getScr("BaseGenerics","entvaluenew"),CMLib.beanCounter().getMoney(E)));
	}

	public static void genWeaponAmmo(MOB mob, Weapon E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		String defaultAmmo=(E.requiresAmmunition())?"Y":"N";
		if((showFlag!=showNumber)&&(showFlag>-999))
		{
			mob.tell(getScr("BaseGenerics","ammorequi",showNumber+"",E.requiresAmmunition()+"",E.ammunitionType()+""));
			return;
		}

		if(mob.session().confirm(getScr("BaseGenerics","confammo",defaultAmmo),defaultAmmo))
		{
			mob.tell(getScr("BaseGenerics","ammotype2",E.ammunitionType()));
			String newName=mob.session().prompt(getScr("BaseGenerics","enternewone"),"");
			if(newName.length()>0)
			{
				E.setAmmunitionType(newName);
				mob.tell(getScr("BaseGenerics","remembergenitem",E.ammunitionType()));
			}
			else
				mob.tell(getScr("BaseGenerics","nochange"));
			mob.tell(getScr("BaseGenerics","ammocapacity",E.ammunitionCapacity()+""));
			int newValue=CMath.s_int(mob.session().prompt(getScr("BaseGenerics","entvaluenew"),""));
			if(newValue>0)
				E.setAmmoCapacity(newValue);
			else
				mob.tell(getScr("BaseGenerics","nochange"));
			E.setAmmoRemaining(E.ammunitionCapacity());
		}
		else
		{
			E.setAmmunitionType("");
			E.setAmmoCapacity(0);
		}
	}
	public static void genWeaponRanges(MOB mob, Weapon E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","minmaxranges",showNumber+"",Math.round(E.minRange())+"",Math.round(E.maxRange())+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newMinStr=mob.session().prompt(getScr("BaseGenerics","minrangemsg"),"");
		String newMaxStr=mob.session().prompt(getScr("BaseGenerics","maxrangemsg"),"");
		if((newMinStr.length()==0)&&(newMaxStr.length()==0))
			mob.tell(getScr("BaseGenerics","nochange"));
		else
		{
			E.setRanges(CMath.s_int(newMinStr),CMath.s_int(newMaxStr));
			if((E.minRange()>E.maxRange())||(E.minRange()<0)||(E.maxRange()<0))
			{
				mob.tell(getScr("BaseGenerics","defectiveent"));
				E.setRanges(0,0);
			}
		}
	}

	public static void genWeaponType(MOB mob, Weapon E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","weapatttype",showNumber+"",Weapon.typeDescription[E.weaponType()]));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		boolean q=false;
		String sel="NSPBFMR";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!q))
		{
			String newType=mob.session().choose(getScr("BaseGenerics","entvaluenew"),sel+"?","");
			if(newType.equals("?"))
			{
				for(int i=0;i<sel.length();i++)
					mob.tell(sel.charAt(i)+") "+Weapon.typeDescription[i]);
				q=false;
			}
			else
			{
				q=true;
				int newValue=-1;
				if(newType.length()>0)
					newValue=sel.indexOf(newType.toUpperCase());
				if(newValue>=0)
					E.setWeaponType(newValue);
				else
					mob.tell(getScr("BaseGenerics","nochange"));
			}
		}
	}

	public static void genTechLevel(MOB mob, Area A, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","themesettings",showNumber+"",Area.THEME_DESCS[A.getTechLevel()]));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		boolean q=false;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!q))
		{
			String newType=mob.session().prompt(getScr("BaseGenerics","entnewlev"),Area.THEME_DESCS[A.getTechLevel()]);
			if(newType.equals("?"))
			{
				StringBuffer say=new StringBuffer("");
				for(int i=1;i<Area.THEME_DESCS.length;i++)
					say.append(i+") "+Area.THEME_DESCS[i]+"\n\r");
				mob.tell(say.toString());
				q=false;
			}
			else
			{
				q=true;
				int newValue=-1;
				if(CMath.s_int(newType)>0)
				    newValue=CMath.s_int(newType);
				else
				for(int i=0;i<Area.THEME_DESCS.length;i++)
					if(Area.THEME_DESCS[i].toUpperCase().startsWith(newType.toUpperCase()))
						newValue=i;
				if(newValue>=0)
					A.setTechLevel(newValue);
				else
					mob.tell(getScr("BaseGenerics","nochange"));
			}
		}
	}


	public static void genMaterialCode(MOB mob, Item E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","materialtype",showNumber+"",RawMaterial.RESOURCE_DESCS[E.material()&RawMaterial.RESOURCE_MASK]));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		boolean q=false;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!q))
		{
			String newType=mob.session().prompt(getScr("BaseGenerics","entnewmaterial"),RawMaterial.RESOURCE_DESCS[E.material()&RawMaterial.RESOURCE_MASK]);
			if(newType.equals("?"))
			{
				StringBuffer say=new StringBuffer("");
				for(int i=0;i<RawMaterial.RESOURCE_DESCS.length-1;i++)
					say.append(RawMaterial.RESOURCE_DESCS[i]+", ");
				mob.tell(say.toString().substring(0,say.length()-2));
				q=false;
			}
			else
			{
				q=true;
				int newValue=-1;
				for(int i=0;i<RawMaterial.RESOURCE_DESCS.length-1;i++)
					if(newType.equalsIgnoreCase(RawMaterial.RESOURCE_DESCS[i]))
						newValue=RawMaterial.RESOURCE_DATA[i][0];
				if(newValue>=0)
					E.setMaterial(newValue);
				else
					mob.tell(getScr("BaseGenerics","nochange"));
			}
		}
	}

	public static void genInstrumentType(MOB mob, MusicalInstrument E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","instrumentype",showNumber+"",MusicalInstrument.TYPE_DESC[E.instrumentType()]));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		boolean q=false;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!q))
		{
			String newType=mob.session().prompt(getScr("BaseGenerics","entnewty"),MusicalInstrument.TYPE_DESC[E.instrumentType()]);
			if(newType.equals("?"))
			{
				StringBuffer say=new StringBuffer("");
				for(int i=0;i<MusicalInstrument.TYPE_DESC.length-1;i++)
					say.append(MusicalInstrument.TYPE_DESC[i]+", ");
				mob.tell(say.toString().substring(0,say.length()-2));
				q=false;
			}
			else
			{
				q=true;
				int newValue=-1;
				for(int i=0;i<MusicalInstrument.TYPE_DESC.length-1;i++)
					if(newType.equalsIgnoreCase(MusicalInstrument.TYPE_DESC[i]))
						newValue=i;
				if(newValue>=0)
					E.setInstrumentType(newValue);
				else
					mob.tell(getScr("BaseGenerics","nochange"));
			}
		}
	}

    public static void genSpecialFaction(MOB mob, MOB E, int showNumber, int showFlag, Faction F)
    throws IOException
    {
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		if(F==null) return;
		Faction.FactionRange myFR=CMLib.factions().getRange(F.factionID(),E.fetchFaction(F.factionID()));
		mob.tell(showNumber+". "+F.name()+": "+((myFR!=null)?myFR.name():"UNDEFINED")+" ("+E.fetchFaction(F.factionID())+")");
	    if((showFlag!=showNumber)&&(showFlag>-999)) return;
	    if(F.ranges()!=null)
	    for(int v=0;v<F.ranges().size();v++)
	    {
	        Faction.FactionRange FR=(Faction.FactionRange)F.ranges().elementAt(v);
	        mob.tell(CMStrings.padRight(FR.name(),20)+": "+FR.low()+" - "+FR.high()+")");
	    }
		String newOne=mob.session().prompt(getScr("BaseGenerics","entvaluenew"));
		if(CMath.isInteger(newOne))
		{
		    E.addFaction(F.factionID(),CMath.s_int(newOne));
	        return;
		}
	    for(int v=0;v<F.ranges().size();v++)
	    {
	        Faction.FactionRange FR=(Faction.FactionRange)F.ranges().elementAt(v);
	        if(FR.name().toUpperCase().startsWith(newOne.toUpperCase()))
	        {
	            if(FR.low()==F.lowest())
	                E.addFaction(F.factionID(),FR.low());
	            else
	            if(FR.high()==F.highest())
	                E.addFaction(F.factionID(),FR.high());
	            else
	                E.addFaction(F.factionID(),FR.low()+((FR.high()-FR.low())/2));
	            return;
	        }
	    }
	    mob.tell(getScr("BaseGenerics","nochange"));
    }
    public static void genFaction(MOB mob, MOB E, int showNumber, int showFlag)
    throws IOException
    {
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		String newFact="Q";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(newFact.length()>0))
		{
		    mob.tell(getScr("BaseGenerics","factions",showNumber+"",E.getFactionListing()));
		    if((showFlag!=showNumber)&&(showFlag>-999)) return;
		    newFact=mob.session().prompt(getScr("BaseGenerics","factionmsg"),"");
		    if(newFact.length()>0)
		    {
		        Faction lookedUp=CMLib.factions().getFactionByName(newFact);
		        if(lookedUp==null) lookedUp=CMLib.factions().getFaction(newFact);
		        if(lookedUp!=null)
		        {
		            if (E.fetchFaction(lookedUp.factionID())!=Integer.MAX_VALUE)
		            {
		                // this mob already has this faction, they must want it removed
		                E.removeFaction(lookedUp.factionID());
		                mob.tell(getScr("BaseGenerics","factionrem",lookedUp.name()  ));
		            }
		            else
		            {
						int value =new Integer(mob.session().prompt(getScr("BaseGenerics","howmuchf",lookedUp.findDefault(E)+""),
						           new Integer(lookedUp.findDefault(E)).toString())).intValue();
			            if(value<lookedUp.minimum()) value=lookedUp.minimum();
					    if(value>lookedUp.maximum()) value=lookedUp.maximum();
		                E.addFaction(lookedUp.factionID(),value);
		                mob.tell(getScr("BaseGenerics","factionadd",lookedUp.name() ));
		            }
		         }
		         else
		            mob.tell(getScr("BaseGenerics","factionerr",newFact));
		    }
		}
	}

	public static void genGender(MOB mob, MOB E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","gender",showNumber+"",""+Character.toUpperCase((char)E.baseCharStats().getStat(CharStats.STAT_GENDER))));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newType=mob.session().choose(getScr("BaseGenerics","entergemsg"),"MFN","");
		int newValue=-1;
		if(newType.length()>0)
			newValue=("MFN").indexOf(newType.trim().toUpperCase());
		if(newValue>=0)
		{
			switch(newValue)
			{
			case 0:
				E.baseCharStats().setStat(CharStats.STAT_GENDER,'M');
				break;
			case 1:
				E.baseCharStats().setStat(CharStats.STAT_GENDER,'F');
				break;
			case 2:
				E.baseCharStats().setStat(CharStats.STAT_GENDER,'N');
				break;
			}
		}
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}

	public static void genWeaponClassification(MOB mob, Weapon E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","weaponclass",showNumber+"",Weapon.classifictionDescription[E.weaponClassification()]));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		boolean q=false;
		String sel=("ABEFHKPRSDTN");
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!q))
		{
			String newType=mob.session().choose(getScr("BaseGenerics","entnewvalueh"),sel+"?","");
			if(newType.equals("?"))
			{
				for(int i=0;i<sel.length();i++)
					mob.tell(sel.charAt(i)+") "+Weapon.classifictionDescription[i]);
				q=false;
			}
			else
			{
				q=true;
				int newValue=-1;
				if(newType.length()>0)
					newValue=sel.indexOf(newType.toUpperCase());
				if(newValue>=0)
					E.setWeaponClassification(newValue);
				else
					mob.tell(getScr("BaseGenerics","nochange"));
			}
		}
	}

	public static void genSecretIdentity(MOB mob, Item E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","secretid",showNumber+"",E.rawSecretIdentity()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newValue=mob.session().prompt(getScr("BaseGenerics","entnewid"),"");
		if(newValue.equalsIgnoreCase("null"))
			E.setSecretIdentity("");
		else
		if(newValue.length()>0)
			E.setSecretIdentity(newValue);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}

	public static void genNourishment(MOB mob, Food E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","noureat",showNumber+"",E.nourishment()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		int newValue=CMath.s_int(mob.session().prompt(getScr("BaseGenerics","entnewamount"),""));
		if(newValue>0)
			E.setNourishment(newValue);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}

	public static void genRace(MOB mob, MOB E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		String raceID="begin!";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(raceID.length()>0))
		{
			mob.tell(getScr("BaseGenerics","race",showNumber+"",E.baseCharStats().getMyRace().ID()));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			raceID=mob.session().prompt(getScr("BaseGenerics","entnewrace"),"").trim();
			if(raceID.equalsIgnoreCase("?"))
				mob.tell(CMLib.lister().reallyList(CMClass.races(),-1).toString());
			else
			if(raceID.length()==0)
				mob.tell(getScr("BaseGenerics","nochange"));
			else
			{
				Race R=CMClass.getRace(raceID);
				if(R!=null)
				{
					E.baseCharStats().setMyRace(R);
					E.baseCharStats().getMyRace().startRacing(E,false);
					E.baseCharStats().getMyRace().setHeightWeight(E.baseEnvStats(),(char)E.baseCharStats().getStat(CharStats.STAT_GENDER));
				}
				else
					mob.tell(getScr("BaseGenerics","unknownrace"));
			}
		}
	}

	public static void genCharClass(MOB mob, MOB E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		String classID="begin!";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(classID.length()>0))
		{
			StringBuffer str=new StringBuffer("");
			for(int c=0;c<E.baseCharStats().numClasses();c++)
			{
				CharClass C=E.baseCharStats().getMyClass(c);
				str.append(C.ID()+"("+E.baseCharStats().getClassLevel(C)+") ");
			}
			mob.tell(getScr("BaseGenerics","classline",showNumber+"",str.toString()));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			classID=mob.session().prompt(getScr("BaseGenerics","entclassar"),"").trim();
			if(classID.equalsIgnoreCase("?"))
				mob.tell(CMLib.lister().reallyList(CMClass.charClasses(),-1).toString());
			else
			if(classID.length()==0)
				mob.tell(getScr("BaseGenerics","nochange"));
			else
			{
				CharClass C=CMClass.getCharClass(classID);
				if(C!=null)
				{
					if(E.baseCharStats().getClassLevel(C)>=0)
					{
						if(E.baseCharStats().numClasses()<2)
							mob.tell(getScr("BaseGenerics","finalclassmsg"));
						else
						{
							StringBuffer charClasses=new StringBuffer("");
							StringBuffer classLevels=new StringBuffer("");
							for(int c=0;c<E.baseCharStats().numClasses();c++)
							{
								CharClass C2=E.baseCharStats().getMyClass(c);
								int L2=E.baseCharStats().getClassLevel(C2);
								if(C2!=C)
								{
									charClasses.append(";"+C2.ID());
									classLevels.append(";"+L2);
								}
							}
							E.baseCharStats().setMyClasses(charClasses.toString());
							E.baseCharStats().setMyLevels(classLevels.toString());
						}
					}
					else
					{
						int highLvl=Integer.MIN_VALUE;
						CharClass highestC=null;
						for(int c=0;c<E.baseCharStats().numClasses();c++)
						{
							CharClass C2=E.baseCharStats().getMyClass(c);
							if(E.baseCharStats().getClassLevel(C2)>highLvl)
							{
								highestC=C2;
								highLvl=E.baseCharStats().getClassLevel(C2);
							}
						}
						E.baseCharStats().setCurrentClass(C);
						int levels=E.baseCharStats().combinedSubLevels();
						levels=E.baseEnvStats().level()-levels;
						String lvl=null;
						if(levels>0)
						{
							lvl=mob.session().prompt(getScr("BaseGenerics","levelsclass",levels+""),""+levels).trim();
							int lvl2=CMath.s_int(lvl);
							if(lvl2>levels) lvl2=levels;
							E.baseCharStats().setClassLevel(C,lvl2);
						}
						else
						{
							lvl=mob.session().prompt(getScr("BaseGenerics","siphon",highestC.ID()),""+0).trim();
							int lvl2=CMath.s_int(lvl);
							if(lvl2>highLvl) lvl2=highLvl;
							E.baseCharStats().setClassLevel(highestC,highLvl-lvl2);
							E.baseCharStats().setClassLevel(C,lvl2);
						}

					}
					int levels=E.baseCharStats().combinedSubLevels();
					levels=E.baseEnvStats().level()-levels;
					C=E.baseCharStats().getCurrentClass();
					E.baseCharStats().setClassLevel(C,levels);
				}
				else
					mob.tell(getScr("BaseGenerics","classerr"));
			}
		}
	}

	public static void genTattoos(MOB mob, MOB E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		String behave="NO";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(behave.length()>0))
		{
			String behaviorstr="";
			for(int b=0;b<E.numTattoos();b++)
			{
				String B=E.fetchTattoo(b);
				if(B!=null)	behaviorstr+=B+", ";
			}
			if(behaviorstr.length()>0)
				behaviorstr=behaviorstr.substring(0,behaviorstr.length()-2);
			mob.tell(getScr("BaseGenerics","tattoos",showNumber+"",behaviorstr));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			behave=mob.session().prompt(getScr("BaseGenerics","tattooent"),"");
			if(behave.length()>0)
			{
				String tattoo=behave;
				if((tattoo.length()>0)
				&&(Character.isDigit(tattoo.charAt(0)))
				&&(tattoo.indexOf(" ")>0)
				&&(CMath.isNumber(tattoo.substring(0,tattoo.indexOf(" ")))))
					tattoo=tattoo.substring(tattoo.indexOf(" ")+1).trim();
				if(E.fetchTattoo(tattoo)!=null)
				{
					mob.tell(getScr("BaseGenerics","tattoorem",tattoo.trim().toUpperCase()));
					E.delTattoo(behave);
				}
				else
				{
					mob.tell(getScr("BaseGenerics","tattooadd",behave.trim().toUpperCase()));
					E.addTattoo(behave);
				}
			}
			else
				mob.tell(getScr("BaseGenerics","nochange"));
		}
	}

	public static void genTitles(MOB mob, MOB E, int showNumber, int showFlag)
	throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		if(E.playerStats()==null) return;
		String behave="NO";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(behave.length()>0))
		{
			String behaviorstr="";
			for(int b=0;b<E.playerStats().getTitles().size();b++)
			{
				String B=(String)E.playerStats().getTitles().elementAt(b);
				if(B!=null)	behaviorstr+=B+", ";
			}
			if(behaviorstr.length()>0)
				behaviorstr=behaviorstr.substring(0,behaviorstr.length()-2);
			mob.tell(getScr("BaseGenerics","titles",showNumber+"",behaviorstr));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			behave=mob.session().prompt(getScr("BaseGenerics","titleent"),"");
			if(behave.length()>0)
			{
				String tattoo=behave;
				if((tattoo.length()>0)
				&&(CMath.isInteger(tattoo))
				&&(CMath.s_int(tattoo)>0)
				&&(CMath.s_int(tattoo)<=E.playerStats().getTitles().size()))
					tattoo=(String)E.playerStats().getTitles().elementAt(CMath.s_int(tattoo)-1);
				else
				if((tattoo.length()>0)
				&&(Character.isDigit(tattoo.charAt(0)))
				&&(tattoo.indexOf(" ")>0)
				&&(CMath.isNumber(tattoo.substring(0,tattoo.indexOf(" ")))))
					tattoo=tattoo.substring(tattoo.indexOf(" ")+1).trim();
				if(E.playerStats().getTitles().contains(tattoo))
				{
					mob.tell(getScr("BaseGenerics","tattoorem",tattoo.trim().toUpperCase()));
					E.playerStats().getTitles().remove(tattoo);
				}
				else
				{
					mob.tell(getScr("BaseGenerics","tattooadd",behave.trim().toUpperCase()));
					E.playerStats().getTitles().addElement(tattoo);
				}
			}
			else
				mob.tell(getScr("BaseGenerics","nochange"));
		}
	}

	public static void genExpertises(MOB mob, MOB E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		String behave="NO";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(behave.length()>0))
		{
			String behaviorstr="";
			for(int b=0;b<E.numExpertises();b++)
			{
				String B=E.fetchExpertise(b);
				if(B!=null)	behaviorstr+=B+", ";
			}
			if(behaviorstr.length()>0)
				behaviorstr=behaviorstr.substring(0,behaviorstr.length()-2);
			mob.tell(getScr("BaseGenerics","expertises",showNumber+"",behaviorstr));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			behave=mob.session().prompt(getScr("BaseGenerics","lessonent"),"");
			if(behave.length()>0)
			{
				if(E.fetchExpertise(behave)!=null)
				{
					mob.tell(getScr("BaseGenerics","behaverem",behave));
					E.delExpertise(behave);
				}
				else
				{
					mob.tell(getScr("BaseGenerics","behaveadd",behave));
					E.addExpertise(behave);
				}
			}
			else
				mob.tell(getScr("BaseGenerics","nochange"));
		}
	}

	public static void genSecurity(MOB mob, MOB E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		PlayerStats P=E.playerStats();
		if(P==null) return;
		String behave="NO";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(behave.length()>0))
		{
			String behaviorstr="";
			for(int b=0;b<P.getSecurityGroups().size();b++)
			{
				String B=(String)P.getSecurityGroups().elementAt(b);
				if(B!=null)	behaviorstr+=B+", ";
			}
			if(behaviorstr.length()>0)
				behaviorstr=behaviorstr.substring(0,behaviorstr.length()-2);
			mob.tell(getScr("BaseGenerics","secgroups",showNumber+"",behaviorstr));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			behave=mob.session().prompt(getScr("BaseGenerics","groupent"),"");
			if(behave.length()>0)
			{
				if(P.getSecurityGroups().contains(behave.trim().toUpperCase()))
				{
					P.getSecurityGroups().remove(behave.trim().toUpperCase());
					mob.tell(getScr("BaseGenerics","behaverem",behave));
				}
				else
                if((behave.trim().toUpperCase().startsWith("AREA "))
                &&(!CMSecurity.isAllowedAnywhere(mob,behave.trim().toUpperCase().substring(5).trim())))
                    mob.tell(getScr("BaseGenerics","behavebad",behave));
                else
                if((!behave.trim().toUpperCase().startsWith("AREA "))
                &&(!CMSecurity.isAllowedEverywhere(mob,behave.trim().toUpperCase())))
                    mob.tell(getScr("BaseGenerics","behavebad",behave));
                else
				{
					P.getSecurityGroups().addElement(behave.trim().toUpperCase());
					mob.tell(getScr("BaseGenerics","behaveadd",behave));
				}
			}
			else
				mob.tell(getScr("BaseGenerics","nochange"));
		}
	}

	public static void genBehaviors(MOB mob, Environmental E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		String behave="NO";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(behave.length()>0))
		{
			String behaviorstr="";
			for(int b=0;b<E.numBehaviors();b++)
			{
				Behavior B=E.fetchBehavior(b);
				if((B!=null)&&(B.isSavable()))
				{
					behaviorstr+=B.ID();
					if(B.getParms().trim().length()>0)
						behaviorstr+="("+B.getParms().trim()+"), ";
					else
						behaviorstr+=", ";
				}
			}
			if(behaviorstr.length()>0)
				behaviorstr=behaviorstr.substring(0,behaviorstr.length()-2);
			mob.tell(getScr("BaseGenerics","behaviorsline",showNumber+"",behaviorstr));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			behave=mob.session().prompt(getScr("BaseGenerics","behaent"),"");
			if(behave.length()>0)
			{
				if(behave.equalsIgnoreCase("?"))
					mob.tell(CMLib.lister().reallyList(CMClass.behaviors(),-1).toString());
				else
				{
					Behavior chosenOne=null;
					for(int b=0;b<E.numBehaviors();b++)
					{
						Behavior B=E.fetchBehavior(b);
						if((B!=null)&&(B.ID().equalsIgnoreCase(behave)))
							chosenOne=B;
					}
					if(chosenOne!=null)
					{
						mob.tell(getScr("BaseGenerics","cidr",chosenOne.ID()));
						E.delBehavior(chosenOne);
					}
					else
					{
						chosenOne=CMClass.getBehavior(behave);
						if(chosenOne!=null)
						{
							boolean alreadyHasIt=false;
							for(int b=0;b<E.numBehaviors();b++)
							{
								Behavior B=E.fetchBehavior(b);
								if((B!=null)&&(B.ID().equals(chosenOne.ID())))
								{
									alreadyHasIt=true;
									chosenOne=B;
								}
							}
                            String parms="?";
                            while(parms.equals("?"))
                            {
    							parms=chosenOne.getParms();
    							parms=mob.session().prompt(getScr("BaseGenerics","behapar",parms));
                                if(parms.equals("?")){ StringBuffer s2=CMLib.help().getHelpText(chosenOne.ID(),mob,true); if(s2!=null) mob.tell(s2.toString()); else mob.tell("no help!");}
                            }
							chosenOne.setParms(parms.trim());
							if(!alreadyHasIt)
							{
								mob.tell(getScr("BaseGenerics","cida",chosenOne.ID()));
								E.addBehavior(chosenOne);
							}
							else
								mob.tell(getScr("BaseGenerics","cidaa",chosenOne.ID()));
						}
						else
						{
							mob.tell(getScr("BaseGenerics","behaveerr",behave));
						}
					}
				}
			}
			else
				mob.tell(getScr("BaseGenerics","nochange"));
		}
	}

	public static void genAffects(MOB mob, Environmental E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		String behave="NO";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(behave.length()>0))
		{
			String affectstr="";
			for(int b=0;b<E.numEffects();b++)
			{
				Ability A=E.fetchEffect(b);
				if((A!=null)&&(A.savable()))
				{
					affectstr+=A.ID();
					if(A.text().trim().length()>0)
						affectstr+="("+A.text().trim()+"), ";
					else
						affectstr+=", ";
				}

			}
			if(affectstr.length()>0)
				affectstr=affectstr.substring(0,affectstr.length()-2);
			mob.tell(getScr("BaseGenerics","effects",showNumber+"",affectstr));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			behave=mob.session().prompt(getScr("BaseGenerics","effectent"),"");
			if(behave.length()>0)
			{
				if(behave.equalsIgnoreCase("?"))
					mob.tell(CMLib.lister().reallyList(CMClass.abilities(),-1).toString());
				else
				{
					Ability chosenOne=null;
					for(int a=0;a<E.numEffects();a++)
					{
						Ability A=E.fetchEffect(a);
						if((A!=null)&&(A.ID().equalsIgnoreCase(behave)))
							chosenOne=A;
					}
					if(chosenOne!=null)
					{
						mob.tell(getScr("BaseGenerics","cidr",chosenOne.ID()));
						E.delEffect(chosenOne);
					}
					else
					{
						chosenOne=CMClass.getAbility(behave);
						if(chosenOne!=null)
						{
                            String parms="?";
                            while(parms.equals("?"))
                            {
                                parms=chosenOne.text();
                                parms=mob.session().prompt(getScr("BaseGenerics","effectpar",parms));
                                if(parms.equals("?")){ StringBuffer s2=CMLib.help().getHelpText(chosenOne.ID(),mob,true); if(s2!=null) mob.tell(s2.toString()); else mob.tell("no help!");}
                            }
							chosenOne.setMiscText(parms.trim());
							mob.tell(getScr("BaseGenerics","cida",chosenOne.ID()));
							E.addNonUninvokableEffect(chosenOne);
						}
						else
						{
							mob.tell(getScr("BaseGenerics","behaveerr",behave));
						}
					}
				}
			}
			else
				mob.tell(getScr("BaseGenerics","nochange"));
		}
	}

	public static void genRideable1(MOB mob, Rideable R, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","ridetype",showNumber+"",Rideable.RIDEABLE_DESCS[R.rideBasis()]));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		boolean q=false;
		String sel="LWACBTEDG";
		while(!q)
		{
			String newType=mob.session().choose(getScr("BaseGenerics","entnewvalueh"),sel+"?","");
			if(newType.equals("?"))
			{
				for(int i=0;i<sel.length();i++)
					mob.tell(sel.charAt(i)+") "+Rideable.RIDEABLE_DESCS[i].toLowerCase());
				q=false;
			}
			else
			{
				q=true;
				int newValue=-1;
				if(newType.length()>0)
					newValue=sel.indexOf(newType.toUpperCase());
				if(newValue>=0)
					R.setRideBasis(newValue);
				else
					mob.tell(getScr("BaseGenerics","nochange"));
			}
		}
	}
	public static void genRideable2(MOB mob, Rideable R, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","nomobheld",showNumber+"",R.riderCapacity()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newLevelStr=mob.session().prompt(getScr("BaseGenerics","entvaluenew"),"");
		int newLevel=CMath.s_int(newLevelStr);
		if(newLevel>0)
			R.setRiderCapacity(newLevel);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}

	public static void genShopkeeper1(MOB mob, ShopKeeper E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","shopktype",showNumber+"",E.storeKeeperString()));
		StringBuffer buf=new StringBuffer("");
		StringBuffer codes=new StringBuffer("");
		String codeStr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		if(E instanceof Banker)
		{
			int r=ShopKeeper.DEAL_BANKER;
			char c=codeStr.charAt(r);
			codes.append(c);
			buf.append(c+") "+ShopKeeper.DEAL_DESCS[r]+"\n\r");
			r=ShopKeeper.DEAL_CLANBANKER;
			c=codeStr.charAt(r);
			codes.append(c);
			buf.append(c+") "+ShopKeeper.DEAL_DESCS[r]+"\n\r");
		}
		else
        if(E instanceof PostOffice)
        {
            int r=ShopKeeper.DEAL_POSTMAN;
            char c=codeStr.charAt(r);
            codes.append(c);
            buf.append(c+") "+ShopKeeper.DEAL_DESCS[r]+"\n\r");
            r=ShopKeeper.DEAL_CLANPOSTMAN;
            c=codeStr.charAt(r);
            codes.append(c);
            buf.append(c+") "+ShopKeeper.DEAL_DESCS[r]+"\n\r");
        }
        else
		for(int r=0;r<ShopKeeper.DEAL_DESCS.length;r++)
		{
			if((r!=ShopKeeper.DEAL_CLANBANKER)
            &&(r!=ShopKeeper.DEAL_BANKER)
            &&(r!=ShopKeeper.DEAL_CLANPOSTMAN)
            &&(r!=ShopKeeper.DEAL_POSTMAN))
			{
				char c=codeStr.charAt(r);
				codes.append(c);
				buf.append(c+") "+ShopKeeper.DEAL_DESCS[r]+"\n\r");
			}
		}
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newType=mob.session().choose(getScr("BaseGenerics","entvaluech",buf.toString()),codes.toString(),"");
		int newValue=-1;
		if(newType.length()>0)
			newValue=codeStr.indexOf(newType.toUpperCase());
		if(newValue>=0)
		{
			boolean reexamine=(E.whatIsSold()!=newValue);
			E.setWhatIsSold(newValue);
            if(reexamine)
            {
                Vector V=E.getShop().getStoreInventory();
                for(int b=0;b<V.size();b++)
                    if(!E.doISellThis((Environmental)V.elementAt(b)))
                        E.getShop().delAllStoreInventory((Environmental)V.elementAt(b),E.whatIsSold());
            }
		}
	}

	public static void genShopkeeper2(MOB mob, ShopKeeper E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		String itemstr="NO";
		while(itemstr.length()>0)
		{
			String inventorystr="";
			Vector V=E.getShop().getStoreInventory();
			for(int b=0;b<V.size();b++)
			{
				Environmental E2=(Environmental)V.elementAt(b);
				if(E2.isGeneric())
					inventorystr+=E2.name()+" ("+E.getShop().numberInStock(E2)+"), ";
				else
					inventorystr+=CMClass.className(E2)+" ("+E.getShop().numberInStock(E2)+"), ";
			}
			if(inventorystr.length()>0)
				inventorystr=inventorystr.substring(0,inventorystr.length()-2);
			mob.tell(getScr("BaseGenerics","inventoryline",showNumber+"",inventorystr));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			itemstr=mob.session().prompt(getScr("BaseGenerics","entsometh"),"");
			if(itemstr.length()>0)
			{
				if(itemstr.equalsIgnoreCase("?"))
				{
					mob.tell(CMLib.lister().reallyList(CMClass.abilities(),-1).toString());
					mob.tell(CMLib.lister().reallyList(CMClass.armor(),-1).toString());
					mob.tell(CMLib.lister().reallyList(CMClass.weapons(),-1).toString());
					mob.tell(CMLib.lister().reallyList(CMClass.miscMagic(),-1).toString());
					mob.tell(CMLib.lister().reallyList(CMClass.miscTech(),-1).toString());
					mob.tell(CMLib.lister().reallyList(CMClass.clanItems(),-1).toString());
					mob.tell(CMLib.lister().reallyList(CMClass.basicItems(),-1).toString());
					mob.tell(CMLib.lister().reallyList(CMClass.mobTypes(),-1).toString());
					mob.tell(getScr("BaseGenerics","msgitemground"));
					mob.tell(getScr("BaseGenerics","msgmobsroom"));
				}
				else
				{
					Environmental item=E.getShop().getStock(itemstr,null,E.whatIsSold(),null);
					if(item!=null)
					{
						mob.tell(getScr("BaseGenerics","itemidrem",item.ID()));
						E.getShop().delAllStoreInventory((Environmental)item.copyOf(),E.whatIsSold());
					}
					else
					{
						item=CMClass.getUnknown(itemstr);
						if((item==null)&&(mob.location()!=null))
						{
							Room R=mob.location();
							item=R.fetchItem(null,itemstr);
							if(item==null)
							{
								item=R.fetchInhabitant(itemstr);
								if((item instanceof MOB)&&(!((MOB)item).isMonster()))
									item=null;
							}
						}
						if(item!=null)
						{
							item=(Environmental)item.copyOf();
							item.recoverEnvStats();
							boolean ok=E.doISellThis(item);
							if((item instanceof Ability)
							   &&((E.whatIsSold()==ShopKeeper.DEAL_TRAINER)||(E.whatIsSold()==ShopKeeper.DEAL_CASTER)))
								ok=true;
							else
							if(E.whatIsSold()==ShopKeeper.DEAL_INVENTORYONLY)
								ok=true;
							if(!ok)
							{
								mob.tell(getScr("BaseGenerics","shoperror"));
							}
							else
							{
								boolean alreadyHasIt=false;

								if(E.getShop().doIHaveThisInStock(item.Name(),null,E.whatIsSold(),null))
								   alreadyHasIt=true;

								if(!alreadyHasIt)
								{
									mob.tell(getScr("BaseGenerics","itemidadd",item.ID()));
									int num=1;
									if(!(item instanceof Ability))
										num=CMath.s_int(mob.session().prompt(getScr("BaseGenerics","howman"),""));
									int price=CMath.s_int(mob.session().prompt(getScr("BaseGenerics","atwprice"),""));
									E.getShop().addStoreInventory(item,num,price,E);
								}
							}
						}
						else
						{
							mob.tell(getScr("BaseGenerics","itemerr",itemstr));
						}
					}
				}
			}
			else
				mob.tell(getScr("BaseGenerics","nochange"));
		}
	}
	public static void genShopkeeper3(MOB mob, ShopKeeper E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","prejudice",showNumber+"",E.prejudiceFactors()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newValue=mob.session().prompt(getScr("BaseGenerics","anewstri"),"");
		if(newValue.equalsIgnoreCase("null"))
			E.setPrejudiceFactors("");
		else
		if(newValue.length()>0)
			E.setPrejudiceFactors(newValue);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}

	public static void genShopkeeper4(MOB mob, ShopKeeper E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","budget",showNumber+"",E.budget()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newValue=mob.session().prompt(getScr("BaseGenerics","anewstri"),"");
		if(newValue.equalsIgnoreCase("null"))
			E.setBudget("");
		else
		if(newValue.length()>0)
			E.setBudget(newValue);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}

	public static void genShopkeeper5(MOB mob, ShopKeeper E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","devaluationrate",showNumber+"",E.devalueRate()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newValue=mob.session().prompt(getScr("BaseGenerics","anewstri"),"");
		if(newValue.equalsIgnoreCase("null"))
			E.setDevalueRate("");
		else
		if(newValue.length()>0)
			E.setDevalueRate(newValue);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}
	public static void genShopkeeper6(MOB mob, ShopKeeper E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","inventoryresetrate",showNumber+"",E.invResetRate()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newValue=mob.session().prompt(getScr("BaseGenerics","anewnum"),"");
		if(newValue.equals("0")||(CMath.s_int(newValue)!=0))
			E.setInvResetRate(CMath.s_int(newValue));
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}

    public static void genShopkeeper7(MOB mob, ShopKeeper E, int showNumber, int showFlag)
    throws IOException
    {
        if((showFlag>0)&&(showFlag!=showNumber)) return;
        mob.tell(getScr("BaseGenerics","ignoremask",showNumber+"",E.ignoreMask()));
        if((showFlag!=showNumber)&&(showFlag>-999)) return;
        String newValue=mob.session().prompt(getScr("BaseGenerics","anewsmask"),"");
        if(newValue.equalsIgnoreCase("null"))
            E.setIgnoreMask("");
        else
        if(newValue.length()>0)
            E.setIgnoreMask(newValue);
        else
            mob.tell(getScr("BaseGenerics","nochange"));
    }

	public static void genAbilities(MOB mob, MOB E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		String behave="NO";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(behave.length()>0))
		{
			String abilitiestr="";
			for(int a=0;a<E.numLearnedAbilities();a++)
			{
				Ability A=E.fetchAbility(a);
				if((A!=null)&&(A.savable()))
					abilitiestr+=A.ID()+", ";
			}
			if(abilitiestr.length()>0)
				abilitiestr=abilitiestr.substring(0,abilitiestr.length()-2);
			mob.tell(getScr("BaseGenerics","abilities",showNumber+"",abilitiestr));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			behave=mob.session().prompt(getScr("BaseGenerics","entabaddrem"),"");
			if(behave.length()>0)
			{
				if(behave.equalsIgnoreCase("?"))
					mob.tell(CMLib.lister().reallyList(CMClass.abilities(),-1).toString());
				else
				{
					Ability chosenOne=null;
					for(int a=0;a<E.numLearnedAbilities();a++)
					{
						Ability A=E.fetchAbility(a);
						if((A!=null)&&(A.ID().equalsIgnoreCase(behave)))
							chosenOne=A;
					}
					if(chosenOne!=null)
					{
						mob.tell(getScr("BaseGenerics","cidr",chosenOne.ID()));
						E.delAbility(chosenOne);
						if(E.fetchEffect(chosenOne.ID())!=null)
							E.delEffect(E.fetchEffect(chosenOne.ID()));
					}
					else
					{
						chosenOne=CMClass.getAbility(behave);
						if(chosenOne!=null)
						{
							boolean alreadyHasIt=(E.fetchAbility(chosenOne.ID())!=null);
							if(!alreadyHasIt)
								mob.tell(getScr("BaseGenerics","cida",chosenOne.ID()));
							else
								mob.tell(getScr("BaseGenerics","cidaa",chosenOne.ID()));
							if(!alreadyHasIt)
							{
								chosenOne=(Ability)chosenOne.copyOf();
								E.addAbility(chosenOne);
								chosenOne.setProficiency(50);
								chosenOne.autoInvocation(mob);
							}
						}
						else
						{
							mob.tell(getScr("BaseGenerics","behaveerr",behave));
						}
					}
				}
			}
			else
				mob.tell(getScr("BaseGenerics","nochange"));
		}
	}

	public static void genClanMembers(MOB mob, Clan E, int showNumber, int showFlag)
	throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		String behave="NO";
		DVector members=E.getMemberList();
		DVector membersCopy=members.copyOf();
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(behave.length()>0))
		{
			String memberStr="";
			for(int m=0;m<members.size();m++)
				memberStr+=((String)members.elementAt(m,1))+" ("+CMLib.clans().getRoleName(E.getGovernment(),((Integer)members.elementAt(m,2)).intValue(),true,false)+"), ";
			if(memberStr.length()>0)
				memberStr=memberStr.substring(0,memberStr.length()-2);
			mob.tell(getScr("BaseGenerics","clanmembers",showNumber+"",memberStr));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			behave=mob.session().prompt(getScr("BaseGenerics","clanmemaddrem"),"");
			if(behave.length()>0)
			{
				int chosenOne=-1;
				for(int m=0;m<members.size();m++)
					if(behave.equalsIgnoreCase((String)members.elementAt(m,1)))
						chosenOne=m;
				if(chosenOne>=0)
				{
					mob.tell(getScr("BaseGenerics","cidr",(String)members.elementAt(chosenOne,1)));
					members.removeElementAt(chosenOne);
				}
				else
				{
					MOB M=CMLib.map().getLoadPlayer(behave);
					if(M!=null)
					{
						int oldNum=-1;
						for(int m=0;m<membersCopy.size();m++)
							if(behave.equalsIgnoreCase((String)membersCopy.elementAt(m,1)))
							{
								oldNum=m;
								members.addElement(membersCopy.elementAt(m,1),membersCopy.elementAt(m,2),membersCopy.elementAt(m,3));
								break;
							}
						int index=oldNum;
						if(index<0)
						{
							index=members.size();
							members.addElement(M.Name(),new Integer(Clan.POS_MEMBER),new Long(M.playerStats().lastDateTime()));
						}
						
						int newRole=-1;
						while((mob.session()!=null)&&(!mob.session().killFlag())&&(newRole<0))
						{
							String newRoleStr=mob.session().prompt(getScr("BaseGenerics","clannewrole",CMLib.clans().getRoleName(E.getGovernment(),((Integer)members.elementAt(index,2)).intValue(),true,false)),"");
							StringBuffer roles=new StringBuffer();
							for(int i=0;i<Clan.ROL_DESCS[E.getGovernment()].length;i++)
							{
								roles.append(Clan.ROL_DESCS[E.getGovernment()][i]+", ");
								if(newRoleStr.equalsIgnoreCase(Clan.ROL_DESCS[E.getGovernment()][i]))
									newRole=Clan.POSORDER[i];
							}
							roles=new StringBuffer(roles.substring(0,roles.length()-2));
							if(newRole<0)
								mob.tell(getScr("BaseGenerics","clanrolerr",roles.toString()));
							else
								break;
						}
						if(oldNum<0)
							mob.tell(getScr("BaseGenerics","cida",M.Name()));
						else
							mob.tell(getScr("BaseGenerics","cidaa",M.Name()));
						members.setElementAt(index,2,new Integer(newRole));
					}
					else
					{
						mob.tell(getScr("BaseGenerics","clanmemerr",behave));
					}
				}
				// first add missing ones
				for(int m=0;m<members.size();m++)
				{
					String newName=(String)members.elementAt(m,1);
					if(!membersCopy.contains(newName))
					{
						MOB M=CMLib.map().getLoadPlayer(newName);
						if(M!=null)
						{
							Clan oldC=CMLib.clans().getClan(M.getClanID());
							if((oldC!=null)
							&&(!M.getClanID().equalsIgnoreCase(E.clanID())))
							{
								M.setClanID("");
								M.setClanRole(Clan.POS_APPLICANT);
								oldC.updateClanPrivileges(M);
							}
							Integer role=(Integer)members.elementAt(m,2);
							CMLib.database().DBUpdateClanMembership(M.Name(), E.clanID(), role.intValue());
							M.setClanID(E.clanID());
							M.setClanRole(role.intValue());
							E.updateClanPrivileges(M);
						}
					}
				}
				// now adjust changed roles
				for(int m=0;m<members.size();m++)
				{
					String newName=(String)members.elementAt(m,1);
					if(membersCopy.contains(newName))
					{
						MOB M=CMLib.map().getLoadPlayer(newName);
						int newRole=((Integer)members.elementAt(m,2)).intValue();
						if((M!=null)&&(newRole!=M.getClanRole()))
						{
							CMLib.database().DBUpdateClanMembership(M.Name(), E.clanID(), newRole);
							M.setClanRole(newRole);
							E.updateClanPrivileges(M);
						}
					}
				}
				// now remove old members
				for(int m=0;m<membersCopy.size();m++)
				{
					String newName=(String)membersCopy.elementAt(m,1);
					if(!members.contains(newName))
					{
						MOB M=CMLib.map().getLoadPlayer(newName);
						if(M!=null)
						{
							M.setClanID("");
							M.setClanRole(Clan.POS_APPLICANT);
							E.updateClanPrivileges(M);
						}
					}
				}
			}
			else
				mob.tell(getScr("BaseGenerics","nochange"));
		}
	}
	
	public static void genDeity1(MOB mob, Deity E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","clericreq",showNumber+"",E.getClericRequirements()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newValue=mob.session().prompt(getScr("BaseGenerics","newreq"),"");
		if(newValue.length()>0)
			E.setClericRequirements(newValue);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}
	public static void genDeity2(MOB mob, Deity E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","clericrit",showNumber+"",E.getClericRitual()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newValue=mob.session().prompt(getScr("BaseGenerics","newrit"),"");
		if(newValue.length()>0)
			E.setClericRitual(newValue);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}
	public static void genDeity3(MOB mob, Deity E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","worshipreq",showNumber+"",E.getWorshipRequirements()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newValue=mob.session().prompt(getScr("BaseGenerics","newreq"),"");
		if(newValue.length()>0)
			E.setWorshipRequirements(newValue);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}
	public static void genDeity4(MOB mob, Deity E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","worshiprit",showNumber+"",E.getWorshipRitual()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newValue=mob.session().prompt(getScr("BaseGenerics","newrit"),"");
		if(newValue.length()>0)
			E.setWorshipRitual(newValue);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}
	public static void genDeity5(MOB mob, Deity E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		String behave="NO";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(behave.length()>0))
		{
			String abilitiestr="";
			for(int a=0;a<E.numBlessings();a++)
			{
				Ability A=E.fetchBlessing(a);
				if((A!=null)&&(A.savable()))
					abilitiestr+=A.ID()+", ";
			}
			if(abilitiestr.length()>0)
				abilitiestr=abilitiestr.substring(0,abilitiestr.length()-2);
			mob.tell(getScr("BaseGenerics","blessings",showNumber+"",abilitiestr));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			behave=mob.session().prompt(getScr("BaseGenerics","entabaddrem"),"");
			if(behave.length()>0)
			{
				if(behave.equalsIgnoreCase("?"))
					mob.tell(CMLib.lister().reallyList(CMClass.abilities(),-1).toString());
				else
				{
					Ability chosenOne=null;
					for(int a=0;a<E.numBlessings();a++)
					{
						Ability A=E.fetchBlessing(a);
						if((A!=null)&&(A.ID().equalsIgnoreCase(behave)))
							chosenOne=A;
					}
					if(chosenOne!=null)
					{
						mob.tell(getScr("BaseGenerics","cidr",chosenOne.ID()));
						E.delBlessing(chosenOne);
					}
					else
					{
						chosenOne=CMClass.getAbility(behave);
						if(chosenOne!=null)
						{
							boolean alreadyHasIt=false;
							for(int a=0;a<E.numBlessings();a++)
							{
								Ability A=E.fetchBlessing(a);
								if((A!=null)&&(A.ID().equals(chosenOne.ID())))
									alreadyHasIt=true;
							}
							if(!alreadyHasIt)
								mob.tell(getScr("BaseGenerics","cida",chosenOne.ID()));
							else
								mob.tell(getScr("BaseGenerics","cidaa",chosenOne.ID()));
							if(!alreadyHasIt)
								E.addBlessing((Ability)chosenOne.copyOf());
						}
						else
						{
							mob.tell(getScr("BaseGenerics","behaveerr",behave));
						}
					}
				}
			}
			else
				mob.tell(getScr("BaseGenerics","nochange"));
		}
	}

	public static void genDeity6(MOB mob, Deity E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		String behave="NO";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(behave.length()>0))
		{
			String abilitiestr="";
			for(int a=0;a<E.numCurses();a++)
			{
				Ability A=E.fetchCurse(a);
				if((A!=null)&&(A.savable()))
					abilitiestr+=A.ID()+", ";
			}
			if(abilitiestr.length()>0)
				abilitiestr=abilitiestr.substring(0,abilitiestr.length()-2);
			mob.tell(getScr("BaseGenerics","curses",showNumber+"",abilitiestr));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			behave=mob.session().prompt(getScr("BaseGenerics","entabaddrem"),"");
			if(behave.length()>0)
			{
				if(behave.equalsIgnoreCase("?"))
					mob.tell(CMLib.lister().reallyList(CMClass.abilities(),-1).toString());
				else
				{
					Ability chosenOne=null;
					for(int a=0;a<E.numCurses();a++)
					{
						Ability A=E.fetchCurse(a);
						if((A!=null)&&(A.ID().equalsIgnoreCase(behave)))
							chosenOne=A;
					}
					if(chosenOne!=null)
					{
						mob.tell(getScr("BaseGenerics","cidr",chosenOne.ID()));
						E.delCurse(chosenOne);
					}
					else
					{
						chosenOne=CMClass.getAbility(behave);
						if(chosenOne!=null)
						{
							boolean alreadyHasIt=false;
							for(int a=0;a<E.numCurses();a++)
							{
								Ability A=E.fetchCurse(a);
								if((A!=null)&&(A.ID().equals(chosenOne.ID())))
									alreadyHasIt=true;
							}
							if(!alreadyHasIt)
								mob.tell(getScr("BaseGenerics","cida",chosenOne.ID()));
							else
								mob.tell(getScr("BaseGenerics","cidaa",chosenOne.ID()));
							if(!alreadyHasIt)
								E.addCurse((Ability)chosenOne.copyOf());
						}
						else
						{
							mob.tell(getScr("BaseGenerics","behaveerr",behave));
						}
					}
				}
			}
			else
				mob.tell(getScr("BaseGenerics","nochange"));
		}
	}

	public static void genDeity7(MOB mob, Deity E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		String behave="NO";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(behave.length()>0))
		{
			String abilitiestr="";
			for(int a=0;a<E.numPowers();a++)
			{
				Ability A=E.fetchPower(a);
				if((A!=null)&&(A.savable()))
					abilitiestr+=A.ID()+", ";
			}
			if(abilitiestr.length()>0)
				abilitiestr=abilitiestr.substring(0,abilitiestr.length()-2);
			mob.tell(getScr("BaseGenerics","grantedpowers",showNumber+"",abilitiestr));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			behave=mob.session().prompt(getScr("BaseGenerics","entabaddrem"),"");
			if(behave.length()>0)
			{
				if(behave.equalsIgnoreCase("?"))
					mob.tell(CMLib.lister().reallyList(CMClass.abilities(),-1).toString());
				else
				{
					Ability chosenOne=null;
					for(int a=0;a<E.numPowers();a++)
					{
						Ability A=E.fetchPower(a);
						if((A!=null)&&(A.ID().equalsIgnoreCase(behave)))
							chosenOne=A;
					}
					if(chosenOne!=null)
					{
						mob.tell(getScr("BaseGenerics","cidr",chosenOne.ID()));
						E.delPower(chosenOne);
					}
					else
					{
						chosenOne=CMClass.getAbility(behave);
						if(chosenOne!=null)
						{
							boolean alreadyHasIt=false;
							for(int a=0;a<E.numPowers();a++)
							{
								Ability A=E.fetchPower(a);
								if((A!=null)&&(A.ID().equals(chosenOne.ID())))
									alreadyHasIt=true;
							}
							if(!alreadyHasIt)
								mob.tell(getScr("BaseGenerics","cida",chosenOne.ID()));
							else
								mob.tell(getScr("BaseGenerics","cidaa",chosenOne.ID()));
							if(!alreadyHasIt)
								E.addPower((Ability)chosenOne.copyOf());
						}
						else
						{
							mob.tell(getScr("BaseGenerics","behaveerr",behave));
						}
					}
				}
			}
			else
				mob.tell(getScr("BaseGenerics","nochange"));
		}
	}
	public static void genDeity8(MOB mob, Deity E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","clericsin",showNumber+"",E.getClericSin()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newValue=mob.session().prompt(getScr("BaseGenerics","sinritual"),"");
		if(newValue.length()>0)
			E.setClericSin(newValue);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}
	public static void genDeity9(MOB mob, Deity E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","worshipsin",showNumber+"",E.getWorshipSin()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newValue=mob.session().prompt(getScr("BaseGenerics","sinritual"),"");
		if(newValue.length()>0)
			E.setWorshipSin(newValue);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}
	public static void genDeity0(MOB mob, Deity E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","clericpowrit",showNumber+"",E.getClericPowerup()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newValue=mob.session().prompt(getScr("BaseGenerics","newpowritual"),"");
		if(newValue.length()>0)
			E.setClericPowerup(newValue);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}
    public static void genDeity11(MOB mob, Deity E, int showNumber, int showFlag)
    throws IOException
    {
        if((showFlag>0)&&(showFlag!=showNumber)) return;
        mob.tell(getScr("BaseGenerics","servicerit",showNumber+"",E.getServiceRitual()));
        if((showFlag!=showNumber)&&(showFlag>-999)) return;
        String newValue=mob.session().prompt(getScr("BaseGenerics","newrit"),"");
        if(newValue.length()>0)
            E.setServiceRitual(newValue);
        else
            mob.tell(getScr("BaseGenerics","nochange"));
    }
	public static void genGridLocaleX(MOB mob, GridZones E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","sizex",showNumber+"",E.xGridSize()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newValue=mob.session().prompt(getScr("BaseGenerics","newsize"),"");
		if(CMath.s_int(newValue)>0)
			E.setXGridSize(CMath.s_int(newValue));
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}

	public static void genGridLocaleY(MOB mob, GridZones E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","sizey",showNumber+"",E.yGridSize()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newValue=mob.session().prompt(getScr("BaseGenerics","newsize"),"");
		if(CMath.s_int(newValue)>0)
			E.setYGridSize(CMath.s_int(newValue));
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}

	public static void genWornLocation(MOB mob, Item E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		if((showFlag!=showNumber)&&(showFlag>-999))
		{
			StringBuffer buf=new StringBuffer(showNumber+". ");
			if(!E.rawLogicalAnd())
				buf.append(getScr("BaseGenerics","wearonany"));
			else
				buf.append(getScr("BaseGenerics","wornonall"));
			for(int l=0;l<Item.WORN_CODES.length;l++)
			{
				long wornCode=1<<l;
				if((CMLib.flags().wornLocation(wornCode).length()>0)
				&&(((E.rawProperLocationBitmap()&wornCode)==wornCode)))
					buf.append(CMLib.flags().wornLocation(wornCode)+" ");
			}
			mob.tell(buf.toString());
			return;
		}
		int codeVal=-1;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(codeVal!=0))
		{
			mob.tell(getScr("BaseGenerics","wearingpar"));
			if(!E.rawLogicalAnd())
				mob.tell(getScr("BaseGenerics","msgworn1"));
			else
				mob.tell(getScr("BaseGenerics","msgworn2"));
			for(int l=0;l<Item.WORN_CODES.length;l++)
			{
				long wornCode=1<<l;
				if(CMLib.flags().wornLocation(wornCode).length()>0)
				{
					String header=(l+2)+": ("+CMLib.flags().wornLocation(wornCode)+") : "+(((E.rawProperLocationBitmap()&wornCode)==wornCode)?"YES":"NO");
					mob.tell(header);
				}
			}
			codeVal=CMath.s_int(mob.session().prompt(getScr("BaseGenerics","togglenumber")));
			if(codeVal>0)
			{
				if(codeVal==1)
					E.setRawLogicalAnd(!E.rawLogicalAnd());
				else
				{
					int wornCode=1<<(codeVal-2);
					if((E.rawProperLocationBitmap()&wornCode)==wornCode)
						E.setRawProperLocationBitmap(E.rawProperLocationBitmap()-wornCode);
					else
						E.setRawProperLocationBitmap(E.rawProperLocationBitmap()|wornCode);
				}
			}
		}
	}

	public static void genThirstQuenched(MOB mob, Drink E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","qdrink",showNumber+"",E.thirstQuenched()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		E.setThirstQuenched(getNumericData(mob,getScr("BaseGenerics","moumou"),E.thirstQuenched()));
	}

	public static void genDrinkHeld(MOB mob, Drink E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","amountdrinks",showNumber+"",""+E.liquidHeld()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		E.setLiquidHeld(getNumericData(mob,getScr("BaseGenerics","moumou"),E.liquidHeld()));
		E.setLiquidRemaining(E.liquidHeld());
	}



	static void genText(MOB mob, Race E, int showNumber, int showFlag, String FieldDisp, String Field)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(showNumber+". "+FieldDisp+": '"+E.getStat(Field)+"'.");
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","enternewone"),"");
		if(newName.length()>0)
			E.setStat(Field,newName);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}
	static void genText(MOB mob, CharClass E, int showNumber, int showFlag, String FieldDisp, String Field)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(showNumber+". "+FieldDisp+": '"+E.getStat(Field)+"'.");
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","enternewone"),"");
		if(newName.length()>0)
			E.setStat(Field,newName);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}
	static void genAttackAttribute(MOB mob, CharClass E, int showNumber, int showFlag, String FieldDisp, String Field)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(showNumber+". "+FieldDisp+": '"+CharStats.STAT_DESCS[CMath.s_int(E.getStat(Field))]+"'.");
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","enternewone"),"");
		String newStat="";
		for(int i=0;i<CharStats.NUM_BASE_STATS;i++)
			if(newName.equalsIgnoreCase(CharStats.STAT_DESCS[i]))
				newStat=""+i;
		if(newStat.length()>0)
			E.setStat(Field,newStat);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}
	static void genArmorCode(MOB mob, CharClass E, int showNumber, int showFlag, String FieldDisp, String Field)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(showNumber+". "+FieldDisp+": '"+CharClass.ARMOR_LONGDESC[CMath.s_int(E.getStat(Field))]+"'.");
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","enter",CMParms.toStringList(CharClass.ARMOR_DESCS)),"");
		String newStat="";
		for(int i=0;i<CharClass.ARMOR_DESCS.length;i++)
			if(newName.equalsIgnoreCase(CharClass.ARMOR_DESCS[i]))
				newStat=""+i;
		if(newStat.length()>0)
			E.setStat(Field,newStat);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}
	static void genQualifications(MOB mob, CharClass E, int showNumber, int showFlag, String FieldDisp, String Field)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(showNumber+". "+FieldDisp+": '"+CMLib.masking().maskDesc(E.getStat(Field))+"'.");
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName="?";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(newName.equals("?")))
		{
			newName=mob.session().prompt(getScr("BaseGenerics","entermask"),"");
			if(newName.equals("?"))
				mob.tell(CMLib.masking().maskHelp("\n",getScr("BaseGenerics","allows")));
		}
		if((newName.length()>0)&&(!newName.equals("?")))
			E.setStat(Field,newName);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}
	static void genClanAccept(MOB mob, Clan E, int showNumber, int showFlag)
	throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(showNumber+". "+getScr("BaseGenerics","clanaccept")+": '"+CMLib.masking().maskDesc(E.getAcceptanceSettings())+"'.");
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName="?";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(newName.equals("?")))
		{
			newName=mob.session().prompt(getScr("BaseGenerics","entermask"),"");
			if(newName.equals("?"))
				mob.tell(CMLib.masking().maskHelp("\n",getScr("BaseGenerics","allows")));
		}
		if((newName.length()>0)&&(!newName.equals("?")))
			E.setAcceptanceSettings(newName);
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}
	static void genWeaponRestr(MOB mob, CharClass E, int showNumber, int showFlag, String FieldDisp, String FieldNum, String Field)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		Vector set=CMParms.parseCommas(E.getStat(Field),true);
		StringBuffer str=new StringBuffer("");
		for(int v=0;v<set.size();v++)
			str.append(" "+Weapon.classifictionDescription[CMath.s_int((String)set.elementAt(v))].toLowerCase());

		mob.tell(showNumber+". "+FieldDisp+": '"+str.toString()+"'.");
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName="?";
		boolean setChanged=false;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(newName.equals("?")))
		{
			newName=mob.session().prompt(getScr("BaseGenerics","weapclass"),"");
			if(newName.equals("?"))
				mob.tell(CMParms.toStringList(Weapon.classifictionDescription));
			else
			if(newName.length()>0)
			{
				int foundCode=-1;
				for(int i=0;i<Weapon.classifictionDescription.length;i++)
					if(Weapon.classifictionDescription[i].equalsIgnoreCase(newName))
						foundCode=i;
				if(foundCode<0)
				{
					mob.tell(getScr("BaseGenerics","namenotrec",newName));
					newName="?";
				}
				else
				{
					int x=set.indexOf(""+foundCode);
					if(x>=0)
					{
						setChanged=true;
						set.removeElementAt(x);
						mob.tell(getScr("BaseGenerics","namerem",newName));
						newName="?";
					}
					else
					{
						set.addElement(""+foundCode);
						setChanged=true;
						mob.tell(getScr("BaseGenerics","nameadd",newName));
						newName="?";
					}
				}
			}
		}
		if(setChanged)
			E.setStat(Field,CMParms.toStringList(set));
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}
	static void genInt(MOB mob, CharClass E, int showNumber, int showFlag, String FieldDisp, String Field)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(showNumber+". "+FieldDisp+": '"+E.getStat(Field)+"'.");
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","enternewone"),"");
		if((newName.length()>0)&&((newName.trim().equals("0"))||(CMath.s_int(newName)!=0)))
			E.setStat(Field,""+CMath.s_int(newName));
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}
	static void genInt(MOB mob, Race E, int showNumber, int showFlag, String FieldDisp, String Field)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(showNumber+". "+FieldDisp+": '"+E.getStat(Field)+"'.");
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","enternewone"),"");
		if((newName.length()>0)&&((newName.trim().equals("0"))||(CMath.s_int(newName)!=0)))
			E.setStat(Field,""+CMath.s_int(newName));
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}
	static void genBool(MOB mob, Race E, int showNumber, int showFlag, String FieldDisp, String Field)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(showNumber+". "+FieldDisp+": '"+E.getStat(Field)+"'.");
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","truefalse"),"");
		if((newName.length()>0)&&(newName.equalsIgnoreCase("true")||newName.equalsIgnoreCase("false")))
			E.setStat(Field,newName.toLowerCase());
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}
	static void genBool(MOB mob, CharClass E, int showNumber, int showFlag, String FieldDisp, String Field)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(showNumber+". "+FieldDisp+": '"+E.getStat(Field)+"'.");
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","truefalse"),"");
		if((newName.length()>0)&&(newName.equalsIgnoreCase("true")||newName.equalsIgnoreCase("false")))
			E.setStat(Field,newName.toLowerCase());
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}
	static void genRaceAvailability(MOB mob, Race E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","availab",showNumber+"",Area.THEME_DESCS_EXT[CMath.s_int(E.getStat("AVAIL"))]));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName="?";
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(newName.equals("?")))
		{
			newName=mob.session().prompt(getScr("BaseGenerics","entnewvalueh"),"");
			if(newName.length()==0)
				mob.tell(getScr("BaseGenerics","nochange"));
			else
			if((CMath.isNumber(newName))&&(CMath.s_int(newName)<Area.THEME_DESCS_EXT.length))
				E.setStat("AVAIL",""+CMath.s_int(newName));
			else
			if(newName.equalsIgnoreCase("?"))
			{
			    StringBuffer str=new StringBuffer(getScr("BaseGenerics","validv"));
			    for(int i=0;i<Area.THEME_DESCS_EXT.length;i++)
			        str.append(i+") "+Area.THEME_DESCS_EXT[i]+"\n\r");
			    mob.tell(str.toString());
			}
			else
				mob.tell(getScr("BaseGenerics","nochange"));
		}
	}
    static void genClassAvailability(MOB mob, CharClass E, int showNumber, int showFlag)
    throws IOException
    {
        if((showFlag>0)&&(showFlag!=showNumber)) return;
        mob.tell(showNumber+". Availability: '"+Area.THEME_DESCS_EXT[CMath.s_int(E.getStat("PLAYER"))]+"'.");
        if((showFlag!=showNumber)&&(showFlag>-999)) return;
        String newName="?";
        while((mob.session()!=null)&&(!mob.session().killFlag())&&(newName.equals("?")))
        {
            newName=mob.session().prompt(getScr("BaseGenerics","entnewvalueh"),"");
            if(newName.length()==0)
                mob.tell(getScr("BaseGenerics","nochange"));
            else
            if((CMath.isNumber(newName))&&(CMath.s_int(newName)<Area.THEME_DESCS_EXT.length))
                E.setStat("PLAYER",""+CMath.s_int(newName));
            else
            if(newName.equalsIgnoreCase("?"))
            {
                StringBuffer str=new StringBuffer(getScr("BaseGenerics","validval"));
                for(int i=0;i<Area.THEME_DESCS_EXT.length;i++)
                    str.append(i+") "+Area.THEME_DESCS_EXT[i]+"\n\r");
                mob.tell(str.toString());
            }
            else
                mob.tell(getScr("BaseGenerics","nochange"));
        }
    }
    
	static void genCat(MOB mob, Race E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","racialcate",showNumber+"",E.racialCategory()+""));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","enternewone"),"");
		if(newName.length()>0)
		{
			boolean found=false;
			if(newName.startsWith("new "))
			{
				newName=CMStrings.capitalizeAndLower(newName.substring(4));
				if(newName.length()>0)
					found=true;
			}
			else
			for(Enumeration r=CMClass.races();r.hasMoreElements();)
			{
				Race R=(Race)r.nextElement();
				if(newName.equalsIgnoreCase(R.racialCategory()))
				{
					newName=R.racialCategory();
					found=true;
					break;
				}
			}
			if(!found)
			{
				StringBuffer str=new StringBuffer(getScr("BaseGenerics","cateerr"));
				HashSet H=new HashSet();
				for(Enumeration r=CMClass.races();r.hasMoreElements();)
				{
					Race R=(Race)r.nextElement();
					if(!H.contains(R.racialCategory()))
					{
						H.add(R.racialCategory());
						str.append(R.racialCategory()+", ");
					}
				}
				mob.tell(str.toString().substring(0,str.length()-2)+".");
			}
			else
				E.setStat("CAT",newName);
		}
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}
	static void genHealthBuddy(MOB mob, Race E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","healthrace",showNumber+"",E.getStat("HEALTHRACE")));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","enternewone"),"");
		if(newName.length()>0)
		{
			Race R2=CMClass.getRace(newName);
			if((R2!=null)&&(R2.isGeneric()))
				R2=null;
			if(R2==null)
			{
				StringBuffer str=new StringBuffer(getScr("BaseGenerics","racenameinv"));
				for(Enumeration r=CMClass.races();r.hasMoreElements();)
				{
					Race R=(Race)r.nextElement();
					if(!R.isGeneric())
						str.append(R.ID()+", ");
				}
				mob.tell(str.toString().substring(0,str.length()-2)+".");
			}
			else
				E.setStat("HEALTHRACE",R2.ID());
		}
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}
	static void genBodyParts(MOB mob, Race E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		StringBuffer parts=new StringBuffer("");
		for(int i=0;i<Race.BODYPARTSTR.length;i++)
			if(E.bodyMask()[i]!=0) parts.append(Race.BODYPARTSTR[i].toLowerCase()+"("+E.bodyMask()[i]+") ");
		mob.tell(getScr("BaseGenerics","bodyparts",showNumber+"",parts.toString()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","bodypart"),"");
		if(newName.length()>0)
		{
			int partNum=-1;
			for(int i=0;i<Race.BODYPARTSTR.length;i++)
				if(newName.equalsIgnoreCase(Race.BODYPARTSTR[i]))
				{ partNum=i; break;}
			if(partNum<0)
			{
				StringBuffer str=new StringBuffer(getScr("BaseGenerics","bodyerr"));
				for(int i=0;i<Race.BODYPARTSTR.length;i++)
					str.append(Race.BODYPARTSTR[i]+", ");
				mob.tell(str.toString().substring(0,str.length()-2)+".");
			}
			else
			{
				newName=mob.session().prompt(getScr("BaseGenerics","newnumb",E.bodyMask()[partNum]+""),""+E.bodyMask()[partNum]);
				if(newName.length()>0)
					E.bodyMask()[partNum]=CMath.s_int(newName);
				else
					mob.tell(getScr("BaseGenerics","nochange"));
			}
		}
		else
			mob.tell(getScr("BaseGenerics","nochange"));
	}
	static void genEStats(MOB mob, Race R, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
        EnvStats S=(EnvStats)CMClass.getCommon("DefaultEnvStats");
        S.setAllValues(0);
		CMLib.coffeeMaker().setEnvStats(S,R.getStat("ESTATS"));
		StringBuffer parts=new StringBuffer("");
		for(int i=0;i<S.getCodes().length;i++)
			if(CMath.s_int(S.getStat(S.getCodes()[i]))!=0)
				parts.append(CMStrings.capitalizeAndLower(S.getCodes()[i])+"("+S.getStat(S.getCodes()[i])+") ");
		mob.tell(getScr("BaseGenerics","Estatadj",showNumber+"",parts.toString()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
        boolean done=false;
        while((!done)&&(mob.session()!=null)&&(!mob.session().killFlag()))
        {
    		String newName=mob.session().prompt(getScr("BaseGenerics","statname"),"");
    		if(newName.length()>0)
    		{
    			String partName=null;
    			for(int i=0;i<S.getCodes().length;i++)
    				if(newName.equalsIgnoreCase(S.getCodes()[i]))
    				{ partName=S.getCodes()[i]; break;}
    			if(partName==null)
    			{
    				StringBuffer str=new StringBuffer(getScr("BaseGenerics","staterr"));
    				for(int i=0;i<S.getCodes().length;i++)
    					str.append(S.getCodes()[i]+", ");
    				mob.tell(str.toString().substring(0,str.length()-2)+".");
    			}
    			else
    			{
    				boolean checkChange=false;
    				if(partName.equals("DISPOSITION"))
    				{
    					genDisposition(mob,S,0,0);
    					checkChange=true;
    				}
    				else
    				if(partName.equals("SENSES"))
    				{
    					genSensesMask(mob,S,0,0);
    					checkChange=true;
    				}
    				else
    				{
    					newName=mob.session().prompt(getScr("BaseGenerics","entvaluep"),"");
    					if(newName.length()>0)
    					{
    						S.setStat(partName,newName);
    						checkChange=true;
    					}
    					else
    						mob.tell(getScr("BaseGenerics","nochange"));
    				}
    				if(checkChange)
    				{
    					boolean zereoed=true;
    					for(int i=0;i<S.getCodes().length;i++)
    					{
    						if(CMath.s_int(S.getStat(S.getCodes()[i]))!=0)
    						{ zereoed=false; break;}
    					}
    					if(zereoed)
    						R.setStat("ESTATS","");
    					else
    						R.setStat("ESTATS",CMLib.coffeeMaker().getEnvStatsStr(S));
    				}
    			}
    		}
    		else
            {
                mob.tell(getScr("BaseGenerics","nochange"));
                done=true;
            }
        }
	}
	static void genAState(MOB mob,
	        			  Race R,
	        			  String field,
	        			  String prompt,
	        			  int showNumber,
	        			  int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		CharState S=(CharState)CMClass.getCommon("DefaultCharState"); S.setAllValues(0);
		CMLib.coffeeMaker().setCharState(S,R.getStat(field));
		StringBuffer parts=new StringBuffer("");
		for(int i=0;i<S.getStatCodes().length;i++)
			if(CMath.s_int(S.getStat(S.getStatCodes()[i]))!=0)
				parts.append(CMStrings.capitalizeAndLower(S.getStatCodes()[i])+"("+S.getStat(S.getStatCodes()[i])+") ");
		mob.tell(showNumber+". "+prompt+": "+parts.toString()+".");
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
        boolean done=false;
        while((!done)&&(mob.session()!=null)&&(!mob.session().killFlag()))
        {
    		String newName=mob.session().prompt(getScr("BaseGenerics","statname"),"");
    		if(newName.length()>0)
    		{
    			String partName=null;
    			for(int i=0;i<S.getStatCodes().length;i++)
    				if(newName.equalsIgnoreCase(S.getStatCodes()[i]))
    				{ partName=S.getStatCodes()[i]; break;}
    			if(partName==null)
    			{
    				StringBuffer str=new StringBuffer(getScr("BaseGenerics","staterr"));
    				for(int i=0;i<S.getStatCodes().length;i++)
    					str.append(S.getStatCodes()[i]+", ");
    				mob.tell(str.toString().substring(0,str.length()-2)+".");
    			}
    			else
    			{
    				newName=mob.session().prompt(getScr("BaseGenerics","entvaluep"),"");
    				if(newName.length()>0)
    				{
    					S.setStat(partName,newName);
    					boolean zereoed=true;
    					for(int i=0;i<S.getStatCodes().length;i++)
    					{
    						if(CMath.s_int(S.getStat(S.getStatCodes()[i]))!=0)
    						{ zereoed=false; break;}
    					}
    					if(zereoed)
    						R.setStat(field,"");
    					else
    						R.setStat(field,CMLib.coffeeMaker().getCharStateStr(S));
    				}
    				else
    					mob.tell(getScr("BaseGenerics","nochange"));
    			}
    		}
    		else
            {
                mob.tell(getScr("BaseGenerics","nochange"));
                done=true;
            }
        }
	}
	static void genAStats(MOB mob, Race R, String Field, String FieldName, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
        CharStats S=(CharStats)CMClass.getCommon("DefaultCharStats"); S.setAllValues(0);
		CMLib.coffeeMaker().setCharStats(S,R.getStat(Field));
		StringBuffer parts=new StringBuffer("");
		for(int i=0;i<CharStats.STAT_DESCS.length;i++)
			if(S.getStat(i)!=0)
				parts.append(CMStrings.capitalizeAndLower(CharStats.STAT_DESCS[i])+"("+S.getStat(i)+") ");
		mob.tell(showNumber+". "+FieldName+": "+parts.toString()+".");
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
        boolean done=false;
        while((!done)&&(mob.session()!=null)&&(!mob.session().killFlag()))
        {
    		String newName=mob.session().prompt(getScr("BaseGenerics","statname"),"");
    		if(newName.length()>0)
    		{
    			int partNum=-1;
    			for(int i=0;i<CharStats.STAT_DESCS.length;i++)
    				if(newName.equalsIgnoreCase(CharStats.STAT_DESCS[i]))
    				{ partNum=i; break;}
    			if(partNum<0)
    			{
    				StringBuffer str=new StringBuffer(getScr("BaseGenerics","staterr"));
    				for(int i=0;i<CharStats.STAT_DESCS.length;i++)
    					str.append(CharStats.STAT_DESCS[i]+", ");
    				mob.tell(str.toString().substring(0,str.length()-2)+".");
    			}
    			else
    			{
    				newName=mob.session().prompt(getScr("BaseGenerics","entvaluep"),"");
    				if(newName.length()>0)
    				{
    					if(newName.trim().equalsIgnoreCase("0"))
        					S.setStat(partNum,CMath.s_int(newName));
    					else
                        if(partNum==CharStats.STAT_GENDER)
                            S.setStat(partNum,(int)newName.charAt(0));
                        else
        					S.setStat(partNum,CMath.s_int(newName));
    					boolean zereoed=true;
    					for(int i=0;i<CharStats.STAT_DESCS.length;i++)
    					{
    						if(S.getStat(i)!=0)
    						{ zereoed=false; break;}
    					}
    					if(zereoed)
    						R.setStat(Field,"");
    					else
    						R.setStat(Field,CMLib.coffeeMaker().getCharStatsStr(S));
    				}
    				else
    					mob.tell(getScr("BaseGenerics","nochange"));
    			}
    		}
    		else
            {
    			mob.tell(getScr("BaseGenerics","nochange"));
                done=true;
            }
        }
	}

	static void genEStats(MOB mob, CharClass R, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
        EnvStats S=(EnvStats)CMClass.getCommon("DefaultEnvStats");
        S.setAllValues(0);
		CMLib.coffeeMaker().setEnvStats(S,R.getStat("ESTATS"));
		StringBuffer parts=new StringBuffer("");
		for(int i=0;i<S.getCodes().length;i++)
			if(CMath.s_int(S.getStat(S.getCodes()[i]))!=0)
				parts.append(CMStrings.capitalizeAndLower(S.getCodes()[i])+"("+S.getStat(S.getCodes()[i])+") ");
		mob.tell(getScr("BaseGenerics","Estatadjline",showNumber+"",parts.toString()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
        boolean done=false;
        while((!done)&&(mob.session()!=null)&&(!mob.session().killFlag()))
        {
    		String newName=mob.session().prompt(getScr("BaseGenerics","statname"),"");
    		if(newName.length()>0)
    		{
    			String partName=null;
    			for(int i=0;i<S.getCodes().length;i++)
    				if(newName.equalsIgnoreCase(S.getCodes()[i]))
    				{ partName=S.getCodes()[i]; break;}
    			if(partName==null)
    			{
    				StringBuffer str=new StringBuffer(getScr("BaseGenerics","staterr"));
    				for(int i=0;i<S.getCodes().length;i++)
    					str.append(S.getCodes()[i]+", ");
    				mob.tell(str.toString().substring(0,str.length()-2)+".");
    			}
    			else
    			{
    				boolean checkChange=false;
    				if(partName.equals("DISPOSITION"))
    				{
    					genDisposition(mob,S,0,0);
    					checkChange=true;
    				}
    				else
    				if(partName.equals("SENSES"))
    				{
    					genSensesMask(mob,S,0,0);
    					checkChange=true;
    				}
    				else
    				{
    					newName=mob.session().prompt(getScr("BaseGenerics","entvaluep"),"");
    					if(newName.length()>0)
    					{
    						S.setStat(partName,newName);
    						checkChange=true;
    					}
    					else
    						mob.tell(getScr("BaseGenerics","nochange"));
    				}
    				if(checkChange)
    				{
    					boolean zereoed=true;
    					for(int i=0;i<S.getCodes().length;i++)
    					{
    						if(CMath.s_int(S.getStat(S.getCodes()[i]))!=0)
    						{ zereoed=false; break;}
    					}
    					if(zereoed)
    						R.setStat("ESTATS","");
    					else
    						R.setStat("ESTATS",CMLib.coffeeMaker().getEnvStatsStr(S));
    				}
    			}
    		}
    		else
            {
    			mob.tell(getScr("BaseGenerics","nochange"));
                done=true;
            }
        }
	}
	static void genAState(MOB mob,
	        			  CharClass R,
	        			  String field,
	        			  String prompt,
	        			  int showNumber,
	        			  int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
        CharState S=(CharState)CMClass.getCommon("DefaultCharState"); S.setAllValues(0);
		CMLib.coffeeMaker().setCharState(S,R.getStat(field));
		StringBuffer parts=new StringBuffer("");
		for(int i=0;i<S.getStatCodes().length;i++)
			if(CMath.s_int(S.getStat(S.getStatCodes()[i]))!=0)
				parts.append(CMStrings.capitalizeAndLower(S.getStatCodes()[i])+"("+S.getStat(S.getStatCodes()[i])+") ");
		mob.tell(showNumber+". "+prompt+": "+parts.toString()+".");
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
        boolean done=false;
        while((!done)&&(mob.session()!=null)&&(!mob.session().killFlag()))
        {
    		String newName=mob.session().prompt(getScr("BaseGenerics","statname"),"");
    		if(newName.length()>0)
    		{
    			String partName=null;
    			for(int i=0;i<S.getStatCodes().length;i++)
    				if(newName.equalsIgnoreCase(S.getStatCodes()[i]))
    				{ partName=S.getStatCodes()[i]; break;}
    			if(partName==null)
    			{
    				StringBuffer str=new StringBuffer(getScr("BaseGenerics","staterr"));
    				for(int i=0;i<S.getStatCodes().length;i++)
    					str.append(S.getStatCodes()[i]+", ");
    				mob.tell(str.toString().substring(0,str.length()-2)+".");
    			}
    			else
    			{
    				newName=mob.session().prompt(getScr("BaseGenerics","entvaluep"),"");
    				if(newName.length()>0)
    				{
    					S.setStat(partName,newName);
    					boolean zereoed=true;
    					for(int i=0;i<S.getStatCodes().length;i++)
    					{
    						if(CMath.s_int(S.getStat(S.getStatCodes()[i]))!=0)
    						{ zereoed=false; break;}
    					}
    					if(zereoed)
    						R.setStat(field,"");
    					else
    						R.setStat(field,CMLib.coffeeMaker().getCharStateStr(S));
    				}
    				else
    					mob.tell(getScr("BaseGenerics","nochange"));
    			}
    		}
    		else
            {
    			mob.tell(getScr("BaseGenerics","nochange"));
                done=true;
            }
        }
	}
	static void genAStats(MOB mob, CharClass R, String Field, String FieldName, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
        CharStats S=(CharStats)CMClass.getCommon("DefaultCharStats"); S.setAllValues(0);
		CMLib.coffeeMaker().setCharStats(S,R.getStat(Field));
		StringBuffer parts=new StringBuffer("");
		for(int i=0;i<CharStats.STAT_DESCS.length;i++)
			if(S.getStat(i)!=0)
				parts.append(CMStrings.capitalizeAndLower(CharStats.STAT_DESCS[i])+"("+S.getStat(i)+") ");
		mob.tell(showNumber+". "+FieldName+": "+parts.toString()+".");
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
        boolean done=false;
        while((!done)&&(mob.session()!=null)&&(!mob.session().killFlag()))
        {
    		String newName=mob.session().prompt(getScr("BaseGenerics","statname"),"");
    		if(newName.length()>0)
    		{
    			int partNum=-1;
    			for(int i=0;i<CharStats.STAT_DESCS.length;i++)
    				if(newName.equalsIgnoreCase(CharStats.STAT_DESCS[i]))
    				{ partNum=i; break;}
    			if(partNum<0)
    			{
    				StringBuffer str=new StringBuffer(getScr("BaseGenerics","staterr"));
    				for(int i=0;i<CharStats.STAT_DESCS.length;i++)
    					str.append(CharStats.STAT_DESCS[i]+", ");
    				mob.tell(str.toString().substring(0,str.length()-2)+".");
    			}
    			else
    			{
    				newName=mob.session().prompt(getScr("BaseGenerics","entvaluep"),"");
    				if(newName.length()>0)
    				{
    					S.setStat(partNum,CMath.s_int(newName));
    					boolean zereoed=true;
    					for(int i=0;i<CharStats.STAT_DESCS.length;i++)
    					{
    						if(S.getStat(i)!=0)
    						{ zereoed=false; break;}
    					}
    					if(zereoed)
    						R.setStat(Field,"");
    					else
    						R.setStat(Field,CMLib.coffeeMaker().getCharStatsStr(S));
    				}
    				else
    					mob.tell(getScr("BaseGenerics","nochange"));
    			}
    		}
    		else
            {
    			mob.tell(getScr("BaseGenerics","nochange"));
                done=true;
            }
        }
	}
	static void genResources(MOB mob, Race E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(true))
		{
			StringBuffer parts=new StringBuffer("");
			int numResources=CMath.s_int(E.getStat("NUMRSC"));
			Vector V=new Vector();
			for(int v=0;v<numResources;v++)
			{
				Item I=CMClass.getItem(E.getStat("GETRSCID"+v));
				if(I!=null)
				{
					I.setMiscText(E.getStat("GETRSCPARM"+v));
					I.recoverEnvStats();
					parts.append(I.name()+", ");
					V.addElement(I);
				}
			}
			if(parts.toString().endsWith(", "))
			{parts.deleteCharAt(parts.length()-1);parts.deleteCharAt(parts.length()-1);}
			mob.tell(getScr("BaseGenerics","resources",showNumber+"",parts.toString()));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			String newName=mob.session().prompt(getScr("BaseGenerics","resname"),"");
			if(newName.length()>0)
			{
				int partNum=-1;
				for(int i=0;i<V.size();i++)
					if(CMLib.english().containsString(((Item)V.elementAt(i)).name(),newName))
					{ partNum=i; break;}
				boolean updateList=false;
				if(partNum<0)
				{
					if(!newName.toLowerCase().startsWith("new "))
						mob.tell(getScr("BaseGenerics","reserr"));
					else
					{
						Item I=mob.fetchCarried(null,newName.substring(4).trim());
						if(I!=null)
						{
							I=(Item)I.copyOf();
							V.addElement(I);
							mob.tell(getScr("BaseGenerics","inameadd",I.name()));
							updateList=true;
						}

					}
				}
				else
				{
					Item I=(Item)V.elementAt(partNum);
					V.removeElementAt(partNum);
					mob.tell(getScr("BaseGenerics","inamerem",I.name()));
					updateList=true;
				}
				if(updateList)
				{
					E.setStat("NUMRSC","");
					for(int i=0;i<V.size();i++)
						E.setStat("GETRSCID"+i,((Item)V.elementAt(i)).ID());
					for(int i=0;i<V.size();i++)
						E.setStat("GETRSCPARM"+i,((Item)V.elementAt(i)).text());
				}
			}
			else
			{
				mob.tell(getScr("BaseGenerics","nochange"));
				return;
			}
		}
	}
	static void genOutfit(MOB mob, Race E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(true))
		{
			StringBuffer parts=new StringBuffer("");
			int numResources=CMath.s_int(E.getStat("NUMOFT"));
			Vector V=new Vector();
			for(int v=0;v<numResources;v++)
			{
				Item I=CMClass.getItem(E.getStat("GETOFTID"+v));
				if(I!=null)
				{
					I.setMiscText(E.getStat("GETOFTPARM"+v));
					I.recoverEnvStats();
					parts.append(I.name()+", ");
					V.addElement(I);
				}
			}
			if(parts.toString().endsWith(", "))
			{parts.deleteCharAt(parts.length()-1);parts.deleteCharAt(parts.length()-1);}
			mob.tell(getScr("BaseGenerics","outfit",showNumber+"",parts.toString()));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			String newName=mob.session().prompt(getScr("BaseGenerics","itemname"),"");
			if(newName.length()>0)
			{
				int partNum=-1;
				for(int i=0;i<V.size();i++)
					if(CMLib.english().containsString(((Item)V.elementAt(i)).name(),newName))
					{ partNum=i; break;}
				boolean updateList=false;
				if(partNum<0)
				{
					if(!newName.toLowerCase().startsWith("new "))
						mob.tell(getScr("BaseGenerics","nameitemerr"));
					else
					{
						Item I=mob.fetchCarried(null,newName.substring(4).trim());
						if(I!=null)
						{
							I=(Item)I.copyOf();
							V.addElement(I);
							mob.tell(getScr("BaseGenerics","inameadd",I.name()));
							updateList=true;
						}

					}
				}
				else
				{
					Item I=(Item)V.elementAt(partNum);
					V.removeElementAt(partNum);
					mob.tell(getScr("BaseGenerics","inamerem",I.name()));
					updateList=true;
				}
				if(updateList)
				{
					E.setStat("NUMOFT","");
					for(int i=0;i<V.size();i++)
						E.setStat("GETOFTID"+i,((Item)V.elementAt(i)).ID());
					for(int i=0;i<V.size();i++)
						E.setStat("GETOFTPARM"+i,((Item)V.elementAt(i)).text());
				}
			}
			else
			{
				mob.tell(getScr("BaseGenerics","nochange"));
				return;
			}
		}
	}
	static void genOutfit(MOB mob, CharClass E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(true))
		{
			StringBuffer parts=new StringBuffer("");
			int numResources=CMath.s_int(E.getStat("NUMOFT"));
			Vector V=new Vector();
			for(int v=0;v<numResources;v++)
			{
				Item I=CMClass.getItem(E.getStat("GETOFTID"+v));
				if(I!=null)
				{
					I.setMiscText(E.getStat("GETOFTPARM"+v));
					I.recoverEnvStats();
					parts.append(I.name()+", ");
					V.addElement(I);
				}
			}
			if(parts.toString().endsWith(", "))
			{parts.deleteCharAt(parts.length()-1);parts.deleteCharAt(parts.length()-1);}
			mob.tell(getScr("BaseGenerics","outfitline",showNumber+"",parts.toString()));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			String newName=mob.session().prompt(getScr("BaseGenerics","itemname"),"");
			if(newName.length()>0)
			{
				int partNum=-1;
				for(int i=0;i<V.size();i++)
					if(CMLib.english().containsString(((Item)V.elementAt(i)).name(),newName))
					{ partNum=i; break;}
				boolean updateList=false;
				if(partNum<0)
				{
					if(!newName.toLowerCase().startsWith("new "))
						mob.tell(getScr("BaseGenerics","nameitemerr"));
					else
					{
						Item I=mob.fetchCarried(null,newName.substring(4).trim());
						if(I!=null)
						{
							I=(Item)I.copyOf();
							V.addElement(I);
							mob.tell(getScr("BaseGenerics","inameadd",I.name()));
							updateList=true;
						}

					}
				}
				else
				{
					Item I=(Item)V.elementAt(partNum);
					V.removeElementAt(partNum);
					mob.tell(getScr("BaseGenerics","inamerem",I.name()));
					updateList=true;
				}
				if(updateList)
				{
					E.setStat("NUMOFT","");
					for(int i=0;i<V.size();i++)
						E.setStat("GETOFTID"+i,((Item)V.elementAt(i)).ID());
					for(int i=0;i<V.size();i++)
						E.setStat("GETOFTPARM"+i,((Item)V.elementAt(i)).text());
				}
			}
			else
			{
				mob.tell(getScr("BaseGenerics","nochange"));
				return;
			}
		}
	}
	static void genWeapon(MOB mob, Race E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		StringBuffer parts=new StringBuffer("");
		Item I=CMClass.getItem(E.getStat("WEAPONCLASS"));
		if(I!=null)
		{
			I.setMiscText(E.getStat("WEAPONXML"));
			I.recoverEnvStats();
			parts.append(I.name());
		}
		mob.tell(getScr("BaseGenerics","naturalweap",showNumber+"",parts.toString()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		String newName=mob.session().prompt(getScr("BaseGenerics","weapname"),"");
		if(newName.equalsIgnoreCase("null"))
		{
			E.setStat("WEAPONCLASS","");
			mob.tell(getScr("BaseGenerics","humanweapset"));
		}
		else
		if(newName.length()>0)
		{
			I=mob.fetchCarried(null,newName);
			if(I==null)
			{
				mob.tell(getScr("BaseGenerics","errinventory",newName));
				mob.tell(getScr("BaseGenerics","nochange"));
				return;
			}
			I=(Item)I.copyOf();
			E.setStat("WEAPONCLASS",I.ID());
			E.setStat("WEAPONXML",I.text());
		}
		else
		{
			mob.tell(getScr("BaseGenerics","nochange"));
			return;
		}
	}

	static void genAgingChart(MOB mob, Race E, int showNumber, int showFlag)
	throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;

		mob.tell(getScr("BaseGenerics","agingchart",showNumber+"",CMParms.toStringList(E.getAgingChart())));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(true))
		{
			String newName=mob.session().prompt(getScr("BaseGenerics","comma"),"");
			if(newName.length()==0)
			{
				mob.tell(getScr("BaseGenerics","nochange"));
				return;
			}
			Vector V=CMParms.parseCommas(newName,true);
			if(V.size()==9)
			{
			    int highest=-1;
			    boolean cont=false;
			    for(int i=0;i<V.size();i++)
			    {
			        if(CMath.s_int((String)V.elementAt(i))<highest)
			        {
			            mob.tell(getScr("BaseGenerics","entryout",((String)V.elementAt(i))));
			            cont=true;
			            break;
			        }
			        highest=CMath.s_int((String)V.elementAt(i));
			    }
			    if(cont) continue;
			    E.setStat("AGING",newName);
			    break;
			}
		}
	}

	static void genRaceFlags(MOB mob, Race E, int showNumber, int showFlag)
	throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber))
		    return;

		int flags=CMath.s_int(E.getStat("DISFLAGS"));
		StringBuffer sets=new StringBuffer("");
	    if(CMath.bset(flags,Race.GENFLAG_NOCLASS))
		    sets.append(getScr("BaseGenerics","classless"));
	    if(CMath.bset(flags,Race.GENFLAG_NOLEVELS))
		    sets.append(getScr("BaseGenerics","leveless"));
	    if(CMath.bset(flags,Race.GENFLAG_NOEXP))
		    sets.append(getScr("BaseGenerics","expless"));

		mob.tell(getScr("BaseGenerics","extraracflags",showNumber+"",sets.toString()));
		if((showFlag!=showNumber)&&(showFlag>-999))
		    return;
		String newName=mob.session().prompt(getScr("BaseGenerics","esslist"),"");
		switch(CMath.s_int(newName))
		{
		case 1:
		    if(CMath.bset(flags,Race.GENFLAG_NOCLASS))
		        flags=CMath.unsetb(flags,Race.GENFLAG_NOCLASS);
		    else
		        flags=flags|Race.GENFLAG_NOCLASS;
		    break;
		case 2:
		    if(CMath.bset(flags,Race.GENFLAG_NOLEVELS))
		        flags=CMath.unsetb(flags,Race.GENFLAG_NOLEVELS);
		    else
		        flags=flags|Race.GENFLAG_NOLEVELS;
		    break;
		case 3:
		    if(CMath.bset(flags,Race.GENFLAG_NOEXP))
		        flags=CMath.unsetb(flags,Race.GENFLAG_NOEXP);
		    else
		        flags=flags|Race.GENFLAG_NOEXP;
		    break;
		default:
			mob.tell(getScr("BaseGenerics","nochange"));
			break;
		}
		E.setStat("DISFLAGS",""+flags);
	}

	static void genClassFlags(MOB mob, CharClass E, int showNumber, int showFlag)
	throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber))
		    return;

		int flags=CMath.s_int(E.getStat("DISFLAGS"));
		StringBuffer sets=new StringBuffer("");
	    if(CMath.bset(flags,CharClass.GENFLAG_NORACE))
		    sets.append(getScr("BaseGenerics","raceless"));
	    if(CMath.bset(flags,CharClass.GENFLAG_NOLEVELS))
		    sets.append(getScr("BaseGenerics","leveless"));
	    if(CMath.bset(flags,CharClass.GENFLAG_NOEXP))
		    sets.append(getScr("BaseGenerics","expless"));

		mob.tell(getScr("BaseGenerics","extracharcfl",showNumber+"",sets.toString()));
		if((showFlag!=showNumber)&&(showFlag>-999))
		    return;
		String newName=mob.session().prompt(getScr("BaseGenerics","esslist"),"");
		switch(CMath.s_int(newName))
		{
		case 1:
		    if(CMath.bset(flags,CharClass.GENFLAG_NORACE))
		        flags=CMath.unsetb(flags,CharClass.GENFLAG_NORACE);
		    else
		        flags=flags|CharClass.GENFLAG_NORACE;
		    break;
		case 2:
		    if(CMath.bset(flags,CharClass.GENFLAG_NOLEVELS))
		        flags=CMath.unsetb(flags,CharClass.GENFLAG_NOLEVELS);
		    else
		        flags=flags|CharClass.GENFLAG_NOLEVELS;
		    break;
		case 3:
		    if(CMath.bset(flags,CharClass.GENFLAG_NOEXP))
		        flags=CMath.unsetb(flags,CharClass.GENFLAG_NOEXP);
		    else
		        flags=flags|CharClass.GENFLAG_NOEXP;
		    break;
		default:
			mob.tell(getScr("BaseGenerics","nochange"));
			break;
		}
		E.setStat("DISFLAGS",""+flags);
	}

	static void genRacialAbilities(MOB mob, Race E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(true))
		{
			StringBuffer parts=new StringBuffer("");
			int numResources=CMath.s_int(E.getStat("NUMRABLE"));
			Vector ables=new Vector();
			Vector data=new Vector();
			for(int v=0;v<numResources;v++)
			{
				Ability A=CMClass.getAbility(E.getStat("GETRABLE"+v));
				if(A!=null)
				{
					parts.append("("+A.ID()+"/"+E.getStat("GETRABLELVL"+v)+"/"+E.getStat("GETRABLEQUAL"+v)+"/"+E.getStat("GETRABLEPROF"+v)+"), ");
					ables.addElement(A);
					data.addElement(A.ID()+";"+E.getStat("GETRABLELVL"+v)+";"+E.getStat("GETRABLEQUAL"+v)+";"+E.getStat("GETRABLEPROF"+v));
				}
			}
			if(parts.toString().endsWith(", "))
			{parts.deleteCharAt(parts.length()-1);parts.deleteCharAt(parts.length()-1);}
			mob.tell(getScr("BaseGenerics","racialab",showNumber+"",parts.toString()));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			String newName=mob.session().prompt(getScr("BaseGenerics","abname"),"");
			if(newName.equalsIgnoreCase("?"))
				mob.tell(CMLib.lister().reallyList(CMClass.abilities(),-1).toString());
			else
			if(newName.length()>0)
			{
				int partNum=-1;
				for(int i=0;i<ables.size();i++)
					if(CMLib.english().containsString(((Ability)ables.elementAt(i)).ID(),newName))
					{ partNum=i; break;}
				boolean updateList=false;
				if(partNum<0)
				{
					Ability A=CMClass.getAbility(newName);
					if(A==null)
						mob.tell(getScr("BaseGenerics","abilityerr"));
					else
					if(A.isAutoInvoked())
						mob.tell(getScr("BaseGenerics","autoinverr",A.name()));
					else
					if((A.triggerStrings()==null)||(A.triggerStrings().length==0))
						mob.tell(getScr("BaseGenerics","notriggererr",A.name()));
					else
					{
						StringBuffer str=new StringBuffer(A.ID()+";");
						String level=mob.session().prompt(getScr("BaseGenerics","skilllev"),"1");
						str.append((""+CMath.s_int(level))+";");
						if(mob.session().confirm(getScr("BaseGenerics","autaut"),"Y"))
							str.append(getScr("BaseGenerics","falseword"));
						else
							str.append(getScr("BaseGenerics","trueword"));
						String prof=mob.session().prompt(getScr("BaseGenerics","proflev"),"100");
						str.append((""+CMath.s_int(prof)));
						data.addElement(str.toString());
						ables.addElement(A);
						mob.tell(getScr("BaseGenerics","anameadd",A.name()));
						updateList=true;
					}
				}
				else
				{
					Ability A=(Ability)ables.elementAt(partNum);
					ables.removeElementAt(partNum);
					data.removeElementAt(partNum);
					updateList=true;
					mob.tell(getScr("BaseGenerics","anamerem",A.name()));
				}
				if(updateList)
				{
					if(data.size()>0)
						E.setStat("NUMRABLE",""+data.size());
					else
						E.setStat("NUMRABLE","");
					for(int i=0;i<data.size();i++)
					{
						Vector V=CMParms.parseSemicolons((String)data.elementAt(i),false);
						E.setStat("GETRABLE"+i,((String)V.elementAt(0)));
						E.setStat("GETRABLELVL"+i,((String)V.elementAt(1)));
						E.setStat("GETRABLEQUAL"+i,((String)V.elementAt(2)));
						E.setStat("GETRABLEPROF"+i,((String)V.elementAt(3)));
					}
				}
			}
			else
			{
				mob.tell(getScr("BaseGenerics","nochange"));
				return;
			}
		}
	}
	static void genRacialEffects(MOB mob, Race E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(true))
		{
			StringBuffer parts=new StringBuffer("");
			int numResources=CMath.s_int(E.getStat("NUMREFF"));
			Vector ables=new Vector();
			Vector data=new Vector();
			for(int v=0;v<numResources;v++)
			{
				Ability A=CMClass.getAbility(E.getStat("GETREFF"+v));
				if(A!=null)
				{
					parts.append("("+A.ID()+"/"+E.getStat("GETREFFLVL"+v)+"/"+E.getStat("GETREFFPARM"+v)+"), ");
					ables.addElement(A);
					data.addElement(A.ID()+"~"+E.getStat("GETREFFLVL"+v)+"~"+E.getStat("GETREFFPARM"+v));
				}
			}
			if(parts.toString().endsWith(", "))
			{parts.deleteCharAt(parts.length()-1);parts.deleteCharAt(parts.length()-1);}
			mob.tell(getScr("BaseGenerics","racialfx",showNumber+"",parts.toString()));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			String newName=mob.session().prompt(getScr("BaseGenerics","effaddrem"),"");
			if(newName.equalsIgnoreCase("?"))
				mob.tell(CMLib.lister().reallyList(CMClass.abilities(),-1).toString());
			else
			if(newName.length()>0)
			{
				int partNum=-1;
				for(int i=0;i<ables.size();i++)
					if(CMLib.english().containsString(((Ability)ables.elementAt(i)).ID(),newName))
					{ partNum=i; break;}
				boolean updateList=false;
				if(partNum<0)
				{
					Ability A=CMClass.getAbility(newName);
					if(A==null)
						mob.tell(getScr("BaseGenerics","effecterr"));
					else
					{
						StringBuffer str=new StringBuffer(A.ID()+"~");
						String level=mob.session().prompt(getScr("BaseGenerics","entgaine"),"1");
						str.append((""+CMath.s_int(level))+"~");
						String prof=mob.session().prompt(getScr("BaseGenerics","anypar"),"");
						str.append(""+prof);
						data.addElement(str.toString());
						ables.addElement(A);
						mob.tell(getScr("BaseGenerics","anameadd",A.name()));
						updateList=true;
					}
				}
				else
				{
					Ability A=(Ability)ables.elementAt(partNum);
					ables.removeElementAt(partNum);
					data.removeElementAt(partNum);
					updateList=true;
					mob.tell(getScr("BaseGenerics","anamerem",A.name()));
				}
				if(updateList)
				{
					if(data.size()>0)
						E.setStat("NUMREFF",""+data.size());
					else
						E.setStat("NUMREFF","");
					for(int i=0;i<data.size();i++)
					{
						Vector V=CMParms.parseSquiggleDelimited((String)data.elementAt(i),false);
						E.setStat("GETREFF"+i,((String)V.elementAt(0)));
						E.setStat("GETREFFLVL"+i,((String)V.elementAt(1)));
						E.setStat("GETREFFPARM"+i,((String)V.elementAt(2)));
					}
				}
			}
			else
			{
				mob.tell(getScr("BaseGenerics","nochange"));
				return;
			}
		}
	}
	static void genClassAbilities(MOB mob, CharClass E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(true))
		{
			StringBuffer parts=new StringBuffer("");
			int numResources=CMath.s_int(E.getStat("NUMCABLE"));
			Vector ables=new Vector();
			Vector data=new Vector();
			for(int v=0;v<numResources;v++)
			{
				Ability A=CMClass.getAbility(E.getStat("GETCABLE"+v));
				if(A!=null)
				{
					parts.append("("+A.ID()+"/"+E.getStat("GETCABLELVL"+v)+"/"+E.getStat("GETCABLEGAIN"+v)+"/"+E.getStat("GETCABLEPROF"+v)+"), ");
					ables.addElement(A);
					data.addElement(A.ID()+";"+E.getStat("GETCABLELVL"+v)+";"+E.getStat("GETCABLEPROF"+v)+";"+E.getStat("GETCABLEGAIN"+v)+";"+E.getStat("GETCABLESECR"+v)+";"+E.getStat("GETCABLEPARM"+v));
				}
			}
			if(parts.toString().endsWith(", "))
			{parts.deleteCharAt(parts.length()-1);parts.deleteCharAt(parts.length()-1);}
			mob.tell(getScr("BaseGenerics","classabilities",showNumber+"",parts.toString()));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			String newName=mob.session().prompt(getScr("BaseGenerics","abname"),"");
			if(newName.equalsIgnoreCase("?"))
				mob.tell(CMLib.lister().reallyList(CMClass.abilities(),-1).toString());
			else
			if(newName.length()>0)
			{
				int partNum=-1;
				for(int i=0;i<ables.size();i++)
					if(CMLib.english().containsString(((Ability)ables.elementAt(i)).ID(),newName))
					{ partNum=i; break;}
				boolean updateList=false;
				if(partNum<0)
				{
					Ability A=CMClass.getAbility(newName);
					if(A==null)
						mob.tell(getScr("BaseGenerics","abilityerr"));
					else
					{
						StringBuffer str=new StringBuffer(A.ID()+";");
						String level=mob.session().prompt(getScr("BaseGenerics","skilllev"),"1");
						str.append((""+CMath.s_int(level))+";");
						String prof=mob.session().prompt(getScr("BaseGenerics","defaultprof"),"0");
						str.append((""+CMath.s_int(prof))+";");
						if(mob.session().confirm(getScr("BaseGenerics","autaut"),"Y"))
							str.append(getScr("BaseGenerics","trueword"));
						else
							str.append(getScr("BaseGenerics","falseword"));
						if(mob.session().confirm(getScr("BaseGenerics","sese"),"N"))
							str.append(getScr("BaseGenerics","trueword"));
						else
							str.append(getScr("BaseGenerics","falseword"));
						String parm=mob.session().prompt(getScr("BaseGenerics","anyprop"),"");
						str.append(parm);
						data.addElement(str.toString());
						ables.addElement(A);
						mob.tell(getScr("BaseGenerics","anameadd",A.name()));
						updateList=true;
					}
				}
				else
				{
					Ability A=(Ability)ables.elementAt(partNum);
					ables.removeElementAt(partNum);
					data.removeElementAt(partNum);
					updateList=true;
					mob.tell(getScr("BaseGenerics","anamerem",A.name()));
				}
				if(updateList)
				{
					if(data.size()>0)
						E.setStat("NUMCABLE",""+data.size());
					else
						E.setStat("NUMCABLE","");
					for(int i=0;i<data.size();i++)
					{
						Vector V=CMParms.parseSemicolons((String)data.elementAt(i),false);
						E.setStat("GETCABLE"+i,((String)V.elementAt(0)));
						E.setStat("GETCABLELVL"+i,((String)V.elementAt(1)));
						E.setStat("GETCABLEPROF"+i,((String)V.elementAt(2)));
						E.setStat("GETCABLEGAIN"+i,((String)V.elementAt(3)));
						E.setStat("GETCABLESECR"+i,((String)V.elementAt(4)));
						E.setStat("GETCABLEPARM"+i,((String)V.elementAt(5)));
					}
				}
			}
			else
			{
				mob.tell(getScr("BaseGenerics","nochange"));
				return;
			}
		}
	}
	static void genCulturalAbilities(MOB mob, Race E, int showNumber, int showFlag)
		throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(true))
		{
			StringBuffer parts=new StringBuffer("");
			int numResources=CMath.s_int(E.getStat("NUMCABLE"));
			Vector ables=new Vector();
			Vector data=new Vector();
			for(int v=0;v<numResources;v++)
			{
				Ability A=CMClass.getAbility(E.getStat("GETCABLE"+v));
				if(A!=null)
				{
					parts.append("("+A.ID()+"/"+E.getStat("GETCABLEPROF"+v)+"), ");
					ables.addElement(A);
					data.addElement(A.ID()+";"+E.getStat("GETCABLEPROF"+v));
				}
			}
			if(parts.toString().endsWith(", "))
			{parts.deleteCharAt(parts.length()-1);parts.deleteCharAt(parts.length()-1);}
			mob.tell(getScr("BaseGenerics","culturalab",showNumber+"",parts.toString()));
			if((showFlag!=showNumber)&&(showFlag>-999)) return;
			String newName=mob.session().prompt(getScr("BaseGenerics","abname"),"");
			if(newName.equalsIgnoreCase("?"))
				mob.tell(CMLib.lister().reallyList(CMClass.abilities(),-1).toString());
			else
			if(newName.length()>0)
			{
				int partNum=-1;
				for(int i=0;i<ables.size();i++)
					if(CMLib.english().containsString(((Ability)ables.elementAt(i)).ID(),newName))
					{ partNum=i; break;}
				boolean updateList=false;
				if(partNum<0)
				{
					Ability A=CMClass.getAbility(newName);
					if(A==null)
						mob.tell(getScr("BaseGenerics","abilityerr"));
					else
					{
						StringBuffer str=new StringBuffer(A.ID()+";");
						String prof=mob.session().prompt(getScr("BaseGenerics","defproflev"),"100");
						str.append((""+CMath.s_int(prof)));
						data.addElement(str.toString());
						ables.addElement(A);
						mob.tell(getScr("BaseGenerics","anameadd",A.name()));
						updateList=true;
					}
				}
				else
				{
					Ability A=(Ability)ables.elementAt(partNum);
					ables.removeElementAt(partNum);
					data.removeElementAt(partNum);
					updateList=true;
					mob.tell(getScr("BaseGenerics","anamerem",A.name()));
				}
				if(updateList)
				{
					if(data.size()>0)
						E.setStat("NUMCABLE",""+data.size());
					else
						E.setStat("NUMCABLE","");
					for(int i=0;i<data.size();i++)
					{
						Vector V=CMParms.parseSemicolons((String)data.elementAt(i),false);
						E.setStat("GETCABLE"+i,((String)V.elementAt(0)));
						E.setStat("GETCABLEPROF"+i,((String)V.elementAt(1)));
					}
				}
			}
			else
			{
				mob.tell(getScr("BaseGenerics","nochange"));
				return;
			}
		}
	}
	public static void modifyGenClass(MOB mob, CharClass me)
		throws IOException
	{
		if(mob.isMonster())
			return;
		boolean ok=false;
		int showFlag=-1;
		if(CMProps.getIntVar(CMProps.SYSTEMI_EDITORTYPE)>0)
			showFlag=-999;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!ok))
		{
			int showNumber=0;

            genInt(mob,me,++showNumber,showFlag,getScr("BaseGenerics","nunu")+" ","NUMNAME");
            int numNames=CMath.s_int(me.getStat("NUMNAME"));
            if(numNames<=1)
    			genText(mob,me,++showNumber,showFlag,"Name","NAME0");
            else
            for(int i=0;i<numNames;i++)
            {
                genText(mob,me,++showNumber,showFlag,getScr("BaseGenerics","nclvl",i+"")+" ","NAME"+i);
                if(i>0)
                while(!mob.session().killFlag())
                {
                    int oldNameLevel=CMath.s_int(me.getStat("NAMELEVEL"+i));
                    genInt(mob,me,++showNumber,showFlag,"Name #"+i+" class level: ","NAMELEVEL"+i);
                    int previousNameLevel=CMath.s_int(me.getStat("NAMELEVEL"+(i-1)));
                    int newNameLevel=CMath.s_int(me.getStat("NAMELEVEL"+i));
                    if((oldNameLevel!=newNameLevel)&&(newNameLevel<(previousNameLevel+1)))
                    {
                        mob.tell(getScr("BaseGenerics","levelless",(previousNameLevel+1)+""));
                        me.setStat("NAMELEVEL"+i,""+(previousNameLevel+1));
                        showNumber--;
                    }
                    else
                        break;
                }
            }
		    genText(mob,me,++showNumber,showFlag,getScr("BaseGenerics","nana"),"NAME");
			genText(mob,me,++showNumber,showFlag,getScr("BaseGenerics","baba"),"BASE");
            genClassAvailability(mob,me,++showNumber,showFlag);
			genInt(mob,me,++showNumber,showFlag,getScr("BaseGenerics","ipip"),"HPDIV");
			genInt(mob,me,++showNumber,showFlag,getScr("BaseGenerics","didi"),"HPDICE");
			genInt(mob,me,++showNumber,showFlag,getScr("BaseGenerics","hphp"),"HPDIE");
			genInt(mob,me,++showNumber,showFlag,getScr("BaseGenerics","divodivo"),"MANADIV");
			genInt(mob,me,++showNumber,showFlag,getScr("BaseGenerics","dicedice"),"MANADICE");
			genInt(mob,me,++showNumber,showFlag,getScr("BaseGenerics","diedie"),"MANADIE");
			genInt(mob,me,++showNumber,showFlag,getScr("BaseGenerics","pracprac"),"LVLPRAC");
			genInt(mob,me,++showNumber,showFlag,getScr("BaseGenerics","atleatle"),"LVLATT");
			genAttackAttribute(mob,me,++showNumber,showFlag,getScr("BaseGenerics","atat"),"ATTATT");
			genInt(mob,me,++showNumber,showFlag,getScr("BaseGenerics","prapra"),"FSTPRAC");
			genInt(mob,me,++showNumber,showFlag,getScr("BaseGenerics","traintrain"),"FSTTRAN");
			genInt(mob,me,++showNumber,showFlag,getScr("BaseGenerics","dmdm"),"LVLDAM");
			genInt(mob,me,++showNumber,showFlag,getScr("BaseGenerics","movmov"),"LVLMOVE");
			genArmorCode(mob,me,++showNumber,showFlag,getScr("BaseGenerics","armarm"),"ARMOR");
			genText(mob,me,++showNumber,showFlag,getScr("BaseGenerics","limlim"),"STRLMT");
			genText(mob,me,++showNumber,showFlag,getScr("BaseGenerics","bonbon"),"STRBON");
			genQualifications(mob,me,++showNumber,showFlag,getScr("BaseGenerics","qualqual"),"QUAL");
			genEStats(mob,me,++showNumber,showFlag);
			genAStats(mob,me,"ASTATS",getScr("BaseGenerics","charsadj"),++showNumber,showFlag);
			genAStats(mob,me,"CSTATS",getScr("BaseGenerics","chastatsett"),++showNumber,showFlag);
			genAState(mob,me,"ASTATE",getScr("BaseGenerics","chastateadj"),++showNumber,showFlag);
			genAState(mob,me,"STARTASTATE",getScr("BaseGenerics","newplaycs"),++showNumber,showFlag);
			genClassFlags(mob,me,++showNumber,showFlag);
			genWeaponRestr(mob,me,++showNumber,showFlag,getScr("BaseGenerics","weapres"),"NUMWEP","GETWEP");
			genOutfit(mob,me,++showNumber,showFlag);
			genClassAbilities(mob,me,++showNumber,showFlag);
            genInt(mob,me,++showNumber,showFlag,getScr("BaseGenerics","numsecs")+" ","NUMSSET");
            int numGroups=CMath.s_int(me.getStat("NUMSSET"));
            for(int i=0;i<numGroups;i++)
            {
                genText(mob,me,++showNumber,showFlag,getScr("BaseGenerics","seccodes")+i,"SSET"+i);
                while(!mob.session().killFlag())
                {
                    int oldGroupLevel=CMath.s_int(me.getStat("SSETLEVEL"+i));
                    genInt(mob,me,++showNumber,showFlag,getScr("BaseGenerics","cllevsec")+i+": ","SSETLEVEL"+i);
                    int previousGroupLevel=CMath.s_int(me.getStat("SSETLEVEL"+(i-1)));
                    int newGroupLevel=CMath.s_int(me.getStat("SSETLEVEL"+i));
                    if((oldGroupLevel!=newGroupLevel)
                    &&(i>0)
                    &&(newGroupLevel<(previousGroupLevel+1)))
                    {
                        mob.tell(getScr("BaseGenerics","levelless",(previousGroupLevel+1)+""));
                        me.setStat("SSETLEVEL"+i,""+(previousGroupLevel+1));
                        showNumber--;
                    }
                    else
                        break;
                }
            }

			if(showFlag<-900){ ok=true; break;}
			if(showFlag>0){ showFlag=-1; continue;}
			showFlag=CMath.s_int(mob.session().prompt(getScr("BaseGenerics","editwhich"),""));
			if(showFlag<=0)
			{
				showFlag=-1;
				ok=true;
			}
		}
	}

    public static void modifyFaction(MOB mob, Faction me)
    throws IOException
    {
        if(mob.isMonster())
            return;
        boolean ok=false;
        int showFlag=-1;
        if(CMProps.getIntVar(CMProps.SYSTEMI_EDITORTYPE)>0)
            showFlag=-999;
        while((mob.session()!=null)&&(!mob.session().killFlag())&&(!ok))
        {
            int showNumber=0;
            // name
            me.setName(CMLib.english().promptText(mob,me.name(),++showNumber,showFlag,getScr("BaseGenerics","namename")));

            // ranges
            ++showNumber;
            if(me.ranges().size()==0)
                me.ranges().addElement(me.newRange("0;100;Sample Range;SAMPLE;"));
            while((mob.session()!=null)&&(!mob.session().killFlag())&&(!((showFlag>0)&&(showFlag!=showNumber))))
            {
                StringBuffer list=new StringBuffer(getScr("BaseGenerics","faction",showNumber+""));
                list.append(CMStrings.padRight("   Name",21)+CMStrings.padRight("Min",11)+CMStrings.padRight("Max",11)+CMStrings.padRight("Code",16)+CMStrings.padRight("Align",6)+"\n\r");
                for(int r=0;r<me.ranges().size();r++)
                {
                    Faction.FactionRange FR=(Faction.FactionRange)me.ranges().elementAt(r);
                    list.append(CMStrings.padRight("   "+FR.name(),20)+" ");
                    list.append(CMStrings.padRight(""+FR.low(),10)+" ");
                    list.append(CMStrings.padRight(""+FR.high(),10)+" ");
                    list.append(CMStrings.padRight(FR.codeName(),15)+" ");
                    list.append(CMStrings.padRight(Faction.ALIGN_NAMES[FR.alignEquiv()],5)+"\n\r");
                }
                mob.tell(list.toString());
                if((showFlag!=showNumber)&&(showFlag>-999)) break;
                String which=mob.session().prompt(getScr("BaseGenerics","addremmodname"),"");
                if(which.length()==0)
                    break;
                Faction.FactionRange FR=null;
                for(int r=0;r<me.ranges().size();r++)
                {
                    if(((Faction.FactionRange)me.ranges().elementAt(r)).name().equalsIgnoreCase(which))
                        FR=(Faction.FactionRange)me.ranges().elementAt(r);
                }
                if(FR==null)
                {
                    if(mob.session().confirm(getScr("BaseGenerics","cnrange",which)+" ","N"))
                    {
                        FR=me.newRange("0;100;"+which+";CHANGEMYCODENAME;");
                        me.ranges().addElement(FR);
                    }
                }
                else
                if(mob.session().choose(getScr("BaseGenerics","moddelran")+" ","MD","M").toUpperCase().startsWith("D"))
                {
                    me.ranges().remove(FR);
                    mob.tell(getScr("BaseGenerics","rangedeleted"));
                    FR=null;
                }
                if(FR!=null)
                {
                    String newName=mob.session().prompt(getScr("BaseGenerics","entnamefr",FR.name(),FR.name()));
                    boolean error99=false;
                    if(newName.length()==0)
                        error99=true;
                    else
                    for(int r=0;r<me.ranges().size();r++)
                    {
                        Faction.FactionRange FR3=(Faction.FactionRange)me.ranges().elementAt(r);
                        if(FR3.name().equalsIgnoreCase(FR.name())&&(FR3!=FR))
                        { mob.tell(getScr("BaseGenerics","alreadyrange")); error99=true; break;}
                    }
                    if(error99)
                        mob.tell(getScr("BaseGenerics","nochange"));
                    else
                        FR.setName(newName);
                    newName=mob.session().prompt(getScr("BaseGenerics","lowendrange",FR.low()+""),""+FR.low());
                    if(!CMath.isInteger(newName))
                        mob.tell(getScr("BaseGenerics","nochange"));
                    else
                        FR.setLow(CMath.s_int(newName));
                    newName=mob.session().prompt(getScr("BaseGenerics","highendrange",FR.high()+""),""+FR.high());
                    if((!CMath.isInteger(newName))||(CMath.s_int(newName)<FR.low()))
                        mob.tell(getScr("BaseGenerics","nochange"));
                    else
                        FR.setHigh(CMath.s_int(newName));
                    newName=mob.session().prompt(getScr("BaseGenerics","codename",FR.codeName()),""+FR.codeName());
                    if(newName.trim().length()==0)
                        mob.tell(getScr("BaseGenerics","nochange"));
                    else
                    {
                    	Faction FC=CMLib.factions().getFactionByRangeCodeName(newName.toUpperCase().trim());
                    	if((FC!=null)&&(FC!=me))
                            mob.tell(getScr("BaseGenerics","facexists"));
                    	else
	                        FR.setCodeName(newName.toUpperCase().trim());
                    }
                    StringBuffer prompt=new StringBuffer(getScr("BaseGenerics","virtuename"));
                    StringBuffer choices=new StringBuffer("");
                    for(int r=0;r<Faction.ALIGN_NAMES.length;r++)
                    {
                        choices.append(""+r);
                        if(r==Faction.ALIGN_INDIFF)
                            prompt.append(getScr("BaseGenerics","notappmsg",r+""));
                        else
                            prompt.append(r+") "+Faction.ALIGN_NAMES[r].toLowerCase()+"\n\r");
                    }
                    FR.setAlignEquiv(CMath.s_int(mob.session().choose(prompt.toString()+getScr("BaseGenerics","enteralign")+" ",choices.toString(),""+FR.alignEquiv())));
                }
            }


            // show in score
            me.setShowinscore(CMLib.english().promptBool(mob,me.showinscore(),++showNumber,showFlag,getScr("BaseGenerics","shosco")));

            // show in factions
            me.setShowinfactionscommand(CMLib.english().promptBool(mob,me.showinfactionscommand(),++showNumber,showFlag,getScr("BaseGenerics","shofcmd")));

            // show in special reports
            boolean alreadyReporter=false;
            for(Enumeration e=CMLib.factions().factionSet().elements();e.hasMoreElements();)
            {
                Faction F2=(Faction)e.nextElement();
                if(F2.showinspecialreported()) alreadyReporter=true;
            }
            if(!alreadyReporter)
                me.setShowinspecialreported(CMLib.english().promptBool(mob,me.showinspecialreported(),++showNumber,showFlag,getScr("BaseGenerics","shorep")));

            // show in editor
            me.setShowineditor(CMLib.english().promptBool(mob,me.showineditor(),++showNumber,showFlag,getScr("BaseGenerics","shomed")));

            // auto defaults
            boolean error=true;
            me.setAutoDefaults(CMParms.parseSemicolons(CMLib.english().promptText(mob,CMParms.toSemicolonList(me.autoDefaults()),++showNumber,showFlag,getScr("BaseGenerics","zappermasksmsg")),true));

            // non-auto defaults
            error=true;
            if(me.defaults().size()==0)
                me.defaults().addElement("0");
            ++showNumber;
            while(error&&(mob.session()!=null)&&(!mob.session().killFlag()))
            {
                error=false;
                String newDefaults=CMLib.english().promptText(mob,CMParms.toSemicolonList(me.defaults()),showNumber,showFlag,getScr("BaseGenerics","zappermasksmsg2"));
                if((showFlag!=showNumber)&&(showFlag>-999)) break;
                Vector V=CMParms.parseSemicolons(newDefaults,true);
                if(V.size()==0)
                {
                    mob.tell(getScr("BaseGenerics","fielderr"));
                    error=true;
                }
                me.setDefaults(CMParms.parseSemicolons(newDefaults,true));
            }

            // choices and choice intro
            me.setChoices(CMParms.parseSemicolons(CMLib.english().promptText(mob,CMParms.toSemicolonList(me.choices()),++showNumber,showFlag,getScr("BaseGenerics","newplayervchoices")),true));
            if(me.choices().size()>0)
                me.setChoiceIntro(CMLib.english().promptText(mob,me.choiceIntro(),++showNumber,showFlag,getScr("BaseGenerics","introtxt")));

            // rate modifier
            String newModifier=CMLib.english().promptText(mob,Math.round(me.rateModifier()*100.0)+"%",++showNumber,showFlag,getScr("BaseGenerics","ratemod"));
            if(newModifier.endsWith("%"))
                newModifier=newModifier.substring(0,newModifier.length()-1);
            if(CMath.isNumber(newModifier))
                me.setRateModifier(CMath.s_double(newModifier)/100.0);

            // experience flag
            boolean error2=true;
            ++showNumber;
            while(error2&&(mob.session()!=null)&&(!mob.session().killFlag())&&(!((showFlag>0)&&(showFlag!=showNumber))))
            {
                error2=false;
                StringBuffer nextPrompt=new StringBuffer("\n\r");
                int myval=-1;
                for(int i=0;i<Faction.EXPAFFECT_NAMES.length;i++)
                {
                    if(me.experienceFlag().equalsIgnoreCase(Faction.EXPAFFECT_NAMES[i]))
                        myval=i;
                    nextPrompt.append("  "+(i+1)+") "+CMStrings.capitalizeAndLower(Faction.EXPAFFECT_NAMES[i].toLowerCase())+"\n\r");
                }
                if(myval<0){ me.setExperienceFlag("NONE"); myval=0;}
                if((showFlag!=showNumber)&&(showFlag>-999))
                {
                    mob.tell(getScr("BaseGenerics","affectexp",showNumber+"",Faction.EXPAFFECT_NAMES[myval]));
                    break;
                }
                String prompt=getScr("BaseGenerics","afexp")+" "+Faction.EXPAFFECT_NAMES[myval]+nextPrompt.toString()+getScr("BaseGenerics","selvaluen")+" ";
                int mynewval=CMLib.english().promptInteger(mob,myval+1,showNumber,showFlag,prompt);
                if((showFlag!=showNumber)&&(showFlag>-999)) break;
                if((mynewval<=0)||(mynewval>Faction.EXPAFFECT_NAMES.length))
                {
                    mob.tell(getScr("BaseGenerics","valuerr"));
                    error2=true;
                }
                else
                    me.setExperienceFlag(Faction.EXPAFFECT_NAMES[mynewval-1]);
            }

            // factors by mask
            ++showNumber;
            while((mob.session()!=null)&&(!mob.session().killFlag())&&(!((showFlag>0)&&(showFlag!=showNumber))))
            {
                StringBuffer list=new StringBuffer(getScr("BaseGenerics","factionmod",showNumber+""));
                list.append("    #) "+CMStrings.padRight("Zapper Mask",31)+CMStrings.padRight("Gain",6)+CMStrings.padRight("Loss",6)+"\n\r");
                StringBuffer choices=new StringBuffer("");
                for(int r=0;r<me.factors().size();r++)
                {
                    Vector factor=(Vector)me.factors().elementAt(r);
                    if(factor.size()!=3)
                        me.factors().removeElement(factor);
                    else
                    {
                        choices.append(((char)('A'+r)));
                        list.append("    "+(((char)('A'+r))+") "));
                        list.append(CMStrings.padRight((String)factor.elementAt(2),30)+" ");
                        list.append(CMStrings.padRight(""+Math.round(CMath.s_double((String)factor.elementAt(0))*100.0)+"%",5)+" ");
                        list.append(CMStrings.padRight(""+Math.round(CMath.s_double((String)factor.elementAt(1))*100.0)+"%",5)+"\n\r");
                    }
                }
                mob.tell(list.toString());
                if((showFlag!=showNumber)&&(showFlag>-999)) break;
                String which=mob.session().choose(getScr("BaseGenerics","whichstring"),"0"+choices.toString(),"").trim().toUpperCase();
                int factorNum=choices.toString().indexOf(which);
                if((which.length()!=1)
                ||((!which.equalsIgnoreCase("0"))
                    &&((factorNum<0)||(factorNum>=me.factors().size()))))
                    break;
                Vector factor=null;
                if(!which.equalsIgnoreCase("0"))
                {
                    factor=(Vector)me.factors().elementAt(factorNum);
                    if(factor!=null)
                        if(mob.session().choose(getScr("BaseGenerics","moddelran")+" ","MD","M").toUpperCase().startsWith("D"))
                        {
                            me.factors().remove(factor);
                            mob.tell(getScr("BaseGenerics","factordel"));
                            factor=null;
                        }
                }
                else
                {
                    factor=new Vector();
                    factor.addElement("1.0");
                    factor.addElement("1.0");
                    factor.addElement("");
                    me.factors().addElement(factor);
                }
                if(factor!=null)
                {
                    String mask=mob.session().prompt(getScr("BaseGenerics","entzapper",((String)factor.elementAt(2)),((String)factor.elementAt(2))));
                    double newHigh=CMath.s_double((String)factor.elementAt(0));
                    String newName=mob.session().prompt(getScr("BaseGenerics","gainadj",Math.round(newHigh*100)+"",Math.round(newHigh*100)+"".trim()));
                    if(newName.endsWith("%"))
                        newName=newName.substring(0,newName.length()-1);
                    if(!CMath.isNumber(newName))
                        mob.tell(getScr("BaseGenerics","nochange"));
                    else
                        newHigh=CMath.s_double(newName)/100.0;

                    double newLow=CMath.s_double((String)factor.elementAt(1));
                    newName=mob.session().prompt(getScr("BaseGenerics","lossadj",Math.round(newLow*100)+"",Math.round(newLow*100)+"".trim()));
                    if(newName.endsWith("%"))
                        newName=newName.substring(0,newName.length()-1);
                    if(!CMath.isNumber(newName))
                        mob.tell(getScr("BaseGenerics","nochange"));
                    else
                        newLow=CMath.s_double(newName)/100.0;
                    me.factors().removeElement(factor);
                    factor=new Vector();
                    factor.addElement(""+newHigh);
                    factor.addElement(""+newLow);
                    factor.addElement(""+mask);
                    me.factors().addElement(factor);
                }
            }

            // relations between factions
            ++showNumber;
            while((mob.session()!=null)&&(!mob.session().killFlag())&&(!((showFlag>0)&&(showFlag!=showNumber))))
            {
                StringBuffer list=new StringBuffer(getScr("BaseGenerics","crossrelati",showNumber+""));
                list.append(getScr("BaseGenerics","percchange","    ",CMStrings.padRight("",25)));
                for(Enumeration e=me.relations().keys();e.hasMoreElements();)
                {
                    String key=(String)e.nextElement();
                    Double value=(Double)me.relations().get(key);
                    Faction F=CMLib.factions().getFaction(key);
                    if(F!=null)
                    {
                        list.append("    "+CMStrings.padRight(F.name(),31)+" ");
                        long lval=Math.round(value.doubleValue()*100.0);
                        list.append(lval+"%");
                        list.append("\n\r");
                    }
                }
                mob.tell(list.toString());
                if((showFlag!=showNumber)&&(showFlag>-999)) break;
                String which=mob.session().prompt(getScr("BaseGenerics","factionarm"),"");
                if(which.length()==0)
                    break;
                Faction theF=null;
                for(Enumeration e=me.relations().keys();e.hasMoreElements();)
                {
                    String key=(String)e.nextElement();
                    Faction F=CMLib.factions().getFaction(key);
                    if((F!=null)&&(F.name().equalsIgnoreCase(which)))
                        theF=F;
                }
                if(theF==null)
                {
                    Faction possibleF=CMLib.factions().getFaction(which);
                    if(possibleF==null) possibleF=CMLib.factions().getFactionByName(which);
                    if(possibleF==null)
                        mob.tell(getScr("BaseGenerics","errfaction",which));
                    else
                    if(mob.session().confirm(getScr("BaseGenerics","cnf",possibleF.name()),"N"))
                    {
                        theF=possibleF;
                        me.relations().put(theF.factionID(),new Double(1.0));
                    }
                }
                else
                if(mob.session().choose(getScr("BaseGenerics","moddelrel")+" ","MD","M").toUpperCase().startsWith("D"))
                {
                    me.relations().remove(theF.factionID());
                    mob.tell(getScr("BaseGenerics","reldel"));
                    theF=null;
                }
                if(theF!=null)
                {
                    long amount=Math.round(((Double)me.relations().get(theF.factionID())).doubleValue()*100.0);
                    String newName=mob.session().prompt(getScr("BaseGenerics","relamount",amount+""),""+amount+"%");
                    if(newName.endsWith("%")) newName=newName.substring(0,newName.length()-1);
                    if(!CMath.isInteger(newName))
                        mob.tell(getScr("BaseGenerics","nochange"));
                    else
                        amount=CMath.s_long(newName);
                    me.relations().remove(theF.factionID());
                    me.relations().put(theF.factionID(),new Double(amount/100.0));
                }
            }

            // faction change triggers
            ++showNumber;
            while((mob.session()!=null)&&(!mob.session().killFlag())&&(!((showFlag>0)&&(showFlag!=showNumber))))
            {
                StringBuffer list=new StringBuffer(getScr("BaseGenerics","factrigg",showNumber+""));
                list.append("    "+CMStrings.padRight("Type",15)
                        +" "+CMStrings.padRight("Direction",10)
                        +" "+CMStrings.padRight("Factor",10)
                        +" "+CMStrings.padRight("Flags",20)
                        +" Mask\n\r");
                for(Enumeration e=me.Changes().elements();e.hasMoreElements();)
                {
                    Faction.FactionChangeEvent CE=(Faction.FactionChangeEvent)e.nextElement();
                    if(CE!=null)
                    {
                        list.append("    ");
                        list.append(CMStrings.padRight(CE.eventID(),15)+" ");
                        list.append(CMStrings.padRight(Faction.FactionChangeEvent.FACTION_DIRECTIONS[CE.direction()],10)+" ");
                        list.append(CMStrings.padRight(Math.round(CE.factor()*100.0)+"%",10)+" ");
                        list.append(CMStrings.padRight(CE.flagCache(),20)+" ");
                        list.append(CE.zapper()+"\n\r");
                    }
                }
                mob.tell(list.toString());
                if((showFlag!=showNumber)&&(showFlag>-999)) break;
                String which=mob.session().prompt(getScr("BaseGenerics","triggerid"),"");
                which=which.toUpperCase().trim();
                if(which.length()==0) break;
                if(which.equalsIgnoreCase("?"))
                {
                    mob.tell(getScr("BaseGenerics","validtrigg",me.ALL_CHANGE_EVENT_TYPES()));
                    continue;
                }
                Faction.FactionChangeEvent CE=(Faction.FactionChangeEvent)me.Changes().get(which);
                if(CE==null)
                {
                    CE=me.newChangeEvent();
                    if(!CE.setFilterID(which))
                    {
                        mob.tell(getScr("BaseGenerics","iderr"));
                        continue;
                    }
                    else
                    if(!mob.session().confirm(getScr("BaseGenerics","cnt",which)+" ","N"))
                    {
                        CE=null;
                        break;
                    }
                    else
                        me.Changes().put(CE.eventID().toUpperCase(),CE);
                }
                else
                if(mob.session().choose(getScr("BaseGenerics","moddeltrig")+" ","MD","M").toUpperCase().startsWith("D"))
                {
                    me.Changes().remove(CE.eventID());
                    mob.tell(getScr("BaseGenerics","trigrem"));
                    CE=null;
                }

                if(CE!=null)
                {
                    StringBuffer directions=new StringBuffer(getScr("BaseGenerics","validdir"));
                    StringBuffer cmds=new StringBuffer("");
                    for(int i=0;i<Faction.FactionChangeEvent.FACTION_DIRECTIONS.length;i++)
                    {
                        directions.append(((char)('A'+i))+") "+Faction.FactionChangeEvent.FACTION_DIRECTIONS[i]+"\n\r");
                        cmds.append((char)('A'+i));
                    }
                    String str=mob.session().choose(directions+getScr("BaseGenerics","selnewdir")+Faction.FactionChangeEvent.FACTION_DIRECTIONS[CE.direction()]+"): ",cmds.toString()+"\n\r","");
                    if((str.length()==0)||str.equals("\n")||str.equals("\r")||(cmds.toString().indexOf(str.charAt(0))<0))
                        mob.tell(getScr("BaseGenerics","nochange"));
                    else
                        CE.setDirection((cmds.toString().indexOf(str.charAt(0))));
                }
                if(CE!=null)
                {
                    if(CE.factor()==0.0) CE.setFactor(1.0);
                    int amount=(int)Math.round(CE.factor()*100.0);
                    String newName=mob.session().prompt(getScr("BaseGenerics","amountfactor",amount+""),""+amount+"%");
                    if(newName.endsWith("%")) newName=newName.substring(0,newName.length()-1);
                    if(!CMath.isInteger(newName))
                        mob.tell(getScr("BaseGenerics","nochange"));
                    else
                        CE.setFactor(new Double(CMath.s_int(newName)/100.0).doubleValue());
                }
                if(CE!=null)
                {
                    mob.tell(getScr("BaseGenerics","validflags",CMParms.toStringList(Faction.FactionChangeEvent.VALID_FLAGS)));
                    String newFlags=mob.session().prompt(getScr("BaseGenerics","newflags",CE.flagCache(),CE.flagCache()));
                    if((newFlags.length()==0)||(newFlags.equals(CE.flagCache())))
                        mob.tell(getScr("BaseGenerics","nochange"));
                    else
                        CE.setFlags(newFlags);
                }
                if(CE!=null)
                {
                    String newFlags=mob.session().prompt(getScr("BaseGenerics","zappermsg",CE.zapper(),CE.zapper()));
                    if((newFlags.length()==0)||(newFlags.equals(CE.zapper())))
                        mob.tell(getScr("BaseGenerics","nochange"));
                    else
                        CE.setZapper(newFlags);
                }
            }

            // Ability allowances
            ++showNumber;
            while((mob.session()!=null)&&(!mob.session().killFlag())&&(!((showFlag>0)&&(showFlag!=showNumber))))
            {
                if((showFlag>0)&&(showFlag!=showNumber)) break;
                StringBuffer list=new StringBuffer(getScr("BaseGenerics","abiallow",showNumber+""));
                list.append("    #) "
                        +CMStrings.padRight("Ability masks",40)
                        +" "+CMStrings.padRight("Low value",10)
                        +" "+CMStrings.padRight("High value",10)
                        +"\n\r");
                int num=0;
                StringBuffer choices=new StringBuffer("0\n\r");
                for(Enumeration e=me.abilityUsages().elements();e.hasMoreElements();)
                {
                    Faction.FactionAbilityUsage CA=(Faction.FactionAbilityUsage)e.nextElement();
                    if(CA!=null)
                    {
                        list.append("    "+((char)('A'+num)+") "));
                        list.append(CMStrings.padRight(CA.usageID(),40)+" ");
                        list.append(CMStrings.padRight(CA.low()+"",10)+" ");
                        list.append(CMStrings.padRight(CA.high()+"",10)+" ");
                        list.append("\n\r");
                        choices.append((char)('A'+num));
                        num++;
                    }
                }
                mob.tell(list.toString());
                if((showFlag!=showNumber)&&(showFlag>-999)) break;
                String which=mob.session().choose(getScr("BaseGenerics","allmsg"),choices.toString(),"");
                if(which.length()!=1)
                    break;
                which=which.toUpperCase().trim();
                Faction.FactionAbilityUsage CA=null;
                if(!which.equalsIgnoreCase("0"))
                {
                    num=(which.charAt(0)-'A');
                    if((num<0)||(num>=me.abilityUsages().size()))
                        break;
                    CA=(Faction.FactionAbilityUsage)me.abilityUsages().elementAt(num);
                    if(CA==null)
                    {
                        mob.tell(getScr("BaseGenerics","allowancerr"));
                        continue;
                    }
                    if(mob.session().choose(getScr("BaseGenerics","moddelall")+" ","MD","M").toUpperCase().startsWith("D"))
                    {
                        me.abilityUsages().remove(CA);
                        mob.tell(getScr("BaseGenerics","alldel"));
                        CA=null;
                    }
                }
                else
                if(!mob.session().confirm(getScr("BaseGenerics","cna")+" ","N"))
                {
                    CA=null;
                    continue;
                }
                else
                {
                    CA=me.newAbilityUsage();
                    me.abilityUsages().addElement(CA);
                }
                if(CA!=null)
                {
                    boolean cont=false;
                    while((!cont)&&(!mob.session().killFlag()))
                    {
                        String newFlags=mob.session().prompt(getScr("BaseGenerics","abdmasks",CA.usageID(),CA.usageID()));
                        if(newFlags.equalsIgnoreCase("?"))
                        {
                            StringBuffer vals=new StringBuffer(getScr("BaseGenerics","validmasks"));
                            for(int i=0;i<Ability.ACODE_DESCS.length;i++)
                                vals.append(Ability.ACODE_DESCS[i]+", ");
                            for(int i=0;i<Ability.DOMAIN_DESCS.length;i++)
                                vals.append(Ability.DOMAIN_DESCS[i]+", ");
                            for(int i=0;i< Ability.FLAG_DESCS.length;i++)
                                vals.append(Ability.FLAG_DESCS[i]+", ");
                            vals.append(getScr("BaseGenerics","abilityidmsg"));
                            mob.tell(vals.toString());
                            cont=false;
                        }
                        else
                        {
                            cont=true;
                            if((newFlags.length()==0)||(newFlags.equals(CA.usageID())))
                                mob.tell(getScr("BaseGenerics","nochange"));
                            else
                            {
                                Vector unknowns=CA.setAbilityFlag(newFlags);
                                if(unknowns.size()>0)
                                    for(int i=unknowns.size()-1;i>=0;i--)
                                        if(CMClass.getAbility((String)unknowns.elementAt(i))!=null)
                                            unknowns.removeElementAt(i);
                                if(unknowns.size()>0)
                                {
                                    mob.tell(getScr("BaseGenerics","unknownmasks",CMParms.toStringList(unknowns)));
                                    cont=false;
                                }
                            }
                        }
                    }
                    String newName=mob.session().prompt(getScr("BaseGenerics","minvalueab",CA.low()+""),""+CA.low());
                    if((!CMath.isInteger(newName))||(CA.low()==CMath.s_int(newName)))
                        mob.tell(getScr("BaseGenerics","nochange"));
                    else
                        CA.setLow(CMath.s_int(newName));
                    newName=mob.session().prompt(getScr("BaseGenerics","maxvalueab",CA.high()+""),""+CA.high());
                    if((!CMath.isInteger(newName))||(CA.high()==CMath.s_int(newName)))
                        mob.tell(getScr("BaseGenerics","nochange"));
                    else
                        CA.setHigh(CMath.s_int(newName));
                    if(CA.high()<CA.low()) CA.setHigh(CA.low());
                }
            }

            // calculate new max/min
            me.setMinimum(Integer.MAX_VALUE);
            me.setMaximum(Integer.MIN_VALUE);
            for(int r=0;r<me.ranges().size();r++)
            {
                Faction.FactionRange FR=(Faction.FactionRange)me.ranges().elementAt(r);
                if(FR.high()>me.maximum()) me.setMaximum(FR.high());
                if(FR.low()<me.minimum()) me.setMinimum(FR.low());
            }
            if(me.minimum()==Integer.MAX_VALUE) me.setMinimum(Integer.MIN_VALUE);
            if(me.maximum()==Integer.MIN_VALUE) me.setMaximum(Integer.MAX_VALUE);
            if(me.maximum()<me.minimum())
            {
                int oldMin=me.minimum();
                me.setMinimum(me.maximum());
                me.setMaximum(oldMin);
            }
            me.setMiddle(me.minimum()+(int)Math.round(CMath.div(me.maximum()-me.minimum(),2.0)));
            me.setDifference(CMath.abs(me.maximum()-me.minimum()));



            if(showFlag<-900){ ok=true; break;}
            if(showFlag>0){ showFlag=-1; continue;}
            showFlag=CMath.s_int(mob.session().prompt(getScr("BaseGenerics","editwhich"),""));
            if(showFlag<=0)
            {
                showFlag=-1;
                ok=true;
            }
        }
        if((me.factionID().length()>0)&&(CMLib.factions().getFaction(me.factionID())!=null))
        {
            Vector oldV=Resources.getFileLineVector(Resources.getFileResource(me.factionID(),true));
            if(oldV.size()<10)
            {

            }
            boolean[] defined=new boolean[Faction.ALL_TAGS.length];
            for(int i=0;i<defined.length;i++) defined[i]=false;
            for(int v=0;v<oldV.size();v++)
            {
                String s=(String)oldV.elementAt(v);
                if(!(s.trim().startsWith("#")||s.trim().length()==0||(s.indexOf("=")<0)))
                {
                    String tag=s.substring(0,s.indexOf("=")).trim().toUpperCase();
                    int tagRef=CMLib.factions().isFactionTag(tag);
                    if(tagRef>=0) defined[tagRef]=true;
                }
            }
            boolean[] done=new boolean[Faction.ALL_TAGS.length];
            for(int i=0;i<done.length;i++) done[i]=false;
            int lastCommented=-1;
            String CR="\n\r";
            StringBuffer buf=new StringBuffer("");
            for(int v=0;v<oldV.size();v++)
            {
                String s=(String)oldV.elementAt(v);
                if(s.trim().length()==0)
                {
                    if((lastCommented>=0)&&(!done[lastCommented]))
                    {
                        done[lastCommented]=true;
                        buf.append(me.getINIDef(Faction.ALL_TAGS[lastCommented],CR)+CR);
                        lastCommented=-1;
                    }
                }
                else
                if(s.trim().startsWith("#")||(s.indexOf("=")<0))
                {
                    buf.append(s+CR);
                    int x=s.indexOf("=");
                    if(x>=0)
                    {
                        s=s.substring(0,x).trim();
                        int first=s.length()-1;
                        for(;first>=0;first--)
                            if(!Character.isLetterOrDigit(s.charAt(first)))
                                break;
                        first=CMLib.factions().isFactionTag(s.substring(first).trim().toUpperCase());
                        if(first>=0) lastCommented=first;
                    }
                }
                else
                {
                    String tag=s.substring(0,s.indexOf("=")).trim().toUpperCase();
                    int tagRef=CMLib.factions().isFactionTag(tag);
                    if(tagRef<0)
                        buf.append(s+CR);
                    else
                    if(!done[tagRef])
                    {
                        done[tagRef]=true;
                        buf.append(me.getINIDef(tag,CR)+CR);
                    }
                }
            }
            if((lastCommented>=0)&&(!done[lastCommented]))
                buf.append(me.getINIDef(Faction.ALL_TAGS[lastCommented],CR)+CR);
            Resources.removeResource(me.factionID());
            Resources.submitResource(me.factionID(),buf);
            if(!Resources.saveFileResource(me.factionID()))
                mob.tell(getScr("BaseGenerics","factionfilereadonly",me.factionID()));
        }
    }

	public static void modifyGenRace(MOB mob, Race me)
		throws IOException
	{
		if(mob.isMonster())
			return;
		boolean ok=false;
		int showFlag=-1;
		if(CMProps.getIntVar(CMProps.SYSTEMI_EDITORTYPE)>0)
			showFlag=-999;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!ok))
		{
			int showNumber=0;
			genText(mob,me,++showNumber,showFlag,getScr("BaseGenerics","edname"),"NAME");
			genCat(mob,me,++showNumber,showFlag);
			genInt(mob,me,++showNumber,showFlag,getScr("BaseGenerics","edwei"),"BWEIGHT");
			genInt(mob,me,++showNumber,showFlag,getScr("BaseGenerics","edvaria"),"VWEIGHT");
			genInt(mob,me,++showNumber,showFlag,getScr("BaseGenerics","edmhe"),"MHEIGHT");
			genInt(mob,me,++showNumber,showFlag,getScr("BaseGenerics","edfhe"),"FHEIGHT");
			genInt(mob,me,++showNumber,showFlag,getScr("BaseGenerics","edhevar"),"VHEIGHT");
			genRaceAvailability(mob,me,++showNumber,showFlag);
			genText(mob,me,++showNumber,showFlag,getScr("BaseGenerics","edleavtxt"),"LEAVE");
			genText(mob,me,++showNumber,showFlag,getScr("BaseGenerics","edarrtxt"),"ARRIVE");
			genHealthBuddy(mob,me,++showNumber,showFlag);
			genBodyParts(mob,me,++showNumber,showFlag);
			genAgingChart(mob,me,++showNumber,showFlag);
            genBool(mob,me,++showNumber,showFlag,getScr("BaseGenerics","edncc"),"BODYKILL");
			genEStats(mob,me,++showNumber,showFlag);
			genAStats(mob,me,"ASTATS",getScr("BaseGenerics","edcadj"),++showNumber,showFlag);
			genAStats(mob,me,"CSTATS",getScr("BaseGenerics","edcset"),++showNumber,showFlag);
			genAState(mob,me,"ASTATE",getScr("BaseGenerics","edcsta"),++showNumber,showFlag);
			genAState(mob,me,"STARTASTATE",getScr("BaseGenerics","ednpca"),++showNumber,showFlag);
			genRaceFlags(mob,me,++showNumber,showFlag);
			genResources(mob,me,++showNumber,showFlag);
			genOutfit(mob,me,++showNumber,showFlag);
			genWeapon(mob,me,++showNumber,showFlag);
			genRacialAbilities(mob,me,++showNumber,showFlag);
			genCulturalAbilities(mob,me,++showNumber,showFlag);
			//genRacialEffects(mob,me,++showNumber,showFlag);
			if(showFlag<-900){ ok=true; break;}
			if(showFlag>0){ showFlag=-1; continue;}
			showFlag=CMath.s_int(mob.session().prompt(getScr("BaseGenerics","editwhich"),""));
			if(showFlag<=0)
			{
				showFlag=-1;
				ok=true;
			}
		}
	}

	public static void modifyGenItem(MOB mob, Item me)
		throws IOException
	{
		boolean ok=false;
		int showFlag=-1;
		if(CMProps.getIntVar(CMProps.SYSTEMI_EDITORTYPE)>0)
			showFlag=-999;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!ok))
		{
			if(mob.isMonster())	return;
			int showNumber=0;
			genName(mob,me,++showNumber,showFlag);
			genDisplayText(mob,me,++showNumber,showFlag);
			genDescription(mob,me,++showNumber,showFlag);
			genLevel(mob,me,++showNumber,showFlag);
			genSecretIdentity(mob,me,++showNumber,showFlag);
			genMaterialCode(mob,me,++showNumber,showFlag);
			if(me instanceof ClanItem)
				genClanItem(mob,(ClanItem)me,++showNumber,showFlag);
			if(me instanceof ShipComponent)
			{
			    if(me instanceof ShipComponent.ShipPanel)
				    genPanelType(mob,(ShipComponent.ShipPanel)me,++showNumber,showFlag);
			}
            if(me instanceof PackagedItems)
                ((PackagedItems)me).setNumberOfItemsInPackage(CMLib.english().promptInteger(mob,((PackagedItems)me).numberOfItemsInPackage(),++showNumber,showFlag,getScr("BaseGenerics","numpackaged")));
			genGettable(mob,me,++showNumber,showFlag);
			genReadable1(mob,me,++showNumber,showFlag);
			genReadable2(mob,me,++showNumber,showFlag);
			if(me instanceof Recipe) genRecipe(mob,(Recipe)me,++showNumber,showFlag);
			if(me instanceof Light)	genBurnout(mob,(Light)me,++showNumber,showFlag);
			genRejuv(mob,me,++showNumber,showFlag);
			if(me instanceof Coins)
			    genCoinStuff(mob,(Coins)me,++showNumber,showFlag);
			else
				genAbility(mob,me,++showNumber,showFlag);
			genUses(mob,me,++showNumber,showFlag);
			if(me instanceof Wand)
				genMaxUses(mob,(Wand)me,++showNumber,showFlag);
			genValue(mob,me,++showNumber,showFlag);
			genWeight(mob,me,++showNumber,showFlag);
			genDisposition(mob,me.baseEnvStats(),++showNumber,showFlag);
			genBehaviors(mob,me,++showNumber,showFlag);
			genAffects(mob,me,++showNumber,showFlag);
			if(me instanceof LandTitle)
				genTitleRoom(mob,(LandTitle)me,++showNumber,showFlag);
			genImage(mob,me,++showNumber,showFlag);
            for(int x=me.getSaveStatIndex();x<me.getStatCodes().length;x++)
                me.setStat(me.getStatCodes()[x],CMLib.english().promptText(mob,me.getStat(me.getStatCodes()[x]),++showNumber,showFlag,CMStrings.capitalizeAndLower(me.getStatCodes()[x])));
			if(showFlag<-900){ ok=true; break;}
			if(showFlag>0){ showFlag=-1; continue;}
			showFlag=CMath.s_int(mob.session().prompt(getScr("BaseGenerics","editwhich"),""));
			if(showFlag<=0)
			{
				showFlag=-1;
				ok=true;
				me.recoverEnvStats();
				if(me.text().length()>=maxLength)
				{
					mob.tell(getScr("BaseGenerics","stringlimiterr",maxLength+""));
					ok=false;
				}
			}
		}
	}

	public static void modifyGenFood(MOB mob, Food me)
		throws IOException
	{
		if(mob.isMonster())
			return;
		boolean ok=false;
		int showFlag=-1;
		if(CMProps.getIntVar(CMProps.SYSTEMI_EDITORTYPE)>0)
			showFlag=-999;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!ok))
		{
			int showNumber=0;
			genName(mob,me,++showNumber,showFlag);
			genDisplayText(mob,me,++showNumber,showFlag);
			genDescription(mob,me,++showNumber,showFlag);
			genSecretIdentity(mob,me,++showNumber,showFlag);
			genLevel(mob,me,++showNumber,showFlag);
			genValue(mob,me,++showNumber,showFlag);
			genRejuv(mob,me,++showNumber,showFlag);
			genWeight(mob,me,++showNumber,showFlag);
			genMaterialCode(mob,me,++showNumber,showFlag);
			genNourishment(mob,me,++showNumber,showFlag);
			genDisposition(mob,me.baseEnvStats(),++showNumber,showFlag);
			genGettable(mob,me,++showNumber,showFlag);
			genReadable1(mob,me,++showNumber,showFlag);
			genReadable2(mob,me,++showNumber,showFlag);
			if(me instanceof Light)	genBurnout(mob,(Light)me,++showNumber,showFlag);
			genBehaviors(mob,me,++showNumber,showFlag);
			genAffects(mob,me,++showNumber,showFlag);
			genImage(mob,me,++showNumber,showFlag);
            for(int x=me.getSaveStatIndex();x<me.getStatCodes().length;x++)
                me.setStat(me.getStatCodes()[x],CMLib.english().promptText(mob,me.getStat(me.getStatCodes()[x]),++showNumber,showFlag,CMStrings.capitalizeAndLower(me.getStatCodes()[x])));
			if(showFlag<-900){ ok=true; break;}
			if(showFlag>0){ showFlag=-1; continue;}
			showFlag=CMath.s_int(mob.session().prompt(getScr("BaseGenerics","editwhich"),""));
			if(showFlag<=0)
			{
				showFlag=-1;
				ok=true;
				me.recoverEnvStats();
				if(me.text().length()>=maxLength)
				{
					mob.tell(getScr("BaseGenerics","stringlimiterr",maxLength+""));
					ok=false;
				}
			}
		}
	}
	public static void modifyGenDrink(MOB mob, Drink me)
		throws IOException
	{
		if(mob.isMonster())
			return;
		boolean ok=false;
		int showFlag=-1;
		if(CMProps.getIntVar(CMProps.SYSTEMI_EDITORTYPE)>0)
			showFlag=-999;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!ok))
		{
			int showNumber=0;
			genName(mob,me,++showNumber,showFlag);
			genDisplayText(mob,me,++showNumber,showFlag);
			genDescription(mob,me,++showNumber,showFlag);
			genSecretIdentity(mob,(Item)me,++showNumber,showFlag);
			genValue(mob,(Item)me,++showNumber,showFlag);
			genLevel(mob,me,++showNumber,showFlag);
			genWeight(mob,me,++showNumber,showFlag);
			genRejuv(mob,me,++showNumber,showFlag);
			genThirstQuenched(mob,me,++showNumber,showFlag);
			genMaterialCode(mob,(Item)me,++showNumber,showFlag);
			genDrinkHeld(mob,me,++showNumber,showFlag);
			genGettable(mob,(Item)me,++showNumber,showFlag);
			genReadable1(mob,(Item)me,++showNumber,showFlag);
			genReadable2(mob,(Item)me,++showNumber,showFlag);
			if(me instanceof Light)	genBurnout(mob,(Light)me,++showNumber,showFlag);
			genBehaviors(mob,me,++showNumber,showFlag);
			genAffects(mob,me,++showNumber,showFlag);
			genDisposition(mob,me.baseEnvStats(),++showNumber,showFlag);
			if(me instanceof Container)
				genCapacity(mob,(Container)me,++showNumber,showFlag);
			if(me instanceof Perfume)
				((Perfume)me).setSmellList(CMLib.english().promptText(mob,((Perfume)me).getSmellList(),++showNumber,showFlag,getScr("BaseGenerics","smelllist")));
			genImage(mob,me,++showNumber,showFlag);
            for(int x=me.getSaveStatIndex();x<me.getStatCodes().length;x++)
                me.setStat(me.getStatCodes()[x],CMLib.english().promptText(mob,me.getStat(me.getStatCodes()[x]),++showNumber,showFlag,CMStrings.capitalizeAndLower(me.getStatCodes()[x])));
			if(showFlag<-900){ ok=true; break;}
			if(showFlag>0){ showFlag=-1; continue;}
			showFlag=CMath.s_int(mob.session().prompt(getScr("BaseGenerics","editwhich"),""));
			if(showFlag<=0)
			{
				showFlag=-1;
				ok=true;
				me.recoverEnvStats();
				if(me.text().length()>=maxLength)
				{
					mob.tell(getScr("BaseGenerics","stringlimiterr",maxLength+""));
					ok=false;
				}
			}
		}
	}

	public static void modifyGenWallpaper(MOB mob, Item me)
		throws IOException
	{
		if(mob.isMonster())
			return;
		boolean ok=false;
		int showFlag=-1;
		if(CMProps.getIntVar(CMProps.SYSTEMI_EDITORTYPE)>0)
			showFlag=-999;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!ok))
		{
			int showNumber=0;
			genName(mob,me,++showNumber,showFlag);
			genDescription(mob,me,++showNumber,showFlag);
			genReadable1(mob,me,++showNumber,showFlag);
			genReadable2(mob,me,++showNumber,showFlag);
			if(me instanceof Light)	genBurnout(mob,(Light)me,++showNumber,showFlag);
            for(int x=me.getSaveStatIndex();x<me.getStatCodes().length;x++)
                me.setStat(me.getStatCodes()[x],CMLib.english().promptText(mob,me.getStat(me.getStatCodes()[x]),++showNumber,showFlag,CMStrings.capitalizeAndLower(me.getStatCodes()[x])));
			if(showFlag<-900){ ok=true; break;}
			if(showFlag>0){ showFlag=-1; continue;}
			showFlag=CMath.s_int(mob.session().prompt(getScr("BaseGenerics","editwhich"),""));
			if(showFlag<=0)
			{
				showFlag=-1;
				ok=true;
				me.recoverEnvStats();
				if(me.text().length()>=maxLength)
				{
					mob.tell(getScr("BaseGenerics","stringlimiterr",maxLength+""));
					ok=false;
				}
			}
		}
	}

	public static void modifyGenMap(MOB mob, com.planet_ink.coffee_mud.Items.interfaces.Map me)
		throws IOException
	{
		if(mob.isMonster())
			return;
		boolean ok=false;
		int showFlag=-1;
		if(CMProps.getIntVar(CMProps.SYSTEMI_EDITORTYPE)>0)
			showFlag=-999;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!ok))
		{
			int showNumber=0;
			genName(mob,me,++showNumber,showFlag);
			genDisplayText(mob,me,++showNumber,showFlag);
			genDescription(mob,me,++showNumber,showFlag);
			genLevel(mob,me,++showNumber,showFlag);
			genSecretIdentity(mob,me,++showNumber,showFlag);
			genGettable(mob,me,++showNumber,showFlag);
			genReadable1(mob,me,++showNumber,showFlag);
			genReadable2(mob,me,++showNumber,showFlag);
			genValue(mob,me,++showNumber,showFlag);
			genWeight(mob,me,++showNumber,showFlag);
			genRejuv(mob,me,++showNumber,showFlag);
			genMaterialCode(mob,me,++showNumber,showFlag);
			genDisposition(mob,me.baseEnvStats(),++showNumber,showFlag);
			genBehaviors(mob,me,++showNumber,showFlag);
			genAffects(mob,me,++showNumber,showFlag);
			genImage(mob,me,++showNumber,showFlag);
            for(int x=me.getSaveStatIndex();x<me.getStatCodes().length;x++)
                me.setStat(me.getStatCodes()[x],CMLib.english().promptText(mob,me.getStat(me.getStatCodes()[x]),++showNumber,showFlag,CMStrings.capitalizeAndLower(me.getStatCodes()[x])));
			if(showFlag<-900){ ok=true; break;}
			if(showFlag>0){ showFlag=-1; continue;}
			showFlag=CMath.s_int(mob.session().prompt(getScr("BaseGenerics","editwhich"),""));
			if(showFlag<=0)
			{
				showFlag=-1;
				ok=true;
				me.recoverEnvStats();
				if(me.text().length()>=maxLength)
				{
					mob.tell(getScr("BaseGenerics","stringlimiterr",maxLength+""));
					ok=false;
				}
			}
		}
	}

	public static void modifyGenContainer(MOB mob, Container me)
		throws IOException
	{
		if(mob.isMonster())
			return;
		boolean ok=false;
		int showFlag=-1;
		if(CMProps.getIntVar(CMProps.SYSTEMI_EDITORTYPE)>0)
			showFlag=-999;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!ok))
		{
			int showNumber=0;
			genName(mob,me,++showNumber,showFlag);
			genDisplayText(mob,me,++showNumber,showFlag);
			genDescription(mob,me,++showNumber,showFlag);
			genLevel(mob,me,++showNumber,showFlag);
			genRejuv(mob,me,++showNumber,showFlag);
			genCapacity(mob,me,++showNumber,showFlag);
			if(me instanceof ShipComponent)
			{
			    if(me instanceof ShipComponent.ShipPanel)
				    genPanelType(mob,(ShipComponent.ShipPanel)me,++showNumber,showFlag);
			}
			genLidsNLocks(mob,me,++showNumber,showFlag);
			genMaterialCode(mob,me,++showNumber,showFlag);
			genSecretIdentity(mob,me,++showNumber,showFlag);
			genValue(mob,me,++showNumber,showFlag);
			genUses(mob,me,++showNumber,showFlag);
			genWeight(mob,me,++showNumber,showFlag);
			genDisposition(mob,me.baseEnvStats(),++showNumber,showFlag);
			if(me instanceof DeadBody)
				genCorpseData(mob,(DeadBody)me,++showNumber,showFlag);
			if(me instanceof ClanItem)
				genClanItem(mob,(ClanItem)me,++showNumber,showFlag);
			genGettable(mob,me,++showNumber,showFlag);
			genReadable1(mob,me,++showNumber,showFlag);
			genReadable2(mob,me,++showNumber,showFlag);
			if(me instanceof Light)	genBurnout(mob,(Light)me,++showNumber,showFlag);
			genBehaviors(mob,me,++showNumber,showFlag);
			genAffects(mob,me,++showNumber,showFlag);
			if(me instanceof Rideable)
			{
				genRideable1(mob,(Rideable)me,++showNumber,showFlag);
				genRideable2(mob,(Rideable)me,++showNumber,showFlag);
			}
			if(me instanceof Exit)
			{
				genDoorName(mob,(Exit)me,++showNumber,showFlag);
				genClosedText(mob,(Exit)me,++showNumber,showFlag);
			}
			genImage(mob,me,++showNumber,showFlag);
            for(int x=me.getSaveStatIndex();x<me.getStatCodes().length;x++)
                me.setStat(me.getStatCodes()[x],CMLib.english().promptText(mob,me.getStat(me.getStatCodes()[x]),++showNumber,showFlag,CMStrings.capitalizeAndLower(me.getStatCodes()[x])));
			if(showFlag<-900){ ok=true; break;}
			if(showFlag>0){ showFlag=-1; continue;}
			showFlag=CMath.s_int(mob.session().prompt(getScr("BaseGenerics","editwhich"),""));
			if(showFlag<=0)
			{
				showFlag=-1;
				ok=true;
				me.recoverEnvStats();
				if(me.text().length()>=maxLength)
				{
					mob.tell(getScr("BaseGenerics","stringlimiterr",maxLength+""));
					ok=false;
				}
			}
		}
	}

	public static void modifyGenWeapon(MOB mob, Weapon me)
		throws IOException
	{
		if(mob.isMonster())
			return;
		boolean ok=false;
		int showFlag=-1;
		if(CMProps.getIntVar(CMProps.SYSTEMI_EDITORTYPE)>0)
			showFlag=-999;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!ok))
		{
			int showNumber=0;
			genName(mob,me,++showNumber,showFlag);
			genDisplayText(mob,me,++showNumber,showFlag);
			genDescription(mob,me,++showNumber,showFlag);
			genLevel(mob,me,++showNumber,showFlag);
			genAttack(mob,me,++showNumber,showFlag);
			genDamage(mob,me,++showNumber,showFlag);
			genMaterialCode(mob,me,++showNumber,showFlag);
			genWeaponType(mob,me,++showNumber,showFlag);
			genWeaponClassification(mob,me,++showNumber,showFlag);
			genWeaponRanges(mob,me,++showNumber,showFlag);
			if(me instanceof Wand)
			{
				genReadable1(mob,me,++showNumber,showFlag);
				genReadable2(mob,me,++showNumber,showFlag);
				genUses(mob,me,++showNumber,showFlag);
				genMaxUses(mob,(Wand)me,++showNumber,showFlag);
				if(me instanceof Light)	genBurnout(mob,(Light)me,++showNumber,showFlag);
			}
			else
				genWeaponAmmo(mob,me,++showNumber,showFlag);
			genRejuv(mob,me,++showNumber,showFlag);
			if((!me.requiresAmmunition())&&(!(me instanceof Wand)))
				genCondition(mob,me,++showNumber,showFlag);
			genAbility(mob,me,++showNumber,showFlag);
			genSecretIdentity(mob,me,++showNumber,showFlag);
			if(me instanceof ClanItem)
				genClanItem(mob,(ClanItem)me,++showNumber,showFlag);
			genGettable(mob,me,++showNumber,showFlag);
			genValue(mob,me,++showNumber,showFlag);
			genWeight(mob,me,++showNumber,showFlag);
			genDisposition(mob,me.baseEnvStats(),++showNumber,showFlag);
			genBehaviors(mob,me,++showNumber,showFlag);
			genAffects(mob,me,++showNumber,showFlag);
			genImage(mob,me,++showNumber,showFlag);
            for(int x=me.getSaveStatIndex();x<me.getStatCodes().length;x++)
                me.setStat(me.getStatCodes()[x],CMLib.english().promptText(mob,me.getStat(me.getStatCodes()[x]),++showNumber,showFlag,CMStrings.capitalizeAndLower(me.getStatCodes()[x])));
			if(showFlag<-900){ ok=true; break;}
			if(showFlag>0){ showFlag=-1; continue;}
			showFlag=CMath.s_int(mob.session().prompt(getScr("BaseGenerics","editwhich"),""));
			if(showFlag<=0)
			{
				showFlag=-1;
				ok=true;
				me.recoverEnvStats();
				if(me.text().length()>=maxLength)
				{
					mob.tell(getScr("BaseGenerics","stringlimiterr",maxLength+""));
					ok=false;
				}
			}
		}
	}
	public static void modifyGenArmor(MOB mob, Armor me)
		throws IOException
	{
		if(mob.isMonster())
			return;
		boolean ok=false;
		int showFlag=-1;
		if(CMProps.getIntVar(CMProps.SYSTEMI_EDITORTYPE)>0)
			showFlag=-999;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!ok))
		{
			int showNumber=0;
			genName(mob,me,++showNumber,showFlag);
			genDisplayText(mob,me,++showNumber,showFlag);
			genDescription(mob,me,++showNumber,showFlag);
			genLevel(mob,me,++showNumber,showFlag);
			genMaterialCode(mob,me,++showNumber,showFlag);
			genWornLocation(mob,me,++showNumber,showFlag);
			genLayer(mob,me,++showNumber,showFlag);
			genRejuv(mob,me,++showNumber,showFlag);
			genArmor(mob,me,++showNumber,showFlag);
			genCondition(mob,me,++showNumber,showFlag);
			genAbility(mob,me,++showNumber,showFlag);
			genSecretIdentity(mob,me,++showNumber,showFlag);
			if(me instanceof ClanItem)
				genClanItem(mob,(ClanItem)me,++showNumber,showFlag);
			genGettable(mob,me,++showNumber,showFlag);
			genCapacity(mob,me,++showNumber,showFlag);
			genLidsNLocks(mob,me,++showNumber,showFlag);
			genReadable1(mob,me,++showNumber,showFlag);
			genReadable2(mob,me,++showNumber,showFlag);
			if(me instanceof Light)	genBurnout(mob,(Light)me,++showNumber,showFlag);
			genValue(mob,me,++showNumber,showFlag);
			genWeight(mob,me,++showNumber,showFlag);
			genSize(mob,me,++showNumber,showFlag);
			genDisposition(mob,me.baseEnvStats(),++showNumber,showFlag);
			genBehaviors(mob,me,++showNumber,showFlag);
			genAffects(mob,me,++showNumber,showFlag);
			genImage(mob,me,++showNumber,showFlag);
            for(int x=me.getSaveStatIndex();x<me.getStatCodes().length;x++)
                me.setStat(me.getStatCodes()[x],CMLib.english().promptText(mob,me.getStat(me.getStatCodes()[x]),++showNumber,showFlag,CMStrings.capitalizeAndLower(me.getStatCodes()[x])));
			if(showFlag<-900){ ok=true; break;}
			if(showFlag>0){ showFlag=-1; continue;}
			showFlag=CMath.s_int(mob.session().prompt(getScr("BaseGenerics","editwhich"),""));
			if(showFlag<=0)
			{
				showFlag=-1;
				ok=true;
				me.recoverEnvStats();
				if(me.text().length()>=maxLength)
				{
					mob.tell(getScr("BaseGenerics","stringlimiterr",maxLength+""));
					ok=false;
				}
			}
		}
	}


	public static void modifyGenInstrument(MOB mob, MusicalInstrument me)
		throws IOException
	{
		if(mob.isMonster())
			return;
		boolean ok=false;
		int showFlag=-1;
		if(CMProps.getIntVar(CMProps.SYSTEMI_EDITORTYPE)>0)
			showFlag=-999;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!ok))
		{
			int showNumber=0;
			genName(mob,me,++showNumber,showFlag);
			genDisplayText(mob,me,++showNumber,showFlag);
			genDescription(mob,me,++showNumber,showFlag);
			genLevel(mob,me,++showNumber,showFlag);
			genMaterialCode(mob,me,++showNumber,showFlag);
			genWornLocation(mob,me,++showNumber,showFlag);
			genRejuv(mob,me,++showNumber,showFlag);
			genAbility(mob,me,++showNumber,showFlag);
			genSecretIdentity(mob,me,++showNumber,showFlag);
			genGettable(mob,me,++showNumber,showFlag);
			genInstrumentType(mob,me,++showNumber,showFlag);
			genValue(mob,me,++showNumber,showFlag);
			genWeight(mob,me,++showNumber,showFlag);
			genDisposition(mob,me.baseEnvStats(),++showNumber,showFlag);
			genBehaviors(mob,me,++showNumber,showFlag);
			genAffects(mob,me,++showNumber,showFlag);
			genImage(mob,me,++showNumber,showFlag);
            for(int x=me.getSaveStatIndex();x<me.getStatCodes().length;x++)
                me.setStat(me.getStatCodes()[x],CMLib.english().promptText(mob,me.getStat(me.getStatCodes()[x]),++showNumber,showFlag,CMStrings.capitalizeAndLower(me.getStatCodes()[x])));
			if(showFlag<-900){ ok=true; break;}
			if(showFlag>0){ showFlag=-1; continue;}
			showFlag=CMath.s_int(mob.session().prompt(getScr("BaseGenerics","editwhich"),""));
			if(showFlag<=0)
			{
				showFlag=-1;
				ok=true;
				me.recoverEnvStats();
				if(me.text().length()>=maxLength)
				{
					mob.tell(getScr("BaseGenerics","stringlimiterr",maxLength+""));
					ok=false;
				}
			}
		}
	}


	public static void modifyGenExit(MOB mob, Exit me)
		throws IOException
	{
		if(mob.isMonster())
			return;
		boolean ok=false;
		int showFlag=-1;
		if(CMProps.getIntVar(CMProps.SYSTEMI_EDITORTYPE)>0)
			showFlag=-999;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!ok))
		{
			int showNumber=0;
			genName(mob,me,++showNumber,showFlag);
			genDisplayText(mob,me,++showNumber,showFlag);
			genDescription(mob,me,++showNumber,showFlag);
			genLevel(mob,me,++showNumber,showFlag);
			genDoorsNLocks(mob,me,++showNumber,showFlag);
			if(me.hasADoor())
			{
				genClosedText(mob,me,++showNumber,showFlag);
				genDoorName(mob,me,++showNumber,showFlag);
				genOpenWord(mob,me,++showNumber,showFlag);
				genCloseWord(mob,me,++showNumber,showFlag);
			}
			genExitMisc(mob,me,++showNumber,showFlag);
			genDisposition(mob,me.baseEnvStats(),++showNumber,showFlag);
			genBehaviors(mob,me,++showNumber,showFlag);
			genAffects(mob,me,++showNumber,showFlag);
			genImage(mob,me,++showNumber,showFlag);
            for(int x=me.getSaveStatIndex();x<me.getStatCodes().length;x++)
                me.setStat(me.getStatCodes()[x],CMLib.english().promptText(mob,me.getStat(me.getStatCodes()[x]),++showNumber,showFlag,CMStrings.capitalizeAndLower(me.getStatCodes()[x])));
			if(showFlag<-900){ ok=true; break;}
			if(showFlag>0){ showFlag=-1; continue;}
			showFlag=CMath.s_int(mob.session().prompt(getScr("BaseGenerics","editwhich"),""));
			if(showFlag<=0)
			{
				showFlag=-1;
				ok=true;
				me.recoverEnvStats();
				if(me.text().length()>=maxLength)
				{
					mob.tell(getScr("BaseGenerics","stringlimiterr",maxLength+""));
					ok=false;
				}
			}
		}
	}


	public static void modifyGenMOB(MOB mob, MOB me)
		throws IOException
	{
		if(mob.isMonster())
			return;
		boolean ok=false;
		int showFlag=-1;
		if(CMProps.getIntVar(CMProps.SYSTEMI_EDITORTYPE)>0)
			showFlag=-999;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!ok))
		{
			int showNumber=0;
			genName(mob,me,++showNumber,showFlag);
			genDisplayText(mob,me,++showNumber,showFlag);
			genDescription(mob,me,++showNumber,showFlag);
			int oldLevel=me.baseEnvStats().level();
			genLevel(mob,me,++showNumber,showFlag);
			if((oldLevel<2)&&(me.baseEnvStats().level()>1))
				me.baseCharStats().getCurrentClass().fillOutMOB(me,me.baseEnvStats().level());
			genRejuv(mob,me,++showNumber,showFlag);
			genRace(mob,me,++showNumber,showFlag);
			Faction F=null;
			for(Enumeration e=CMLib.factions().factionSet().elements();e.hasMoreElements();)
			{
			    F=(Faction)e.nextElement();
			    if((!F.hasFaction(me))&&(F.findAutoDefault(me)!=Integer.MAX_VALUE))
			        mob.addFaction(F.factionID(),F.findAutoDefault(me));
			    if(F.showineditor())
				    genSpecialFaction(mob,me,++showNumber,showFlag,F);
			}
			genGender(mob,me,++showNumber,showFlag);
			genHeight(mob,me,++showNumber,showFlag);
			genWeight(mob,me,++showNumber,showFlag);
			genClan(mob,me,++showNumber,showFlag);
			genSpeed(mob,me,++showNumber,showFlag);
			if((oldLevel<2)&&(me.baseEnvStats().level()>1))
				me.baseEnvStats().setDamage((int)Math.round(CMath.div(me.baseEnvStats().damage(),me.baseEnvStats().speed())));
			genAttack(mob,me,++showNumber,showFlag);
			genDamage(mob,me,++showNumber,showFlag);
			genArmor(mob,me,++showNumber,showFlag);
			genHitPoints(mob,me,++showNumber,showFlag);
			genMoney(mob,me,++showNumber,showFlag);
			genAbilities(mob,me,++showNumber,showFlag);
			genBehaviors(mob,me,++showNumber,showFlag);
			genAffects(mob,me,++showNumber,showFlag);
			genDisposition(mob,me.baseEnvStats(),++showNumber,showFlag);
			genSensesMask(mob,me.baseEnvStats(),++showNumber,showFlag);
			if(me instanceof Rideable)
			{
				genRideable1(mob,(Rideable)me,++showNumber,showFlag);
				genRideable2(mob,(Rideable)me,++showNumber,showFlag);
			}
			if(me instanceof Deity)
			{
				genDeity1(mob,(Deity)me,++showNumber,showFlag);
				genDeity2(mob,(Deity)me,++showNumber,showFlag);
				genDeity3(mob,(Deity)me,++showNumber,showFlag);
				genDeity4(mob,(Deity)me,++showNumber,showFlag);
				genDeity5(mob,(Deity)me,++showNumber,showFlag);
				genDeity8(mob,(Deity)me,++showNumber,showFlag);
				genDeity9(mob,(Deity)me,++showNumber,showFlag);
				genDeity6(mob,(Deity)me,++showNumber,showFlag);
				genDeity0(mob,(Deity)me,++showNumber,showFlag);
				genDeity7(mob,(Deity)me,++showNumber,showFlag);
                genDeity11(mob,(Deity)me,++showNumber,showFlag);
			}
			genFaction(mob,me,++showNumber,showFlag);
			genTattoos(mob,me,++showNumber,showFlag);
			genExpertises(mob,me,++showNumber,showFlag);
			genImage(mob,me,++showNumber,showFlag);
            for(int x=me.getSaveStatIndex();x<me.getStatCodes().length;x++)
                me.setStat(me.getStatCodes()[x],CMLib.english().promptText(mob,me.getStat(me.getStatCodes()[x]),++showNumber,showFlag,CMStrings.capitalizeAndLower(me.getStatCodes()[x])));
			if(showFlag<-900){ ok=true; break;}
			if(showFlag>0){ showFlag=-1; continue;}
			showFlag=CMath.s_int(mob.session().prompt(getScr("BaseGenerics","editwhich"),""));
			if(showFlag<=0)
			{
				showFlag=-1;
				ok=true;
				me.recoverCharStats();
				me.recoverMaxState();
				me.recoverEnvStats();
				me.resetToMaxState();
				if(me.text().length()>=maxLength)
				{
					mob.tell(getScr("BaseGenerics","stringlimiterr",maxLength+""));
					ok=false;
				}
				me.setMiscText(me.text());
			}
		}

		mob.tell(getScr("BaseGenerics","equipbeforesave",me.charStats().himher()));
	}

	public static void modifyPlayer(MOB mob, MOB me)
		throws IOException
	{
		if(mob.isMonster())
			return;
		boolean ok=false;
		int showFlag=-1;
		if(CMProps.getIntVar(CMProps.SYSTEMI_EDITORTYPE)>0)
			showFlag=-999;
		String oldName=me.Name();
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!ok))
		{
			int showNumber=0;
			genName(mob,me,++showNumber,showFlag);
			while((!me.Name().equals(oldName))&&(CMLib.database().DBUserSearch(null,me.Name())))
			{
				mob.tell(getScr("BaseGenerics","namealused"));
				genName(mob,me,showNumber,showFlag);
			}
			genPassword(mob,me,++showNumber,showFlag);

			genDescription(mob,me,++showNumber,showFlag);
			genLevel(mob,me,++showNumber,showFlag);
			genRace(mob,me,++showNumber,showFlag);
			genCharClass(mob,me,++showNumber,showFlag);
			genCharStats(mob,me,++showNumber,showFlag);
			Faction F=null;
			for(Enumeration e=CMLib.factions().factionSet().elements();e.hasMoreElements();)
			{
			    F=(Faction)e.nextElement();
			    if((!F.hasFaction(me))&&(F.findAutoDefault(me)!=Integer.MAX_VALUE))
			        mob.addFaction(F.factionID(),F.findAutoDefault(me));
			    if(F.showineditor())
				    genSpecialFaction(mob,me,++showNumber,showFlag,F);
			}
			genGender(mob,me,++showNumber,showFlag);
			genHeight(mob,me,++showNumber,showFlag);
			genWeight(mob,me,++showNumber,showFlag);
			genSpeed(mob,me,++showNumber,showFlag);
			genAttack(mob,me,++showNumber,showFlag);
			genDamage(mob,me,++showNumber,showFlag);
			genArmor(mob,me,++showNumber,showFlag);
			genHitPoints(mob,me,++showNumber,showFlag);
			genMoney(mob,me,++showNumber,showFlag);
            me.setTrains(CMLib.english().promptInteger(mob,me.getTrains(),++showNumber,showFlag,getScr("BaseGenerics","trpoints")));
            me.setPractices(CMLib.english().promptInteger(mob,me.getPractices(),++showNumber,showFlag,getScr("BaseGenerics","practicep")));
            me.setQuestPoint(CMLib.english().promptInteger(mob,me.getQuestPoint(),++showNumber,showFlag,getScr("BaseGenerics","questpoints")));
			genAbilities(mob,me,++showNumber,showFlag);
			genAffects(mob,me,++showNumber,showFlag);
			genBehaviors(mob,me,++showNumber,showFlag);
			genDisposition(mob,me.baseEnvStats(),++showNumber,showFlag);
			genSensesMask(mob,me.baseEnvStats(),++showNumber,showFlag);
			if(me instanceof Rideable)
			{
				genRideable1(mob,(Rideable)me,++showNumber,showFlag);
				genRideable2(mob,(Rideable)me,++showNumber,showFlag);
			}
			genFaction(mob,me,++showNumber,showFlag);
			genTattoos(mob,me,++showNumber,showFlag);
			genExpertises(mob,me,++showNumber,showFlag);
			genTitles(mob,me,++showNumber,showFlag);
			genEmail(mob,me,++showNumber,showFlag);
			genSecurity(mob,me,++showNumber,showFlag);
			genImage(mob,me,++showNumber,showFlag);
			genNotes(mob,me,++showNumber,showFlag);
            for(int x=me.getSaveStatIndex();x<me.getStatCodes().length;x++)
                me.setStat(me.getStatCodes()[x],CMLib.english().promptText(mob,me.getStat(me.getStatCodes()[x]),++showNumber,showFlag,CMStrings.capitalizeAndLower(me.getStatCodes()[x])));
            if(me.playerStats()!=null)
            for(int x=me.playerStats().getSaveStatIndex();x<me.playerStats().getStatCodes().length;x++)
                me.setStat(me.playerStats().getStatCodes()[x],CMLib.english().promptText(mob,me.playerStats().getStat(me.playerStats().getStatCodes()[x]),++showNumber,showFlag,CMStrings.capitalizeAndLower(me.playerStats().getStatCodes()[x])));
			if(showFlag<-900){ ok=true; break;}
			if(showFlag>0){ showFlag=-1; continue;}
			showFlag=CMath.s_int(mob.session().prompt(getScr("BaseGenerics","editwhich"),""));
			if(showFlag<=0)
			{
				showFlag=-1;
				ok=true;
				me.recoverCharStats();
				me.recoverMaxState();
				me.recoverEnvStats();
				me.resetToMaxState();
				if(!oldName.equals(me.Name()))
				{
					MOB fakeMe=(MOB)me.copyOf();
					fakeMe.setName(oldName);
					CMLib.database().DBDeleteMOB(fakeMe);
					CMLib.database().DBCreateCharacter(me);
				}
				CMLib.database().DBUpdatePlayer(me);
				CMLib.database().DBUpdateFollowers(me);
			}
		}
	}

	
	static void genClanStatus(MOB mob, Clan C, int showNumber, int showFlag)
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","clanstatus",showNumber+"",Clan.CLANSTATUS_DESC[C.getStatus()]));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		switch(C.getStatus())
		{
		case Clan.CLANSTATUS_ACTIVE:
			C.setStatus(Clan.CLANSTATUS_PENDING);
			mob.tell("Clan '"+C.name()+"' has been changed from active to pending!");
			break;
		case Clan.CLANSTATUS_PENDING:
			C.setStatus(Clan.CLANSTATUS_ACTIVE);
			mob.tell("Clan '"+C.name()+"' has been changed from pending to active!");
			break;
		case Clan.CLANSTATUS_FADING:
			C.setStatus(Clan.CLANSTATUS_ACTIVE);
			mob.tell("Clan '"+C.name()+"' has been changed from fading to active!");
			break;
		default:
			mob.tell("Clan '"+C.name()+"' has not been changed!");
			break;
		}
	}
	
	static void genClanGovt(MOB mob, Clan C, int showNumber, int showFlag)
	throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","clangovt",showNumber+"",C.typeName()));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		while((mob.session()!=null)&&(!mob.session().killFlag()))
		{
			String newName=mob.session().prompt(getScr("BaseGenerics","enter2"),"");
			if(newName.trim().length()==0)
			{
				mob.tell(getScr("BaseGenerics","nochange"));
				return;
			}
			int newGovt=-1;
			StringBuffer gvts=new StringBuffer();
			for(int i=0;i<Clan.GVT_DESCS.length;i++)
			{
				gvts.append(Clan.GVT_DESCS[i]+", ");
				if(newName.equalsIgnoreCase(Clan.GVT_DESCS[i]))
					newGovt=i;
			}
			gvts=new StringBuffer(gvts.substring(0,gvts.length()-2));
			if(newGovt<0)
				mob.tell(getScr("BaseGenerics","clangvterr",gvts.toString()));
			else
			{
				C.setGovernment(newGovt);
				break;
			}
		}
	}
	
	static void genClanRole(MOB mob, Clan C, int showNumber, int showFlag)
	throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		mob.tell(getScr("BaseGenerics","clanrole",showNumber+"",CMLib.clans().getRoleName(C.getGovernment(),C.getAutoPosition(),true,false)));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		while((mob.session()!=null)&&(!mob.session().killFlag()))
		{
			String newName=mob.session().prompt(getScr("BaseGenerics","enter2"),"");
			if(newName.trim().length()==0)
			{
				mob.tell(getScr("BaseGenerics","nochange"));
				return;
			}
			int newRole=-1;
			StringBuffer roles=new StringBuffer();
			for(int i=0;i<Clan.ROL_DESCS[C.getGovernment()].length;i++)
			{
				roles.append(Clan.ROL_DESCS[C.getGovernment()][i]+", ");
				if(newName.equalsIgnoreCase(Clan.ROL_DESCS[C.getGovernment()][i]))
					newRole=Clan.POSORDER[i];
			}
			roles=new StringBuffer(roles.substring(0,roles.length()-2));
			if(newRole<0)
				mob.tell(getScr("BaseGenerics","clanrolerr",roles.toString()));
			else
			{
				C.setAutoPosition(newRole);
				break;
			}
		}
	}
	
	static void genClanClass(MOB mob, Clan C, int showNumber, int showFlag)
	throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return;
		CharClass CC=CMClass.getCharClass(C.getClanClass());
		if(CC==null)CC=CMClass.findCharClass(C.getClanClass());
		String clasName=(CC==null)?"NONE":CC.name();
		mob.tell(getScr("BaseGenerics","clanclas",showNumber+"",clasName));
		if((showFlag!=showNumber)&&(showFlag>-999)) return;
		while((mob.session()!=null)&&(!mob.session().killFlag()))
		{
			String newName=mob.session().prompt(getScr("BaseGenerics","enter2"),"");
			if(newName.trim().equalsIgnoreCase("none"))
			{
				C.setClanClass("");
				return;
			}
			else
			if(newName.trim().length()==0)
			{
				mob.tell(getScr("BaseGenerics","nochange"));
				return;
			}
			CharClass newC=null;
			StringBuffer clss=new StringBuffer();
			for(Enumeration e=CMClass.charClasses();e.hasMoreElements();)
			{
				CC=(CharClass)e.nextElement();
				clss.append(CC.name()+", ");
				if(newName.equalsIgnoreCase(CC.name())||(newName.equalsIgnoreCase(CC.ID())))
					newC=CC;
			}
			clss=new StringBuffer(clss.substring(0,clss.length()-2));
			if(newC==null)
				mob.tell(getScr("BaseGenerics","clanclaserr",clss.toString()));
			else
			{
				C.setClanClass(newC.ID());
				break;
			}
		}
	}
	
	static String genClanRoom(MOB mob, Clan C, String oldRoomID, String promptCode, int showNumber, int showFlag)
	throws IOException
	{
		if((showFlag>0)&&(showFlag!=showNumber)) return oldRoomID;
		mob.tell(getScr("BaseGenerics",promptCode,showNumber+"",oldRoomID));
		if((showFlag!=showNumber)&&(showFlag>-999)) return oldRoomID;
		while((mob.session()!=null)&&(!mob.session().killFlag()))
		{
			String newName=mob.session().prompt(getScr("BaseGenerics","entnull"),"");
			if(newName.trim().equalsIgnoreCase("null"))
				return "";
			else
			if(newName.trim().length()==0)
			{
				mob.tell(getScr("BaseGenerics","nochange"));
				return oldRoomID;
			}
			Room newRoom=CMLib.map().getRoom(newName);
			if((newRoom==null)
			||(CMLib.map().getExtendedRoomID(newRoom).length()==0)
			||(!CMLib.utensils().doesOwnThisProperty(C.clanID(),newRoom)))
				mob.tell(getScr("BaseGenerics","clanroomerr"));
			else
				return CMLib.map().getExtendedRoomID(newRoom);
		}
		return oldRoomID;
	}
    
	public static void modifyClan(MOB mob, Clan C)
	throws IOException
	{
		if(mob.isMonster())
			return;
		boolean ok=false;
		int showFlag=-1;
		if(CMProps.getIntVar(CMProps.SYSTEMI_EDITORTYPE)>0)
			showFlag=-999;
		String oldName=C.ID();
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!ok))
		{
			mob.tell(getScr("BaseGenerics","Name","*",C.name()));
			int showNumber=0;
			genClanGovt(mob,C,++showNumber,showFlag);
			C.setPremise(CMLib.english().promptText(mob,C.getPremise(),++showNumber,showFlag,getScr("BaseGenerics","clanprem"),true));
			C.setExp(CMLib.english().promptLong(mob,C.getExp(),++showNumber,showFlag,getScr("BaseGenerics","clanexp")));
			C.setTaxes(CMLib.english().promptDouble(mob,C.getTaxes(),++showNumber,showFlag,getScr("BaseGenerics","clantax")));
			C.setMorgue(genClanRoom(mob,C,C.getMorgue(),"clanmorg",++showNumber,showFlag));
			C.setRecall(genClanRoom(mob,C,C.getRecall(),"clanreca",++showNumber,showFlag));
			C.setDonation(genClanRoom(mob,C,C.getDonation(),"clandona",++showNumber,showFlag));
			genClanAccept(mob,C,++showNumber,showFlag);
			genClanClass(mob,C,++showNumber,showFlag);
			genClanRole(mob,C,++showNumber,showFlag);
			genClanStatus(mob,C,++showNumber,showFlag);
			genClanMembers(mob,C,++showNumber,showFlag);
			/*setClanRelations, votes?*/
			if(showFlag<-900){ ok=true; break;}
			if(showFlag>0){ showFlag=-1; continue;}
			showFlag=CMath.s_int(mob.session().prompt(getScr("BaseGenerics","editwhich"),""));
			if(showFlag<=0)
			{
				showFlag=-1;
				ok=true;
				if(!oldName.equals(C.ID()))
				{
					//cycle through everything changing the name
					CMLib.database().DBDeleteClan(C);
					CMLib.database().DBCreateClan(C);
				}
				C.update();
			}
		}
	}
	
	public static void modifyGenShopkeeper(MOB mob, ShopKeeper me)
		throws IOException
	{
		if(mob.isMonster())
			return;
		if(!(me instanceof MOB))
			return;
		MOB mme=(MOB)me;
		boolean ok=false;
		int showFlag=-1;
		if(CMProps.getIntVar(CMProps.SYSTEMI_EDITORTYPE)>0)
			showFlag=-999;
		while((mob.session()!=null)&&(!mob.session().killFlag())&&(!ok))
		{
			int showNumber=0;
			genName(mob,me,++showNumber,showFlag);
			genDisplayText(mob,me,++showNumber,showFlag);
			genDescription(mob,me,++showNumber,showFlag);
			int oldLevel=me.baseEnvStats().level();
			genLevel(mob,me,++showNumber,showFlag);
			if((oldLevel<2)&&(me.baseEnvStats().level()>1))
				mme.baseCharStats().getCurrentClass().fillOutMOB(mme,me.baseEnvStats().level());
			genRejuv(mob,me,++showNumber,showFlag);
			genRace(mob,mme,++showNumber,showFlag);
			genHeight(mob,me,++showNumber,showFlag);
			genWeight(mob,me,++showNumber,showFlag);
			Faction F=null;
			for(Enumeration e=CMLib.factions().factionSet().elements();e.hasMoreElements();)
			{
			    F=(Faction)e.nextElement();
			    if((!F.hasFaction((MOB)me))&&(F.findAutoDefault((MOB)me)!=Integer.MAX_VALUE))
			        mob.addFaction(F.factionID(),F.findAutoDefault((MOB)me));
			    if(F.showineditor())
				    genSpecialFaction(mob,(MOB)me,++showNumber,showFlag,F);
			}
			genGender(mob,mme,++showNumber,showFlag);
			genClan(mob,mme,++showNumber,showFlag);
			genSpeed(mob,me,++showNumber,showFlag);
			if((oldLevel<2)&&(me.baseEnvStats().level()>1))
				me.baseEnvStats().setDamage((int)Math.round(CMath.div(me.baseEnvStats().damage(),me.baseEnvStats().speed())));
			genAttack(mob,me,++showNumber,showFlag);
			genDamage(mob,me,++showNumber,showFlag);
			genArmor(mob,me,++showNumber,showFlag);
			if(me instanceof MOB)
				genHitPoints(mob,(MOB)me,++showNumber,showFlag);
			genMoney(mob,mme,++showNumber,showFlag);
			genAbilities(mob,mme,++showNumber,showFlag);
			genBehaviors(mob,me,++showNumber,showFlag);
			genAffects(mob,me,++showNumber,showFlag);
			genShopkeeper1(mob,me,++showNumber,showFlag);
			genShopkeeper2(mob,me,++showNumber,showFlag);
			genShopkeeper3(mob,me,++showNumber,showFlag);
            genShopkeeper7(mob,me,++showNumber,showFlag);
			if(me instanceof Banker)
			{
				genBanker1(mob,(Banker)me,++showNumber,showFlag);
				genBanker2(mob,(Banker)me,++showNumber,showFlag);
				genBanker3(mob,(Banker)me,++showNumber,showFlag);
				genBanker4(mob,(Banker)me,++showNumber,showFlag);
			}
			else
            if(me instanceof PostOffice)
            {
                ((PostOffice)me).setPostalChain(CMLib.english().promptText(mob,((PostOffice)me).postalChain(),++showNumber,showFlag,getScr("BaseGenerics","postalchainl")));
                ((PostOffice)me).setFeeForNewBox(CMLib.english().promptDouble(mob,((PostOffice)me).feeForNewBox(),++showNumber,showFlag,getScr("BaseGenerics","feebox")));
                ((PostOffice)me).setMinimumPostage(CMLib.english().promptDouble(mob,((PostOffice)me).minimumPostage(),++showNumber,showFlag,getScr("BaseGenerics","minpostcost")));
                ((PostOffice)me).setPostagePerPound(CMLib.english().promptDouble(mob,((PostOffice)me).postagePerPound(),++showNumber,showFlag,getScr("BaseGenerics","poundcost")));
                ((PostOffice)me).setHoldFeePerPound(CMLib.english().promptDouble(mob,((PostOffice)me).holdFeePerPound(),++showNumber,showFlag,getScr("BaseGenerics","feepound")));
                ((PostOffice)me).setMaxMudMonthsHeld(CMLib.english().promptInteger(mob,((PostOffice)me).maxMudMonthsHeld(),++showNumber,showFlag,getScr("BaseGenerics","monthsmac")));
            }
            else
			{
				genShopkeeper4(mob,me,++showNumber,showFlag);
				genShopkeeper5(mob,me,++showNumber,showFlag);
				genShopkeeper6(mob,me,++showNumber,showFlag);
			}
			genDisposition(mob,me.baseEnvStats(),++showNumber,showFlag);
			genSensesMask(mob,me.baseEnvStats(),++showNumber,showFlag);
			genFaction(mob,mme,++showNumber,showFlag);
			genTattoos(mob,(MOB)me,++showNumber,showFlag);
			genExpertises(mob,(MOB)me,++showNumber,showFlag);
			genImage(mob,me,++showNumber,showFlag);
            for(int x=me.getSaveStatIndex();x<me.getStatCodes().length;x++)
                me.setStat(me.getStatCodes()[x],CMLib.english().promptText(mob,me.getStat(me.getStatCodes()[x]),++showNumber,showFlag,CMStrings.capitalizeAndLower(me.getStatCodes()[x])));
			if(showFlag<-900){ ok=true; break;}
			if(showFlag>0){ showFlag=-1; continue;}
			showFlag=CMath.s_int(mob.session().prompt(getScr("BaseGenerics","editwhich"),""));
			if(showFlag<=0)
			{
				showFlag=-1;
				ok=true;
				mme.recoverCharStats();
				mme.recoverMaxState();
				me.recoverEnvStats();
				mme.resetToMaxState();
				if(me.text().length()>=maxLength)
				{
					mob.tell(getScr("BaseGenerics","stringlimiterr",maxLength+""));
					ok=false;
				}
				me.setMiscText(me.text());
			}
		}
		mob.tell(getScr("BaseGenerics","genmobmsg"));
	}
}