Advertisement
Guest User

OHFixedBalance

a guest
Jun 20th, 2013
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.68 KB | None | 0 0
  1. void CBaseGame :: OHFixedBalance( )
  2. {
  3.         //Main beginning
  4.         if( !( m_Map->GetMapOptions( ) & MAPOPT_FIXEDPLAYERSETTINGS ) )
  5.         {
  6.                 CONSOLE_Print( "[GAME: " + m_GameName + "] error balancing slots - can't balance slots without fixed player settings" );
  7.                 return;
  8.         }
  9.  
  10.         // Getting values
  11.         vector<unsigned char> PlayerWins;
  12.         for( vector<CGamePlayer *> :: iterator i = m_Players.begin( ); i != m_Players.end( ); ++i )
  13.         {
  14.                 int Win = 0;
  15. //              if( (*i)->GetGames( ) >= 10 )
  16.                         Win = (*i)->GetWinPerc( );
  17.  
  18.                 CONSOLE_Print( "Name: " + (*i)->GetName() + " | Win Perc: " + UTIL_ToString( (*i)->GetWinPerc( ), 2 ) );
  19.  
  20.                 PlayerWins.push_back( Win );
  21.         }
  22.  
  23.         // find the best order
  24.         uint32_t k = 0;
  25.         for( vector<unsigned char> :: iterator i = PlayerWins.begin( ); i != PlayerWins.end( ); ++i )
  26.                 k =+ 1;
  27.  
  28.         if( k == 0 )
  29.         {
  30.                 CONSOLE_Print( "Error, no players left" );
  31.         }
  32.         uint32_t counter;
  33.         double BestSpread = 100;
  34.         vector<unsigned char> BestOrder;
  35.         for( vector<unsigned char> :: iterator a = PlayerWins.begin( ); a != PlayerWins.end( ); ++a )
  36.         {
  37.                 for( vector<unsigned char> :: iterator b = PlayerWins.begin( ); b != PlayerWins.end( ); ++b )
  38.                 {
  39.                         if( a > b )
  40.                         {
  41.                                 for( vector<unsigned char> :: iterator c = PlayerWins.begin( ); c != PlayerWins.end( ); ++c )
  42.                                 {
  43.                                         if( b > c )
  44.                                         {
  45.                                                 for( vector<unsigned char> :: iterator d = PlayerWins.begin( ); d != PlayerWins.end( ); ++d )
  46.                                                 {
  47.                                                         if( c > d )
  48.                                                         {
  49.                                                                 for( vector<unsigned char> :: iterator e = PlayerWins.begin( ); e != PlayerWins.end( ); ++e )
  50.                                                                 {
  51.                                                                         if( d > e )
  52.                                                                         {
  53.                                                                                 double teampoints = 0;
  54.                                                                                 double result;
  55.                                                                                 double CurrentSpread;
  56.                                                                                 teampoints = *a + *b + *c + *d + *e;
  57.                                                                                 result = teampoints/5;
  58.                                                                                 if( result > 50 )
  59.                                                                                         CurrentSpread = result-50;
  60.                                                                                 else if( result < 50 )
  61.                                                                                         CurrentSpread = 50-result;
  62.                                                                                 else
  63.                                                                                         CONSOLE_Print( "Found 50 - 50 Teams, may break here" );
  64.  
  65.                                                                                 if( CurrentSpread < BestSpread )
  66.                                                                                 {
  67.                                                                                         BestSpread = CurrentSpread;
  68.                                                                                         vector<unsigned char> BestOrder;
  69.                                                                                         BestOrder.push_back( *a );
  70.                                                                                         BestOrder.push_back( *b );
  71.                                                                                         BestOrder.push_back( *c );
  72.                                                                                         BestOrder.push_back( *d );
  73.                                                                                         BestOrder.push_back( *e );
  74.                                                                                 }
  75.                                                                                 counter++;
  76.                                                                         }
  77.                                                                 }
  78.                                                         }
  79.                                                 }
  80.                                         }
  81.                                 }
  82.                         }
  83.                 }
  84.         }
  85.         CONSOLE_Print( "Checked " + UTIL_ToString( counter ) + " possible combinations" );
  86.         sort( BestOrder.begin( ), BestOrder.end( ) );
  87.  
  88.         //now swap
  89.         for( vector<CGamePlayer *> :: iterator i = m_Players.begin( ); i != m_Players.end( ); ++i )
  90.         {
  91.                 for( vector<unsigned char> :: iterator h = BestOrder.begin( ); h != BestOrder.end( ); ++h )
  92.                 {
  93.                         if( (*i)->GetWinPerc( ) == *h )
  94.                         {
  95.                                 int oldpid = GetSIDFromPID( (*i)->GetPID( ) );
  96.  
  97.                                 if( (*h-1) != oldpid )
  98.                                 {
  99.                                         CONSOLE_Print( "Swapping [" + UTIL_ToString( oldpid ) + "] to " + UTIL_ToString( *h-1 ) );
  100.                                         SwapSlots( (unsigned char)oldpid, (unsigned char)*h-1 );
  101.                                 }
  102.                         }
  103.                 }
  104.         }
  105.  
  106.         //for a better view order the other team also
  107.         vector<unsigned char> OrderOtherTeam;
  108.         for( vector<CGamePlayer *> :: iterator i = m_Players.begin( ); i != m_Players.end( ); ++i )
  109.         {
  110.                 int oldpid = GetSIDFromPID( (*i)->GetPID( ) );
  111.                 if( oldpid > 5 )
  112.                         OrderOtherTeam.push_back( (*i)->GetWinPerc() );
  113.         }
  114.  
  115.         sort( OrderOtherTeam.begin(), OrderOtherTeam.end() );
  116.         bool AllOrdered = false;
  117.         counter = 0;
  118.         while( !AllOrdered )
  119.         {
  120.                 for( vector<CGamePlayer *> :: iterator i = m_Players.begin( ); i != m_Players.end( ); ++i )
  121.                 {
  122.                         for( vector<unsigned char> :: iterator h = OrderOtherTeam.begin( ); h != OrderOtherTeam.end( ); ++h )
  123.                         {
  124.                                 int oldpid = GetSIDFromPID( (*i)->GetPID( ) );
  125.                                 if( (*i)->GetWinPerc( ) == *h && oldpid > 5 )
  126.                                 {
  127.                                         if( (*h+4) != oldpid )
  128.                                         {
  129.                                                 CONSOLE_Print( "Swapping [" + UTIL_ToString( oldpid ) + "] to " + UTIL_ToString( *h+4 ) );
  130.                                                 SwapSlots( (unsigned char)oldpid, (unsigned char)*h+4 );
  131.                                         }
  132.                                         else
  133.                                                 counter++;
  134.  
  135.                                         if( counter == 5 )
  136.                                                 AllOrdered = true;
  137.                                 }
  138.                         }
  139.                 }
  140.         }
  141.  
  142.         //and finish the process with an output
  143.         double SentPoints = 0;
  144.         double ScouPoints = 0;
  145.         for( vector<unsigned char> :: iterator i = BestOrder.begin( ); i != BestOrder.end( ); ++i )
  146.                 SentPoints += *i;
  147.  
  148.         for( vector<unsigned char> :: iterator i = OrderOtherTeam.begin( ); i != OrderOtherTeam.end( ); ++i )
  149.                 ScouPoints += *i;
  150.  
  151.         SendAllChat( "[Sentinel combined rating: " + UTIL_ToString( SentPoints, 2 ) + "]" );
  152.         SendAllChat( "[Scourge combined rating: " + UTIL_ToString( ScouPoints, 2 ) + "]" );
  153.         SendAllChat( "[Total Spread: " + UTIL_ToString( (SentPoints-ScouPoints), 2 ) + "]" );
  154.         SendAllChat( "[Team WinChance: (Sentinel:" + UTIL_ToString( (SentPoints/(SentPoints+ScouPoints)), 2 ) + "%) (Scourge:" + UTIL_ToString( (ScouPoints/(SentPoints+ScouPoints)), 2 ) + "%)]" );
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement