Vegastrike 0.5.1 rc1  1.0
Original sources for Vegastrike Evolved
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
WeaponComparator< FORWARD > Class Template Reference

Public Types

typedef std::set< WeaponGroup,
WeaponComparator< FORWARD > > 
WeaponGroupSet
 

Public Member Functions

bool operator() (const WeaponGroup &a, const WeaponGroup &b) const
 

Static Public Member Functions

static bool checkmount (Unit *un, int i, bool missile)
 
static bool isSpecial (const Mount &mount)
 
static bool notSpecial (const Mount &mount)
 
static void ToggleWeaponSet (Unit *un, bool missile)
 

Detailed Description

template<bool FORWARD>
class WeaponComparator< FORWARD >

Definition at line 5429 of file unit_generic.cpp.

Member Typedef Documentation

template<bool FORWARD>
typedef std::set< WeaponGroup, WeaponComparator< FORWARD > > WeaponComparator< FORWARD >::WeaponGroupSet

Definition at line 5451 of file unit_generic.cpp.

Member Function Documentation

template<bool FORWARD>
static bool WeaponComparator< FORWARD >::checkmount ( Unit un,
int  i,
bool  missile 
)
inlinestatic

Definition at line 5453 of file unit_generic.cpp.

References Mount::DESTROYED, isMissile(), and Unit::mounts.

5454  {
5455  return un->mounts[i].status < Mount::DESTROYED && ( ( isMissile( un->mounts[i].type ) ) == missile )
5456  && un->mounts[i].ammo != 0;
5457  }
template<bool FORWARD>
static bool WeaponComparator< FORWARD >::isSpecial ( const Mount mount)
inlinestatic

Definition at line 5459 of file unit_generic.cpp.

References weapon_info::size, weapon_info::SPECIAL, weapon_info::SPECIALMISSILE, and Mount::type.

5460  {
5461  return mount.type->size == weapon_info::SPECIAL || mount.type->size == weapon_info::SPECIALMISSILE;
5462  }
template<bool FORWARD>
static bool WeaponComparator< FORWARD >::notSpecial ( const Mount mount)
inlinestatic

Definition at line 5464 of file unit_generic.cpp.

5465  {
5466  return !isSpecial( mount );
5467  }
template<bool FORWARD>
bool WeaponComparator< FORWARD >::operator() ( const WeaponGroup a,
const WeaponGroup b 
) const
inline

Definition at line 5432 of file unit_generic.cpp.

References UnitXML::FORWARD.

5433  {
5434  if ( a.size() == b.size() ) {
5435  for (WeaponGroup::const_iterator iterA = a.begin(), iterB = b.begin();
5436  iterA != a.end() && iterB != b.end();
5437  ++iterA, ++iterB) {
5438  if ( (*iterA) < (*iterB) )
5439  return FORWARD;
5440  else if ( (*iterB) < (*iterA) )
5441  return !FORWARD;
5442  }
5443  return false;
5444  } else if ( a.size() < b.size() ) {
5445  return FORWARD;
5446  } else {
5447  return !FORWARD;
5448  }
5449  }
template<bool FORWARD>
static void WeaponComparator< FORWARD >::ToggleWeaponSet ( Unit un,
bool  missile 
)
inlinestatic

Definition at line 5469 of file unit_generic.cpp.

References Mount::ACTIVE, UnitXML::FORWARD, Unit::getSubUnits(), VegaConfig::getVariable(), j, Unit::mounts, XMLSupport::parse_bool(), and vs_config.

Referenced by Unit::ToggleWeapon().

5470  {
5471  if (un->mounts.size() == 0) {
5472  Unit *tur = NULL;
5473  for (un_iter i = un->getSubUnits(); (tur = *i) != NULL; ++i)
5474  ToggleWeaponSet( tur, missile );
5475  return;
5476  }
5477  WeaponGroup lightMissiles;
5478  WeaponGroup heavyMissiles;
5479  WeaponGroup allWeapons;
5480  WeaponGroup allWeaponsNoSpecial;
5481  WeaponGroupSet myset;
5482  unsigned int i;
5483  typename WeaponGroupSet::const_iterator iter;
5484  printf( "ToggleWeaponSet: %s\n", FORWARD ? "true" : "false" );
5485  for (i = 0; i < un->mounts.size(); ++i)
5486  if ( checkmount( un, i, missile ) ) {
5487  WeaponGroup mygroup;
5488  for (unsigned int j = 0; j < un->mounts.size(); ++j)
5489  if (un->mounts[j].type == un->mounts[i].type)
5490  if ( checkmount( un, j, missile ) )
5491  mygroup.insert( j );
5492  //WIll ignore if already there.
5493  myset.insert( mygroup );
5494  allWeapons.insert( i );
5495  if ( notSpecial( un->mounts[i] ) )
5496  allWeaponsNoSpecial.insert( i );
5497  }
5498  const WeaponGroupSet mypairset( myset );
5499  for (iter = mypairset.begin(); iter != mypairset.end(); ++iter)
5500  if ( (*iter).size() && notSpecial( un->mounts[( *( (*iter).begin() ) )] ) ) {
5501  typename WeaponGroupSet::const_iterator iter2;
5502  for (iter2 = mypairset.begin(); iter2 != mypairset.end(); ++iter2)
5503  if ( (*iter2).size() && notSpecial( un->mounts[( *( (*iter2).begin() ) )] ) ) {
5504  WeaponGroup myGroup;
5505  set_union( (*iter).begin(), (*iter).end(), (*iter2).begin(), (*iter2).end(),
5506  inserter( myGroup, myGroup.begin() ) );
5507  myset.insert( myGroup );
5508  }
5509  }
5510  static bool allow_special_with_weapons =
5511  XMLSupport::parse_bool( vs_config->getVariable( "physics", "special_and_normal_gun_combo", "true" ) );
5512  if (allow_special_with_weapons)
5513  myset.insert( allWeapons );
5514  myset.insert( allWeaponsNoSpecial );
5515  for (iter = myset.begin(); iter != myset.end(); ++iter) {
5516  for (WeaponGroup::const_iterator iter2 = (*iter).begin(); iter2 != (*iter).end(); ++iter2)
5517  printf( "%d:%s ", *iter2, un->mounts[*iter2].type->weapon_name.c_str() );
5518  printf( "\n" );
5519  }
5520  WeaponGroup activeWeapons;
5521  printf( "CURRENT: " );
5522  for (i = 0; i < un->mounts.size(); ++i)
5523  if ( un->mounts[i].status == Mount::ACTIVE && checkmount( un, i, missile ) ) {
5524  activeWeapons.insert( i );
5525  printf( "%d:%s ", i, un->mounts[i].type->weapon_name.c_str() );
5526  }
5527  printf( "\n" );
5528  iter = myset.upper_bound( activeWeapons );
5529  if ( iter == myset.end() )
5530  iter = myset.begin();
5531  if ( iter == myset.end() )
5532  return;
5533  for (i = 0; i < un->mounts.size(); ++i)
5534  un->mounts[i].DeActive( missile );
5535  printf( "ACTIVE: " );
5536  for (WeaponGroup::const_iterator iter2 = (*iter).begin(); iter2 != (*iter).end(); ++iter2) {
5537  printf( "%d:%s ", *iter2, un->mounts[*iter2].type->weapon_name.c_str() );
5538  un->mounts[*iter2].Activate( missile );
5539  }
5540  printf( "\n" );
5541  printf( "ToggleWeapon end...\n" );
5542  }

The documentation for this class was generated from the following file: