public ActionEvent(BehaviorNodes.Action action, ActionEventType type, BehaviorExecutionContext bec) {
				this.Type = type;
				this.Action = action;
                this.BEC = bec;
			}
		public void TerminateBehavior(BehaviorExecutionContext bec) {
			RunningBehaviors.Remove(bec);
			int total = bec.Nodes.Count;
			int remaining = bec.RemainingNodes.Count;
			DebugIf("all", "Terminated behavior '" + bec.Behavior.Id + "': " + (total-remaining) + " of " + total + "nodes executed.");
		}
        private void ScheduleBehavior(BehaviorExecutionContext context)
        {
            DebugIf("behaviorSchedule", "ScheduleBehavior '" + context.ToString() + "'");
			try {
				scheduler.WaitOne();
	            foreach (BehaviorNode node in context.Nodes)
	            {
	                if (node is BehaviorNodes.Required)
	                {
	                    if ((node as BehaviorNodes.Required).IsValid())
	                    {
	                        foreach (BehaviorNodes.Action a in (node as BehaviorNodes.Required).Actions)
	                        {
	                            a.RequiredAction = true;
	                            a.ParentNode = node;
	                            ScheduleAction(a, context);
	                        }
	                    }
	                }
	                else
	                {
	                    (node as BehaviorNodes.Action).RequiredAction = false;
	                    ScheduleAction((node as BehaviorNodes.Action), context);
	                }
	            }
				scheduler.ReleaseMutex();
				RunningBehaviors.Add(context);
			}catch(Exception e){
				DebugIf("error", "Failed to schedule behavior '" + context.Behavior.Id + "' on character '" + context.Character.Name + "': " + e.Message);
			}
        }
        private void ScheduleAction(BehaviorNodes.Action a, BehaviorExecutionContext bec)
        {
            if (a.StartTime.Type == SyncPointType.Unspecified)
            {
                a.Event(ActionEventType.start, bec);
                RunningActions.Add(a);
            }
            else
            {
                if (a.StartTime.Type == SyncPointType.Absolute) AddTimeline(a.StartTime.AbsoluteValue * Properties.Settings.Default.PlanFPS + currentFrame, new ActionEvent(a, ActionEventType.start, bec));
                else if (a.StartTime.Type == SyncPointType.Reference) AddEventline(a.StartTime.ReferenceValue, new ActionEvent(a, ActionEventType.start, bec));

                if (a.EndTime.Type == SyncPointType.Absolute) AddTimeline(a.EndTime.AbsoluteValue * Properties.Settings.Default.PlanFPS + currentFrame, new ActionEvent(a, ActionEventType.end, bec));
                else if (a.EndTime.Type == SyncPointType.Reference) AddEventline(a.EndTime.ReferenceValue, new ActionEvent(a, ActionEventType.end, bec));
            }
        }