Fixed crash at the end of a GP if there is a challenge associated to it. Also, it is now detected properly when you unlock a feature by winnign a GP (however the chest scene doesn't yet apepar)

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@4954 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
auria 2010-03-07 18:42:04 +00:00
parent 32f1e24b4a
commit 0623cce462
5 changed files with 116 additions and 81 deletions

View File

@ -323,10 +323,13 @@ bool ChallengeData::grandPrixFinished()
race_manager->getNumPlayers() > 1) return false; race_manager->getNumPlayers() > 1) return false;
// check if the player came first. // check if the player came first.
Kart* kart = World::getWorld()->getPlayerKart(0); //assert(World::getWorld() != NULL);
const int rank = race_manager->getKartFinalGPRank(kart->getWorldKartId()); // Kart* kart = World::getWorld()->getPlayerKart(0);
//const int rank = race_manager->getKartGPRank(kart->getWorldKartId());
const int rank = race_manager->getLocalPlayerGPRank(0);
//printf("getting rank for %s : %i \n", kart->getName().c_str(), rank ); //printf("getting rank for %s : %i \n", kart->getName().c_str(), rank );
if( rank != 0 ) return false; if (rank != 0) return false;
return true; return true;
} // grandPrixFinished } // grandPrixFinished

View File

@ -340,8 +340,9 @@ void UnlockManager::grandPrixFinished()
for(AllChallengesType::iterator i =m_all_challenges.begin(); for(AllChallengesType::iterator i =m_all_challenges.begin();
i!=m_all_challenges.end(); i++) i!=m_all_challenges.end(); i++)
{ {
if(i->second->isActive() &&i->second->grandPrixFinished()) if(i->second->isActive() && i->second->grandPrixFinished())
{ {
std::cout << "===== A FEATURE WAS UNLOCKED BECAUSE YOU WON THE GP!! ==\n";
unlockFeature(i->second); unlockFeature(i->second);
} }
} }

View File

@ -2617,7 +2617,9 @@
GCC_PREFIX_HEADER = ""; GCC_PREFIX_HEADER = "";
GCC_VERSION = 4.0; GCC_VERSION = 4.0;
GCC_WARN_ABOUT_MISSING_NEWLINE = YES; GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
GCC_WARN_MISSING_PARENTHESES = YES;
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
GCC_WARN_SHADOW = NO;
GCC_WARN_UNUSED_FUNCTION = NO; GCC_WARN_UNUSED_FUNCTION = NO;
GCC_WARN_UNUSED_PARAMETER = NO; GCC_WARN_UNUSED_PARAMETER = NO;
HEADER_SEARCH_PATHS = "$(inherited)"; HEADER_SEARCH_PATHS = "$(inherited)";
@ -2654,7 +2656,9 @@
GCC_PREFIX_HEADER = ""; GCC_PREFIX_HEADER = "";
GCC_VERSION = 4.0; GCC_VERSION = 4.0;
GCC_WARN_ABOUT_MISSING_NEWLINE = YES; GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
GCC_WARN_MISSING_PARENTHESES = YES;
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
GCC_WARN_SHADOW = NO;
GCC_WARN_UNUSED_FUNCTION = NO; GCC_WARN_UNUSED_FUNCTION = NO;
GCC_WARN_UNUSED_PARAMETER = NO; GCC_WARN_UNUSED_PARAMETER = NO;
HEADER_SEARCH_PATHS = "$(inherited)"; HEADER_SEARCH_PATHS = "$(inherited)";

View File

@ -90,13 +90,28 @@ void RaceManager::setPlayerKart(unsigned int player_id, const RemoteKartInfo& ki
*/ */
void RaceManager::setLocalKartInfo(unsigned int player_id, const std::string& kart) void RaceManager::setLocalKartInfo(unsigned int player_id, const std::string& kart)
{ {
assert(0<=player_id && player_id <m_local_kart_info.size()); assert(0<=player_id && player_id <m_local_player_karts.size());
m_local_kart_info[player_id] = RemoteKartInfo(player_id, kart, m_local_player_karts[player_id] = RemoteKartInfo(player_id, kart,
StateManager::get()->getActivePlayerProfile(player_id)->getName(), StateManager::get()->getActivePlayerProfile(player_id)->getName(),
network_manager->getMyHostId()); network_manager->getMyHostId());
} // setLocalKartInfo } // setLocalKartInfo
//-----------------------------------------------------------------------------
int RaceManager::getLocalPlayerGPRank(const int playerID) const
{
const int amount = m_kart_status.size();
for (int n=0; n<amount; n++)
{
if (m_kart_status[n].m_local_player_id == playerID)
{
return m_kart_status[n].m_gp_rank;
}
}
return -1;
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
/** Sets the number of local players playing on this computer (including /** Sets the number of local players playing on this computer (including
* split screen). * split screen).
@ -104,7 +119,7 @@ void RaceManager::setLocalKartInfo(unsigned int player_id, const std::string& ka
*/ */
void RaceManager::setNumLocalPlayers(unsigned int n) void RaceManager::setNumLocalPlayers(unsigned int n)
{ {
m_local_kart_info.resize(n); m_local_player_karts.resize(n);
} // setNumLocalPlayers } // setNumLocalPlayers
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -294,6 +309,77 @@ void RaceManager::next()
} }
} // next } // next
//-----------------------------------------------------------------------------
/**
* Sets/updates the m_gp_rank status of each KartStatus object
*/
void RaceManager::computeGPRanks()
{
// calculate the rank of each kart
const unsigned int NUM_KARTS = getNumberOfKarts();
int *scores = new int[NUM_KARTS];
int *position = new int[NUM_KARTS];
double *race_time = new double[NUM_KARTS];
// Ignore the first kart if it's a follow-the-leader race.
int start=(race_manager->getMinorMode()==RaceManager::MINOR_MODE_FOLLOW_LEADER) ? 1 : 0;
for (unsigned int kart_id = start; kart_id < NUM_KARTS; ++kart_id)
{
position[kart_id] = kart_id;
scores[kart_id] = race_manager->getKartScore(kart_id);
race_time[kart_id] = race_manager->getOverallTime(kart_id);
}
if (race_manager->getMinorMode()==RaceManager::MINOR_MODE_FOLLOW_LEADER)
{
// fill values for leader
position[0] = -1;
scores[0] = -1;
race_time[0] = -1;
m_kart_status[0].m_gp_rank = -1;
}
//Bubblesort
bool sorted;
do
{
sorted = true;
for( unsigned int i = start; i < NUM_KARTS - 1; ++i )
{
if( scores[i] < scores[i+1] || (scores[i] == scores[i+1]
&& race_time[i] > race_time[i+1]))
{
int tmp_score[2];
double tmp_time;
tmp_score[0] = position[i];
tmp_score[1] = scores[i];
tmp_time = race_time[i];
position[i] = position[i+1];
scores[i] = scores[i+1];
race_time[i] = race_time[i+1];
position[i+1] = tmp_score[0];
scores[i+1] = tmp_score[1];
race_time[i+1] = tmp_time;
sorted = false;
}
}
} while(!sorted);
for (unsigned int i=start; i < NUM_KARTS; ++i)
{
//printf("setting kart %s to rank %i\n", race_manager->getKartName(position[i]).c_str(), i-start);
m_kart_status[position[i]].m_gp_rank = i - start;
}
// printf("kart %s has rank %i\n", 0, m_kart_status[0].m_gp_rank);
delete []scores;
delete []position;
delete []race_time;
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
/** In GP displays the GP result screen, and then deletes the world. /** In GP displays the GP result screen, and then deletes the world.
*/ */
@ -303,70 +389,7 @@ void RaceManager::exitRace()
// were finished, and not when a race is aborted. // were finished, and not when a race is aborted.
if (m_major_mode==MAJOR_MODE_GRAND_PRIX && m_track_number==(int)m_tracks.size()) if (m_major_mode==MAJOR_MODE_GRAND_PRIX && m_track_number==(int)m_tracks.size())
{ {
// calculate the rank of each kart computeGPRanks();
const unsigned int NUM_KARTS = getNumberOfKarts();
int *scores = new int[NUM_KARTS];
int *position = new int[NUM_KARTS];
double *race_time = new double[NUM_KARTS];
// Ignore the first kart if it's a follow-the-leader race.
int start=(race_manager->getMinorMode()==RaceManager::MINOR_MODE_FOLLOW_LEADER) ? 1 : 0;
for (unsigned int kart_id = start; kart_id < NUM_KARTS; ++kart_id)
{
position[kart_id] = kart_id;
scores[kart_id] = race_manager->getKartScore(kart_id);
race_time[kart_id] = race_manager->getOverallTime(kart_id);
}
if (race_manager->getMinorMode()==RaceManager::MINOR_MODE_FOLLOW_LEADER)
{
// fill values for leader
position[0] = -1;
scores[0] = -1;
race_time[0] = -1;
m_kart_status[0].m_gp_final_rank = -1;
}
//Bubblesort
bool sorted;
do
{
sorted = true;
for( unsigned int i = start; i < NUM_KARTS - 1; ++i )
{
if( scores[i] < scores[i+1] || (scores[i] == scores[i+1]
&& race_time[i] > race_time[i+1]))
{
int tmp_score[2];
double tmp_time;
tmp_score[0] = position[i];
tmp_score[1] = scores[i];
tmp_time = race_time[i];
position[i] = position[i+1];
scores[i] = scores[i+1];
race_time[i] = race_time[i+1];
position[i+1] = tmp_score[0];
scores[i+1] = tmp_score[1];
race_time[i+1] = tmp_time;
sorted = false;
}
}
} while(!sorted);
for (unsigned int i=start; i < NUM_KARTS; ++i)
{
//printf("setting kart %s to rank %i\n", race_manager->getKartName(position[i]).c_str(), i-start);
m_kart_status[position[i]].m_gp_final_rank = i - start;
}
// printf("kart %s has rank %i\n", 0, m_kart_status[0].m_gp_final_rank);
delete []scores;
delete []position;
delete []race_time;
unlock_manager->grandPrixFinished(); unlock_manager->grandPrixFinished();
StateManager::get()->resetAndGoToScreen( MainMenuScreen::getInstance() ); StateManager::get()->resetAndGoToScreen( MainMenuScreen::getInstance() );
@ -375,8 +398,8 @@ void RaceManager::exitRace()
std::string winners[3]; std::string winners[3];
for (unsigned int i=0; i < m_kart_status.size(); ++i) for (unsigned int i=0; i < m_kart_status.size(); ++i)
{ {
std::cout << m_kart_status[i].m_ident << " has GP final rank " << m_kart_status[i].m_gp_final_rank << std::endl; std::cout << m_kart_status[i].m_ident << " has GP final rank " << m_kart_status[i].m_gp_rank << std::endl;
const int rank = m_kart_status[i].m_gp_final_rank; const int rank = m_kart_status[i].m_gp_rank;
if (rank >= 0 && rank < 3) if (rank >= 0 && rank < 3)
{ {
winners[rank] = m_kart_status[i].m_ident; winners[rank] = m_kart_status[i].m_ident;

View File

@ -170,7 +170,7 @@ private:
KartType m_kart_type; // Kart type: AI, player, network player etc. KartType m_kart_type; // Kart type: AI, player, network player etc.
int m_local_player_id; // player controling the kart, for AI: -1 int m_local_player_id; // player controling the kart, for AI: -1
int m_global_player_id; // global ID of player int m_global_player_id; // global ID of player
int m_gp_final_rank; // In GPs, at the end, will hold the overall rank of this kart. int m_gp_rank; // In GPs, at the end, will hold the overall rank of this kart.
KartStatus(const std::string& ident, const int& prev_finish_pos, KartStatus(const std::string& ident, const int& prev_finish_pos,
int local_player_id, int global_player_id, KartType kt) : int local_player_id, int global_player_id, KartType kt) :
@ -189,7 +189,7 @@ private:
MinorRaceModeType m_minor_mode; MinorRaceModeType m_minor_mode;
/** Stores remote kart information about all player karts. */ /** Stores remote kart information about all player karts. */
std::vector<RemoteKartInfo> m_player_karts; std::vector<RemoteKartInfo> m_player_karts;
std::vector<RemoteKartInfo> m_local_kart_info; std::vector<RemoteKartInfo> m_local_player_karts;
std::vector<std::string> m_tracks; std::vector<std::string> m_tracks;
std::vector<int> m_host_ids; std::vector<int> m_host_ids;
std::vector<int> m_num_laps; std::vector<int> m_num_laps;
@ -216,9 +216,9 @@ public:
void reset(); void reset();
void setLocalKartInfo(unsigned int player_id, const std::string& kart); void setLocalKartInfo(unsigned int player_id, const std::string& kart);
const RemoteKartInfo& const RemoteKartInfo&
getLocalKartInfo(unsigned int n) const {return m_local_kart_info[n];} getLocalKartInfo(unsigned int n) const {return m_local_player_karts[n];}
void setNumLocalPlayers(unsigned int n); void setNumLocalPlayers(unsigned int n);
unsigned int getNumLocalPlayers() const {return m_local_kart_info.size(); }; unsigned int getNumLocalPlayers() const {return m_local_player_karts.size(); };
/** Returns the selected number of karts (selected=number of players and /** Returns the selected number of karts (selected=number of players and
* AI karts. */ * AI karts. */
unsigned int getNumberOfKarts() const {return m_num_karts; } unsigned int getNumberOfKarts() const {return m_num_karts; }
@ -232,9 +232,9 @@ public:
void setNumLaps(int num) { m_num_laps.clear(); void setNumLaps(int num) { m_num_laps.clear();
m_num_laps.push_back(num); } m_num_laps.push_back(num); }
void setMajorMode(MajorRaceModeType mode) void setMajorMode(MajorRaceModeType mode)
{ m_major_mode = mode; } { m_major_mode = mode; }
void setMinorMode(MinorRaceModeType mode) void setMinorMode(MinorRaceModeType mode)
{ m_minor_mode = mode; } { m_minor_mode = mode; }
void setNumKarts(int num) { m_num_karts = num; } void setNumKarts(int num) { m_num_karts = num; }
void setCoinTarget(int num) { m_coin_target = num; } void setCoinTarget(int num) { m_coin_target = num; }
MajorRaceModeType MajorRaceModeType
@ -250,8 +250,12 @@ public:
unsigned int getFinishedPlayers() const { return m_num_finished_players; } unsigned int getFinishedPlayers() const { return m_num_finished_players; }
const std::string& getItemStyle() const { return m_grand_prix.getItemStyle(); } const std::string& getItemStyle() const { return m_grand_prix.getItemStyle(); }
int getKartFinalGPRank(const int kart_id) void computeGPRanks();
const { return m_kart_status[kart_id].m_gp_final_rank; } int getKartGPRank(const int kart_id)
const { return m_kart_status[kart_id].m_gp_rank; }
/** \return the GP rank of a local player, or -1 if the given player ID doesn't exist */
int getLocalPlayerGPRank(const int playerID) const;
const std::string& const std::string&
getKartIdent(int kart) const { return m_kart_status[kart].m_ident;} getKartIdent(int kart) const { return m_kart_status[kart].m_ident;}