void Battle::FixColours() { if ( !IsFounderMe() )return; std::vector<wxColour> &palette = GetFixColoursPalette( m_teams_sizes.size() + 1 ); std::vector<int> palette_use( palette.size(), 0 ); wxColour my_col = GetMe().BattleStatus().colour; // Never changes color of founder (me) :-) int my_diff = 0; int my_col_i = GetClosestFixColour( my_col, palette_use,my_diff ); palette_use[my_col_i]++; std::set<int> parsed_teams; for ( user_map_t::size_type i = 0; i < GetNumUsers(); i++ ) { User &user=GetUser(i); if ( &user == &GetMe() ) continue; // skip founder ( yourself ) UserBattleStatus& status = user.BattleStatus(); if ( status.spectator ) continue; if ( parsed_teams.find( status.team ) != parsed_teams.end() ) continue; // skip duplicates parsed_teams.insert( status.team ); wxColour &user_col=status.colour; int user_col_i=GetClosestFixColour(user_col,palette_use, 60); palette_use[user_col_i]++; for ( user_map_t::size_type j = 0; j < GetNumUsers(); j++ ) { User &usr=GetUser(j); if ( usr.BattleStatus().team == status.team ) { ForceColour( usr, palette[user_col_i]); } } } }
int IBattle::GetClosestFixColour(const wxColour &col, const std::vector<int> &excludes, int difference) const { std::vector<wxColour> palette = GetFixColoursPalette( m_teams_sizes.size() + 1 ); int result=0; int t1=palette.size(); int t2=excludes.size(); wxLogMessage(_T("GetClosestFixColour %d %d"),t1,t2); for (size_t i=0; i<palette.size(); ++i) { if ((i>=excludes.size()) || (!excludes[i])) { if (AreColoursSimilar( palette[i],col, difference )) { return i; } } } return result; }
wxColour IBattle::GetFreeColour( User * ) const { typedef std::vector<wxColour> ColorVec; ColorVec current_used_colors; for ( user_map_t::size_type i = 0; i < GetNumUsers(); ++i ) { UserBattleStatus& bs = GetUser( i ).BattleStatus(); current_used_colors.push_back( bs.colour ); } int inc = 1; while ( true ) { ColorVec fixcolourspalette = GetFixColoursPalette( m_teams_sizes.size() + inc++ ); ColorVec::iterator fixcolourspalette_new_end = std::unique( fixcolourspalette.begin(), fixcolourspalette.end(), AreColoursSimilarProxy( 20 ) ); fixcolourspalette_new_end = std::remove_if( fixcolourspalette.begin(), fixcolourspalette.end(), DismissColor( current_used_colors ) ); if ( fixcolourspalette_new_end != fixcolourspalette.begin() ) return (*fixcolourspalette.begin()); } }
wxColour IBattle::GetFixColour(int i) const { int size = m_teams_sizes.size(); std::vector<wxColour> palette = GetFixColoursPalette( size ); return palette[i]; }