/
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/Languages/
com/planet_ink/coffee_mud/Abilities/Misc/
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/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/Common/
com/planet_ink/coffee_mud/Common/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/CompTech/
com/planet_ink/coffee_mud/Items/MiscMagic/
com/planet_ink/coffee_mud/Items/Weapons/
com/planet_ink/coffee_mud/Items/interfaces/
com/planet_ink/coffee_mud/Libraries/
com/planet_ink/coffee_mud/Libraries/interfaces/
com/planet_ink/coffee_mud/Locales/
com/planet_ink/coffee_mud/MOBS/
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/core/
com/planet_ink/coffee_mud/core/collections/
com/planet_ink/coffee_mud/core/interfaces/
com/planet_ink/coffee_mud/core/intermud/
com/planet_ink/coffee_mud/core/intermud/i3/
com/planet_ink/coffee_web/server/
com/planet_ink/siplet/applet/
lib/
resources/factions/
resources/fakedb/
resources/progs/autoplayer/
resources/quests/holidays/
web/
web/admin.templates/
web/admin/grinder/
web/admin/images/
web/clan.templates/
web/pub.templates/
web/pub/images/mxp/
web/pub/sounds/
web/pub/textedit/
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.core.collections.*;
import com.planet_ink.coffee_mud.Abilities.interfaces.*;
import com.planet_ink.coffee_mud.Areas.interfaces.*;
import com.planet_ink.coffee_mud.Behaviors.interfaces.*;
import com.planet_ink.coffee_mud.CharClasses.interfaces.*;
import com.planet_ink.coffee_mud.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.Libraries.interfaces.MaskingLibrary;
import com.planet_ink.coffee_mud.Locales.interfaces.*;
import com.planet_ink.coffee_mud.MOBS.interfaces.*;
import com.planet_ink.coffee_mud.Races.interfaces.*;

import java.util.*;

/*
   Copyright 2014-2016 Bo Zimmerman

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

	   http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
*/

public class Every extends StdCommand
{
	public Every(){}

	private final String[] access=I(new String[]{"EVERY"});
	@Override public String[] getAccessWords(){return access;}
	
	
	private enum EveryWhat {
		MOB,
		ITEM,
		ROOM,
		EXIT
	}

	
	protected List<String> makeNewCommands(List<String> commands, String replace)
	{
		final XVector<String> newCommands=new XVector<String>(commands);
		int x=newCommands.indexOf("*");
		if(x>=0)
			newCommands.set(x,replace);
		return newCommands;
	}
	
	@Override
	public boolean execute(MOB mob, List<String> commands, int metaFlags)
		throws java.io.IOException
	{	
		final Room room=mob.location();
		if(room == null)
			return false;
		commands=new XVector<String>(commands);
		Enumeration<Room> roomList = new XVector<Room>(room).elements();
		MaskingLibrary.CompiledZapperMask mask = null;
		boolean doPlayers = false;
		List<String> mskBunch=null;
		if(commands.size()==0)
			return false;
		commands.remove(0);
		if(commands.size()==0)
			return false;
		final String which=commands.get(0).toString().toUpperCase().trim();
		final EveryWhat what = (EveryWhat)CMath.s_valueOf(EveryWhat.class, which);
		if(what==null)
		{
			mob.tell(L("Every what? MOB, ITEM, ROOM, or EXIT please."));
			return false;
		}
		final CMSecurity.SecFlag secFlag;
		switch(what)
		{
		case ROOM: 
			secFlag=CMSecurity.SecFlag.CMDROOMS; 
			break;
		case MOB: 
			secFlag=CMSecurity.SecFlag.CMDMOBS; 
			break;
		case ITEM: 
			secFlag=CMSecurity.SecFlag.CMDITEMS; 
			break;
		case EXIT: 
			secFlag=CMSecurity.SecFlag.CMDROOMS; 
			break;
		default: 
			return false;
		}
		commands.remove(0);
		while(commands.size()>0)
		{
			if(mskBunch != null)
			{
				String s=commands.get(0).toString();
				int x=s.toUpperCase().indexOf("</MASK>");
				if(x<0)
					mskBunch.add(s);
				else
				{
					String rest=s.substring(x+7).trim();
					if(rest.length()>0)
					{
						if(commands.size()==1)
							commands.add(rest);
						else
							commands.add(1,rest);
					}
					s=s.substring(0,x).trim();
					if(s.length()>0)
						mskBunch.add(s);
					s=CMParms.combineQuoted(mskBunch, 0);
					mask=CMLib.masking().maskCompile(s);
					mskBunch = null;
				}
				commands.remove(0);
			}
			else
			if(commands.get(0).toString().equalsIgnoreCase("INAREA"))
			{
				if(CMSecurity.isAllowed(mob, room, secFlag))
				{
					roomList=room.getArea().getMetroMap();
				}
				else
				{
					mob.tell(L("Not permitted."));
					roomList = null;
				}
				commands.remove(0);
			}
			else
			if(commands.get(0).toString().equalsIgnoreCase("INWORLD"))
			{
				if(CMSecurity.isAllowedEverywhere(mob, secFlag) && CMSecurity.isAllowedEverywhere(mob, CMSecurity.SecFlag.EVERY))
				{
					roomList=CMLib.map().rooms();
				}
				else
				{
					mob.tell(L("Not permitted."));
					roomList = null;
				}
				commands.remove(0);
			}
			else
			if(commands.get(0).toString().toUpperCase().startsWith("<MASK>"))
			{
				mskBunch=new XVector<String>(commands.get(0).toString().substring(6));
				commands.remove(0);
			}
			else
			if(commands.get(0).toString().equals("+PLAYERS"))
			{
				if(CMSecurity.isAllowed(mob, room, CMSecurity.SecFlag.CMDPLAYERS))
				{
					doPlayers = true;
				}
				else
				{
					mob.tell(L("Not permitted."));
					roomList = null;
				}
				commands.remove(0);
			}
			else
				break;
		}
		
		final Session session=mob.session();
		if(roomList == null)
		{
			mob.tell(L("You failed."));
			return false;
		}
		if(commands.size()==0)
		{
			mob.tell(L("Do what? How about a command?"));
			return false;
		}
		
		final Room oldLocR=mob.location();
		while(roomList.hasMoreElements() && ((session==null)||(!session.isStopped())))
		{
			final Room R=roomList.nextElement();
			if(R!=null)
			{
				if(mob.location()!=R)
					R.bringMobHere(mob,false);
				switch(what)
				{
				case ROOM:
					mob.doCommand(makeNewCommands(commands,"*"),metaFlags);
					break;
				case ITEM:
					for(final Enumeration<Item> i=R.items();i.hasMoreElements();)
					{
						final Item I=i.nextElement();
						if((I!=null)
						&&((mask==null)||(CMLib.masking().maskCheck(mask, I, true))))
							mob.doCommand(makeNewCommands(commands,R.getContextName(I)),metaFlags);
					}
					break;
				case MOB:
					for(final Enumeration<MOB> m=R.inhabitants();m.hasMoreElements();)
					{
						final MOB M=m.nextElement();
						if((M!=null)
						&&(M!=mob)
						&&(M.isMonster() || (doPlayers))
						&&((mask==null)||(CMLib.masking().maskCheck(mask, M, true))))
							mob.doCommand(makeNewCommands(commands,R.getContextName(M)),metaFlags);
					}
					break;
				case EXIT:
				{
					final boolean inAShip =(R instanceof BoardableShip)||(R.getArea() instanceof BoardableShip);
					for(int d=0;d<Directions.NUM_DIRECTIONS();d++)
					{
						final Exit E=R.getExitInDir(d);
						if((E!=null)
						&&((mask==null)||(CMLib.masking().maskCheck(mask, E, true))))
						{
							mob.doCommand(makeNewCommands(commands,inAShip ? Directions.getShipDirectionName(d) : Directions.getDirectionName(d)),metaFlags);
						}
					}
				}
				}
			}
		}
		if(mob.location()!=oldLocR) 
			oldLocR.bringMobHere(mob,false);
		mob.tell(L("Done."));
		return false;
	}

	@Override public boolean canBeOrdered(){return false;}
	@Override public boolean securityCheck(MOB mob){return CMSecurity.isAllowed(mob,mob.location(),CMSecurity.SecFlag.EVERY);}
}