public void ExecuteEvent(ScriptedObject thisCaller,string eventName){
		// intended to be called from animation Events, start execution at the named line, and
		// run until an action flagged sequenceEnd=true;
		
		// Look for the line. fail if not found
		int startingIndex=-1;
		for (int i=0;i<scriptLines.Length;i++){
			if (scriptLines[i].name == eventName){
				startingIndex=i;
				break;
			}
		}
		if (startingIndex <0){
			Debug.LogError("AnimationEvent using "+name+" could not find line "+eventName);
			return;
		}
		
		// caller is only used by ExecuteScript and onScriptComplete, so we might go without it...
		caller = thisCaller;
		myObject = caller.gameObject;
		args.Clear(); // do we need any args for events ?
		SetArgs (startingArgs);
		
		currentLine = startingIndex;
		nextLineLabel = "";
		isRunning = true;
		readyState = readiness.executing;
		myOI = caller.GetComponent<ObjectInteraction>();

		if (debug) Debug.Log ("Script "+name+" execution started");
	
		if (scriptLines[currentLine] != null)
			scriptLines[currentLine].ForceExecute(this);
		else
			OnScriptComplete("");
	}
	public void Execute(ScriptedObject thisCaller,string argString="", GameObject obj=null){
		caller = thisCaller;

		foreach (ObjectInteraction actor in actorObjects){
			actor.reservedForScript = null; // incase anyone got reserved who doesn't get picked by the dispatcher
		}
		
		// here, we must find a character for each role, assign and reserve them
		Dispatcher.GetInstance().FillRoles(this); // bail if fail
		
		if (obj == null) myObject = caller.gameObject; // the scripted object by default
		else myObject = obj;
		args.Clear(); // clear the dictionary to start
		SetArgs (startingArgs);
		SetArgs(argString);
		currentLine = 0;
		nextLineLabel = "";
		isRunning = true;
		readyState = readiness.executing;
		myOI = caller.GetComponent<ObjectInteraction>();

//Debug.LogWarning(name+" reserving "+myOI.name);

		foreach (ObjectInteraction actor in actorObjects){
			actor.actingInScript = this;
			actor.reservedForScript = null;
		}
		foreach (ScriptedAction sa in scriptLines)
			sa.hasExecuted = false; // really just for debug use, would break 'executeOnlyOnce'
		
		// if there's an interaction set specified, send it to the interaction manager.
		if (interactionSet != null && interactionSet.Name != null && interactionSet.Name != "")
			InteractionMgr.GetInstance().CurrentSet = interactionSet;
		
		if (debug) Debug.Log ("Script "+name+" execution started");
		
		// we're going to have to handle multiple current lines for roles 
		
		if (scriptLines[currentLine] != null)
			scriptLines[currentLine].Execute(this);
		else
			OnScriptComplete("");
	}