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);
|
||||
|
||||
CUSTOM_SCHEDULES;
|
||||
static TYPEDESCRIPTION m_SaveData[];
|
||||
|
||||
static const char *pGruntSentences[];
|
||||
};
|
||||
|
||||
@ -511,627 +508,6 @@ void CFGrunt::DeathSound( void )
|
||||
//=========================================================
|
||||
// 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!
|
||||
|
@ -85,9 +85,6 @@ public:
|
||||
|
||||
int IRelationship(CBaseEntity *pTarget);
|
||||
|
||||
CUSTOM_SCHEDULES;
|
||||
static TYPEDESCRIPTION m_SaveData[];
|
||||
|
||||
static const char *pGruntSentences[];
|
||||
};
|
||||
|
||||
@ -478,627 +475,6 @@ void CNGrunt::DeathSound( void )
|
||||
//=========================================================
|
||||
// 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!
|
||||
|
@ -87,8 +87,6 @@ public:
|
||||
|
||||
int IRelationship(CBaseEntity *pTarget);
|
||||
|
||||
CUSTOM_SCHEDULES;
|
||||
|
||||
static const char *pGruntSentences[];
|
||||
};
|
||||
|
||||
@ -528,627 +526,6 @@ void CZGrunt::DeathSound( void )
|
||||
//=========================================================
|
||||
// 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!
|
||||
|
Loading…
x
Reference in New Issue
Block a user