GunChleoc has proposed merging lp:~widelands-dev/widelands/bug-1821506-new-scenario-crash into lp:widelands.
Commit message: Allow random player tribes in scenarios. Requested reviews: Widelands Developers (widelands-dev) Related bugs: Bug #1821506 in widelands: "New scenarios crash on load" https://bugs.launchpad.net/widelands/+bug/1821506 For more details, see: https://code.launchpad.net/~widelands-dev/widelands/bug-1821506-new-scenario-crash/+merge/365002 This is for Build 20, because Widelands will crash if somebody creates a scenario and forgets to assign a tribename to a player. -- Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/bug-1821506-new-scenario-crash into lp:widelands.
=== modified file 'src/logic/game.cc' --- src/logic/game.cc 2019-03-09 10:55:24 +0000 +++ src/logic/game.cc 2019-03-24 12:05:15 +0000 @@ -232,7 +232,14 @@ loader_ui.step(_("Creating players")); PlayerNumber const nr_players = map().get_nrplayers(); iterate_player_numbers(p, nr_players) { - add_player(p, 0, map().get_scenario_player_tribe(p), map().get_scenario_player_name(p)); + // If tribe name is empty, pick a random tribe + std::string tribe = map().get_scenario_player_tribe(p); + if (tribe.empty()) { + log("Setting random tribe for Player %d\n", static_cast<unsigned int>(p)); + const DescriptionIndex random = std::rand() % tribes().nrtribes(); + tribe = tribes().get_tribe_descr(random)->name(); + } + add_player(p, 0, tribe, map().get_scenario_player_name(p)); get_player(p)->set_ai(map().get_scenario_player_ai(p)); } win_condition_displayname_ = "Scenario"; === modified file 'src/logic/map_objects/tribes/tribe_descr.cc' --- src/logic/map_objects/tribes/tribe_descr.cc 2019-02-23 11:00:49 +0000 +++ src/logic/map_objects/tribes/tribe_descr.cc 2019-03-24 12:05:15 +0000 @@ -251,7 +251,7 @@ return wares_.count(index) == 1; } bool TribeDescr::has_worker(const DescriptionIndex& index) const { - return workers_.count(index) == 1; + return workers_.count(index) == 1; // NOCOM here } bool TribeDescr::has_immovable(const DescriptionIndex& index) const { return immovables_.count(index) == 1; === modified file 'src/logic/playersmanager.cc' --- src/logic/playersmanager.cc 2019-02-23 11:00:49 +0000 +++ src/logic/playersmanager.cc 2019-03-24 12:05:15 +0000 @@ -75,8 +75,12 @@ number_of_players_--; } } + const TribeDescr* player_tribe = egbase_.tribes().get_tribe_descr(egbase_.tribes().tribe_index(tribe)); + if (player_tribe == nullptr) { + throw wexception("Tribe '%s' for player %d '%s' does not exist!", tribe.c_str(), static_cast<unsigned int>(player_number), name.c_str()); + } p = new Player(egbase_, player_number, initialization_index, - *egbase_.tribes().get_tribe_descr(egbase_.tribes().tribe_index(tribe)), name); + *player_tribe, name); p->set_team_number(team); if (player_number <= UserSettings::highest_playernum()) { number_of_players_++;
_______________________________________________ Mailing list: https://launchpad.net/~widelands-dev Post to : widelands-dev@lists.launchpad.net Unsubscribe : https://launchpad.net/~widelands-dev More help : https://help.launchpad.net/ListHelp