@Override
	public String getViewDescription(MOB viewerM, Environmental E)
	{
		final StringBuilder str=new StringBuilder("");
		if(E==null)
			return str.toString();
		if(E instanceof Physical)
			str.append("\n\rLevel      : "+((Physical)E).phyStats().level());
		if(E instanceof LandTitle)
		{
			final LandTitle T=(LandTitle)E;
			str.append(L("\n\rSize       : ")+L("@x1 room(s)",""+T.getAllTitledRooms().size()));
			StringBuilder features = new StringBuilder("");
			if(T.allowsExpansionConstruction())
				features.append(L(" expandable"));
			if(T.rentalProperty())
				features.append(L(" rental"));
			// this space intentionally left with dynamic string
			str.append(L("\n\rFeatures   :"+features.toString()));
		}
		else
		if(E instanceof Item)
		{
			final Item I=(Item)E;
			str.append(L("\n\rMaterial   : @x1",L(CMStrings.capitalizeAndLower(RawMaterial.CODES.NAME(I.material()).toLowerCase()))));
			str.append(L("\n\rWeight     : @x1 pounds",""+I.phyStats().weight()));
			if(I instanceof Electronics)
			{
				str.append(L("\n\rMake       : @x1",""+((Electronics)I).getFinalManufacturer().name()));
				str.append(L("\n\rType       : @x1",""+((Electronics)I).getTechType().getDisplayName()));
			}
			if(I instanceof Technical)
			{
				str.append(L("\n\rModel Num. : @x1",""+((Technical)I).techLevel()));
			}
			if(I instanceof BoardableShip)
			{
				final Area A=((BoardableShip)I).getShipArea();
				if(A!=null)
				{
					str.append(L("\n\rRooms      : @x1",""+A.numberOfProperIDedRooms()));
					final List<String> miscItems=new ArrayList<String>();
					for(final Enumeration<Room> r= A.getProperMap(); r.hasMoreElements();)
					{
						final Room R=r.nextElement();
						if(R==null)
							continue;
						for(final Enumeration<Item> i = R.items();i.hasMoreElements();)
						{
							final Item I2=i.nextElement();
							if(I2.displayText().length()>0)
							{
								if(I2 instanceof TechComponent)
									str.append(L("\n\r"+CMStrings.padRight(((TechComponent)I2).getTechType().getShortDisplayName(),11)+": @x1",getSellableElectronicsName(viewerM,(Electronics)I2)));
								else
									miscItems.add(I2.name(viewerM));
							}
						}
					}
					if(miscItems.size()>0)
					{
						str.append(L("\n\rMisc Items : "));
						str.append(CMParms.toListString(miscItems));
					}
				}
			}
			else
			if(I instanceof Weapon)
			{
				final String handedNess;
				if(I.rawLogicalAnd() && ((I.rawProperLocationBitmap()&(Item.WORN_HELD|Item.WORN_WIELD))==(Item.WORN_HELD|Item.WORN_WIELD)))
					handedNess = L(" (2 handed)");
				else
					handedNess = "";
				str.append(L("\n\rWeap. Type : @x1",L(CMStrings.capitalizeAndLower(Weapon.TYPE_DESCS[((Weapon)I).weaponDamageType()]))));
				str.append(L("\n\rWeap. Class: @x1",L(CMStrings.capitalizeAndLower(Weapon.CLASS_DESCS[((Weapon)I).weaponClassification()]))))
					.append(handedNess);
			}
			else
			if(I instanceof Armor)
			{
				str.append(L("\n\rWear Info  : Worn on "));
				final Wearable.CODES codes = Wearable.CODES.instance();
				final List<String> locs = new ArrayList<String>();
				for(final long wornCode : codes.all())
				{
					if(wornCode != Wearable.IN_INVENTORY)
					{
						if(codes.name(wornCode).length()>0)
						{
							if(((I.rawProperLocationBitmap()&wornCode)==wornCode))
							{
								locs.add(CMStrings.capitalizeAndLower(codes.name(wornCode)));
							}
						}
					}
				}
				str.append(CMParms.combineWith(locs, L(I.rawLogicalAnd() ? " and " : " or ")));
				if(I.phyStats().height()>0)
				{
					Armor.SizeDeviation deviation=((Armor) I).getSizingDeviation(viewerM);
					if(deviation != Armor.SizeDeviation.FITS)
						str.append(L("\n\rSize       : ")+I.phyStats().height()+" ("+L(deviation.toString().toLowerCase().replace('_',' ')+")"));
				}
			}
		}
		str.append(L("\n\rDescription: @x1",E.description()));
		return str.toString();
	}