From f74f9455582dc9cefc7be3bad591cb40e04f53e2 Mon Sep 17 00:00:00 2001 From: auria Date: Fri, 7 Sep 2012 02:06:50 +0000 Subject: [PATCH] Add minimal support for GP challenges in the overworld. More to come git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@11566 178a84e3-b1eb-0310-8ba1-8eac791a3b58 --- src/challenges/challenge_data.cpp | 83 +++++++++++-------- src/challenges/challenge_data.hpp | 1 + .../dialogs/select_challenge.cpp | 13 ++- src/states_screens/race_gui_overworld.cpp | 44 +++++++--- src/tracks/track.cpp | 32 ++++--- 5 files changed, 112 insertions(+), 61 deletions(-) diff --git a/src/challenges/challenge_data.cpp b/src/challenges/challenge_data.cpp index b8076c395..a02b74f54 100644 --- a/src/challenges/challenge_data.cpp +++ b/src/challenges/challenge_data.cpp @@ -77,36 +77,6 @@ ChallengeData::ChallengeData(const std::string& filename) return; } - const XMLNode* track_node = root->getNode("track"); - - // TODO: add GP support - if (track_node == NULL) - { - throw std::runtime_error("Challenge file " + filename + " has no node!"); - } - - - if (!track_node->get("id", &m_track_id )) - { - error("track"); - } - if (track_manager->getTrack(m_track_id) == NULL) - { - error("track"); - } - - if (!track_node->get("laps", &m_num_laps) && m_minor != RaceManager::MINOR_MODE_FOLLOW_LEADER) - { - error("laps"); - } - - - const XMLNode* requirements_node = root->getNode("requirements"); - if (requirements_node == NULL) - { - throw std::runtime_error("Challenge file " + filename + " has no node!"); - } - requirements_node->get("trophies", &m_num_trophies); const XMLNode* mode_node = root->getNode("mode"); @@ -134,6 +104,49 @@ ChallengeData::ChallengeData(const std::string& filename) m_minor = RaceManager::MINOR_MODE_FOLLOW_LEADER; else error("minor"); + + const XMLNode* track_node = root->getNode("track"); + const XMLNode* gp_node = root->getNode("grandprix"); + + if (m_major == RaceManager::MAJOR_MODE_SINGLE && track_node == NULL) + { + throw std::runtime_error("Challenge file " + filename + " has no node!"); + } + if (m_major == RaceManager::MAJOR_MODE_GRAND_PRIX && gp_node == NULL) + { + throw std::runtime_error("Challenge file " + filename + " has no node!"); + } + + if (track_node != NULL) + { + if (!track_node->get("id", &m_track_id )) + { + error("track"); + } + if (track_manager->getTrack(m_track_id) == NULL) + { + error("track"); + } + + if (!track_node->get("laps", &m_num_laps) && m_minor != RaceManager::MINOR_MODE_FOLLOW_LEADER) + { + error("laps"); + } + } + else if (gp_node != NULL) + { + if (!gp_node->get("id", &m_gp_id )) + { + error("grandprix"); + } + } + + const XMLNode* requirements_node = root->getNode("requirements"); + if (requirements_node == NULL) + { + throw std::runtime_error("Challenge file " + filename + " has no node!"); + } + requirements_node->get("trophies", &m_num_trophies); const XMLNode* difficulties[RaceManager::DIFFICULTY_COUNT]; difficulties[0] = root->getNode("easy"); @@ -229,11 +242,13 @@ ChallengeData::ChallengeData(const std::string& filename) */ core::stringw description; - //I18N: number of laps to race in a challenge - description += _("Laps : %i", m_num_laps); - description += core::stringw(L"\n"); + if (track_node != NULL) + { + //I18N: number of laps to race in a challenge + description += _("Laps : %i", m_num_laps); + description += core::stringw(L"\n"); + } - // TODO: add this info in the difficulties dialog perhaps? /* //I18N: number of AI karts in a challenge description += _("AI Karts : %i", m_num_karts - 1); diff --git a/src/challenges/challenge_data.hpp b/src/challenges/challenge_data.hpp index 228594a49..532796a4b 100644 --- a/src/challenges/challenge_data.hpp +++ b/src/challenges/challenge_data.hpp @@ -112,6 +112,7 @@ public: void setId(const std::string& s) { m_id = s; } const std::string& getTrackId() const { return m_track_id; } + const std::string& getGPId() const { return m_gp_id; } int getNumLaps() const { return m_num_laps; } diff --git a/src/states_screens/dialogs/select_challenge.cpp b/src/states_screens/dialogs/select_challenge.cpp index 36e50554e..2c3389c2c 100644 --- a/src/states_screens/dialogs/select_challenge.cpp +++ b/src/states_screens/dialogs/select_challenge.cpp @@ -25,6 +25,7 @@ #include "io/file_manager.hpp" #include "modes/world.hpp" #include "network/network_manager.hpp" +#include "race/grand_prix_manager.hpp" #include "race/race_manager.hpp" #include "states_screens/dialogs/select_challenge.hpp" #include "tracks/track_manager.hpp" @@ -116,8 +117,16 @@ SelectChallengeDialog::SelectChallengeDialog(const float percentWidth, medium_label->setText( getLabel(RaceManager::RD_MEDIUM, c->getData()), false ); expert_label->setText( getLabel(RaceManager::RD_HARD, c->getData()), false ); - const wchar_t* track_name = track_manager->getTrack(c->getData()->getTrackId())->getName(); - getWidget("title")->setText( track_name, true ); + if (c->getData()->getMajorMode() == RaceManager::MAJOR_MODE_GRAND_PRIX) + { + const GrandPrixData* gp = grand_prix_manager->getGrandPrix(c->getData()->getGPId()); + getWidget("title")->setText( gp->getName(), true ); + } + else + { + const wchar_t* track_name = track_manager->getTrack(c->getData()->getTrackId())->getName(); + getWidget("title")->setText( track_name, true ); + } } // ---------------------------------------------------------------------------- diff --git a/src/states_screens/race_gui_overworld.cpp b/src/states_screens/race_gui_overworld.cpp index ae009114a..265071c92 100644 --- a/src/states_screens/race_gui_overworld.cpp +++ b/src/states_screens/race_gui_overworld.cpp @@ -42,6 +42,7 @@ using namespace irr; #include "karts/kart_properties.hpp" #include "karts/kart_properties_manager.hpp" #include "modes/world.hpp" +#include "race/grand_prix_manager.hpp" #include "race/race_manager.hpp" #include "tracks/track.hpp" #include "tracks/track_manager.hpp" @@ -422,20 +423,39 @@ void RaceGUIOverworld::drawGlobalMiniMap() break; } - Track* track = track_manager->getTrack(challenge->getTrackId()); - if (track == NULL) + if (challenge->getMajorMode() == RaceManager::MAJOR_MODE_GRAND_PRIX) { - fprintf(stderr, "[RaceGUIOverworld] ERROR: Cannot find track <%s>, " - "referenced from challenge <%s>\n", - challenge->getTrackId().c_str(), - challenges[n].m_challenge_id.c_str()); - break; + const GrandPrixData* gp = grand_prix_manager->getGrandPrix(challenge->getGPId()); + + if (gp == NULL) + { + fprintf(stderr, "[RaceGUIOverworld] ERROR: Cannot find GP <%s>, " + "referenced from challenge <%s>\n", + challenge->getGPId().c_str(), + challenges[n].m_challenge_id.c_str()); + break; + } + + gui::ScalableFont* font = GUIEngine::getTitleFont(); + font->draw(gp->getName(), pos, video::SColor(255,255,255,255), + false, true /* vcenter */, NULL); + } + else + { + Track* track = track_manager->getTrack(challenge->getTrackId()); + if (track == NULL) + { + fprintf(stderr, "[RaceGUIOverworld] ERROR: Cannot find track <%s>, " + "referenced from challenge <%s>\n", + challenge->getTrackId().c_str(), + challenges[n].m_challenge_id.c_str()); + break; + } + + gui::ScalableFont* font = GUIEngine::getTitleFont(); + font->draw(track->getName(), pos, video::SColor(255,255,255,255), + false, true /* vcenter */, NULL); } - - gui::ScalableFont* font = GUIEngine::getTitleFont(); - font->draw(track->getName(), pos, video::SColor(255,255,255,255), - false, true /* vcenter */, NULL); - pos.UpperLeftCorner.Y += GUIEngine::getTitleFontHeight(); pos.LowerRightCorner.Y = UserConfigParams::m_height; diff --git a/src/tracks/track.cpp b/src/tracks/track.cpp index b57188fd2..22d7b2cf6 100644 --- a/src/tracks/track.cpp +++ b/src/tracks/track.cpp @@ -950,23 +950,29 @@ bool Track::loadMainTrack(const XMLNode &root) m_challenges.push_back( OverworldChallenge(xyz, challenge) ); - Track* t = track_manager->getTrack(c->getTrackId()); - if (t == NULL) + if (c->getMajorMode() == RaceManager::MAJOR_MODE_GRAND_PRIX) { - fprintf(stderr, "[WARNING] Cannot find track named <%s>\n", c->getTrackId().c_str()); - continue; + } - - std::string sshot = t->getScreenshotFile(); - video::ITexture* screenshot = irr_driver->getTexture(sshot); - - if (screenshot == NULL) + else { - fprintf(stderr, "[WARNING] Cannot find track screenshot <%s>\n", sshot.c_str()); - continue; + Track* t = track_manager->getTrack(c->getTrackId()); + if (t == NULL) + { + fprintf(stderr, "[WARNING] Cannot find track named <%s>\n", c->getTrackId().c_str()); + continue; + } + + std::string sshot = t->getScreenshotFile(); + video::ITexture* screenshot = irr_driver->getTexture(sshot); + + if (screenshot == NULL) + { + fprintf(stderr, "[WARNING] Cannot find track screenshot <%s>\n", sshot.c_str()); + continue; + } + scene_node->getMaterial(0).setTexture(0, screenshot); } - - scene_node->getMaterial(0).setTexture(0, screenshot); // make transparent for (unsigned int m=0; mgetMeshBufferCount(); m++)