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_kart_mode = KM_END_ANIM;
|
||||||
m_controller->finishedRace(time);
|
m_controller->finishedRace(time);
|
||||||
race_manager->kartFinishedRace(this, time);
|
race_manager->kartFinishedRace(this, time);
|
||||||
|
|
||||||
|
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()));
|
setController(new EndController(this, m_controller->getPlayer()));
|
||||||
m_kart_properties->getKartModel()->setEndAnimation(true);
|
m_kart_properties->getKartModel()->setEndAnimation(true);
|
||||||
|
|
||||||
// Not all karts have a camera
|
// Not all karts have a camera
|
||||||
if(m_camera)
|
if (m_camera) m_camera->setMode(Camera::CM_REVERSE);
|
||||||
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
|
} // finishedRace
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
@ -53,6 +53,13 @@ void ThreeStrikesBattle::init()
|
|||||||
// no positions in this mode
|
// no positions in this mode
|
||||||
m_karts[n]->setPosition(-1);
|
m_karts[n]->setPosition(-1);
|
||||||
}// next kart
|
}// next kart
|
||||||
|
|
||||||
|
|
||||||
|
BattleEvent evt;
|
||||||
|
evt.m_time = 0.0f;
|
||||||
|
evt.m_kart_info = m_kart_info;
|
||||||
|
m_battle_events.push_back(evt);
|
||||||
|
|
||||||
} // ThreeStrikesBattle
|
} // ThreeStrikesBattle
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@ -70,6 +77,12 @@ void ThreeStrikesBattle::kartHit(const int kart_id)
|
|||||||
// make kart lose a life
|
// make kart lose a life
|
||||||
m_kart_info[kart_id].m_lives--;
|
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();
|
updateKartRanks();
|
||||||
|
|
||||||
// check if kart is 'dead'
|
// check if kart is 'dead'
|
||||||
@ -77,8 +90,6 @@ void ThreeStrikesBattle::kartHit(const int kart_id)
|
|||||||
{
|
{
|
||||||
m_karts[kart_id]->finishedRace(WorldStatus::getTime());
|
m_karts[kart_id]->finishedRace(WorldStatus::getTime());
|
||||||
removeKart(kart_id);
|
removeKart(kart_id);
|
||||||
// FIXME - what about end camera here??
|
|
||||||
// createEndCamera(kart_id)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const unsigned int NUM_KARTS = getNumKarts();
|
const unsigned int NUM_KARTS = getNumKarts();
|
||||||
@ -86,8 +97,7 @@ void ThreeStrikesBattle::kartHit(const int kart_id)
|
|||||||
|
|
||||||
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)
|
if (m_kart_info[n].m_lives > 1) num_karts_many_lives++;
|
||||||
num_karts_many_lives++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// when almost over, use fast music
|
// when almost over, use fast music
|
||||||
@ -168,6 +178,17 @@ bool ThreeStrikesBattle::isRaceOver()
|
|||||||
*/
|
*/
|
||||||
void ThreeStrikesBattle::terminateRace()
|
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();
|
updateKartRanks();
|
||||||
World::terminateRace();
|
World::terminateRace();
|
||||||
} // terminateRace
|
} // terminateRace
|
||||||
@ -186,6 +207,8 @@ void ThreeStrikesBattle::restartRace()
|
|||||||
// no positions in this mode
|
// no positions in this mode
|
||||||
m_karts[n]->setPosition(-1);
|
m_karts[n]->setPosition(-1);
|
||||||
}// next kart
|
}// next kart
|
||||||
|
|
||||||
|
m_battle_events.clear();
|
||||||
} // restartRace
|
} // restartRace
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
@ -42,6 +42,14 @@ private:
|
|||||||
|
|
||||||
public:
|
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();
|
ThreeStrikesBattle();
|
||||||
virtual ~ThreeStrikesBattle();
|
virtual ~ThreeStrikesBattle();
|
||||||
|
|
||||||
|
@ -561,27 +561,36 @@ Kart *World::getLocalPlayerKart(unsigned int n) const
|
|||||||
} // getLocalPlayerKart
|
} // getLocalPlayerKart
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
/** Called in follow-leader-mode to remove the last kart
|
/** Remove (eliminate) a kart from the race */
|
||||||
*/
|
void World::removeKart(int kart_number, bool notifyOfElimination)
|
||||||
void World::removeKart(int kart_number)
|
|
||||||
{
|
{
|
||||||
Kart *kart = m_karts[kart_number];
|
Kart *kart = m_karts[kart_number];
|
||||||
|
|
||||||
|
std::cout << "==== World::removeKart ====\n";
|
||||||
|
|
||||||
// Display a message about the eliminated kart in the race gui
|
// Display a message about the eliminated kart in the race gui
|
||||||
|
if (notifyOfElimination)
|
||||||
|
{
|
||||||
for (KartList::iterator i = m_karts.begin(); i != m_karts.end(); i++ )
|
for (KartList::iterator i = m_karts.begin(); i != m_karts.end(); i++ )
|
||||||
{
|
{
|
||||||
if(!(*i)->getCamera()) continue;
|
if(!(*i)->getCamera()) continue;
|
||||||
if(*i==kart)
|
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);
|
m_race_gui->addMessage(_("You have been\neliminated!"), *i, 2.0f, 60);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
std::cout << kart->getIdent().c_str() << " has been eliminated (i = " << (*i)->getIdent() << ")\n";
|
||||||
m_race_gui->addMessage(StringUtils::insertValues(_("'%s' has\nbeen eliminated."),
|
m_race_gui->addMessage(StringUtils::insertValues(_("'%s' has\nbeen eliminated."),
|
||||||
kart->getName().c_str()),
|
kart->getName().c_str()),
|
||||||
*i, 2.0f, 60);
|
*i, 2.0f, 60);
|
||||||
}
|
}
|
||||||
} // for i in kart
|
} // for i in kart
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "=========================\n";
|
||||||
|
|
||||||
if(kart->getController()->isPlayerController())
|
if(kart->getController()->isPlayerController())
|
||||||
{
|
{
|
||||||
// Change the camera so that it will be attached to the leader
|
// Change the camera so that it will be attached to the leader
|
||||||
|
@ -107,7 +107,7 @@ protected:
|
|||||||
|
|
||||||
void updateHighscores ();
|
void updateHighscores ();
|
||||||
void resetAllKarts ();
|
void resetAllKarts ();
|
||||||
void removeKart (int kart_number);
|
void removeKart (int kart_number, bool notifyOfElimination=true);
|
||||||
Controller*
|
Controller*
|
||||||
loadAIController (Kart *kart);
|
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
|
// First line of text somewhat under the top of the screen. For now
|
||||||
// start just under the timer display
|
// start just under the timer display
|
||||||
int y = (int)(scaling.Y*164 + UserConfigParams::m_height
|
int y = (int)(viewport.UpperLeftCorner.Y + 164*scaling.Y);
|
||||||
- viewport.LowerRightCorner.Y );
|
|
||||||
const int x = (viewport.LowerRightCorner.X - viewport.UpperLeftCorner.X)/2;
|
const int x = (viewport.LowerRightCorner.X - viewport.UpperLeftCorner.X)/2;
|
||||||
const int w = (viewport.LowerRightCorner.X + viewport.UpperLeftCorner.X)/2;
|
const int w = (viewport.LowerRightCorner.X + viewport.UpperLeftCorner.X)/2;
|
||||||
|
|
||||||
|
@ -56,10 +56,10 @@ private:
|
|||||||
class TimedMessage
|
class TimedMessage
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
irr::core::stringw m_message; // message to display
|
irr::core::stringw m_message; //!< message to display
|
||||||
float m_remaining_time; // time remaining before removing this message from screen
|
float m_remaining_time; //!< time remaining before removing this message from screen
|
||||||
video::SColor m_color; // color of message
|
video::SColor m_color; //!< color of message
|
||||||
int m_font_size; // size
|
int m_font_size; //!< size
|
||||||
const Kart *m_kart;
|
const Kart *m_kart;
|
||||||
// -----------------------------------------------------
|
// -----------------------------------------------------
|
||||||
// std::vector needs standard copy-ctor and std-assignment op.
|
// std::vector needs standard copy-ctor and std-assignment op.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user