//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- int CNPC_GMan::SelectSchedule( void ) { if ( !BehaviorSelectSchedule() ) { } return BaseClass::SelectSchedule(); }
int CNPC_Dog::SelectSchedule ( void ) { ClearCondition( COND_DOG_LOST_PHYSICS_ENTITY ); if ( GetState() == NPC_STATE_SCRIPT || IsInAScript() ) return BaseClass::SelectSchedule(); if ( BehaviorSelectSchedule() ) return BaseClass::SelectSchedule(); if ( m_bDoWaitforObjectBehavior == true ) { if ( m_hPhysicsEnt ) return SCHED_DOG_CATCH_OBJECT; } if ( m_bDoCatchThrowBehavior == true ) { if ( m_flTimeToCatch < 0.1 && m_flNextSwat <= gpGlobals->curtime ) { return SCHED_DOG_FIND_OBJECT; } if ( m_flTimeToCatch > gpGlobals->curtime && m_hPhysicsEnt ) return SCHED_DOG_CATCH_OBJECT; } else { if ( m_hPhysicsEnt ) { if ( m_bHasObject == true ) { return SCHED_DOG_WAIT_THROW_OBJECT; } } } return BaseClass::SelectSchedule(); }
int CNPC_Monk::SelectSchedule() { if( HasCondition( COND_HEAR_DANGER ) ) { SpeakIfAllowed( TLK_DANGER ); return SCHED_TAKE_COVER_FROM_BEST_SOUND; } if ( HasCondition( COND_TALKER_PLAYER_DEAD ) && !m_bMournedPlayer && IsOkToSpeak() ) { m_bMournedPlayer = true; Speak( TLK_IDLE ); } if( !BehaviorSelectSchedule() ) { if ( HasCondition ( COND_NO_PRIMARY_AMMO ) ) { return SCHED_HIDE_AND_RELOAD; } } return BaseClass::SelectSchedule(); }
//========================================================= // SelectSchedule - Decides which type of schedule best suits // the monster's current state and conditions. Then calls // monster's member function to get a pointer to a schedule // of the proper type. //========================================================= int CNPC_HL1Barney::SelectSchedule( void ) { if ( m_NPCState == NPC_STATE_COMBAT || GetEnemy() != NULL ) { // Priority action! if (!m_fGunDrawn ) return SCHED_ARM_WEAPON; } if ( GetFollowTarget() == NULL ) { if ( HasCondition( COND_PLAYER_PUSHING ) && !(GetSpawnFlags() & SF_NPC_PREDISASTER ) ) // Player wants me to move return SCHED_HL1TALKER_FOLLOW_MOVE_AWAY; } if ( BehaviorSelectSchedule() ) return BaseClass::SelectSchedule(); if ( HasCondition( COND_HEAR_DANGER ) ) { CSound *pSound; pSound = GetBestSound(); ASSERT( pSound != NULL ); if ( pSound && pSound->IsSoundType( SOUND_DANGER ) ) return SCHED_TAKE_COVER_FROM_BEST_SOUND; } if ( HasCondition( COND_ENEMY_DEAD ) && IsOkToSpeak() ) { Speak( BA_KILL ); } switch( m_NPCState ) { case NPC_STATE_COMBAT: { // dead enemy if ( HasCondition( COND_ENEMY_DEAD ) ) return BaseClass::SelectSchedule(); // call base class, all code to handle dead enemies is centralized there. // always act surprized with a new enemy if ( HasCondition( COND_NEW_ENEMY ) && HasCondition( COND_LIGHT_DAMAGE) ) return SCHED_SMALL_FLINCH; if ( HasCondition( COND_HEAVY_DAMAGE ) ) return SCHED_TAKE_COVER_FROM_ENEMY; if ( !HasCondition(COND_SEE_ENEMY) ) { // we can't see the enemy if ( !HasCondition(COND_ENEMY_OCCLUDED) ) { // enemy is unseen, but not occluded! // turn to face enemy return SCHED_COMBAT_FACE; } else { return SCHED_CHASE_ENEMY; } } } break; case NPC_STATE_ALERT: case NPC_STATE_IDLE: if ( HasCondition( COND_LIGHT_DAMAGE ) || HasCondition( COND_HEAVY_DAMAGE ) ) { // flinch if hurt return SCHED_SMALL_FLINCH; } if ( GetEnemy() == NULL && GetFollowTarget() ) { if ( !GetFollowTarget()->IsAlive() ) { // UNDONE: Comment about the recently dead player here? StopFollowing(); break; } else { return SCHED_TARGET_FACE; } } // try to say something about smells TrySmellTalk(); break; } return BaseClass::SelectSchedule(); }
//----------------------------------------------------------------------------- // Purpose: // Input : // Output : //----------------------------------------------------------------------------- int CNPC_Stalker::SelectSchedule( void ) { if ( BehaviorSelectSchedule() ) { return BaseClass::SelectSchedule(); } switch ( m_NPCState ) { case NPC_STATE_IDLE: case NPC_STATE_ALERT: { if( HasCondition(COND_IN_PVS) ) { return SCHED_STALKER_PATROL; } return SCHED_IDLE_STAND; break; } case NPC_STATE_COMBAT: { // ----------- // new enemy // ----------- if( HasCondition( COND_NEW_ENEMY ) ) { if( GetEnemy()->IsPlayer() ) { return SCHED_STALKER_ACQUIRE_PLAYER; } } if( HasCondition( COND_CAN_RANGE_ATTACK1 ) ) { if( OccupyStrategySlotRange(SQUAD_SLOT_ATTACK1, SQUAD_SLOT_ATTACK2) ) { return SCHED_RANGE_ATTACK1; } else { return SCHED_STALKER_PATROL; } } if( !HasCondition(COND_SEE_ENEMY) ) { return SCHED_STALKER_PATROL; } return SCHED_COMBAT_FACE; break; } } // no special cases here, call the base class return BaseClass::SelectSchedule(); }