Add tutorial to overworld
git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@12487 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
parent
42b3dfe98e
commit
6147636454
@ -449,7 +449,6 @@ void IrrDriver::initDevice()
|
||||
// so let's decide ourselves...)
|
||||
m_device->getCursorControl()->setVisible(true);
|
||||
m_pointer_shown = true;
|
||||
|
||||
} // initDevice
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
@ -179,12 +179,20 @@ void OverWorld::onFirePressed(Controller* who)
|
||||
|
||||
for (unsigned int n=0; n<challenges.size(); n++)
|
||||
{
|
||||
if (challenges[n].getForceField().m_is_locked) continue;
|
||||
if (challenges[n].isForceFieldSet() && challenges[n].getForceField().m_is_locked) continue;
|
||||
|
||||
if ((kart_xyz - Vec3(challenges[n].m_position)).length2_2d() < CHALLENGE_DISTANCE_SQUARED)
|
||||
{
|
||||
if (challenges[n].m_challenge_id == "tutorial")
|
||||
{
|
||||
scheduleTutorial();
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
race_manager->setKartLastPositionOnOverworld(kart_xyz);
|
||||
new SelectChallengeDialog(0.8f, 0.8f, challenges[n].m_challenge_id);
|
||||
}
|
||||
} // end if
|
||||
} // end for
|
||||
}
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include "graphics/camera.hpp"
|
||||
#include "graphics/hardware_skinning.hpp"
|
||||
#include "io/file_manager.hpp"
|
||||
#include "input/device_manager.hpp"
|
||||
#include "items/projectile_manager.hpp"
|
||||
#include "karts/controller/player_controller.hpp"
|
||||
#include "karts/controller/end_controller.hpp"
|
||||
@ -97,6 +98,7 @@ World::World() : WorldStatus(), m_clear_color(255,100,101,140)
|
||||
m_schedule_unpause = false;
|
||||
m_schedule_exit_race = false;
|
||||
m_self_destruct = false;
|
||||
m_schedule_tutorial = false;
|
||||
|
||||
m_stop_music_when_dialog_open = true;
|
||||
|
||||
@ -632,12 +634,51 @@ void World::updateWorld(float dt)
|
||||
{
|
||||
race_manager->exitRace();
|
||||
race_manager->setAIKartOverride("");
|
||||
|
||||
StateManager::get()->resetAndGoToScreen(MainMenuScreen::getInstance());
|
||||
|
||||
if (m_schedule_tutorial)
|
||||
{
|
||||
race_manager->setNumLocalPlayers(1);
|
||||
race_manager->setMajorMode (RaceManager::MAJOR_MODE_SINGLE);
|
||||
race_manager->setMinorMode (RaceManager::MINOR_MODE_TUTORIAL);
|
||||
race_manager->setNumKarts( 1 );
|
||||
race_manager->setTrack( "tutorial" );
|
||||
race_manager->setDifficulty(RaceManager::DIFFICULTY_EASY);
|
||||
|
||||
// Use keyboard 0 by default (FIXME: let player choose?)
|
||||
InputDevice* device = input_manager->getDeviceList()->getKeyboard(0);
|
||||
|
||||
// Create player and associate player with keyboard
|
||||
StateManager::get()->createActivePlayer(unlock_manager->getCurrentPlayer(),
|
||||
device);
|
||||
|
||||
if (kart_properties_manager->getKart(UserConfigParams::m_default_kart) == NULL)
|
||||
{
|
||||
fprintf(stderr, "[MainMenuScreen] WARNING: cannot find kart '%s', will revert to default\n",
|
||||
UserConfigParams::m_default_kart.c_str());
|
||||
UserConfigParams::m_default_kart.revertToDefaults();
|
||||
}
|
||||
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);
|
||||
input_manager->getDeviceList()
|
||||
->setSinglePlayer( StateManager::get()->getActivePlayer(0) );
|
||||
|
||||
StateManager::get()->enterGameState();
|
||||
network_manager->setupPlayerKartInfo();
|
||||
race_manager->startNew(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (race_manager->raceWasStartedFromOverworld())
|
||||
{
|
||||
OverWorld::enterOverWorld();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
} // updateWorld
|
||||
|
||||
|
@ -138,6 +138,8 @@ protected:
|
||||
|
||||
bool m_schedule_exit_race;
|
||||
|
||||
bool m_schedule_tutorial;
|
||||
|
||||
Phase m_scheduled_pause_phase;
|
||||
|
||||
/** Set when the world needs to be deleted but you can't do it immediately
|
||||
@ -250,6 +252,8 @@ public:
|
||||
void schedulePause(Phase phase);
|
||||
void scheduleUnpause();
|
||||
void scheduleExitRace() { m_schedule_exit_race = true; }
|
||||
void scheduleTutorial() { m_schedule_exit_race = true;
|
||||
m_schedule_tutorial = true; }
|
||||
void updateWorld(float dt);
|
||||
void handleExplosion(const Vec3 &xyz, AbstractKart *kart_hit,
|
||||
PhysicalObject *object);
|
||||
|
@ -387,6 +387,8 @@ void RaceGUIOverworld::drawGlobalMiniMap()
|
||||
m_current_challenge = NULL;
|
||||
for (unsigned int n=0; n<challenges.size(); n++)
|
||||
{
|
||||
if (challenges[n].m_challenge_id == "tutorial") continue;
|
||||
|
||||
Vec3 draw_at;
|
||||
track->mapPoint2MiniMap(challenges[n].m_position, &draw_at);
|
||||
|
||||
@ -423,19 +425,29 @@ void RaceGUIOverworld::drawGlobalMiniMap()
|
||||
|
||||
|
||||
// ---- Draw nearby challenge if any
|
||||
m_close_to_a_challenge = false;
|
||||
for (unsigned int n=0; n<challenges.size(); n++)
|
||||
{
|
||||
if (challenges[n].getForceField().m_is_locked) continue;
|
||||
|
||||
if ((kart_xyz - Vec3(challenges[n].m_position)).length2_2d() < CHALLENGE_DISTANCE_SQUARED)
|
||||
{
|
||||
m_close_to_a_challenge = true;
|
||||
core::rect<s32> pos(15,
|
||||
10,
|
||||
15 + UserConfigParams::m_width/2,
|
||||
10 + GUIEngine::getTitleFontHeight());
|
||||
|
||||
m_close_to_a_challenge = false;
|
||||
for (unsigned int n=0; n<challenges.size(); n++)
|
||||
{
|
||||
if (challenges[n].m_challenge_id != "tutorial" &&
|
||||
challenges[n].getForceField().m_is_locked) continue;
|
||||
|
||||
if ((kart_xyz - Vec3(challenges[n].m_position)).length2_2d() < CHALLENGE_DISTANCE_SQUARED)
|
||||
{
|
||||
m_close_to_a_challenge = true;
|
||||
|
||||
if (challenges[n].m_challenge_id == "tutorial")
|
||||
{
|
||||
gui::ScalableFont* font = GUIEngine::getTitleFont();
|
||||
font->draw(_("Tutorial"), pos, video::SColor(255,255,255,255),
|
||||
false, true /* vcenter */, NULL);
|
||||
continue;
|
||||
}
|
||||
|
||||
const ChallengeData* challenge = unlock_manager->getChallenge(challenges[n].m_challenge_id);
|
||||
|
||||
if (challenge == NULL)
|
||||
|
@ -885,6 +885,7 @@ bool Track::loadMainTrack(const XMLNode &root)
|
||||
GameSlot* slot = unlock_manager->getCurrentSlot();
|
||||
for (unsigned int c=0; c<m_challenges.size(); c++)
|
||||
{
|
||||
if (m_challenges[c].m_challenge_id == "tutorial") continue;
|
||||
if (slot->getChallenge(m_challenges[c].m_challenge_id)
|
||||
->isSolvedAtAnyDifficulty())
|
||||
{
|
||||
@ -912,6 +913,7 @@ bool Track::loadMainTrack(const XMLNode &root)
|
||||
GameSlot* slot = unlock_manager->getCurrentSlot();
|
||||
for (unsigned int c=0; c<m_challenges.size(); c++)
|
||||
{
|
||||
if (m_challenges[c].m_challenge_id == "tutorial") continue;
|
||||
if (slot->getChallenge(m_challenges[c].m_challenge_id)
|
||||
->isSolvedAtAnyDifficulty())
|
||||
{
|
||||
@ -1026,7 +1028,11 @@ bool Track::loadMainTrack(const XMLNode &root)
|
||||
// for challenge orbs, a bit more work to do
|
||||
if (challenge.size() > 0)
|
||||
{
|
||||
const ChallengeData* c = unlock_manager->getChallenge(challenge);
|
||||
const ChallengeData* c = NULL;
|
||||
|
||||
if (challenge != "tutorial")
|
||||
{
|
||||
c = unlock_manager->getChallenge(challenge);
|
||||
if (c == NULL)
|
||||
{
|
||||
Log::error("track", "Cannot find challenge named <%s>\n",
|
||||
@ -1034,14 +1040,17 @@ bool Track::loadMainTrack(const XMLNode &root)
|
||||
scene_node->remove();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
m_challenges.push_back( OverworldChallenge(xyz, challenge) );
|
||||
|
||||
if (c->getMajorMode() == RaceManager::MAJOR_MODE_GRAND_PRIX)
|
||||
if (c != NULL && c->getMajorMode() == RaceManager::MAJOR_MODE_GRAND_PRIX)
|
||||
{
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
if (challenge != "tutorial")
|
||||
{
|
||||
Track* t = track_manager->getTrack(c->getTrackId());
|
||||
if (t == NULL)
|
||||
@ -1063,6 +1072,7 @@ bool Track::loadMainTrack(const XMLNode &root)
|
||||
}
|
||||
scene_node->getMaterial(0).setTexture(0, screenshot);
|
||||
}
|
||||
}
|
||||
|
||||
// make transparent
|
||||
for (unsigned int m=0; m<a_mesh->getMeshBufferCount(); m++)
|
||||
|
@ -111,6 +111,7 @@ public:
|
||||
return m_force_field;
|
||||
}
|
||||
|
||||
bool isForceFieldSet() const { return m_force_field_set; }
|
||||
|
||||
const OverworldForceField& getForceField() const
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user