20
20
#include "karts/kart_properties_manager.hpp"
23
22
#include <algorithm>
26
#include "file_manager.hpp"
27
#include "stk_config.hpp"
28
#include "user_config.hpp"
29
27
#include "challenges/unlock_manager.hpp"
28
#include "config/stk_config.hpp"
29
#include "config/user_config.hpp"
30
#include "graphics/irr_driver.hpp"
31
#include "guiengine/engine.hpp"
32
#include "io/file_manager.hpp"
30
33
#include "karts/kart_properties.hpp"
31
34
#include "utils/string_utils.hpp"
33
36
KartPropertiesManager *kart_properties_manager=0;
38
std::vector<std::string> KartPropertiesManager::m_kart_search_path;
40
/** Constructor, only clears internal data structures. */
35
41
KartPropertiesManager::KartPropertiesManager()
37
43
m_all_groups.clear();
38
44
} // KartPropertiesManager
40
46
//-----------------------------------------------------------------------------
47
/** Destructor. Removes all allocated data.
41
49
KartPropertiesManager::~KartPropertiesManager()
43
51
for(KartPropertiesVector::iterator i = m_karts_properties.begin();
61
80
m_karts_properties.clear();
62
callback_manager->clear(CB_KART);
81
m_selected_karts.clear();
82
m_kart_available.clear();
85
m_kart_search_path.clear();
63
86
} // removeTextures
65
88
//-----------------------------------------------------------------------------
66
void KartPropertiesManager::loadKartData(bool dont_load_models)
68
std::set<std::string> result;
69
file_manager->listFiles(result, file_manager->getKartDir(),
70
/*is_full_path*/ true);
72
// Find out which characters are available and load them
73
for(std::set<std::string>::iterator i = result.begin();
74
i != result.end(); ++i)
76
std::string kart_file;
79
kart_file = file_manager->getKartFile((*i)+".kart");
81
catch (std::exception& e)
83
(void)e; // remove warning about unused variable
86
FILE *f=fopen(kart_file.c_str(),"r");
89
KartProperties* kp = new KartProperties();
90
kp->load(kart_file, "tuxkart-kart", dont_load_models);
92
// If the version of the kart file is not supported,
93
// ignore this .kart file
94
if(kp->getVersion()<stk_config->m_min_kart_version ||
95
kp->getVersion()>stk_config->m_max_kart_version)
97
fprintf(stderr, "Warning: kart '%s' is not supported by this binary, ignored.\n",
98
kp->getIdent().c_str());
103
m_karts_properties.push_back(kp);
104
m_kart_available.push_back(true);
105
const std::vector<std::string>& groups=kp->getGroups();
106
for(unsigned int g=0; g<groups.size(); g++)
108
if(m_groups.find(groups[g])==m_groups.end())
89
void KartPropertiesManager::reLoadAllKarts()
91
for(KartPropertiesVector::iterator i = m_karts_properties.begin();
92
i != m_karts_properties.end(); ++i)
96
m_karts_properties.clear();
97
m_selected_karts.clear();
98
m_kart_available.clear();
100
m_all_groups.clear();
101
//m_kart_search_path.clear();
104
//-----------------------------------------------------------------------------
105
/** Loads all kart properties and models.
107
void KartPropertiesManager::loadAllKarts(bool loading_icon)
109
m_all_kart_dirs.clear();
110
for(std::vector<std::string>::const_iterator dir=m_kart_search_path.begin();
111
dir!=m_kart_search_path.end(); dir++)
113
// First check if there is a kart in the current directory
114
// -------------------------------------------------------
115
if(loadKart(*dir)) continue;
117
// If not, check each subdir of this directory.
118
// --------------------------------------------
119
std::set<std::string> result;
120
file_manager->listFiles(result, *dir, /*is_full_path*/ true);
121
for(std::set<std::string>::const_iterator subdir=result.begin();
122
subdir!=result.end(); subdir++)
124
const bool loaded = loadKart(*dir+"/"+*subdir);
126
if (loaded && loading_icon)
110
m_all_groups.push_back(groups[g]);
128
GUIEngine::addLoadingIcon(irr_driver->getTexture(
129
*dir + "/"+*subdir + "/" +
130
m_karts_properties[m_karts_properties.size()-1]->getIconFile()
112
m_groups[groups[g]].push_back(m_karts_properties.size()-1);
134
} // for all files in the currently handled directory
138
//-----------------------------------------------------------------------------
139
/** Loads a single kart and (if not disabled) the oorresponding 3d model.
140
* \param filename Full path to the kart config file.
142
bool KartPropertiesManager::loadKart(const std::string &dir)
144
std::string config_filename=dir+"/kart.xml";
145
FILE *f=fopen(config_filename.c_str(), "r");
149
KartProperties* kart_properties;
152
kart_properties = new KartProperties(config_filename);
154
catch (std::runtime_error& err)
156
std::cerr << "Giving up loading '" << config_filename.c_str()
157
<< "' : " << err.what() << std::endl;
161
// If the version of the kart file is not supported,
162
// ignore this .kart file
163
if (kart_properties->getVersion() < stk_config->m_min_kart_version ||
164
kart_properties->getVersion() > stk_config->m_max_kart_version)
166
fprintf(stderr, "[KartPropertiesManager] Warning: kart '%s' is not supported by this binary, ignored.\n",
167
kart_properties->getIdent().c_str());
168
delete kart_properties;
172
m_karts_properties.push_back(kart_properties);
173
m_kart_available.push_back(true);
174
const std::vector<std::string>& groups=kart_properties->getGroups();
175
for(unsigned int g=0; g<groups.size(); g++)
177
if(m_groups.find(groups[g])==m_groups.end())
179
m_all_groups.push_back(groups[g]);
181
m_groups[groups[g]].push_back(m_karts_properties.size()-1);
183
m_all_kart_dirs.push_back(dir);
115
185
} // loadKartData
117
187
//-----------------------------------------------------------------------------
118
188
const int KartPropertiesManager::getKartId(const std::string &ident) const
120
190
for(KartPropertiesVector::const_iterator i = m_karts_properties.begin();
121
191
i != m_karts_properties.end(); ++i)
193
if(UserConfigParams::m_verbosity>=5)
194
std::cout << "[KartPropertiesManager] getKartId : " << (*i)->getIdent().c_str() << std::endl;
123
195
if ((*i)->getIdent() == ident)
124
196
return i-m_karts_properties.begin();
264
336
// -----------------------------------------
265
337
std::vector<bool> used;
266
338
used.resize(getNumberOfKarts(), false);
268
340
std::vector<std::string> all_karts;
269
341
for(unsigned int i=0; i<existing_karts.size(); i++)
271
int id=getKartId(existing_karts[i].getKartName());
345
int id=getKartId(existing_karts[i].getKartName());
348
catch (std::runtime_error& ex)
351
std::cerr << "[KartPropertiesManager] getRandomKartList : WARNING, can't find kart '" << existing_karts[i].getKartName() << "'\n";
275
355
// Add karts from the current group
276
356
// --------------------------------
277
std::vector<int> karts = getKartsInGroup(user_config->m_kart_group);
357
std::vector<int> karts = getKartsInGroup(UserConfigParams::m_kart_group);
278
358
std::vector<int>::iterator k;
279
359
// Remove karts that are already used or generally not available
280
360
// (i.e. locked or not available on all clients)
311
390
karts.push_back(i);
313
392
std::random_shuffle(karts.begin(), karts.end());
314
394
// Then fill up the remaining empty spaces
315
while(count>0 && karts.size()>0)
317
random_karts.push_back(m_karts_properties[karts.back()]->getIdent());
397
while(count>0 && karts.size()>0)
399
random_karts.push_back(m_karts_properties[karts.back()]->getIdent());
404
// we used all karts but still need more... we'll have no choice but
405
// to use the same karts more than once.
406
if (count>0 && karts.size() == 0)
408
for(unsigned int i=0; i<getNumberOfKarts(); i++)
410
if(!used[i] && m_kart_available[i] &&
411
!unlock_manager->isLocked(m_karts_properties[i]->getIdent()) )
414
// If there are no unused karts, use used karts again.
415
// This means that e.g. if only one kart is availabe, which is
416
// used by the player, it will still be used by AI karts (which
417
// can be useful for debugging).
420
for(unsigned int i=0; i<getNumberOfKarts(); i++)
422
if(m_kart_available[i] &&
423
!unlock_manager->isLocked(m_karts_properties[i]->getIdent()) )
427
std::random_shuffle(karts.begin(), karts.end());
321
432
// There should always be enough karts
322
433
assert(count==0);
323
434
return random_karts;