|
|
@ -86,9 +86,6 @@ public: |
|
|
|
|
|
|
|
|
|
|
|
int IRelationship(CBaseEntity *pTarget); |
|
|
|
int IRelationship(CBaseEntity *pTarget); |
|
|
|
|
|
|
|
|
|
|
|
CUSTOM_SCHEDULES; |
|
|
|
|
|
|
|
static TYPEDESCRIPTION m_SaveData[]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static const char *pGruntSentences[]; |
|
|
|
static const char *pGruntSentences[]; |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
@ -511,627 +508,6 @@ void CFGrunt::DeathSound( void ) |
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
// AI Schedules Specific to this monster
|
|
|
|
// AI Schedules Specific to this monster
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
/*
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
// GruntFail
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
Task_t tlGruntFail[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ TASK_STOP_MOVING, 0 }, |
|
|
|
|
|
|
|
{ TASK_SET_ACTIVITY, (float)ACT_IDLE }, |
|
|
|
|
|
|
|
{ TASK_WAIT, (float)2 }, |
|
|
|
|
|
|
|
{ TASK_WAIT_PVS, (float)0 }, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Schedule_t slGruntFail[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tlGruntFail, |
|
|
|
|
|
|
|
ARRAYSIZE( tlGruntFail ), |
|
|
|
|
|
|
|
bits_COND_CAN_RANGE_ATTACK1 | |
|
|
|
|
|
|
|
bits_COND_CAN_RANGE_ATTACK2 | |
|
|
|
|
|
|
|
bits_COND_CAN_MELEE_ATTACK1 | |
|
|
|
|
|
|
|
bits_COND_CAN_MELEE_ATTACK2, |
|
|
|
|
|
|
|
0, |
|
|
|
|
|
|
|
"Grunt Fail" |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
// Grunt Combat Fail
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
Task_t tlGruntCombatFail[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ TASK_STOP_MOVING, 0 }, |
|
|
|
|
|
|
|
{ TASK_SET_ACTIVITY, (float)ACT_IDLE }, |
|
|
|
|
|
|
|
{ TASK_WAIT_FACE_ENEMY, (float)2 }, |
|
|
|
|
|
|
|
{ TASK_WAIT_PVS, (float)0 }, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Schedule_t slGruntCombatFail[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tlGruntCombatFail, |
|
|
|
|
|
|
|
ARRAYSIZE( tlGruntCombatFail ), |
|
|
|
|
|
|
|
bits_COND_CAN_RANGE_ATTACK1 | |
|
|
|
|
|
|
|
bits_COND_CAN_RANGE_ATTACK2, |
|
|
|
|
|
|
|
0, |
|
|
|
|
|
|
|
"Grunt Combat Fail" |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
// Victory dance!
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
Task_t tlGruntVictoryDance[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ TASK_STOP_MOVING, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_FACE_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_WAIT, (float)1.5 }, |
|
|
|
|
|
|
|
{ TASK_GET_PATH_TO_ENEMY_CORPSE, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_WALK_PATH, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_WAIT_FOR_MOVEMENT, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_FACE_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_PLAY_SEQUENCE, (float)ACT_VICTORY_DANCE }, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Schedule_t slGruntVictoryDance[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tlGruntVictoryDance, |
|
|
|
|
|
|
|
ARRAYSIZE( tlGruntVictoryDance ), |
|
|
|
|
|
|
|
bits_COND_NEW_ENEMY | |
|
|
|
|
|
|
|
bits_COND_LIGHT_DAMAGE | |
|
|
|
|
|
|
|
bits_COND_HEAVY_DAMAGE, |
|
|
|
|
|
|
|
0, |
|
|
|
|
|
|
|
"GruntVictoryDance" |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
// Establish line of fire - move to a position that allows
|
|
|
|
|
|
|
|
// the grunt to attack.
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
Task_t tlGruntEstablishLineOfFire[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ TASK_SET_FAIL_SCHEDULE, (float)SCHED_GRUNT_ELOF_FAIL }, |
|
|
|
|
|
|
|
{ TASK_GET_PATH_TO_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_GRUNT_SPEAK_SENTENCE,(float)0 }, |
|
|
|
|
|
|
|
{ TASK_RUN_PATH, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_WAIT_FOR_MOVEMENT, (float)0 }, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Schedule_t slGruntEstablishLineOfFire[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tlGruntEstablishLineOfFire, |
|
|
|
|
|
|
|
ARRAYSIZE( tlGruntEstablishLineOfFire ), |
|
|
|
|
|
|
|
bits_COND_NEW_ENEMY | |
|
|
|
|
|
|
|
bits_COND_ENEMY_DEAD | |
|
|
|
|
|
|
|
bits_COND_CAN_RANGE_ATTACK1 | |
|
|
|
|
|
|
|
bits_COND_CAN_MELEE_ATTACK1 | |
|
|
|
|
|
|
|
bits_COND_CAN_RANGE_ATTACK2 | |
|
|
|
|
|
|
|
bits_COND_CAN_MELEE_ATTACK2 | |
|
|
|
|
|
|
|
bits_COND_HEAR_SOUND, |
|
|
|
|
|
|
|
bits_SOUND_DANGER, |
|
|
|
|
|
|
|
"GruntEstablishLineOfFire" |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
// GruntFoundEnemy - grunt established sight with an enemy
|
|
|
|
|
|
|
|
// that was hiding from the squad.
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
Task_t tlGruntFoundEnemy[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ TASK_STOP_MOVING, 0 }, |
|
|
|
|
|
|
|
{ TASK_FACE_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_PLAY_SEQUENCE_FACE_ENEMY, (float)ACT_SIGNAL1 }, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Schedule_t slGruntFoundEnemy[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tlGruntFoundEnemy, |
|
|
|
|
|
|
|
ARRAYSIZE( tlGruntFoundEnemy ), |
|
|
|
|
|
|
|
bits_COND_HEAR_SOUND, |
|
|
|
|
|
|
|
bits_SOUND_DANGER, |
|
|
|
|
|
|
|
"GruntFoundEnemy" |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
// GruntCombatFace Schedule
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
Task_t tlGruntCombatFace1[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ TASK_STOP_MOVING, 0 }, |
|
|
|
|
|
|
|
{ TASK_SET_ACTIVITY, (float)ACT_IDLE }, |
|
|
|
|
|
|
|
{ TASK_FACE_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_WAIT, (float)1.5 }, |
|
|
|
|
|
|
|
{ TASK_SET_SCHEDULE, (float)SCHED_GRUNT_SWEEP }, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Schedule_t slGruntCombatFace[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tlGruntCombatFace1, |
|
|
|
|
|
|
|
ARRAYSIZE( tlGruntCombatFace1 ), |
|
|
|
|
|
|
|
bits_COND_NEW_ENEMY | |
|
|
|
|
|
|
|
bits_COND_ENEMY_DEAD | |
|
|
|
|
|
|
|
bits_COND_CAN_RANGE_ATTACK1 | |
|
|
|
|
|
|
|
bits_COND_CAN_RANGE_ATTACK2, |
|
|
|
|
|
|
|
0, |
|
|
|
|
|
|
|
"Combat Face" |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
// Suppressing fire - don't stop shooting until the clip is
|
|
|
|
|
|
|
|
// empty or grunt gets hurt.
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
Task_t tlGruntSignalSuppress[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ TASK_STOP_MOVING, 0 }, |
|
|
|
|
|
|
|
{ TASK_FACE_IDEAL, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_PLAY_SEQUENCE_FACE_ENEMY, (float)ACT_SIGNAL2 }, |
|
|
|
|
|
|
|
{ TASK_FACE_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_GRUNT_CHECK_FIRE, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_RANGE_ATTACK1, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_FACE_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_GRUNT_CHECK_FIRE, (float)0}, |
|
|
|
|
|
|
|
{ TASK_RANGE_ATTACK1, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_FACE_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_GRUNT_CHECK_FIRE, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_RANGE_ATTACK1, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_FACE_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_GRUNT_CHECK_FIRE, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_RANGE_ATTACK1, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_FACE_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_GRUNT_CHECK_FIRE, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_RANGE_ATTACK1, (float)0 }, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Schedule_t slGruntSignalSuppress[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tlGruntSignalSuppress, |
|
|
|
|
|
|
|
ARRAYSIZE( tlGruntSignalSuppress ), |
|
|
|
|
|
|
|
bits_COND_ENEMY_DEAD | |
|
|
|
|
|
|
|
bits_COND_LIGHT_DAMAGE | |
|
|
|
|
|
|
|
bits_COND_HEAVY_DAMAGE | |
|
|
|
|
|
|
|
bits_COND_HEAR_SOUND | |
|
|
|
|
|
|
|
bits_COND_GRUNT_NOFIRE | |
|
|
|
|
|
|
|
bits_COND_NO_AMMO_LOADED, |
|
|
|
|
|
|
|
bits_SOUND_DANGER, |
|
|
|
|
|
|
|
"SignalSuppress" |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Task_t tlGruntSuppress[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ TASK_STOP_MOVING, 0 }, |
|
|
|
|
|
|
|
{ TASK_FACE_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_GRUNT_CHECK_FIRE, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_RANGE_ATTACK1, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_FACE_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_GRUNT_CHECK_FIRE, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_RANGE_ATTACK1, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_FACE_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_GRUNT_CHECK_FIRE, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_RANGE_ATTACK1, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_FACE_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_GRUNT_CHECK_FIRE, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_RANGE_ATTACK1, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_FACE_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_GRUNT_CHECK_FIRE, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_RANGE_ATTACK1, (float)0 }, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Schedule_t slGruntSuppress[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tlGruntSuppress, |
|
|
|
|
|
|
|
ARRAYSIZE( tlGruntSuppress ), |
|
|
|
|
|
|
|
bits_COND_ENEMY_DEAD | |
|
|
|
|
|
|
|
bits_COND_LIGHT_DAMAGE | |
|
|
|
|
|
|
|
bits_COND_HEAVY_DAMAGE | |
|
|
|
|
|
|
|
bits_COND_HEAR_SOUND | |
|
|
|
|
|
|
|
bits_COND_GRUNT_NOFIRE | |
|
|
|
|
|
|
|
bits_COND_NO_AMMO_LOADED, |
|
|
|
|
|
|
|
bits_SOUND_DANGER, |
|
|
|
|
|
|
|
"Suppress" |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
// grunt wait in cover - we don't allow danger or the ability
|
|
|
|
|
|
|
|
// to attack to break a grunt's run to cover schedule, but
|
|
|
|
|
|
|
|
// when a grunt is in cover, we do want them to attack if they can.
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
Task_t tlGruntWaitInCover[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ TASK_STOP_MOVING, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_SET_ACTIVITY, (float)ACT_IDLE }, |
|
|
|
|
|
|
|
{ TASK_WAIT_FACE_ENEMY, (float)1 }, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Schedule_t slGruntWaitInCover[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tlGruntWaitInCover, |
|
|
|
|
|
|
|
ARRAYSIZE( tlGruntWaitInCover ), |
|
|
|
|
|
|
|
bits_COND_NEW_ENEMY | |
|
|
|
|
|
|
|
bits_COND_HEAR_SOUND | |
|
|
|
|
|
|
|
bits_COND_CAN_RANGE_ATTACK1 | |
|
|
|
|
|
|
|
bits_COND_CAN_RANGE_ATTACK2 | |
|
|
|
|
|
|
|
bits_COND_CAN_MELEE_ATTACK1 | |
|
|
|
|
|
|
|
bits_COND_CAN_MELEE_ATTACK2, |
|
|
|
|
|
|
|
bits_SOUND_DANGER, |
|
|
|
|
|
|
|
"GruntWaitInCover" |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
// run to cover.
|
|
|
|
|
|
|
|
// !!!BUGBUG - set a decent fail schedule here.
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
Task_t tlGruntTakeCover1[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ TASK_STOP_MOVING, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_SET_FAIL_SCHEDULE, (float)SCHED_GRUNT_TAKECOVER_FAILED }, |
|
|
|
|
|
|
|
{ TASK_WAIT, (float)0.2 }, |
|
|
|
|
|
|
|
{ TASK_FIND_COVER_FROM_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_GRUNT_SPEAK_SENTENCE, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_RUN_PATH, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_WAIT_FOR_MOVEMENT, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_REMEMBER, (float)bits_MEMORY_INCOVER }, |
|
|
|
|
|
|
|
{ TASK_SET_SCHEDULE, (float)SCHED_GRUNT_WAIT_FACE_ENEMY }, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Schedule_t slGruntTakeCover[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tlGruntTakeCover1, |
|
|
|
|
|
|
|
ARRAYSIZE ( tlGruntTakeCover1 ), |
|
|
|
|
|
|
|
0, |
|
|
|
|
|
|
|
0, |
|
|
|
|
|
|
|
"TakeCover" |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
// drop grenade then run to cover.
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
Task_t tlGruntGrenadeCover1[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ TASK_STOP_MOVING, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_FIND_COVER_FROM_ENEMY, (float)99 }, |
|
|
|
|
|
|
|
{ TASK_FIND_FAR_NODE_COVER_FROM_ENEMY, (float)384 }, |
|
|
|
|
|
|
|
{ TASK_PLAY_SEQUENCE, (float)ACT_SPECIAL_ATTACK1 }, |
|
|
|
|
|
|
|
{ TASK_CLEAR_MOVE_WAIT, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_RUN_PATH, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_WAIT_FOR_MOVEMENT, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_SET_SCHEDULE, (float)SCHED_GRUNT_WAIT_FACE_ENEMY }, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Schedule_t slGruntGrenadeCover[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tlGruntGrenadeCover1, |
|
|
|
|
|
|
|
ARRAYSIZE( tlGruntGrenadeCover1 ), |
|
|
|
|
|
|
|
0, |
|
|
|
|
|
|
|
0, |
|
|
|
|
|
|
|
"GrenadeCover" |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
// drop grenade then run to cover.
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
Task_t tlGruntTossGrenadeCover1[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ TASK_FACE_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_RANGE_ATTACK2, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_SET_SCHEDULE, (float)SCHED_TAKE_COVER_FROM_ENEMY }, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Schedule_t slGruntTossGrenadeCover[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tlGruntTossGrenadeCover1, |
|
|
|
|
|
|
|
ARRAYSIZE( tlGruntTossGrenadeCover1 ), |
|
|
|
|
|
|
|
0, |
|
|
|
|
|
|
|
0, |
|
|
|
|
|
|
|
"TossGrenadeCover" |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
// hide from the loudest sound source (to run from grenade)
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
Task_t tlGruntTakeCoverFromBestSound[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ TASK_SET_FAIL_SCHEDULE, (float)SCHED_COWER },// duck and cover if cannot move from explosion
|
|
|
|
|
|
|
|
{ TASK_STOP_MOVING, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_FIND_COVER_FROM_BEST_SOUND, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_RUN_PATH, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_WAIT_FOR_MOVEMENT, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_REMEMBER, (float)bits_MEMORY_INCOVER }, |
|
|
|
|
|
|
|
{ TASK_TURN_LEFT, (float)179 }, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Schedule_t slGruntTakeCoverFromBestSound[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tlGruntTakeCoverFromBestSound, |
|
|
|
|
|
|
|
ARRAYSIZE( tlGruntTakeCoverFromBestSound ), |
|
|
|
|
|
|
|
0, |
|
|
|
|
|
|
|
0, |
|
|
|
|
|
|
|
"GruntTakeCoverFromBestSound" |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
// Grunt reload schedule
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
Task_t tlGruntHideReload[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ TASK_STOP_MOVING, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_SET_FAIL_SCHEDULE, (float)SCHED_RELOAD }, |
|
|
|
|
|
|
|
{ TASK_FIND_COVER_FROM_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_RUN_PATH, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_WAIT_FOR_MOVEMENT, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_REMEMBER, (float)bits_MEMORY_INCOVER }, |
|
|
|
|
|
|
|
{ TASK_FACE_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_PLAY_SEQUENCE, (float)ACT_RELOAD }, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Schedule_t slGruntHideReload[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tlGruntHideReload, |
|
|
|
|
|
|
|
ARRAYSIZE( tlGruntHideReload ), |
|
|
|
|
|
|
|
bits_COND_HEAVY_DAMAGE | |
|
|
|
|
|
|
|
bits_COND_HEAR_SOUND, |
|
|
|
|
|
|
|
bits_SOUND_DANGER, |
|
|
|
|
|
|
|
"GruntHideReload" |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
// Do a turning sweep of the area
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
Task_t tlGruntSweep[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ TASK_TURN_LEFT, (float)179 }, |
|
|
|
|
|
|
|
{ TASK_WAIT, (float)1 }, |
|
|
|
|
|
|
|
{ TASK_TURN_LEFT, (float)179 }, |
|
|
|
|
|
|
|
{ TASK_WAIT, (float)1 }, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Schedule_t slGruntSweep[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tlGruntSweep, |
|
|
|
|
|
|
|
ARRAYSIZE( tlGruntSweep ), |
|
|
|
|
|
|
|
bits_COND_NEW_ENEMY | |
|
|
|
|
|
|
|
bits_COND_LIGHT_DAMAGE | |
|
|
|
|
|
|
|
bits_COND_HEAVY_DAMAGE | |
|
|
|
|
|
|
|
bits_COND_CAN_RANGE_ATTACK1 | |
|
|
|
|
|
|
|
bits_COND_CAN_RANGE_ATTACK2 | |
|
|
|
|
|
|
|
bits_COND_HEAR_SOUND, |
|
|
|
|
|
|
|
bits_SOUND_WORLD |// sound flags
|
|
|
|
|
|
|
|
bits_SOUND_DANGER | |
|
|
|
|
|
|
|
bits_SOUND_PLAYER, |
|
|
|
|
|
|
|
"Grunt Sweep" |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
// primary range attack. Overriden because base class stops attacking when the enemy is occluded.
|
|
|
|
|
|
|
|
// grunt's grenade toss requires the enemy be occluded.
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
Task_t tlGruntRangeAttack1A[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ TASK_STOP_MOVING, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_PLAY_SEQUENCE_FACE_ENEMY, (float)ACT_CROUCH }, |
|
|
|
|
|
|
|
{ TASK_GRUNT_CHECK_FIRE, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_RANGE_ATTACK1, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_FACE_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_GRUNT_CHECK_FIRE, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_RANGE_ATTACK1, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_FACE_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_GRUNT_CHECK_FIRE, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_RANGE_ATTACK1, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_FACE_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_GRUNT_CHECK_FIRE, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_RANGE_ATTACK1, (float)0 }, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Schedule_t slGruntRangeAttack1A[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tlGruntRangeAttack1A, |
|
|
|
|
|
|
|
ARRAYSIZE( tlGruntRangeAttack1A ), |
|
|
|
|
|
|
|
bits_COND_NEW_ENEMY | |
|
|
|
|
|
|
|
bits_COND_ENEMY_DEAD | |
|
|
|
|
|
|
|
bits_COND_HEAVY_DAMAGE | |
|
|
|
|
|
|
|
bits_COND_ENEMY_OCCLUDED | |
|
|
|
|
|
|
|
bits_COND_HEAR_SOUND | |
|
|
|
|
|
|
|
bits_COND_GRUNT_NOFIRE | |
|
|
|
|
|
|
|
bits_COND_NO_AMMO_LOADED, |
|
|
|
|
|
|
|
bits_SOUND_DANGER, |
|
|
|
|
|
|
|
"Range Attack1A" |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
// primary range attack. Overriden because base class stops attacking when the enemy is occluded.
|
|
|
|
|
|
|
|
// grunt's grenade toss requires the enemy be occluded.
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
Task_t tlGruntRangeAttack1B[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ TASK_STOP_MOVING, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_PLAY_SEQUENCE_FACE_ENEMY, (float)ACT_IDLE_ANGRY }, |
|
|
|
|
|
|
|
{ TASK_GRUNT_CHECK_FIRE, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_RANGE_ATTACK1, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_FACE_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_GRUNT_CHECK_FIRE, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_RANGE_ATTACK1, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_FACE_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_GRUNT_CHECK_FIRE, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_RANGE_ATTACK1, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_FACE_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_GRUNT_CHECK_FIRE, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_RANGE_ATTACK1, (float)0 }, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Schedule_t slGruntRangeAttack1B[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tlGruntRangeAttack1B, |
|
|
|
|
|
|
|
ARRAYSIZE( tlGruntRangeAttack1B ), |
|
|
|
|
|
|
|
bits_COND_NEW_ENEMY | |
|
|
|
|
|
|
|
bits_COND_ENEMY_DEAD | |
|
|
|
|
|
|
|
bits_COND_HEAVY_DAMAGE | |
|
|
|
|
|
|
|
bits_COND_ENEMY_OCCLUDED | |
|
|
|
|
|
|
|
bits_COND_NO_AMMO_LOADED | |
|
|
|
|
|
|
|
bits_COND_GRUNT_NOFIRE | |
|
|
|
|
|
|
|
bits_COND_HEAR_SOUND, |
|
|
|
|
|
|
|
bits_SOUND_DANGER, |
|
|
|
|
|
|
|
"Range Attack1B" |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
// secondary range attack. Overriden because base class stops attacking when the enemy is occluded.
|
|
|
|
|
|
|
|
// grunt's grenade toss requires the enemy be occluded.
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
Task_t tlGruntRangeAttack2[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ TASK_STOP_MOVING, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_GRUNT_FACE_TOSS_DIR, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_PLAY_SEQUENCE, (float)ACT_RANGE_ATTACK2 }, |
|
|
|
|
|
|
|
{ TASK_SET_SCHEDULE, (float)SCHED_GRUNT_WAIT_FACE_ENEMY },// don't run immediately after throwing grenade.
|
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Schedule_t slGruntRangeAttack2[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tlGruntRangeAttack2, |
|
|
|
|
|
|
|
ARRAYSIZE( tlGruntRangeAttack2 ), |
|
|
|
|
|
|
|
0, |
|
|
|
|
|
|
|
0, |
|
|
|
|
|
|
|
"RangeAttack2" |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
// repel
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
Task_t tlGruntRepel[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ TASK_STOP_MOVING, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_FACE_IDEAL, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_PLAY_SEQUENCE, (float)ACT_GLIDE }, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Schedule_t slGruntRepel[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tlGruntRepel, |
|
|
|
|
|
|
|
ARRAYSIZE( tlGruntRepel ), |
|
|
|
|
|
|
|
bits_COND_SEE_ENEMY | |
|
|
|
|
|
|
|
bits_COND_NEW_ENEMY | |
|
|
|
|
|
|
|
bits_COND_LIGHT_DAMAGE | |
|
|
|
|
|
|
|
bits_COND_HEAVY_DAMAGE | |
|
|
|
|
|
|
|
bits_COND_HEAR_SOUND, |
|
|
|
|
|
|
|
bits_SOUND_DANGER | |
|
|
|
|
|
|
|
bits_SOUND_COMBAT | |
|
|
|
|
|
|
|
bits_SOUND_PLAYER, |
|
|
|
|
|
|
|
"Repel" |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
// repel
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
Task_t tlGruntRepelAttack[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ TASK_STOP_MOVING, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_FACE_ENEMY, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_PLAY_SEQUENCE, (float)ACT_FLY }, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Schedule_t slGruntRepelAttack[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tlGruntRepelAttack, |
|
|
|
|
|
|
|
ARRAYSIZE( tlGruntRepelAttack ), |
|
|
|
|
|
|
|
bits_COND_ENEMY_OCCLUDED, |
|
|
|
|
|
|
|
0, |
|
|
|
|
|
|
|
"Repel Attack" |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
// repel land
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
|
|
|
|
Task_t tlGruntRepelLand[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ TASK_STOP_MOVING, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_PLAY_SEQUENCE, (float)ACT_LAND }, |
|
|
|
|
|
|
|
{ TASK_GET_PATH_TO_LASTPOSITION, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_RUN_PATH, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_WAIT_FOR_MOVEMENT, (float)0 }, |
|
|
|
|
|
|
|
{ TASK_CLEAR_LASTPOSITION, (float)0 }, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Schedule_t slGruntRepelLand[] = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tlGruntRepelLand, |
|
|
|
|
|
|
|
ARRAYSIZE( tlGruntRepelLand ), |
|
|
|
|
|
|
|
bits_COND_SEE_ENEMY | |
|
|
|
|
|
|
|
bits_COND_NEW_ENEMY | |
|
|
|
|
|
|
|
bits_COND_LIGHT_DAMAGE | |
|
|
|
|
|
|
|
bits_COND_HEAVY_DAMAGE | |
|
|
|
|
|
|
|
bits_COND_HEAR_SOUND, |
|
|
|
|
|
|
|
bits_SOUND_DANGER | |
|
|
|
|
|
|
|
bits_SOUND_COMBAT | |
|
|
|
|
|
|
|
bits_SOUND_PLAYER, |
|
|
|
|
|
|
|
"Repel Land" |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DEFINE_CUSTOM_SCHEDULES( CFGrunt ) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
slGruntFail, |
|
|
|
|
|
|
|
slGruntCombatFail, |
|
|
|
|
|
|
|
slGruntVictoryDance, |
|
|
|
|
|
|
|
slGruntEstablishLineOfFire, |
|
|
|
|
|
|
|
slGruntFoundEnemy, |
|
|
|
|
|
|
|
slGruntCombatFace, |
|
|
|
|
|
|
|
slGruntSignalSuppress, |
|
|
|
|
|
|
|
slGruntSuppress, |
|
|
|
|
|
|
|
slGruntWaitInCover, |
|
|
|
|
|
|
|
slGruntTakeCover, |
|
|
|
|
|
|
|
slGruntGrenadeCover, |
|
|
|
|
|
|
|
slGruntTossGrenadeCover, |
|
|
|
|
|
|
|
slGruntTakeCoverFromBestSound, |
|
|
|
|
|
|
|
slGruntHideReload, |
|
|
|
|
|
|
|
slGruntSweep, |
|
|
|
|
|
|
|
slGruntRangeAttack1A, |
|
|
|
|
|
|
|
slGruntRangeAttack1B, |
|
|
|
|
|
|
|
slGruntRangeAttack2, |
|
|
|
|
|
|
|
slGruntRepel, |
|
|
|
|
|
|
|
slGruntRepelAttack, |
|
|
|
|
|
|
|
slGruntRepelLand, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IMPLEMENT_CUSTOM_SCHEDULES( CFGrunt, CSquadMonster ) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//=========================================================
|
|
|
|
//=========================================================
|
|
|
|
// Get Schedule!
|
|
|
|
// Get Schedule!
|
|
|
|