From b643cfd599f05c863e4560aaca87204d7ec708d8 Mon Sep 17 00:00:00 2001 From: hikerstk Date: Wed, 7 Jan 2009 00:54:20 +0000 Subject: [PATCH] Bugfix: incorrect track name or GP in a challenge will not cause a crash when trying to use to do the challenge, instead STK will abort with an error message indicating the problem at startup (see bug 2316973). git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/trunk/supertuxkart@2851 178a84e3-b1eb-0310-8ba1-8eac791a3b58 --- src/challenges/challenge.hpp | 2 ++ src/challenges/challenge_data.cpp | 30 +++++++++++++++++++++++++++++- src/challenges/challenge_data.hpp | 3 ++- src/main.cpp | 2 ++ src/unlock_manager.cpp | 14 ++++++++++++++ src/unlock_manager.hpp | 1 + 6 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/challenges/challenge.hpp b/src/challenges/challenge.hpp index 5dbad6cac..558ca574f 100755 --- a/src/challenges/challenge.hpp +++ b/src/challenges/challenge.hpp @@ -94,5 +94,7 @@ public: virtual bool raceFinished() {return false;} // end of a race virtual bool grandPrixFinished() {return false;} // end of a GP virtual void setRace() const = 0; // set race to use + /** Checks if a challenge is valid. */ + virtual void check() const = 0; }; #endif diff --git a/src/challenges/challenge_data.cpp b/src/challenges/challenge_data.cpp index 591998271..bd659dcab 100755 --- a/src/challenges/challenge_data.cpp +++ b/src/challenges/challenge_data.cpp @@ -24,6 +24,7 @@ #include "translation.hpp" #include "grand_prix_data.hpp" #include "grand_prix_manager.hpp" +#include "track_manager.hpp" #include "karts/kart.hpp" #include "lisp/lisp.hpp" #include "lisp/parser.hpp" @@ -135,7 +136,7 @@ ChallengeData::ChallengeData(const std::string& filename) } // ChallengeData // ---------------------------------------------------------------------------- -void ChallengeData::error(const char *id) +void ChallengeData::error(const char *id) const { char msg[MAX_ERROR_MESSAGE_LENGTH]; snprintf(msg, sizeof(msg), "Undefined or incorrect value for '%s' in challenge file '%s'.", @@ -143,6 +144,33 @@ void ChallengeData::error(const char *id) throw std::runtime_error(msg); } // error // ---------------------------------------------------------------------------- +/** Checks if this challenge is valid, i.e. contains a valid track or a valid + * GP. If incorrect data are found, STK is aborted with an error message. + * (otherwise STK aborts when trying to do this challenge, which is worse). + */ +void ChallengeData::check() const +{ + if(m_major==RaceManager::MAJOR_MODE_SINGLE) + { + try + { + track_manager->getTrack(m_track_name); + } + catch(std::exception&) + { + error("track"); + } + } + else if(m_major==RaceManager::MAJOR_MODE_GRAND_PRIX) + { + if(!grand_prix_manager->getGrandPrix(m_gp_id)) + { + error("gp"); + } + } +} // check + +// ---------------------------------------------------------------------------- void ChallengeData::getUnlocks(const lisp::Lisp *lisp, const char* type, diff --git a/src/challenges/challenge_data.hpp b/src/challenges/challenge_data.hpp index 4d54e546e..27c97da8a 100755 --- a/src/challenges/challenge_data.hpp +++ b/src/challenges/challenge_data.hpp @@ -45,11 +45,12 @@ private: std::string m_filename; void getUnlocks(const lisp::Lisp *lisp, const char* type, REWARD_TYPE reward); - void error(const char *id); + void error(const char *id) const; public: ChallengeData(const std::string& filename); void setRace() const; + virtual void check() const; virtual bool raceFinished(); virtual bool grandPrixFinished(); }; // ChallengeData diff --git a/src/main.cpp b/src/main.cpp index 664017e9e..f1c078560 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -451,6 +451,8 @@ void InitTuxkart() grand_prix_manager = new GrandPrixManager (); network_manager = new NetworkManager (); track_manager->loadTrackList(); + // Check needs GP and track manager. + unlock_manager->check(); sound_manager->addMusicToTracks(); stk_config->load(file_manager->getConfigFile("stk_config.data")); diff --git a/src/unlock_manager.cpp b/src/unlock_manager.cpp index 0f35704ca..13005f2cb 100755 --- a/src/unlock_manager.cpp +++ b/src/unlock_manager.cpp @@ -128,6 +128,20 @@ void UnlockManager::addChallenge(const std::string& filename) { addChallenge(new ChallengeData(filename)); } // addChallenge +//----------------------------------------------------------------------------- +/** Checks if all challenges are valid, i.e. contain a valid track or GP. + * If not, STK is aborted with an error message. + */ +void UnlockManager::check() const +{ + for(AllChallengesType::const_iterator i =m_all_challenges.begin(); + i!=m_all_challenges.end(); i++) + { + i->second->check(); + } // for i + +} // check + //----------------------------------------------------------------------------- std::vector UnlockManager::getActiveChallenges() { diff --git a/src/unlock_manager.hpp b/src/unlock_manager.hpp index 1c48e5dbe..1fbd6b37b 100755 --- a/src/unlock_manager.hpp +++ b/src/unlock_manager.hpp @@ -53,6 +53,7 @@ public: void unlockFeature (Challenge* c, bool save=true); void lockFeature (Challenge* challenge); bool isLocked (const std::string& feature); + void check () const; }; // UnlockManager extern UnlockManager* unlock_manager;