made it so a corrupt user campaign won't stop the game from starting

This commit is contained in:
Dave White 2005-06-11 02:41:38 +00:00
parent f798a88076
commit cd9cbe45c6
4 changed files with 63 additions and 7 deletions

View file

@ -22,7 +22,6 @@
{terrain_generator.cfg} {terrain_generator.cfg}
{campaigns} {campaigns}
{~campaigns}
{help.cfg} {help.cfg}

View file

@ -61,6 +61,22 @@ void config::append(const config& cfg)
} }
} }
void config::merge_children(const std::string& key)
{
config merged_children;
const child_list& children = get_children(key);
if(children.size() < 2) {
return;
}
for(child_list::const_iterator i = children.begin(); i != children.end(); ++i) {
merged_children.append(**i);
}
clear_children(key);
add_child(key,merged_children);
}
config::child_itors config::child_range(const std::string& key) config::child_itors config::child_range(const std::string& key)
{ {
child_map::iterator i = children.find(key); child_map::iterator i = children.find(key);

View file

@ -124,6 +124,10 @@ public:
//latter config object will clobber attributes in this one. //latter config object will clobber attributes in this one.
void append(const config& cfg); void append(const config& cfg);
//all children with the given key will be merged into the first element
//with that key
void merge_children(const std::string& key);
//resets the translated values of all strings contained in this object //resets the translated values of all strings contained in this object
void reset_translation() const; void reset_translation() const;

View file

@ -1279,6 +1279,39 @@ void game_controller::read_game_cfg(preproc_map& defines, config& cfg, bool use_
std::string error_log; std::string error_log;
read(cfg, *stream, &error_log); read(cfg, *stream, &error_log);
//load user campaigns
const std::string user_campaign_dir = get_user_data_dir() + "/data/campaigns/";
std::vector<std::string> user_campaigns, error_campaigns;
get_files_in_dir(user_campaign_dir,&user_campaigns,NULL,ENTIRE_FILE_PATH);
for(std::vector<std::string>::const_iterator uc = user_campaigns.begin(); uc != user_campaigns.end(); ++uc) {
try {
scoped_istream stream = preprocess_file(*uc,&defines);
config user_campaign_cfg;
read(user_campaign_cfg,*stream,NULL);
cfg.append(user_campaign_cfg);
} catch(config::error&) {
std::cerr << "error processing user campaign '" << *uc << "'\n";
error_campaigns.push_back(*uc);
} catch(io_exception&) {
std::cerr << "error reading user campaign '" << *uc << "'\n";
error_campaigns.push_back(*uc);
}
}
if(error_campaigns.empty() == false) {
std::stringstream msg;
msg << _("The following add-on campaign(s) had errors and could not be loaded:");
for(std::vector<std::string>::const_iterator i = error_campaigns.begin(); i != error_campaigns.end(); ++i) {
msg << "\n" << *i;
}
gui::show_error_message(disp(),msg.str());
}
cfg.merge_children("units");
if(!error_log.empty()) { if(!error_log.empty()) {
gui::show_error_message(disp(), gui::show_error_message(disp(),
_("Warning: Errors occurred while loading game configuration files: '") + _("Warning: Errors occurred while loading game configuration files: '") +
@ -1511,6 +1544,12 @@ int play_game(int argc, char** argv)
return 0; return 0;
} }
res = game.init_video();
if(res == false) {
std::cerr << "could not initialize display\n";
return 0;
}
#ifdef WIN32 #ifdef WIN32
res = game.init_config(); res = game.init_config();
if(res == false) { if(res == false) {
@ -1519,12 +1558,6 @@ int play_game(int argc, char** argv)
} }
#endif #endif
res = game.init_video();
if(res == false) {
std::cerr << "could not initialize display\n";
return 0;
}
res = game.init_language(); res = game.init_language();
if(res == false) { if(res == false) {
std::cerr << "could not initialize the language\n"; std::cerr << "could not initialize the language\n";
@ -1620,6 +1653,10 @@ int play_game(int argc, char** argv)
return 0; return 0;
} }
void f() {
throw config::error("");
}
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
try { try {