gentity_t *UpdateGoal( void ) { gentity_t *goal; if ( !NPCInfo->goalEntity ) { return NULL; } if ( !NPCInfo->goalEntity->inuse ) {//Somehow freed it, but didn't clear it NPC_ClearGoal(); return NULL; } goal = NPCInfo->goalEntity; if ( ReachedGoal( goal ) ) { NPC_ReachedGoal(); goal = NULL;//so they don't keep trying to move to it }//else if fail, need to tell script so? return goal; }
void SandCreature_Sleep( void ) { SandCreature_CheckAlerts(); SandCreature_CheckMovingEnts(); //FIXME: keeps chasing goalEntity even when it's already reached it! if ( NPCInfo->goalEntity && SandCreature_DistSqToGoal( qfalse ) >= MIN_ATTACK_DIST_SQ ) { ucmd.buttons |= BUTTON_WALKING; if ( SandCreature_Move() ) { SandCreature_MoveEffect(); } } else { NPC_ReachedGoal(); } /* if ( UpdateGoal() ) { ucmd.buttons |= BUTTON_WALKING; //FIXME: Sand Creatures look silly using waypoints when they can go straight to the goal if ( SandCreature_Move() ) { SandCreature_MoveEffect(); } } */ }
gentity_t *UpdateGoal( void ) { //FIXME: CREED should look at this // this func doesn't seem to be working correctly for the sand creature gentity_t *goal; if ( !NPCInfo->goalEntity ) { return NULL; } if ( !NPCInfo->goalEntity->inuse ) {//Somehow freed it, but didn't clear it NPC_ClearGoal(); return NULL; } goal = NPCInfo->goalEntity; if ( ReachedGoal( goal ) ) { NPC_ReachedGoal(); goal = NULL;//so they don't keep trying to move to it }//else if fail, need to tell script so? return goal; }
void SandCreature_Hunt( void ) { SandCreature_CheckAlerts(); SandCreature_CheckMovingEnts(); //If we have somewhere to go, then do that //FIXME: keeps chasing goalEntity even when it's already reached it...? if ( NPCInfo->goalEntity && SandCreature_DistSqToGoal( qfalse ) >= MIN_ATTACK_DIST_SQ ) { ucmd.buttons |= BUTTON_WALKING; if ( SandCreature_Move() ) { SandCreature_MoveEffect(); } } else { NPC_ReachedGoal(); } }
static void GM_CheckMoveState( void ) { if ( Q3_TaskIDPending( NPC, TID_MOVE_NAV ) ) {//moving toward a goal that a script is waiting on, so don't stop for anything! bMove = qtrue; } //See if we're moving towards a goal, not the enemy if ( ( NPCInfo->goalEntity != NPC->enemy ) && ( NPCInfo->goalEntity != NULL ) ) { //Did we make it? if ( NAV_HitNavGoal( NPC->currentOrigin, NPC->mins, NPC->maxs, NPCInfo->goalEntity->currentOrigin, 16, qfalse ) || ( !Q3_TaskIDPending( NPC, TID_MOVE_NAV ) && enemyLOS && enemyDist <= 10000 ) ) {//either hit our navgoal or our navgoal was not a crucial (scripted) one (maybe a combat point) and we're scouting and found our enemy NPC_ReachedGoal(); //don't attack right away TIMER_Set( NPC, "attackDelay", Q_irand( 250, 500 ) ); //FIXME: Slant for difficulty levels return; } } }
static void Sniper_CheckMoveState( void ) { //See if we're a scout if ( !(NPCInfo->scriptFlags & SCF_CHASE_ENEMIES) )//NPCInfo->behaviorState == BS_STAND_AND_SHOOT ) { if ( NPCInfo->goalEntity == NPC->enemy ) { AImove = qfalse; return; } } //See if we're running away else if ( NPCInfo->squadState == SQUAD_RETREAT ) { if ( TIMER_Done( NPC, "flee" ) ) { NPCInfo->squadState = SQUAD_IDLE; } else { faceEnemy = qfalse; } } else if ( NPCInfo->squadState == SQUAD_IDLE ) { if ( !NPCInfo->goalEntity ) { AImove = qfalse; return; } } //See if we're moving towards a goal, not the enemy if ( ( NPCInfo->goalEntity != NPC->enemy ) && ( NPCInfo->goalEntity != NULL ) ) { //Did we make it? if ( NAV_HitNavGoal( NPC->currentOrigin, NPC->mins, NPC->maxs, NPCInfo->goalEntity->currentOrigin, 16, FlyingCreature( NPC ) ) || ( NPCInfo->squadState == SQUAD_SCOUT && enemyLOS && enemyDist <= 10000 ) ) { int newSquadState = SQUAD_STAND_AND_SHOOT; //we got where we wanted to go, set timers based on why we were running switch ( NPCInfo->squadState ) { case SQUAD_RETREAT://was running away TIMER_Set( NPC, "duck", (NPC->max_health - NPC->health) * 100 ); TIMER_Set( NPC, "hideTime", Q_irand( 3000, 7000 ) ); newSquadState = SQUAD_COVER; break; case SQUAD_TRANSITION://was heading for a combat point TIMER_Set( NPC, "hideTime", Q_irand( 2000, 4000 ) ); break; case SQUAD_SCOUT://was running after player break; default: break; } NPC_ReachedGoal(); //don't attack right away TIMER_Set( NPC, "attackDelay", Q_irand( (6-NPCInfo->stats.aim)*50, (6-NPCInfo->stats.aim)*100 ) ); //FIXME: Slant for difficulty levels, too? //don't do something else just yet TIMER_Set( NPC, "roamTime", Q_irand( 1000, 4000 ) ); //stop fleeing if ( NPCInfo->squadState == SQUAD_RETREAT ) { TIMER_Set( NPC, "flee", -level.time ); NPCInfo->squadState = SQUAD_IDLE; } return; } //keep going, hold of roamTimer until we get there TIMER_Set( NPC, "roamTime", Q_irand( 4000, 8000 ) ); } }
static void Grenadier_CheckMoveState( void ) { //See if we're a scout if ( !(NPCInfo->scriptFlags & SCF_CHASE_ENEMIES) )//behaviorState == BS_STAND_AND_SHOOT ) { if ( NPCInfo->goalEntity == NPC->enemy ) { doMove = qfalse; return; } } //See if we're running away else if ( NPCInfo->squadState == SQUAD_RETREAT ) { if ( TIMER_Done( NPC, "flee" ) ) { NPCInfo->squadState = SQUAD_IDLE; } else { faceEnemy = qfalse; } } /* else if ( NPCInfo->squadState == SQUAD_IDLE ) { if ( !NPCInfo->goalEntity ) { doMove = qfalse; return; } //Should keep moving toward player when we're out of range... right? } */ //See if we're moving towards a goal, not the enemy if ( ( NPCInfo->goalEntity != NPC->enemy ) && ( NPCInfo->goalEntity != NULL ) ) { //Did we make it? if ( STEER::Reached(NPC, NPCInfo->goalEntity, 16, !!FlyingCreature(NPC)) || ( NPCInfo->squadState == SQUAD_SCOUT && enemyLOS && enemyDist <= 10000 ) ) { //int newSquadState = SQUAD_STAND_AND_SHOOT; //we got where we wanted to go, set timers based on why we were running switch ( NPCInfo->squadState ) { case SQUAD_RETREAT://was running away TIMER_Set( NPC, "duck", (NPC->max_health - NPC->health) * 100 ); TIMER_Set( NPC, "hideTime", Q_irand( 3000, 7000 ) ); //newSquadState = SQUAD_COVER; break; case SQUAD_TRANSITION://was heading for a combat point TIMER_Set( NPC, "hideTime", Q_irand( 2000, 4000 ) ); break; case SQUAD_SCOUT://was running after player break; default: break; } NPC_ReachedGoal(); //don't attack right away TIMER_Set( NPC, "attackDelay", Q_irand( 250, 500 ) ); //FIXME: Slant for difficulty levels //don't do something else just yet TIMER_Set( NPC, "roamTime", Q_irand( 1000, 4000 ) ); //stop fleeing if ( NPCInfo->squadState == SQUAD_RETREAT ) { TIMER_Set( NPC, "flee", -level.time ); NPCInfo->squadState = SQUAD_IDLE; } return; } //keep going, hold of roamTimer until we get there TIMER_Set( NPC, "roamTime", Q_irand( 4000, 8000 ) ); } if ( !NPCInfo->goalEntity ) { if ( NPCInfo->scriptFlags & SCF_CHASE_ENEMIES ) { NPCInfo->goalEntity = NPC->enemy; NPCInfo->goalRadius = (NPC->maxs[0]*1.5f); } } }