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
This commit is contained in:
auria 2012-09-07 02:06:50 +00:00
parent 80786003c3
commit f74f945558
5 changed files with 112 additions and 61 deletions

View File

@ -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 <track> 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 <requirements> node!");
}
requirements_node->get("trophies", &m_num_trophies);
const XMLNode* mode_node = root->getNode("mode");
@ -135,6 +105,49 @@ ChallengeData::ChallengeData(const std::string& filename)
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 <track> node!");
}
if (m_major == RaceManager::MAJOR_MODE_GRAND_PRIX && gp_node == NULL)
{
throw std::runtime_error("Challenge file " + filename + " has no <grandprix> 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 <requirements> node!");
}
requirements_node->get("trophies", &m_num_trophies);
const XMLNode* difficulties[RaceManager::DIFFICULTY_COUNT];
difficulties[0] = root->getNode("easy");
difficulties[1] = root->getNode("medium");
@ -229,11 +242,13 @@ ChallengeData::ChallengeData(const std::string& filename)
*/
core::stringw description;
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);

View File

@ -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; }

View File

@ -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,9 +117,17 @@ 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 );
if (c->getData()->getMajorMode() == RaceManager::MAJOR_MODE_GRAND_PRIX)
{
const GrandPrixData* gp = grand_prix_manager->getGrandPrix(c->getData()->getGPId());
getWidget<LabelWidget>("title")->setText( gp->getName(), true );
}
else
{
const wchar_t* track_name = track_manager->getTrack(c->getData()->getTrackId())->getName();
getWidget<LabelWidget>("title")->setText( track_name, true );
}
}
// ----------------------------------------------------------------------------

View File

@ -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,6 +423,25 @@ void RaceGUIOverworld::drawGlobalMiniMap()
break;
}
if (challenge->getMajorMode() == RaceManager::MAJOR_MODE_GRAND_PRIX)
{
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)
{
@ -435,7 +455,7 @@ void RaceGUIOverworld::drawGlobalMiniMap()
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;

View File

@ -950,6 +950,12 @@ bool Track::loadMainTrack(const XMLNode &root)
m_challenges.push_back( OverworldChallenge(xyz, challenge) );
if (c->getMajorMode() == RaceManager::MAJOR_MODE_GRAND_PRIX)
{
}
else
{
Track* t = track_manager->getTrack(c->getTrackId());
if (t == NULL)
{
@ -965,8 +971,8 @@ bool Track::loadMainTrack(const XMLNode &root)
fprintf(stderr, "[WARNING] Cannot find track screenshot <%s>\n", sshot.c_str());
continue;
}
scene_node->getMaterial(0).setTexture(0, screenshot);
}
// make transparent
for (unsigned int m=0; m<a_mesh->getMeshBufferCount(); m++)