groovy/mudspace/domains/minnovar/
groovy/mudspace/domains/minnovar/objects/containers/
groovy/mudspace/domains/minnovar/objects/mobs/
groovy/mudspace/domains/minnovar/objects/mobs/scripts/
groovy/mudspace/domains/minnovar/objects/weapons/
groovy/mudspace/domains/minnovar/town/
groovy/mudspace/resources/
groovy/mudspace/std/
groovy/mudspace/std/game/
groovy/mudspace/std/game/guild/
groovy/mudspace/std/game/guild/skill/
groovy/mudspace/std/game/objects/
groovy/mudspace/std/game/objects/alive/
groovy/mudspace/std/game/objects/bodyparts/
groovy/mudspace/std/game/objects/containers/
groovy/mudspace/std/game/objects/exits/
groovy/mudspace/std/game/objects/exits/events/
groovy/mudspace/std/game/objects/trappings/
groovy/mudspace/std/game/objects/views/
groovy/mudspace/std/game/races/
groovy/scripts/
groovy/scripts/commands/creator/
groovy/scripts/commands/god/
scripts/
package commands.player

import org.groovymud.object.views.ContentsHelper
/* Copyright 2008 Matthew Corby-Eaglen
*
* 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. 
*/
import org.groovymud.object.MudObject
import org.groovymud.object.Container
import org.groovymud.engine.event.messages.MessageEvent
import org.groovymud.engine.event.EventScope
import static org.groovymud.utils.WordUtils.*
import org.groovymud.object.alive.Alive

import static org.groovymud.utils.MessengerUtils.sendMessageToRoom
import utils.MatchedObject
import utils.GenericSyntaxParser

/*
 * Syntax: get [all] [item [index] | items] [from [container [index] | containers]
 * 
 * eg get bread from sack
 * 	  get bread 2 from sack 1
 * 	  get all from sack
 *    get all monkeys from sacks
 *    get monkeys from sacks
 *    get all green monkeys from dirty sacks
 */
stream = source.getTerminalOutput()

parser = new GenericSyntaxParser()
parser.parse(argstr, "from")

if(parser.subjectObject != null){
	
	def fromObject = source.getCurrentContainer() // get from the room
	if(parser.prepositionObject != null){ // unless the prep object is populated
		// is the object in the player?
		fromObject = parser.prepositionObject.findObjectInContainer(source)
		if(fromObject == null){
			// or the room
			fromObject = parser.prepositionObject.findObjectInContainer(source.getCurrentContainer())			
		}
	}
	if(fromObject != null && !(fromObject instanceof Alive)){
		def actualObjs = parser.subjectObject.findObjectInContainer(fromObject)
		getFrom(actualObjs, fromObject)
	}else{	  
	    if(fromObject != null && fromObject instanceof Alive){
	        stream.writeln "You cannot get things from ${affixDefiniteArticle(fromObject)}, they have to give it to you!" 
	    }else{
	        stream.writeln "Cannot find ${parser.prepositionObject.objectName} to get anything from."
	    }
	}
}else{
	stream.writeln "Syntax: get [all] [item [index] | items] [from [container [index] | containers]"
}

 
 def getFrom(def actualObjs, def fromObject){
		def contentsDescription = "";
		//put the objects into the source object (the player)
		if(actualObjs != null){
			if(actualObjs instanceof Set){			    
			    def map = fromObject.getMudObjectsMap().clone()
			    def remove = [] as Set
			    def contentsHelper = new ContentsHelper()
			    removeAlive(map, contentsHelper)
			    actualObjs.clone().each{
				    obj ->
				       if(source.checkCanAddItem(obj)){
							source.addMudObject(obj)
					    }else{
							stream.writeln("You cannot get ${affixIndefiniteArticle(obj)}.")							
							contentsHelper.removeMudObject(obj, map);
					    }
				    
				}			 
			    
			    contentsDescription = contentsHelper.getContentsDescription(map, source, false, false)
			}else{
			    contentsDescription = affixIndefiniteArticle(actualObjs);
			    boolean canAdd = source.checkCanAddItem(actualObjs)
			    if(canAdd){
					source.addMudObject actualObjs 
			    }
			    else{
					stream.writeln "You cannot get $contentsDescription."
					return 
			    }
			}
			if(contentsDescription.trim() != ""){
    		    def scopeMsg = "${affixDefiniteArticle(source)} gets ${contentsDescription} from ${affixDefiniteArticle(fromObject)}."
    		    def sourceMsg = "You get $contentsDescription from the ${fromObject.getName()}."
    		    sendMessageToRoom(source, sourceMsg, scopeMsg)
			}
		}else{
		    if(parser.subjectObject == null || parser.subjectObject.objectName == "null"){
		        stream.writeln "You need to get something."
		    }else{
		        stream.writeln "Cannot find ${parser.prepositionObject.objectName} to get."
		    }
		}
 }
 
 def removeAlive(map, contentsHelper){
     new HashSet(map.values()).each{ set -> 
         set.each{
             if(it instanceof Alive){
                 contentsHelper.removeMudObject(it, map)
             }
         }         
     }
 }