From 0623cce4625a0168eb7b962618f0e76f9b339249 Mon Sep 17 00:00:00 2001 From: auria Date: Sun, 7 Mar 2010 18:42:04 +0000 Subject: [PATCH] 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 --- src/challenges/challenge_data.cpp | 9 +- src/challenges/unlock_manager.cpp | 3 +- .../Xcode/STK_XCode.xcodeproj/project.pbxproj | 4 + src/race/race_manager.cpp | 161 ++++++++++-------- src/race/race_manager.hpp | 20 ++- 5 files changed, 116 insertions(+), 81 deletions(-) diff --git a/src/challenges/challenge_data.cpp b/src/challenges/challenge_data.cpp index 45d0612d2..736ab9859 100644 --- a/src/challenges/challenge_data.cpp +++ b/src/challenges/challenge_data.cpp @@ -323,10 +323,13 @@ bool ChallengeData::grandPrixFinished() race_manager->getNumPlayers() > 1) return false; // check if the player came first. - Kart* kart = World::getWorld()->getPlayerKart(0); - const int rank = race_manager->getKartFinalGPRank(kart->getWorldKartId()); + //assert(World::getWorld() != NULL); + // 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 ); - if( rank != 0 ) return false; + if (rank != 0) return false; return true; } // grandPrixFinished diff --git a/src/challenges/unlock_manager.cpp b/src/challenges/unlock_manager.cpp index a424c267b..408cafc7b 100644 --- a/src/challenges/unlock_manager.cpp +++ b/src/challenges/unlock_manager.cpp @@ -340,8 +340,9 @@ void UnlockManager::grandPrixFinished() for(AllChallengesType::iterator i =m_all_challenges.begin(); 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); } } diff --git a/src/ide/Xcode/STK_XCode.xcodeproj/project.pbxproj b/src/ide/Xcode/STK_XCode.xcodeproj/project.pbxproj index ec3007ab6..8d0a56392 100644 --- a/src/ide/Xcode/STK_XCode.xcodeproj/project.pbxproj +++ b/src/ide/Xcode/STK_XCode.xcodeproj/project.pbxproj @@ -2617,7 +2617,9 @@ GCC_PREFIX_HEADER = ""; GCC_VERSION = 4.0; GCC_WARN_ABOUT_MISSING_NEWLINE = YES; + GCC_WARN_MISSING_PARENTHESES = YES; GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; + GCC_WARN_SHADOW = NO; GCC_WARN_UNUSED_FUNCTION = NO; GCC_WARN_UNUSED_PARAMETER = NO; HEADER_SEARCH_PATHS = "$(inherited)"; @@ -2654,7 +2656,9 @@ GCC_PREFIX_HEADER = ""; GCC_VERSION = 4.0; GCC_WARN_ABOUT_MISSING_NEWLINE = YES; + GCC_WARN_MISSING_PARENTHESES = YES; GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; + GCC_WARN_SHADOW = NO; GCC_WARN_UNUSED_FUNCTION = NO; GCC_WARN_UNUSED_PARAMETER = NO; HEADER_SEARCH_PATHS = "$(inherited)"; diff --git a/src/race/race_manager.cpp b/src/race/race_manager.cpp index 73da96787..37e86295c 100644 --- a/src/race/race_manager.cpp +++ b/src/race/race_manager.cpp @@ -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) { - assert(0<=player_id && player_id getActivePlayerProfile(player_id)->getName(), network_manager->getMyHostId()); } // setLocalKartInfo +//----------------------------------------------------------------------------- + +int RaceManager::getLocalPlayerGPRank(const int playerID) const +{ + const int amount = m_kart_status.size(); + for (int n=0; ngetMinorMode()==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. */ @@ -303,70 +389,7 @@ void RaceManager::exitRace() // were finished, and not when a race is aborted. if (m_major_mode==MAJOR_MODE_GRAND_PRIX && m_track_number==(int)m_tracks.size()) { - // 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_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; - + computeGPRanks(); unlock_manager->grandPrixFinished(); StateManager::get()->resetAndGoToScreen( MainMenuScreen::getInstance() ); @@ -375,8 +398,8 @@ void RaceManager::exitRace() std::string winners[3]; 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; - const int rank = m_kart_status[i].m_gp_final_rank; + 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_rank; if (rank >= 0 && rank < 3) { winners[rank] = m_kart_status[i].m_ident; diff --git a/src/race/race_manager.hpp b/src/race/race_manager.hpp index d8ff185ae..d7b69ef07 100644 --- a/src/race/race_manager.hpp +++ b/src/race/race_manager.hpp @@ -170,7 +170,7 @@ private: 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_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, int local_player_id, int global_player_id, KartType kt) : @@ -189,7 +189,7 @@ private: MinorRaceModeType m_minor_mode; /** Stores remote kart information about all player karts. */ std::vector m_player_karts; - std::vector m_local_kart_info; + std::vector m_local_player_karts; std::vector m_tracks; std::vector m_host_ids; std::vector m_num_laps; @@ -216,9 +216,9 @@ public: void reset(); void setLocalKartInfo(unsigned int player_id, const std::string& kart); 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); - 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 * AI karts. */ unsigned int getNumberOfKarts() const {return m_num_karts; } @@ -232,9 +232,9 @@ public: void setNumLaps(int num) { m_num_laps.clear(); m_num_laps.push_back(num); } void setMajorMode(MajorRaceModeType mode) - { m_major_mode = mode; } + { m_major_mode = mode; } void setMinorMode(MinorRaceModeType mode) - { m_minor_mode = mode; } + { m_minor_mode = mode; } void setNumKarts(int num) { m_num_karts = num; } void setCoinTarget(int num) { m_coin_target = num; } MajorRaceModeType @@ -250,8 +250,12 @@ public: unsigned int getFinishedPlayers() const { return m_num_finished_players; } const std::string& getItemStyle() const { return m_grand_prix.getItemStyle(); } - int getKartFinalGPRank(const int kart_id) - const { return m_kart_status[kart_id].m_gp_final_rank; } + void computeGPRanks(); + 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& getKartIdent(int kart) const { return m_kart_status[kart].m_ident;}