mirror of
https://github.com/YGGverse/hlsdk-portable.git
synced 2025-02-04 19:14:30 +00:00
Do not define duplicated schedules.
This commit is contained in:
parent
93e1597f0d
commit
039c4219a9
@ -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!
|
||||||
|
@ -85,9 +85,6 @@ public:
|
|||||||
|
|
||||||
int IRelationship(CBaseEntity *pTarget);
|
int IRelationship(CBaseEntity *pTarget);
|
||||||
|
|
||||||
CUSTOM_SCHEDULES;
|
|
||||||
static TYPEDESCRIPTION m_SaveData[];
|
|
||||||
|
|
||||||
static const char *pGruntSentences[];
|
static const char *pGruntSentences[];
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -478,627 +475,6 @@ void CNGrunt::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( CNGrunt )
|
|
||||||
{
|
|
||||||
slGruntFail,
|
|
||||||
slGruntCombatFail,
|
|
||||||
slGruntVictoryDance,
|
|
||||||
slGruntEstablishLineOfFire,
|
|
||||||
slGruntFoundEnemy,
|
|
||||||
slGruntCombatFace,
|
|
||||||
slGruntSignalSuppress,
|
|
||||||
slGruntSuppress,
|
|
||||||
slGruntWaitInCover,
|
|
||||||
slGruntTakeCover,
|
|
||||||
slGruntGrenadeCover,
|
|
||||||
slGruntTossGrenadeCover,
|
|
||||||
slGruntTakeCoverFromBestSound,
|
|
||||||
slGruntHideReload,
|
|
||||||
slGruntSweep,
|
|
||||||
slGruntRangeAttack1A,
|
|
||||||
slGruntRangeAttack1B,
|
|
||||||
slGruntRangeAttack2,
|
|
||||||
slGruntRepel,
|
|
||||||
slGruntRepelAttack,
|
|
||||||
slGruntRepelLand,
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_CUSTOM_SCHEDULES( CNGrunt, CSquadMonster )
|
|
||||||
|
|
||||||
//=========================================================
|
//=========================================================
|
||||||
// Get Schedule!
|
// Get Schedule!
|
||||||
|
@ -87,8 +87,6 @@ public:
|
|||||||
|
|
||||||
int IRelationship(CBaseEntity *pTarget);
|
int IRelationship(CBaseEntity *pTarget);
|
||||||
|
|
||||||
CUSTOM_SCHEDULES;
|
|
||||||
|
|
||||||
static const char *pGruntSentences[];
|
static const char *pGruntSentences[];
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -528,627 +526,6 @@ void CZGrunt::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( CZGrunt )
|
|
||||||
{
|
|
||||||
slGruntFail,
|
|
||||||
slGruntCombatFail,
|
|
||||||
slGruntVictoryDance,
|
|
||||||
slGruntEstablishLineOfFire,
|
|
||||||
slGruntFoundEnemy,
|
|
||||||
slGruntCombatFace,
|
|
||||||
slGruntSignalSuppress,
|
|
||||||
slGruntSuppress,
|
|
||||||
slGruntWaitInCover,
|
|
||||||
slGruntTakeCover,
|
|
||||||
slGruntGrenadeCover,
|
|
||||||
slGruntTossGrenadeCover,
|
|
||||||
slGruntTakeCoverFromBestSound,
|
|
||||||
slGruntHideReload,
|
|
||||||
slGruntSweep,
|
|
||||||
slGruntRangeAttack1A,
|
|
||||||
slGruntRangeAttack1B,
|
|
||||||
slGruntRangeAttack2,
|
|
||||||
slGruntRepel,
|
|
||||||
slGruntRepelAttack,
|
|
||||||
slGruntRepelLand,
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_CUSTOM_SCHEDULES( CZGrunt, CSquadMonster )
|
|
||||||
|
|
||||||
//=========================================================
|
//=========================================================
|
||||||
// Get Schedule!
|
// Get Schedule!
|
||||||
|
Loading…
x
Reference in New Issue
Block a user