widelands-dev team mailing list archive
-
widelands-dev team
-
Mailing list archive
-
Message #16364
[Merge] lp:~widelands-dev/widelands/bug-1821506-new-scenario-crash into lp:widelands
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_++;
Follow ups