3 strikes now has some ending instead of crashing (more to come)
git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@4838 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
parent
616a3b3719
commit
08c0d291fb
@ -467,11 +467,25 @@ void Kart::finishedRace(float time)
|
||||
m_kart_mode = KM_END_ANIM;
|
||||
m_controller->finishedRace(time);
|
||||
race_manager->kartFinishedRace(this, time);
|
||||
setController(new EndController(this, m_controller->getPlayer()));
|
||||
m_kart_properties->getKartModel()->setEndAnimation(true);
|
||||
// Not all karts have a camera
|
||||
if(m_camera)
|
||||
m_camera->setMode(Camera::CM_REVERSE);
|
||||
|
||||
if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_NORMAL_RACE ||
|
||||
race_manager->getMinorMode() == RaceManager::MINOR_MODE_TIME_TRIAL)
|
||||
{
|
||||
// in modes that support it, start end animation
|
||||
setController(new EndController(this, m_controller->getPlayer()));
|
||||
m_kart_properties->getKartModel()->setEndAnimation(true);
|
||||
|
||||
// Not all karts have a camera
|
||||
if (m_camera) m_camera->setMode(Camera::CM_REVERSE);
|
||||
}
|
||||
else if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_FOLLOW_LEADER)
|
||||
{
|
||||
//TODO: what to do on FTL end?
|
||||
}
|
||||
else if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_3_STRIKES)
|
||||
{
|
||||
}
|
||||
|
||||
} // finishedRace
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
@ -53,6 +53,13 @@ void ThreeStrikesBattle::init()
|
||||
// no positions in this mode
|
||||
m_karts[n]->setPosition(-1);
|
||||
}// next kart
|
||||
|
||||
|
||||
BattleEvent evt;
|
||||
evt.m_time = 0.0f;
|
||||
evt.m_kart_info = m_kart_info;
|
||||
m_battle_events.push_back(evt);
|
||||
|
||||
} // ThreeStrikesBattle
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@ -70,24 +77,27 @@ void ThreeStrikesBattle::kartHit(const int kart_id)
|
||||
// make kart lose a life
|
||||
m_kart_info[kart_id].m_lives--;
|
||||
|
||||
// record event
|
||||
BattleEvent evt;
|
||||
evt.m_time = getTime();
|
||||
evt.m_kart_info = m_kart_info;
|
||||
m_battle_events.push_back(evt);
|
||||
|
||||
updateKartRanks();
|
||||
|
||||
// check if kart is 'dead'
|
||||
if(m_kart_info[kart_id].m_lives < 1)
|
||||
if (m_kart_info[kart_id].m_lives < 1)
|
||||
{
|
||||
m_karts[kart_id]->finishedRace(WorldStatus::getTime());
|
||||
removeKart(kart_id);
|
||||
// FIXME - what about end camera here??
|
||||
// createEndCamera(kart_id)
|
||||
}
|
||||
|
||||
const unsigned int NUM_KARTS = getNumKarts();
|
||||
int num_karts_many_lives = 0;
|
||||
|
||||
for( unsigned int n = 0; n < NUM_KARTS; ++n )
|
||||
for (unsigned int n = 0; n < NUM_KARTS; ++n)
|
||||
{
|
||||
if (m_kart_info[n].m_lives > 1)
|
||||
num_karts_many_lives++;
|
||||
if (m_kart_info[n].m_lives > 1) num_karts_many_lives++;
|
||||
}
|
||||
|
||||
// when almost over, use fast music
|
||||
@ -168,6 +178,17 @@ bool ThreeStrikesBattle::isRaceOver()
|
||||
*/
|
||||
void ThreeStrikesBattle::terminateRace()
|
||||
{
|
||||
for (unsigned int n=0; n<m_battle_events.size(); n++)
|
||||
{
|
||||
const float time = m_battle_events[n].m_time;
|
||||
printf("At time %f :\n", time);
|
||||
|
||||
for (unsigned int k=0; k<m_battle_events[n].m_kart_info.size(); k++)
|
||||
{
|
||||
printf(" kart %s had %i lives\n", m_karts[k]->getIdent().c_str(), m_battle_events[n].m_kart_info[k].m_lives);
|
||||
}
|
||||
}
|
||||
|
||||
updateKartRanks();
|
||||
World::terminateRace();
|
||||
} // terminateRace
|
||||
@ -186,6 +207,8 @@ void ThreeStrikesBattle::restartRace()
|
||||
// no positions in this mode
|
||||
m_karts[n]->setPosition(-1);
|
||||
}// next kart
|
||||
|
||||
m_battle_events.clear();
|
||||
} // restartRace
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
@ -41,7 +41,15 @@ private:
|
||||
std::vector<BattleInfo> m_kart_info;
|
||||
|
||||
public:
|
||||
|
||||
|
||||
/** Used to show a nice graph when battle is over */
|
||||
struct BattleEvent
|
||||
{
|
||||
float m_time;
|
||||
std::vector<BattleInfo> m_kart_info;
|
||||
};
|
||||
std::vector<BattleEvent> m_battle_events;
|
||||
|
||||
ThreeStrikesBattle();
|
||||
virtual ~ThreeStrikesBattle();
|
||||
|
||||
|
@ -561,27 +561,36 @@ Kart *World::getLocalPlayerKart(unsigned int n) const
|
||||
} // getLocalPlayerKart
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/** Called in follow-leader-mode to remove the last kart
|
||||
*/
|
||||
void World::removeKart(int kart_number)
|
||||
/** Remove (eliminate) a kart from the race */
|
||||
void World::removeKart(int kart_number, bool notifyOfElimination)
|
||||
{
|
||||
Kart *kart = m_karts[kart_number];
|
||||
|
||||
std::cout << "==== World::removeKart ====\n";
|
||||
|
||||
// Display a message about the eliminated kart in the race gui
|
||||
for (KartList::iterator i = m_karts.begin(); i != m_karts.end(); i++ )
|
||||
if (notifyOfElimination)
|
||||
{
|
||||
if(!(*i)->getCamera()) continue;
|
||||
if(*i==kart)
|
||||
for (KartList::iterator i = m_karts.begin(); i != m_karts.end(); i++ )
|
||||
{
|
||||
m_race_gui->addMessage(_("You have been\neliminated!"), *i, 2.0f, 60);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_race_gui->addMessage(StringUtils::insertValues(_("'%s' has\nbeen eliminated."),
|
||||
kart->getName().c_str()),
|
||||
*i, 2.0f, 60);
|
||||
}
|
||||
} // for i in kart
|
||||
if(!(*i)->getCamera()) continue;
|
||||
if(*i==kart)
|
||||
{
|
||||
std::cout << "You have been eliminated (i = " << (*i)->getIdent() << ")\n";
|
||||
m_race_gui->addMessage(_("You have been\neliminated!"), *i, 2.0f, 60);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout << kart->getIdent().c_str() << " has been eliminated (i = " << (*i)->getIdent() << ")\n";
|
||||
m_race_gui->addMessage(StringUtils::insertValues(_("'%s' has\nbeen eliminated."),
|
||||
kart->getName().c_str()),
|
||||
*i, 2.0f, 60);
|
||||
}
|
||||
} // for i in kart
|
||||
}
|
||||
|
||||
std::cout << "=========================\n";
|
||||
|
||||
if(kart->getController()->isPlayerController())
|
||||
{
|
||||
// Change the camera so that it will be attached to the leader
|
||||
|
@ -107,7 +107,7 @@ protected:
|
||||
|
||||
void updateHighscores ();
|
||||
void resetAllKarts ();
|
||||
void removeKart (int kart_number);
|
||||
void removeKart (int kart_number, bool notifyOfElimination=true);
|
||||
Controller*
|
||||
loadAIController (Kart *kart);
|
||||
|
||||
|
@ -649,8 +649,7 @@ void RaceGUI::drawAllMessages(const Kart* kart,
|
||||
|
||||
// First line of text somewhat under the top of the screen. For now
|
||||
// start just under the timer display
|
||||
int y = (int)(scaling.Y*164 + UserConfigParams::m_height
|
||||
- viewport.LowerRightCorner.Y );
|
||||
int y = (int)(viewport.UpperLeftCorner.Y + 164*scaling.Y);
|
||||
const int x = (viewport.LowerRightCorner.X - viewport.UpperLeftCorner.X)/2;
|
||||
const int w = (viewport.LowerRightCorner.X + viewport.UpperLeftCorner.X)/2;
|
||||
|
||||
|
@ -56,10 +56,10 @@ private:
|
||||
class TimedMessage
|
||||
{
|
||||
public:
|
||||
irr::core::stringw m_message; // message to display
|
||||
float m_remaining_time; // time remaining before removing this message from screen
|
||||
video::SColor m_color; // color of message
|
||||
int m_font_size; // size
|
||||
irr::core::stringw m_message; //!< message to display
|
||||
float m_remaining_time; //!< time remaining before removing this message from screen
|
||||
video::SColor m_color; //!< color of message
|
||||
int m_font_size; //!< size
|
||||
const Kart *m_kart;
|
||||
// -----------------------------------------------------
|
||||
// std::vector needs standard copy-ctor and std-assignment op.
|
||||
|
Loading…
x
Reference in New Issue
Block a user