Behaviors: Difference between revisions
		
		
		
		
		
		Jump to navigation
		Jump to search
		
				
		 Warning:Until you release it, this will lock the NPC into your behavior code and only your behavior code.
Warning:Until you release it, this will lock the NPC into your behavior code and only your behavior code.
		
	
| No edit summary | TomEdwards (talk | contribs)  m (→The NPC) | ||
| (11 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
| Behaviors let you  | '''Behaviors''' let you abstract AI code to a C++ class of its own which is not tied to any one NPC. You might want to create <code>MensBathroomBehavior</code> for male NPCs and <code>WomensBathroomBehavior</code> for female NPCs, for instance. | ||
| == Authoring a behavior == | |||
| Behavior code, for the most part, behaves in the same way and uses the same framework as AI code you would write directly into an NPC. There is a certain amount of 'glue' required between one and the NPCs that will use it however: | |||
| === The behavior === | |||
| *Create <code>[[bool]] CanSelectSchedule()</code>, which defines whether or not an NPC will 'defer' to the behavior for a given [[NPCThink()|think]]. | |||
| *Create <code>virtual const char *GetName() { return "MyBehavior friendly name"; }</code>. | |||
| *Use <code>AI_BEGIN_CUSTOM_SCHEDULE_PROVIDER</code> instead of <code>[[AI_BEGIN_CUSTOM_NPC]]</code> (in the body). | |||
| *Use <code>DEFINE_CUSTOM_SCHEDULE_PROVIDER</code> instead of <code>[[DEFINE_CUSTOM_AI]]</code> (in the header). | |||
| *Use <code>[[GetOuter()]]-></code> to access the NPC object. | |||
| === The NPC === | |||
| *Include the header for your new behavior, and <code>ai_behavior.h</code>. | |||
| *Create a member instance of your behavior. | |||
| *Register the instance in <code>CreateBehaviors()</code> with <code>AddBehavior( &m_MyBehavior )</code>. | |||
| **None of Valve's NPC base classes have any behaviors registered - it may not be possible to do it at that level. | |||
| *Call <code>BehaviorSelectSchedule()</code> at some point in <code>[[SelectSchedule()]]</code>. This probably already happens if you're working with a stock NPC. | |||
| == Activating a behaviour manually == | |||
| Behaviours are evaluated on every [[NPCThink()|think]] with the logic in <code>CanSelectSchedule()</code>. If you want to manually enable a behavior until you disable it: | |||
|  MyNPC::SelectSchedule() | |||
|  { | |||
|  	if ( m_MyBehavior.m_bActive ) | |||
|  	{ | |||
|  		DeferSchedulingToBehavior( &m_MyBehavior );	''// Normally happens in BehaviorSelectSchedule()'' | |||
|  		return BaseClass::SelectSchedule();		''// This will now poll your behavior'' | |||
|  	} | |||
|  	... | |||
|  } | |||
| {{warning|Until you release it, this will lock the NPC into your behavior code and ''only'' your behavior code.}} | |||
| [[Category:AI Programming]] | |||
Latest revision as of 10:19, 28 May 2008
Behaviors let you abstract AI code to a C++ class of its own which is not tied to any one NPC. You might want to create MensBathroomBehavior for male NPCs and WomensBathroomBehavior for female NPCs, for instance.
Authoring a behavior
Behavior code, for the most part, behaves in the same way and uses the same framework as AI code you would write directly into an NPC. There is a certain amount of 'glue' required between one and the NPCs that will use it however:
The behavior
- Create bool CanSelectSchedule(), which defines whether or not an NPC will 'defer' to the behavior for a given think.
- Create virtual const char *GetName() { return "MyBehavior friendly name"; }.
- Use AI_BEGIN_CUSTOM_SCHEDULE_PROVIDERinstead ofAI_BEGIN_CUSTOM_NPC(in the body).
- Use DEFINE_CUSTOM_SCHEDULE_PROVIDERinstead ofDEFINE_CUSTOM_AI(in the header).
- Use GetOuter()->to access the NPC object.
The NPC
- Include the header for your new behavior, and ai_behavior.h.
- Create a member instance of your behavior.
- Register the instance in CreateBehaviors()withAddBehavior( &m_MyBehavior ).- None of Valve's NPC base classes have any behaviors registered - it may not be possible to do it at that level.
 
- Call BehaviorSelectSchedule()at some point inSelectSchedule(). This probably already happens if you're working with a stock NPC.
Activating a behaviour manually
Behaviours are evaluated on every think with the logic in CanSelectSchedule(). If you want to manually enable a behavior until you disable it:
MyNPC::SelectSchedule()
{
	if ( m_MyBehavior.m_bActive )
	{
		DeferSchedulingToBehavior( &m_MyBehavior );	// Normally happens in BehaviorSelectSchedule()
		return BaseClass::SelectSchedule();		// This will now poll your behavior
	}
	...
}
 Warning:Until you release it, this will lock the NPC into your behavior code and only your behavior code.
Warning:Until you release it, this will lock the NPC into your behavior code and only your behavior code.