Creating a task: Difference between revisions
Jump to navigation
Jump to search
Robber9000 (talk | contribs) mNo edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
{{npc tut}} | {{npc tut}} | ||
< | A '''Task''' is an action that an NPC can perform. [[Schedule]]s will run a list of tasks. Keep tasks as atomic as possible; don't squeeze two distinct actions into the same one. | ||
== Creating a task == | |||
Custom tasks are added by first declaring a new enum value. | |||
<source lang=cpp> | |||
enum | enum | ||
{ | { | ||
TASK_JUMP = LAST_SHARED_TASK, | TASK_JUMP = LAST_SHARED_TASK, | ||
TASK_FIND_DODGE_DIRECTION, | |||
LAST_MY_NPC_TASK, | |||
}; | }; | ||
</ | </source> | ||
After that, the task should be declared like this: | After that, the task itself should be declared like this: | ||
< | <source lang=cpp> | ||
DECLARE_TASK(TASK_GOOMBA_WALK_STRAIGHT) | AI_BEGIN_CUSTOM_NPC( npc_custom, CNPC_Custom ) | ||
</ | DECLARE_TASK( TASK_GOOMBA_WALK_STRAIGHT ) | ||
AI_END_CUSTOM_SCHEDULE_PROVIDER() | |||
</source> | |||
Then you add the tasks in your custom schedule in the order you want them to execute. See [[Schedule]] for more details on the following code: | |||
<source lang=cpp> | |||
AI_BEGIN_CUSTOM_NPC( npc_custom, CNPC_Custom ) | AI_BEGIN_CUSTOM_NPC( npc_custom, CNPC_Custom ) | ||
DEFINE_SCHEDULE | DEFINE_SCHEDULE | ||
Line 30: | Line 34: | ||
" Tasks" | " Tasks" | ||
" TASK_FIND_DODGE_DIRECTION 3" | " TASK_FIND_DODGE_DIRECTION 3" | ||
" TASK_JUMP | " TASK_JUMP 0" | ||
"" | "" | ||
" Interrupts" | " Interrupts" | ||
" COND_LIGHT_DAMAGE" | |||
) | ) | ||
AI_END_CUSTOM_NPC() | AI_END_CUSTOM_NPC() | ||
</ | </source> | ||
== Task logic == | |||
Now that everything is set up it's finally time ''to write some actual AI code''. | |||
* Tasks are initiated from <code>StartTask(Task_t *pTask)</code>, which should take the form of a <code>[[W:Switch statement#Examples|switch]]</code> statement that evaluates <code>pTask->iTask</code>. {{note|Remember to have a <code>default</code> case that falls back on <code>BaseClass::StartTask()</code>.}} | |||
* Each task has an associated [[float]] value, <code>pTask->flTaskData</code>, which can be used to change its outcome. | |||
* When the current task is complete, call <code>TaskComplete()</code>. | |||
* If the current task has failed, call <code>TaskFail()</code> with an error message. | |||
=== Navigation === | |||
{{todo}} | |||
=== Animation === | |||
{{todo}} | |||
{ | === Combat === | ||
{{todo}} | |||
{{navbar|Creating a schedule|Creating an NPC|Giving an NPC Memory}} | |||
{{navbar|Creating a | |||
[[Category:AI Programming]] | [[Category:AI Programming]] |
Revision as of 11:18, 15 September 2011
A Task is an action that an NPC can perform. Schedules will run a list of tasks. Keep tasks as atomic as possible; don't squeeze two distinct actions into the same one.
Creating a task
Custom tasks are added by first declaring a new enum value.
enum
{
TASK_JUMP = LAST_SHARED_TASK,
TASK_FIND_DODGE_DIRECTION,
LAST_MY_NPC_TASK,
};
After that, the task itself should be declared like this:
AI_BEGIN_CUSTOM_NPC( npc_custom, CNPC_Custom )
DECLARE_TASK( TASK_GOOMBA_WALK_STRAIGHT )
AI_END_CUSTOM_SCHEDULE_PROVIDER()
Then you add the tasks in your custom schedule in the order you want them to execute. See Schedule for more details on the following code:
AI_BEGIN_CUSTOM_NPC( npc_custom, CNPC_Custom )
DEFINE_SCHEDULE
(
SCHED_DODGE_ENEMY_FIRE,
" Tasks"
" TASK_FIND_DODGE_DIRECTION 3"
" TASK_JUMP 0"
""
" Interrupts"
" COND_LIGHT_DAMAGE"
)
AI_END_CUSTOM_NPC()
Task logic
Now that everything is set up it's finally time to write some actual AI code.
- Tasks are initiated from
StartTask(Task_t *pTask)
, which should take the form of aswitch
statement that evaluatespTask->iTask
.Note:Remember to have a
default
case that falls back onBaseClass::StartTask()
. - Each task has an associated float value,
pTask->flTaskData
, which can be used to change its outcome. - When the current task is complete, call
TaskComplete()
. - If the current task has failed, call
TaskFail()
with an error message.
[Todo]
Animation
[Todo]
Combat
[Todo]