void ATST_Attack( void ) { qboolean altAttack = qfalse, visible = qfalse, advance = qfalse; int blasterTest, chargerTest; float distance; if ( !NPC_CheckEnemyExt( qfalse ) ) { NPC->enemy = NULL; return; } NPC_FaceEnemy( qtrue ); // Rate our distance to the target, and our visibilty distance = (int)DistanceHorizontalSquared( &NPC->r.currentOrigin, &NPC->enemy->r.currentOrigin ); visible = NPC_ClearLOS4( NPC->enemy ) ? qtrue : qfalse; advance = (distance > MIN_DISTANCE_SQR) ? qtrue : qfalse; // If we cannot see our target, move to see it if ( !visible ) { if ( NPCInfo->scriptFlags & SCF_CHASE_ENEMIES ) { ATST_Hunt( visible, advance ); return; } } // Decide what type of attack to do if ( distance > MIN_MELEE_RANGE_SQR ) { // DIST_LONG // NPC_ChangeWeapon( WP_ATST_SIDE ); //rwwFIXMEFIXME: make atst weaps work. // See if the side weapons are there blasterTest = trap->G2API_GetSurfaceRenderStatus( NPC->ghoul2, 0, "head_light_blaster_cann" ); chargerTest = trap->G2API_GetSurfaceRenderStatus( NPC->ghoul2, 0, "head_concussion_charger" ); // It has both side weapons if ( blasterTest != -1 && !(blasterTest & TURN_OFF) && chargerTest != -1 && !(chargerTest & TURN_OFF) ) altAttack = Q_irand( 0, 1 ) ? qtrue : qfalse; else if ( blasterTest != -1 && !(blasterTest & TURN_OFF) ) altAttack = qfalse; else if ( chargerTest != -1 && !(chargerTest & TURN_OFF) ) altAttack = qtrue; else NPC_ChangeWeapon( WP_NONE ); } else { // DIST_MELEE // NPC_ChangeWeapon( WP_ATST_MAIN ); } NPC_FaceEnemy( qtrue ); ATST_Ranged( visible, advance, altAttack ); }
/* ------------------------- ATST_Ranged ------------------------- */ void ATST_Ranged( qboolean visible, qboolean advance, qboolean altAttack ) { if ( TIMER_Done( NPC, "atkDelay" ) && visible ) // Attack? { TIMER_Set( NPC, "atkDelay", Q_irand( 500, 3000 ) ); ucmd.buttons |= BUTTON_ATTACK; } if ( NPCInfo->scriptFlags & SCF_CHASE_ENEMIES ) { ATST_Hunt( visible, advance ); } }
/* ------------------------- ATST_Attack ------------------------- */ void ATST_Attack( void ) { qboolean altAttack=qfalse; int blasterTest,chargerTest,weapon; if ( NPC_CheckEnemyExt() == qfalse )//!NPC->enemy )// { NPC->enemy = NULL; return; } NPC_FaceEnemy( qtrue ); // Rate our distance to the target, and our visibilty float distance = (int) DistanceHorizontalSquared( NPC->currentOrigin, NPC->enemy->currentOrigin ); distance_e distRate = ( distance > MIN_MELEE_RANGE_SQR ) ? DIST_LONG : DIST_MELEE; qboolean visible = NPC_ClearLOS( NPC->enemy ); qboolean advance = (qboolean)(distance > MIN_DISTANCE_SQR); // If we cannot see our target, move to see it if ( visible == qfalse ) { if ( NPCInfo->scriptFlags & SCF_CHASE_ENEMIES ) { ATST_Hunt( visible, advance ); return; } } // Decide what type of attack to do switch ( distRate ) { case DIST_MELEE: NPC_ChangeWeapon( WP_ATST_MAIN ); break; case DIST_LONG: NPC_ChangeWeapon( WP_ATST_SIDE ); // See if the side weapons are there blasterTest = gi.G2API_GetSurfaceRenderStatus( &NPC->ghoul2[NPC->playerModel], "head_light_blaster_cann" ); chargerTest = gi.G2API_GetSurfaceRenderStatus( &NPC->ghoul2[NPC->playerModel], "head_concussion_charger" ); // It has both side weapons if (!(blasterTest & TURN_OFF) && !(chargerTest & TURN_OFF)) { weapon = Q_irand( 0, 1); // 0 is blaster, 1 is charger (ALT SIDE) if (weapon) // Fire charger { altAttack = qtrue; } else { altAttack = qfalse; } } else if (!(blasterTest & TURN_OFF)) // Blaster is on { altAttack = qfalse; } else if (!(chargerTest & TURN_OFF)) // Blaster is on { altAttack = qtrue; } else { NPC_ChangeWeapon( WP_NONE ); } break; } NPC_FaceEnemy( qtrue ); ATST_Ranged( visible, advance,altAttack ); }