Cleaning up kart selection. Assigns karts correctly in multiplayer. included some null pointer and bounds checks that were causing some

crashes, etc.



git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/irrlicht@3856 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
rforder 2009-08-13 22:53:24 +00:00
parent 3119dec5c2
commit 7a84273ec5
4 changed files with 37 additions and 12 deletions

View File

@ -534,6 +534,10 @@ void NetworkManager::worldLoaded()
*/
void NetworkManager::setupPlayerKartInfo()
{
// Not sure if this should be here, but without it extra uncontrolled
// human players accumulate after each race.
m_kart_info.clear();
// Get the local kart info
for(unsigned int i=0; i<race_manager->getNumLocalPlayers(); i++)
m_kart_info.push_back(race_manager->getLocalKartInfo(i));

View File

@ -152,7 +152,7 @@ namespace KartSelectionScreen
this->modelView->addModel( kartModel->getWheelModel(3), kartModel->getWheelGraphicsPosition(3) );
kartName = new LabelWidget();
kartName->m_properties[PROP_TEXT] = _("Tux");
kartName->m_properties[PROP_TEXT] = default_kart;
kartName->m_properties[PROP_TEXT_ALIGN] = "center";
kartName->m_properties[PROP_ID] = StringUtils::insert_values("@p%i_kartname", playerID);
kartName->x = kart_name_x;
@ -409,6 +409,7 @@ class KartHoverListener : public RibbonGridHoverListener
ModelViewWidget* w3 = g_player_karts[pKartIndex].modelView;
assert( w3 != NULL );
printf("%s\n", selectionID.c_str());
const KartProperties* kart = kart_properties_manager->getKart(selectionID);
if(kart == NULL) return;
KartModel* kartModel = kart->getKartModel();
@ -421,8 +422,8 @@ class KartHoverListener : public RibbonGridHoverListener
w3->addModel( kartModel->getWheelModel(3), kartModel->getWheelGraphicsPosition(3) );
w3->update(0);
g_player_karts[pKartIndex].kartName->setText( kart->getName().c_str() );
g_player_karts[pKartIndex].kartName->m_properties[PROP_TEXT] = selectionID;
g_player_karts[pKartIndex].kartName->setText( selectionID.c_str() );
}
};
KartHoverListener* karthoverListener = NULL;
@ -489,6 +490,13 @@ bool playerQuit(ActivePlayer* player)
{
int playerID = -1;
RibbonGridWidget* w = getCurrentScreen()->getWidget<RibbonGridWidget>("karts");
if (w == NULL )
{
std::cout << "playerQuit() called outside of kart selection screen.\n";
return false;
}
// If last player quits, return to main menu
if (g_player_karts.size() <= 1) return false;
@ -550,7 +558,7 @@ void menuEventKarts(Widget* widget, const std::string& name)
if(name == "tearDown")
{
//g_player_karts.clearWithoutDeleting();
//g_player_karts.clearAndDeleteAll();
g_player_karts.clearAndDeleteAll();
}
else if(name == "init")
{
@ -650,14 +658,13 @@ void menuEventKarts(Widget* widget, const std::string& name)
race_manager->setNumLocalPlayers( players.size() );
//g_player_karts.clearAndDeleteAll();
race_manager->setLocalKartInfo(0, w->getSelectionIDString());
// TODO : assign karts to other players too
for(int n=1; n<players.size(); n++)
//race_manager->setLocalKartInfo(0, w->getSelectionIDString());
for (int n = 0; n < g_player_karts.size(); n++)
{
race_manager->setLocalKartInfo(n, "tux");
race_manager->setLocalKartInfo(n, g_player_karts[n].kartName->m_properties[PROP_TEXT]);
}
//Return to assign mode
input_manager->getDeviceList()->setAssignMode(ASSIGN);
StateManager::get()->pushMenu("racesetup.stkgui");

View File

@ -249,8 +249,13 @@ void RaceGUI::drawPlayerIcons (const KartIconDisplayInfo* info)
video::ITexture *icon = kart->getKartProperties()->getIconMaterial()->getTexture();
int w = kart->isPlayerKart() ? ICON_PLAYER_WIDTH : ICON_WIDTH;
const core::rect<s32> pos(x, y, x+w, y+w);
const core::rect<s32> rect(core::position2d<s32>(0,0), icon->getOriginalSize());
irr_driver->getVideoDriver()->draw2DImage(icon, pos, rect, NULL, NULL, true);
// Fixes crash bug, why are certain icons not showing up?
if (icon != NULL)
{
const core::rect<s32> rect(core::position2d<s32>(0,0), icon->getOriginalSize());
irr_driver->getVideoDriver()->draw2DImage(icon, pos, rect, NULL, NULL, true);
}
} // next kart

View File

@ -62,7 +62,16 @@ ptr_vector<ActivePlayer, HOLD>& StateManager::getActivePlayers()
}
ActivePlayer* StateManager::getActivePlayer(const int id)
{
return m_active_players.get(id);
ActivePlayer *returnPlayer = NULL;
if (id < m_active_players.size() && id >= 0)
{
returnPlayer = m_active_players.get(id);
}
else
{
fprintf(stderr, "getActivePlayer(): id out of bounds\n");
}
return returnPlayer;
}
void StateManager::addActivePlayer(ActivePlayer* p)
{