void AAIAttackManager::Update() { for(list<AAIAttack*>::iterator a = attacks.begin(); a != attacks.end(); ++a) { // drop failed attacks if((*a)->Failed()) { (*a)->StopAttack(); delete (*a); attacks.erase(a); break; } // check if sector cleared if((*a)->dest) { if((*a)->dest->enemy_structures <= 0) GetNextDest(*a); } } if(attacks.size() < cfg->MAX_ATTACKS) { LaunchAttack(); } }
void ScoreKeeperRave::AddSuperMeterDelta( float fUnscaledPercentChange ) { if( PREFSMAN->m_bMercifulDrain && fUnscaledPercentChange<0 ) { float fSuperPercentage = m_pPlayerState->m_fSuperMeter / NUM_ATTACK_LEVELS; fUnscaledPercentChange *= SCALE( fSuperPercentage, 0.f, 1.f, 0.5f, 1.f); } // more mercy: Grow super meter slower or faster depending on life. if( PREFSMAN->m_bMercifulSuperMeter ) { float fLifePercentage = 0; switch( m_pPlayerState->m_PlayerNumber ) { case PLAYER_1: fLifePercentage = GAMESTATE->m_fTugLifePercentP1; break; case PLAYER_2: fLifePercentage = 1 - GAMESTATE->m_fTugLifePercentP1; break; default: ASSERT(0); } CLAMP( fLifePercentage, 0.f, 1.f ); if( fUnscaledPercentChange > 0 ) fUnscaledPercentChange *= SCALE( fLifePercentage, 0.f, 1.f, 1.7f, 0.3f); else // fUnscaledPercentChange <= 0 fUnscaledPercentChange /= SCALE( fLifePercentage, 0.f, 1.f, 1.7f, 0.3f); } // mercy: drop super meter faster if at a higher level if( fUnscaledPercentChange < 0 ) fUnscaledPercentChange *= SCALE( m_pPlayerState->m_fSuperMeter, 0.f, 1.f, 0.01f, 1.f ); AttackLevel oldAL = (AttackLevel)(int)m_pPlayerState->m_fSuperMeter; float fPercentToMove = fUnscaledPercentChange; m_pPlayerState->m_fSuperMeter += fPercentToMove * m_pPlayerState->m_fSuperMeterGrowthScale; CLAMP( m_pPlayerState->m_fSuperMeter, 0.f, NUM_ATTACK_LEVELS ); AttackLevel newAL = (AttackLevel)(int)m_pPlayerState->m_fSuperMeter; if( newAL > oldAL ) { LaunchAttack( oldAL ); if( newAL == NUM_ATTACK_LEVELS ) // hit upper bounds of meter m_pPlayerState->m_fSuperMeter -= 1.f; } // mercy: if losing remove attacks on life drain if( fUnscaledPercentChange < 0 ) { bool bWinning; switch( m_pPlayerState->m_PlayerNumber ) { case PLAYER_1: bWinning = GAMESTATE->m_fTugLifePercentP1 > 0.5f; break; case PLAYER_2: bWinning = GAMESTATE->m_fTugLifePercentP1 < 0.5f; break; default: ASSERT(0); } if( !bWinning ) m_pPlayerState->EndActiveAttacks(); } }