Start work on starting challenges from overworld. Note that it does NOT yet fully work.

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@10668 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
auria 2012-01-15 02:46:59 +00:00
parent d7eff73234
commit cd6185c2ee
7 changed files with 86 additions and 0 deletions

View File

@ -140,6 +140,7 @@ void LODNode::OnRegisterSceneNode()
{ {
scene::IMeshBuffer* mb = mesh->getMeshBuffer(n); scene::IMeshBuffer* mb = mesh->getMeshBuffer(n);
video::ITexture* t = mb->getMaterial().getTexture(0); video::ITexture* t = mb->getMaterial().getTexture(0);
if (t == NULL) continue;
Material* m = material_manager->getMaterialFor(t, mb); Material* m = material_manager->getMaterialFor(t, mb);
if (m != NULL) if (m != NULL)
{ {

View File

@ -68,6 +68,7 @@ std::set<scene::IMeshBuffer*> g_processed;
Material* MaterialManager::getMaterialFor(video::ITexture* t, Material* MaterialManager::getMaterialFor(video::ITexture* t,
scene::IMeshBuffer *mb) scene::IMeshBuffer *mb)
{ {
assert(t != NULL);
const std::string image = StringUtils::getBasename(core::stringc(t->getName()).c_str()); const std::string image = StringUtils::getBasename(core::stringc(t->getName()).c_str());
// Search backward so that temporary (track) textures are found first // Search backward so that temporary (track) textures are found first
for(int i = (int)m_materials.size()-1; i>=0; i-- ) for(int i = (int)m_materials.size()-1; i>=0; i-- )

View File

@ -176,6 +176,10 @@ void PlayerController::action(PlayerAction action, int value)
break; break;
case PA_FIRE: case PA_FIRE:
m_controls->m_fire = (value!=0); m_controls->m_fire = (value!=0);
if (value > 0)
{
World::getWorld()->onFirePressed(this);
}
break; break;
case PA_LOOK_BACK: case PA_LOOK_BACK:
m_controls->m_look_back = (value!=0); m_controls->m_look_back = (value!=0);

View File

@ -15,9 +15,15 @@
// along with this program; if not, write to the Free Software // along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "challenges/unlock_manager.hpp"
#include "input/device_manager.hpp"
#include "input/input.hpp"
#include "input/input_manager.hpp"
#include "karts/kart.hpp" #include "karts/kart.hpp"
#include "modes/overworld.hpp" #include "modes/overworld.hpp"
#include "network/network_manager.hpp"
#include "states_screens/race_gui_overworld.hpp" #include "states_screens/race_gui_overworld.hpp"
#include "tracks/track.hpp"
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
OverWorld::OverWorld() : LinearWorld() OverWorld::OverWorld() : LinearWorld()
@ -71,3 +77,63 @@ void OverWorld::createRaceGUI()
{ {
m_race_gui = new RaceGUIOverworld(); m_race_gui = new RaceGUIOverworld();
} }
//-----------------------------------------------------------------------------
void OverWorld::onFirePressed(Controller* who)
{
const std::vector<OverworldChallenge>& challenges = m_track->getChallengeList();
Vec3 kart_xyz = getKart(0)->getXYZ();
for (unsigned int n=0; n<challenges.size(); n++)
{
if ((kart_xyz - Vec3(challenges[n].m_position)).length2_2d() < 20)
{
core::rect<s32> pos(15,
10,
15 + UserConfigParams::m_width/2,
10 + GUIEngine::getTitleFontHeight());
const ChallengeData* challenge = unlock_manager->getChallenge(challenges[n].m_challenge_id);
if (challenge == NULL)
{
fprintf(stderr, "[RaceGUIOverworld] ERROR: Cannot find challenge <%s>\n",
challenges[n].m_challenge_id.c_str());
break;
}
race_manager->exitRace();
// Use latest used device
InputDevice* device = input_manager->getDeviceList()->getLatestUsedDevice();
int id = StateManager::get()->createActivePlayer( unlock_manager->getCurrentPlayer(), device );
input_manager->getDeviceList()->setSinglePlayer( StateManager::get()->getActivePlayer(id) );
// Set up race manager appropriately
race_manager->setNumLocalPlayers(1);
race_manager->setLocalKartInfo(0, UserConfigParams::m_default_kart);
// ASSIGN should make sure that only input from assigned devices is read.
input_manager->getDeviceList()->setAssignMode(ASSIGN);
// Go straight to the race
StateManager::get()->enterGameState();
// Initialise global data - necessary even in local games to avoid
// many if tests in other places (e.g. if network_game call
// network_manager else call race_manager).
network_manager->initCharacterDataStructures();
// Launch challenge
challenge->setRace();
// Sets up kart info, including random list of kart for AI
network_manager->setupPlayerKartInfo();
race_manager->startNew();
return;
} // end if
} // end for
}

View File

@ -63,6 +63,10 @@ public:
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
/** Override base class method */ /** Override base class method */
virtual bool shouldDrawTimer() const { return false; } virtual bool shouldDrawTimer() const { return false; }
// ------------------------------------------------------------------------
/** Override base class method */
virtual void onFirePressed(Controller* who);
}; };
#endif #endif

View File

@ -274,6 +274,8 @@ public:
void setClearbackBufferColor(irr::video::SColor color) void setClearbackBufferColor(irr::video::SColor color)
{ m_clear_color = color; } { m_clear_color = color; }
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
/** Override if you want to know when a kart presses fire */
virtual void onFirePressed(Controller* who) {}
}; // World }; // World

View File

@ -371,6 +371,14 @@ void RaceGUIOverworld::drawGlobalMiniMap()
GUIEngine::getFont()->draw(challenge->getChallengeDescription().c_str(), GUIEngine::getFont()->draw(challenge->getChallengeDescription().c_str(),
pos, video::SColor(255,255,255,255), pos, video::SColor(255,255,255,255),
false, false /* vcenter */, NULL); false, false /* vcenter */, NULL);
core::rect<s32> pos2(0,
UserConfigParams::m_height - GUIEngine::getFontHeight()*2,
UserConfigParams::m_width,
UserConfigParams::m_height);
GUIEngine::getFont()->draw(_("Press fire to start the challenge"), pos2,
video::SColor(255,255,150,60),
true, true /* vcenter */, NULL);
break; break;
} }
} }