only one saved GP per GP-ident
Conflicts: src/graphics/glwrap.cpp
This commit is contained in:
parent
9dff5a7990
commit
ae24c6b40f
@ -143,29 +143,27 @@ void SavedGrandPrix::setKarts(const std::vector<RaceManager::KartStatus> &kart_l
|
||||
//------------------------------------------------------------------------------
|
||||
void SavedGrandPrix::loadKarts(std::vector<RaceManager::KartStatus> & kart_list)
|
||||
{
|
||||
//Fix aikarts
|
||||
int aikarts = 0;
|
||||
for(unsigned int i = 0; i < m_karts.size(); i++)
|
||||
{
|
||||
const KartProperties *kp = kart_properties_manager->getKart(m_karts[i].m_ident);
|
||||
|
||||
if(m_karts[i].m_local_player_id == -1)
|
||||
if(m_karts[i].m_local_player_id == -1) // AI kart
|
||||
{
|
||||
//AI kart found
|
||||
if(kp) kart_list[aikarts].m_ident = m_karts[i].m_ident;
|
||||
kart_list[aikarts].m_score = m_karts[i].m_score;
|
||||
kart_list[aikarts].m_score = m_karts[i].m_score;
|
||||
kart_list[aikarts].m_overall_time = m_karts[i].m_overall_time;
|
||||
aikarts++;
|
||||
}
|
||||
else
|
||||
{
|
||||
//Get correct player
|
||||
// Get correct player
|
||||
for(unsigned int x = kart_list.size()-m_player_karts;
|
||||
x < kart_list.size(); x++)
|
||||
{
|
||||
if(kart_list[x].m_local_player_id == m_karts[i].m_local_player_id)
|
||||
{
|
||||
kart_list[x].m_score = m_karts[i].m_score;
|
||||
kart_list[x].m_score = m_karts[i].m_score;
|
||||
kart_list[x].m_overall_time = m_karts[i].m_overall_time;
|
||||
} // if kart_list[x].m_local_player_id == m_karts[i].,_local
|
||||
} // for x
|
||||
|
@ -135,25 +135,19 @@ public:
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
/** Finds the right SavedGrandPrix given the specified data, or
|
||||
* NULL if no matching GP was found.
|
||||
*/
|
||||
* NULL if no matching GP was found. */
|
||||
static SavedGrandPrix* getSavedGP(unsigned int player,
|
||||
const std::string &gpid,
|
||||
int difficulty, int total_karts,
|
||||
int player_karts)
|
||||
const std::string &gpid,
|
||||
const unsigned int number_of_players)
|
||||
{
|
||||
for (unsigned int n=0; n<UserConfigParams::m_saved_grand_prix_list.size(); n++)
|
||||
{
|
||||
SavedGrandPrix* gp = &UserConfigParams::m_saved_grand_prix_list[n];
|
||||
|
||||
if ((gp->getGPID() == gpid) &&
|
||||
(gp->getPlayerID() == player) &&
|
||||
(gp->getDifficulty() == difficulty) &&
|
||||
(gp->getTotalKarts() == total_karts) &&
|
||||
(gp->getPlayerKarts() == player_karts)){
|
||||
if (gp->getGPID() == gpid &&
|
||||
gp->getPlayerID() == player &&
|
||||
gp->getPlayerKarts() == (int)number_of_players)
|
||||
return gp;
|
||||
} // if
|
||||
} // for n
|
||||
}
|
||||
return NULL;
|
||||
} // getSavedGP
|
||||
// ------------------------------------------------------------------------
|
||||
|
@ -279,15 +279,38 @@ void RaceManager::computeRandomKartList()
|
||||
void RaceManager::startNew(bool from_overworld)
|
||||
{
|
||||
m_started_from_overworld = from_overworld;
|
||||
m_saved_gp = NULL; // There will be checks for this being NULL done later
|
||||
|
||||
if(m_major_mode==MAJOR_MODE_GRAND_PRIX)
|
||||
if (m_major_mode==MAJOR_MODE_GRAND_PRIX)
|
||||
{
|
||||
// GP: get tracks, laps and reverse info from grand prix
|
||||
m_tracks = m_grand_prix.getTrackNames();
|
||||
m_num_laps = m_grand_prix.getLaps();
|
||||
m_reverse_track = m_grand_prix.getReverse();
|
||||
|
||||
// Saved GP only in offline mode
|
||||
if (m_continue_saved_gp && !NetworkWorld::getInstance<NetworkWorld>()->isRunning())
|
||||
{
|
||||
// We look if Player 1 has a saved version of this GP.
|
||||
m_saved_gp = SavedGrandPrix::getSavedGP(
|
||||
StateManager::get()
|
||||
->getActivePlayerProfile(0)
|
||||
->getUniqueID(),
|
||||
m_grand_prix.getId(),
|
||||
m_player_karts.size());
|
||||
|
||||
if (m_saved_gp == NULL)
|
||||
{
|
||||
Log::error("Race Manager", "Can not continue Grand Prix '%s'"
|
||||
"because it could not exist",
|
||||
m_grand_prix.getId().c_str());
|
||||
m_continue_saved_gp = false; // simple and working
|
||||
} else {
|
||||
setNumKarts(m_saved_gp->getTotalKarts());
|
||||
setupPlayerKartInfo();
|
||||
}
|
||||
}
|
||||
}
|
||||
//assert(m_player_karts.size() > 0);
|
||||
|
||||
// command line parameters: negative numbers=all karts
|
||||
if(m_num_karts < 0 ) m_num_karts = stk_config->m_max_karts;
|
||||
@ -308,8 +331,8 @@ void RaceManager::startNew(bool from_overworld)
|
||||
race_manager->getMinorMode()==RaceManager::MINOR_MODE_FOLLOW_LEADER
|
||||
? -1
|
||||
: 0;
|
||||
const unsigned int ai_kart_count = (unsigned int) m_ai_kart_list.size();
|
||||
for(unsigned int i=0; i<ai_kart_count; i++)
|
||||
const unsigned int ai_kart_count = m_ai_kart_list.size();
|
||||
for(unsigned int i = 0; i < ai_kart_count; i++)
|
||||
{
|
||||
m_kart_status.push_back(KartStatus(m_ai_kart_list[i], i, -1, -1,
|
||||
init_gp_rank, KT_AI));
|
||||
@ -323,7 +346,7 @@ void RaceManager::startNew(bool from_overworld)
|
||||
|
||||
// Then the players, which start behind the AI karts
|
||||
// -------------------------------------------------
|
||||
for(unsigned int i=0; i<(unsigned int)m_player_karts.size(); i++)
|
||||
for(unsigned int i = 0; i < m_player_karts.size(); i++)
|
||||
{
|
||||
KartType kt= m_player_karts[i].isNetworkPlayer() ? KT_NETWORK_PLAYER : KT_PLAYER;
|
||||
m_kart_status.push_back(KartStatus(m_player_karts[i].getKartName(), i,
|
||||
@ -339,35 +362,20 @@ void RaceManager::startNew(bool from_overworld)
|
||||
init_gp_rank ++;
|
||||
}
|
||||
|
||||
m_track_number = 0;
|
||||
if(m_major_mode==MAJOR_MODE_GRAND_PRIX &&
|
||||
!NetworkWorld::getInstance<NetworkWorld>()->isRunning()) // offline mode only
|
||||
if (MAJOR_MODE_GRAND_PRIX)
|
||||
{
|
||||
//We look if Player 1 has a saved version of this GP.
|
||||
// =================================================
|
||||
SavedGrandPrix* gp = SavedGrandPrix::getSavedGP( StateManager::get()
|
||||
->getActivePlayerProfile(0)
|
||||
->getUniqueID(),
|
||||
m_grand_prix.getId(),
|
||||
m_difficulty,
|
||||
m_num_karts,
|
||||
(int)m_player_karts.size());
|
||||
|
||||
// Start the race with the appropriate track
|
||||
// =========================================
|
||||
if(gp != NULL)
|
||||
if (m_continue_saved_gp)
|
||||
{
|
||||
if (m_continue_saved_gp)
|
||||
{
|
||||
m_track_number = gp->getNextTrack();
|
||||
gp->loadKarts(m_kart_status);
|
||||
}
|
||||
else
|
||||
{
|
||||
gp->remove();
|
||||
}
|
||||
m_track_number = m_saved_gp->getNextTrack();
|
||||
m_saved_gp->loadKarts(m_kart_status);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_track_number = 0;
|
||||
m_saved_gp->remove();
|
||||
}
|
||||
}
|
||||
|
||||
startNextRace();
|
||||
} // startNew
|
||||
|
||||
@ -493,25 +501,16 @@ void RaceManager::next()
|
||||
{
|
||||
if(m_major_mode==MAJOR_MODE_GRAND_PRIX && !NetworkWorld::getInstance()->isRunning())
|
||||
{
|
||||
//Saving GP state
|
||||
//We look if Player 1 has already saved this GP.
|
||||
SavedGrandPrix* gp =
|
||||
SavedGrandPrix::getSavedGP(StateManager::get()
|
||||
->getActivePlayerProfile(0)
|
||||
->getUniqueID(),
|
||||
m_grand_prix.getId(),
|
||||
m_difficulty,
|
||||
m_num_karts,
|
||||
(int)m_player_karts.size());
|
||||
if(gp != NULL)
|
||||
// Saving GP state
|
||||
// If Player 1 has already saved a GP, we adapt it
|
||||
if(m_saved_gp != NULL)
|
||||
{
|
||||
//if so addept it
|
||||
gp->setKarts(m_kart_status);
|
||||
gp->setNextTrack(m_track_number);
|
||||
m_saved_gp->setKarts(m_kart_status);
|
||||
m_saved_gp->setNextTrack(m_track_number);
|
||||
}
|
||||
else
|
||||
{
|
||||
//create a new entry
|
||||
// Otherwise we create a new entry
|
||||
UserConfigParams::m_saved_grand_prix_list.push_back(
|
||||
new SavedGrandPrix(
|
||||
StateManager::get()->getActivePlayerProfile(0)
|
||||
@ -630,16 +629,8 @@ void RaceManager::exitRace(bool delete_world)
|
||||
PlayerManager::getCurrentPlayer()->grandPrixFinished();
|
||||
if(m_major_mode==MAJOR_MODE_GRAND_PRIX&& !NetworkWorld::getInstance()->isRunning())
|
||||
{
|
||||
//Delete saved GP
|
||||
SavedGrandPrix* gp =
|
||||
SavedGrandPrix::getSavedGP(StateManager::get()
|
||||
->getActivePlayerProfile(0)
|
||||
->getUniqueID(),
|
||||
m_grand_prix.getId(),
|
||||
m_difficulty,
|
||||
m_num_karts,
|
||||
(int)m_player_karts.size());
|
||||
if(gp != NULL) gp->remove();
|
||||
if(m_saved_gp != NULL)
|
||||
m_saved_gp->remove();
|
||||
}
|
||||
StateManager::get()->resetAndGoToScreen( MainMenuScreen::getInstance() );
|
||||
|
||||
@ -717,6 +708,7 @@ void RaceManager::exitRace(bool delete_world)
|
||||
|
||||
if (delete_world) World::deleteWorld();
|
||||
|
||||
m_saved_gp = NULL;
|
||||
m_track_number = 0;
|
||||
} // exitRace
|
||||
|
||||
@ -766,7 +758,6 @@ void RaceManager::startGP(const GrandPrixData &gp, bool from_overworld,
|
||||
{
|
||||
StateManager::get()->enterGameState();
|
||||
setGrandPrix(gp);
|
||||
setCoinTarget( 0 ); // Might still be set from a previous challenge
|
||||
race_manager->setupPlayerKartInfo();
|
||||
m_continue_saved_gp = continue_saved_gp;
|
||||
|
||||
|
@ -36,6 +36,7 @@
|
||||
#include "utils/vec3.hpp"
|
||||
|
||||
class AbstractKart;
|
||||
class SavedGrandPrix;
|
||||
class Track;
|
||||
|
||||
static const std::string IDENT_STD ("STANDARD" );
|
||||
@ -326,6 +327,7 @@ private:
|
||||
std::vector<std::string> m_ai_kart_list;
|
||||
int m_track_number;
|
||||
GrandPrixData m_grand_prix;
|
||||
SavedGrandPrix* m_saved_gp;
|
||||
int m_num_karts;
|
||||
unsigned int m_num_finished_karts;
|
||||
unsigned int m_num_finished_players;
|
||||
@ -410,11 +412,13 @@ public:
|
||||
*/
|
||||
void setDifficulty(Difficulty diff);
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
void setCoinTarget(int num) { m_coin_target = num; }
|
||||
// ------------------------------------------------------------------------
|
||||
void setGrandPrix(const GrandPrixData &gp)
|
||||
{
|
||||
m_grand_prix = gp;
|
||||
m_coin_target = 0;
|
||||
setCoinTarget(0);
|
||||
}
|
||||
// ------------------------------------------------------------------------
|
||||
void setAIKartOverride(const std::string& kart)
|
||||
@ -453,8 +457,6 @@ public:
|
||||
m_ai_superpower = SUPERPOWER_NONE;
|
||||
}
|
||||
// ------------------------------------------------------------------------
|
||||
void setCoinTarget(int num) { m_coin_target = num; }
|
||||
// ------------------------------------------------------------------------
|
||||
void setTimeTarget(float num) { m_has_time_target = true;
|
||||
m_time_target = num; }
|
||||
/** \} */
|
||||
|
@ -203,8 +203,6 @@ void GPInfoDialog::addButtons()
|
||||
->getActivePlayerProfile(0)
|
||||
->getUniqueID(),
|
||||
m_gp.getId(),
|
||||
race_manager->getDifficulty(),
|
||||
race_manager->getNumberOfKarts(),
|
||||
race_manager->getNumLocalPlayers());
|
||||
|
||||
okBtn->m_properties[PROP_ID] = "start";
|
||||
|
@ -81,7 +81,7 @@ void GPInfoScreen::loadedFromFile()
|
||||
// Only init the number of tracks here, this way the previously selected
|
||||
// number of tracks will be the default.
|
||||
m_num_tracks_spinner->setValue(1);
|
||||
|
||||
|
||||
m_ai_kart_spinner = getWidget<SpinnerWidget>("ai-spinner");
|
||||
} // loadedFromFile
|
||||
|
||||
@ -97,14 +97,14 @@ void GPInfoScreen::setGP(const std::string &gp_ident)
|
||||
{
|
||||
// Doesn't matter what kind of GP we create, it just gets the
|
||||
// right id ("random").
|
||||
m_gp.createRandomGP(1, "standard",
|
||||
m_gp.createRandomGP(1, "standard",
|
||||
m_reverse_spinner ? getReverse()
|
||||
: GrandPrixData::GP_NO_REVERSE);
|
||||
}
|
||||
} // setGP
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
/** Converts the currently selected reverse status into a value of type
|
||||
/** Converts the currently selected reverse status into a value of type
|
||||
* GPReverseType .
|
||||
*/
|
||||
GrandPrixData::GPReverseType GPInfoScreen::getReverse() const
|
||||
@ -130,8 +130,6 @@ void GPInfoScreen::beforeAddingWidget()
|
||||
SavedGrandPrix* saved_gp = SavedGrandPrix::getSavedGP(
|
||||
StateManager::get()->getActivePlayerProfile(0)->getUniqueID(),
|
||||
m_gp.getId(),
|
||||
race_manager->getDifficulty(),
|
||||
race_manager->getNumberOfKarts(),
|
||||
race_manager->getNumLocalPlayers());
|
||||
|
||||
RibbonWidget* ribbonButtons = getWidget<RibbonWidget>("buttons");
|
||||
@ -194,10 +192,10 @@ void GPInfoScreen::init()
|
||||
else
|
||||
m_group_name = stringc(m_group_spinner->getStringValue().c_str()).c_str();
|
||||
|
||||
// If there are more tracks selected atm as in the group (which can
|
||||
// If there are more tracks selected atm as in the group (which can
|
||||
// happen if the group has been changed since last time this screen
|
||||
// was shown), adjust it:
|
||||
int max_num_tracks = m_group_name=="all"
|
||||
int max_num_tracks = m_group_name=="all"
|
||||
? track_manager->getNumberOfRaceTracks()
|
||||
: (int)track_manager->getTracksInGroup(m_group_name).size();
|
||||
m_num_tracks_spinner->setMax(max_num_tracks);
|
||||
@ -207,7 +205,7 @@ void GPInfoScreen::init()
|
||||
}
|
||||
|
||||
// Now create the random GP:
|
||||
m_gp.createRandomGP(m_num_tracks_spinner->getValue(),
|
||||
m_gp.createRandomGP(m_num_tracks_spinner->getValue(),
|
||||
m_group_name, getReverse(), true);
|
||||
}
|
||||
else
|
||||
@ -215,7 +213,7 @@ void GPInfoScreen::init()
|
||||
getWidget<LabelWidget>("name")->setText(m_gp.getName(), false);
|
||||
m_gp.checkConsistency();
|
||||
}
|
||||
|
||||
|
||||
// Number of AIs
|
||||
// -------------
|
||||
const bool has_AI = race_manager->hasAI();
|
||||
@ -288,7 +286,7 @@ void GPInfoScreen::addScreenshot()
|
||||
m_screenshot_widget->m_h = screenshot_div->m_h;
|
||||
|
||||
|
||||
// Temporary icon, will replace it just after
|
||||
// Temporary icon, will replace it just after
|
||||
// (but it will be shown if the given icon is not found)
|
||||
m_screenshot_widget->m_properties[PROP_ICON] = "gui/main_help.png";
|
||||
m_screenshot_widget->add();
|
||||
@ -336,7 +334,7 @@ void GPInfoScreen::eventCallback(Widget *, const std::string &name,
|
||||
// the current track. The current value in the Number-of-tracks-spinner
|
||||
// has to be updated, since otherwise the displayed (and used) value
|
||||
// can be bigger than the maximum. (Might be a TODO to fix this)
|
||||
int max_num_tracks = m_group_name=="all"
|
||||
int max_num_tracks = m_group_name=="all"
|
||||
? track_manager->getNumberOfRaceTracks()
|
||||
: (int)track_manager->getTracksInGroup(m_group_name).size();
|
||||
m_num_tracks_spinner->setMax(max_num_tracks);
|
||||
@ -344,7 +342,7 @@ void GPInfoScreen::eventCallback(Widget *, const std::string &name,
|
||||
m_num_tracks_spinner->setValue(max_num_tracks);
|
||||
// Create a new (i.e. with new tracks) random gp, since the old
|
||||
// tracks might not all belong to the newly selected group.
|
||||
|
||||
|
||||
m_gp.createRandomGP(m_num_tracks_spinner->getValue(), m_group_name,
|
||||
getReverse(), /*new_tracks*/true);
|
||||
addTracks();
|
||||
@ -359,7 +357,7 @@ void GPInfoScreen::eventCallback(Widget *, const std::string &name,
|
||||
const int num_ai = m_ai_kart_spinner->getValue();
|
||||
race_manager->setNumKarts( race_manager->getNumLocalPlayers() + num_ai );
|
||||
UserConfigParams::m_num_karts = race_manager->getNumLocalPlayers() + num_ai;
|
||||
|
||||
|
||||
//Redraw scene because available buttons depend on current settings
|
||||
getWidget<RibbonWidget>("buttons")->setSelection(0, PLAYER_ID_GAME_MASTER);
|
||||
reshowCurrentScreen();
|
||||
|
Loading…
x
Reference in New Issue
Block a user