← Back to team overview

widelands-dev team mailing list archive

[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