protected String addXMLQuestMob(MOB mob,
									int showFlag,
									DVector pageDV,
									String showValue,
									String parm1Fixed,
									String lastLabel,
									boolean optionalEntry,
									int step,
									int showNumber)
	throws IOException
	{
		MOB M=null;
		final Vector<MOB> choices=new Vector<MOB>();
		MOB baseM=((showValue!=null)?baseM=CMLib.coffeeMaker().getMobFromXML(showValue):null);
		final StringBuffer choiceDescs=new StringBuffer("");
		if(baseM!=null)
		{
			choices.addElement(baseM);
			choiceDescs.append(baseM.name()+", ");
		}
		final Room R=mob.location();
		if(R!=null)
		for(int i=0;i<R.numInhabitants();i++)
		{
			M=R.fetchInhabitant(i);
			if((M!=null)&&(M.isSavable()))
			{
				choices.addElement(M);
				choiceDescs.append(M.name()+", ");
			}
		}
		final Vector<MOB> newMobs=new Vector<MOB>();
		for(final Enumeration<MOB> e=CMClass.mobTypes();e.hasMoreElements();)
		{
			M=e.nextElement();
			if(M.isGeneric())
			{
				M=(MOB)M.copyOf();
				newMobs.add(M);
				M.setName(L("A NEW @x1",M.ID().toUpperCase()));
				choices.add(M);
				choiceDescs.append(M.name()+", ");
			}
		}
		final MOB canMOB=CMClass.getFactoryMOB();
		canMOB.setName(L("CANCEL"));
		choiceDescs.append("CANCEL");
		choices.addElement(canMOB);
		String showName=showValue;
		if(baseM!=null)
			showName=CMLib.english().getContextName(choices,baseM);
		lastLabel=((lastLabel==null)?"":lastLabel)+"\n\rChoices: "+choiceDescs.toString();
		final GenericEditor.CMEval evaler = getQuestCommandEval(QMCommand.$MOBXML);
		final String s=CMLib.genEd().prompt(mob,showName,showNumber,showFlag,parm1Fixed,optionalEntry,false,lastLabel,
										evaler, choices.toArray());
		canMOB.destroy();
		if(s.equalsIgnoreCase("CANCEL"))
			return null;
		M=(MOB)CMLib.english().fetchEnvironmental(choices,s,false);
		if((M!=null)&&(newMobs.contains(M)))
		{
			final Command C=CMClass.getCommand("Modify");
			if(C!=null)
				C.executeInternal(mob,0,M);
			// modify it!
		}
		final String newValue=(M!=null)?CMLib.coffeeMaker().getMobXML(M).toString():showValue;
		for(int n=0;n<newMobs.size();n++) newMobs.elementAt(n).destroy();
		return newValue==null?"":newValue.trim();
	}