In 3 strikes you now have only 2 spare tires, to be more logical. And when you lose you actually lose your wheels.

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@9763 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
auria
2011-09-05 23:21:21 +00:00
parent 13de49b5ee
commit 2d6cb641c5
7 changed files with 36 additions and 27 deletions

View File

@@ -81,16 +81,26 @@ void EmergencyAnimation::reset()
/** Eliminates a kart from the race. It removes the kart from the physics
* world, and makes the scene node invisible.
*/
void EmergencyAnimation::eliminate()
void EmergencyAnimation::eliminate(bool remove)
{
if (!playingEmergencyAnimation())
if (!playingEmergencyAnimation() && remove)
{
World::getWorld()->getPhysics()->removeKart(m_kart);
}
if (m_stars_effect)
{
m_stars_effect->reset();
m_stars_effect->update(1);
}
m_eliminated = true;
m_kart_mode = EA_NONE;
m_kart->getNode()->setVisible(false);
if (remove)
{
m_kart->getNode()->setVisible(false);
}
} // eliminate
//-----------------------------------------------------------------------------

View File

@@ -98,7 +98,7 @@ public:
bool isEliminated () const {return m_eliminated;}
/** Returns a pointer to the stars effect. */
const Stars *getStarEffect () const {return m_stars_effect; }
void eliminate ();
void eliminate (bool remove);
}; // EmergencyAnimation
#endif

View File

@@ -577,6 +577,13 @@ void Kart::reset()
if(m_controller)
m_controller->reset();
// 3 strikes mode can hide the wheels
scene::ISceneNode** wheels = getKartModel()->getWheelNodes();
wheels[0]->setVisible(true);
wheels[1]->setVisible(true);
wheels[2]->setVisible(true);
wheels[3]->setVisible(true);
} // reset
//-----------------------------------------------------------------------------
@@ -757,7 +764,8 @@ void Kart::update(float dt)
{
if (m_eliminated)
{
getNode()->setVisible(false);
printf("a\n");
EmergencyAnimation::update(dt);
return;
}

View File

@@ -91,7 +91,7 @@ void FollowTheLeaderRace::countdownReachedZero()
printf("[ftl] Eliminiating kart '%s' at position %d.\n",
kart->getIdent().c_str(), position_to_remove);
}
removeKart(kart->getWorldKartId());
eliminateKart(kart->getWorldKartId());
// In case that the kart on position 1 was removed, we have
// to set the correct position (which equals the remaining

View File

@@ -97,22 +97,16 @@ void ThreeStrikesBattle::kartAdded(Kart* kart, scene::ISceneNode* node)
float coord = -kart->getKartLength()*0.5f;
scene::IMeshSceneNode* tire_node = irr_driver->addMesh(m_tire, node);
tire_node->setPosition(core::vector3df(0.0f, 0.55f, coord - 0.25f));
tire_node->setPosition(core::vector3df(-0.15f, 0.3f, coord - 0.21f));
tire_node->setScale(core::vector3df(0.4f, 0.4f, 0.4f));
tire_node->setRotation(core::vector3df(90.0f, 0.0f, 0.0f));
tire_node->setName("tire1");
tire_node = irr_driver->addMesh(m_tire, node);
tire_node->setPosition(core::vector3df(-0.2f, 0.3f, coord - 0.3f));
tire_node->setPosition(core::vector3df(0.15f, 0.3f, coord - 0.21f));
tire_node->setScale(core::vector3df(0.4f, 0.4f, 0.4f));
tire_node->setRotation(core::vector3df(90.0f, 0.0f, 0.0f));
tire_node->setName("tire2");
tire_node = irr_driver->addMesh(m_tire, node);
tire_node->setPosition(core::vector3df(0.2f, 0.3f, coord - 0.3f));
tire_node->setScale(core::vector3df(0.4f, 0.4f, 0.4f));
tire_node->setRotation(core::vector3df(90.0f, 0.0f, 0.0f));
tire_node->setName("tire3");
}
//-----------------------------------------------------------------------------
@@ -136,7 +130,12 @@ void ThreeStrikesBattle::kartHit(const int kart_id)
if (m_kart_info[kart_id].m_lives < 1)
{
m_karts[kart_id]->finishedRace(WorldStatus::getTime());
removeKart(kart_id);
scene::ISceneNode** wheels = m_karts[kart_id]->getKartModel()->getWheelNodes();
wheels[0]->setVisible(false);
wheels[1]->setVisible(false);
wheels[2]->setVisible(false);
wheels[3]->setVisible(false);
eliminateKart(kart_id, true, false);
}
const unsigned int NUM_KARTS = getNumKarts();
@@ -170,10 +169,6 @@ void ThreeStrikesBattle::kartHit(const int kart_id)
{
curr->setVisible(m_kart_info[kart_id].m_lives >= 2);
}
else if (core::stringc(curr->getName()) == "tire3")
{
curr->setVisible(m_kart_info[kart_id].m_lives >= 1);
}
}
// schedule a tire to be thrown away (but can't do it in this callback
@@ -326,10 +321,6 @@ void ThreeStrikesBattle::restartRace()
{
curr->setVisible(true);
}
else if (core::stringc(curr->getName()) == "tire3")
{
curr->setVisible(true);
}
}
}// next kart

View File

@@ -778,7 +778,7 @@ Kart *World::getLocalPlayerKart(unsigned int n) const
//-----------------------------------------------------------------------------
/** Remove (eliminate) a kart from the race */
void World::removeKart(int kart_number, bool notifyOfElimination)
void World::eliminateKart(int kart_number, bool notifyOfElimination, bool remove)
{
Kart *kart = m_karts[kart_number];
@@ -814,7 +814,7 @@ void World::removeKart(int kart_number, bool notifyOfElimination)
// ignored in all loops). Important:world->getCurrentNumKarts() returns
// the number of karts still racing. This value can not be used for loops
// over all karts, use race_manager->getNumKarts() instead!
kart->eliminate();
kart->eliminate(remove);
m_eliminated_karts++;
} // removeKart

View File

@@ -86,7 +86,7 @@ protected:
void updateHighscores (int* best_highscore_rank, int* best_finish_time, std::string* highscore_who,
StateManager::ActivePlayer** best_player);
void resetAllKarts ();
void removeKart (int kart_number, bool notifyOfElimination=true);
void eliminateKart (int kart_number, bool notifyOfElimination=true, bool remove=true);
Controller*
loadAIController (Kart *kart);