Behaviors: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
No edit summary
 
(11 intermediate revisions by 2 users not shown)
Line 1: Line 1:
Behaviors let you assign schedules and functionality to more than one NPC class without having to re-write or derive off a certain class.<rbr>
'''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.
For example: <br>
You have three npc classes : npc_bob , npc_fred , npc_jane<br>
You make two behaviors : MensBathroomBehavior, WomensBathroomBehavior<br>


You'd assign MensBathroomBehavior to the male npcs and WomensBathroomBehavior to npc_jane.
== Authoring a behavior ==


Steps To Add 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:


*add a function to your npc class : bool npc_class::CreateBehaviors() : (comes in virtually from CAI_BehaviorHost)
=== The behavior ===
*create the behaviour as a member variable in your class
*add the behavior AddBehavior( &m_WhateverBehavior ); in your CreateBehaviors() function
*let your npc class know you want to use a behavior by calling BehaviorSelectSchedule() in your SelectSchedule()


To allow the Behavior to be used you'll need a function in teh 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.


bool CAI_WhateverBehaviour::CanSelectSchedule()
=== The NPC ===
{
return true;
}


That should do it.
*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_PROVIDER instead of AI_BEGIN_CUSTOM_NPC (in the body).
  • Use DEFINE_CUSTOM_SCHEDULE_PROVIDER instead of DEFINE_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() with AddBehavior( &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 in SelectSchedule(). 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.pngWarning:Until you release it, this will lock the NPC into your behavior code and only your behavior code.