mirror of
https://github.com/YGGverse/hlsdk-portable.git
synced 2025-01-23 21:24:27 +00:00
Do not define duplicated schedules. Remove duplicated saverestore fields.
This commit is contained in:
parent
199ec1cc6a
commit
d386145501
@ -65,143 +65,15 @@ public:
|
||||
|
||||
void TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType);
|
||||
void Killed( entvars_t *pevAttacker, int iGib );
|
||||
|
||||
virtual int Save( CSave &save );
|
||||
virtual int Restore( CRestore &restore );
|
||||
static TYPEDESCRIPTION m_SaveData[];
|
||||
|
||||
CUSTOM_SCHEDULES
|
||||
};
|
||||
|
||||
LINK_ENTITY_TO_CLASS( monster_helmet, CHelmet )
|
||||
|
||||
TYPEDESCRIPTION CHelmet::m_SaveData[] =
|
||||
{
|
||||
DEFINE_FIELD( CHelmet, m_fGunDrawn, FIELD_BOOLEAN ),
|
||||
DEFINE_FIELD( CHelmet, m_painTime, FIELD_TIME ),
|
||||
DEFINE_FIELD( CHelmet, m_checkAttackTime, FIELD_TIME ),
|
||||
DEFINE_FIELD( CHelmet, m_lastAttackCheck, FIELD_BOOLEAN ),
|
||||
DEFINE_FIELD( CHelmet, m_flPlayerDamage, FIELD_FLOAT ),
|
||||
};
|
||||
|
||||
IMPLEMENT_SAVERESTORE( CHelmet, CTalkMonster )
|
||||
/*
|
||||
//=========================================================
|
||||
// AI Schedules Specific to this monster
|
||||
//=========================================================
|
||||
Task_t tlBaFollow[] =
|
||||
{
|
||||
{ TASK_MOVE_TO_TARGET_RANGE, (float)128 }, // Move within 128 of target ent (client)
|
||||
{ TASK_SET_SCHEDULE, (float)SCHED_TARGET_FACE },
|
||||
};
|
||||
|
||||
Schedule_t slBaFollow[] =
|
||||
{
|
||||
{
|
||||
tlBaFollow,
|
||||
ARRAYSIZE( tlBaFollow ),
|
||||
bits_COND_NEW_ENEMY |
|
||||
bits_COND_LIGHT_DAMAGE |
|
||||
bits_COND_HEAVY_DAMAGE |
|
||||
bits_COND_HEAR_SOUND |
|
||||
bits_COND_PROVOKED,
|
||||
bits_SOUND_DANGER,
|
||||
"Follow"
|
||||
},
|
||||
};
|
||||
|
||||
//=========================================================
|
||||
// BarneyDraw - much better looking draw schedule for when
|
||||
// barney knows who he's gonna attack.
|
||||
//=========================================================
|
||||
Task_t tlBarneyEnemyDraw[] =
|
||||
{
|
||||
{ TASK_STOP_MOVING, 0 },
|
||||
{ TASK_FACE_ENEMY, 0 },
|
||||
{ TASK_PLAY_SEQUENCE_FACE_ENEMY, (float) ACT_ARM },
|
||||
};
|
||||
|
||||
Schedule_t slBarneyEnemyDraw[] =
|
||||
{
|
||||
{
|
||||
tlBarneyEnemyDraw,
|
||||
ARRAYSIZE( tlBarneyEnemyDraw ),
|
||||
0,
|
||||
0,
|
||||
"Barney Enemy Draw"
|
||||
}
|
||||
};
|
||||
|
||||
Task_t tlBaFaceTarget[] =
|
||||
{
|
||||
{ TASK_SET_ACTIVITY, (float)ACT_IDLE },
|
||||
{ TASK_FACE_TARGET, (float)0 },
|
||||
{ TASK_SET_ACTIVITY, (float)ACT_IDLE },
|
||||
{ TASK_SET_SCHEDULE, (float)SCHED_TARGET_CHASE },
|
||||
};
|
||||
|
||||
Schedule_t slBaFaceTarget[] =
|
||||
{
|
||||
{
|
||||
tlBaFaceTarget,
|
||||
ARRAYSIZE( tlBaFaceTarget ),
|
||||
bits_COND_CLIENT_PUSH |
|
||||
bits_COND_NEW_ENEMY |
|
||||
bits_COND_LIGHT_DAMAGE |
|
||||
bits_COND_HEAVY_DAMAGE |
|
||||
bits_COND_HEAR_SOUND |
|
||||
bits_COND_PROVOKED,
|
||||
bits_SOUND_DANGER,
|
||||
"FaceTarget"
|
||||
},
|
||||
};
|
||||
|
||||
Task_t tlIdleBaStand[] =
|
||||
{
|
||||
{ TASK_STOP_MOVING, 0 },
|
||||
{ TASK_SET_ACTIVITY, (float)ACT_IDLE },
|
||||
{ TASK_WAIT, (float)2 }, // repick IDLESTAND every two seconds.
|
||||
{ TASK_TLK_HEADRESET, (float)0 }, // reset head position
|
||||
};
|
||||
|
||||
Schedule_t slIdleBaStand[] =
|
||||
{
|
||||
{
|
||||
tlIdleBaStand,
|
||||
ARRAYSIZE( tlIdleBaStand ),
|
||||
bits_COND_NEW_ENEMY |
|
||||
bits_COND_LIGHT_DAMAGE |
|
||||
bits_COND_HEAVY_DAMAGE |
|
||||
bits_COND_HEAR_SOUND |
|
||||
bits_COND_SMELL |
|
||||
bits_COND_PROVOKED,
|
||||
bits_SOUND_COMBAT |// sound flags - change these, and you'll break the talking code.
|
||||
//bits_SOUND_PLAYER |
|
||||
//bits_SOUND_WORLD |
|
||||
bits_SOUND_DANGER |
|
||||
bits_SOUND_MEAT |// scents
|
||||
bits_SOUND_CARCASS |
|
||||
bits_SOUND_GARBAGE,
|
||||
"IdleStand"
|
||||
},
|
||||
};
|
||||
*/
|
||||
|
||||
extern Schedule_t slBaFollow[];
|
||||
extern Schedule_t slBarneyEnemyDraw[];
|
||||
extern Schedule_t slBaFaceTarget[];
|
||||
extern Schedule_t slIdleBaStand[];
|
||||
|
||||
DEFINE_CUSTOM_SCHEDULES( CHelmet )
|
||||
{
|
||||
slBaFollow,
|
||||
slBarneyEnemyDraw,
|
||||
slBaFaceTarget,
|
||||
slIdleBaStand,
|
||||
};
|
||||
|
||||
IMPLEMENT_CUSTOM_SCHEDULES( CHelmet, CTalkMonster )
|
||||
|
||||
//=========================================================
|
||||
// ALertSound - barney says "Freeze!"
|
||||
//=========================================================
|
||||
|
@ -85,8 +85,6 @@ public:
|
||||
|
||||
int IRelationship(CBaseEntity *pTarget);
|
||||
|
||||
CUSTOM_SCHEDULES;
|
||||
|
||||
static const char *pGruntSentences[];
|
||||
};
|
||||
|
||||
@ -483,627 +481,6 @@ void CMassn::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( CMassn )
|
||||
{
|
||||
slGruntFail,
|
||||
slGruntCombatFail,
|
||||
slGruntVictoryDance,
|
||||
slGruntEstablishLineOfFire,
|
||||
slGruntFoundEnemy,
|
||||
slGruntCombatFace,
|
||||
slGruntSignalSuppress,
|
||||
slGruntSuppress,
|
||||
slGruntWaitInCover,
|
||||
slGruntTakeCover,
|
||||
slGruntGrenadeCover,
|
||||
slGruntTossGrenadeCover,
|
||||
slGruntTakeCoverFromBestSound,
|
||||
slGruntHideReload,
|
||||
slGruntSweep,
|
||||
slGruntRangeAttack1A,
|
||||
slGruntRangeAttack1B,
|
||||
slGruntRangeAttack2,
|
||||
slGruntRepel,
|
||||
slGruntRepelAttack,
|
||||
slGruntRepelLand,
|
||||
};
|
||||
|
||||
IMPLEMENT_CUSTOM_SCHEDULES( CMassn, CSquadMonster )
|
||||
|
||||
//=========================================================
|
||||
// Get Schedule!
|
||||
|
Loading…
x
Reference in New Issue
Block a user