Merge lp:~widelands-dev/widelands/bug-1821506-new-scenario-crash into lp:widelands

Proposed by GunChleoc
Status: Merged
Merged at revision: 9030
Proposed branch: lp:~widelands-dev/widelands/bug-1821506-new-scenario-crash
Merge into: lp:widelands
Diff against target: 37 lines (+13/-2)
2 files modified
src/logic/game.cc (+8/-1)
src/logic/playersmanager.cc (+5/-1)
To merge this branch: bzr merge lp:~widelands-dev/widelands/bug-1821506-new-scenario-crash
Reviewer Review Type Date Requested Status
hessenfarmer test review Approve
Review via email: mp+365002@code.launchpad.net

Commit message

Allow random player tribes in scenarios.

Description of the change

This is for Build 20, because Widelands will crash if somebody creates a scenario and forgets to assign a tribename to a player.

To post a comment you must log in.
Revision history for this message
bunnybot (widelandsofficial) wrote :

Continuous integration builds have changed state:

Travis build 4636. State: passed. Details: https://travis-ci.org/widelands/widelands/builds/510574309.
Appveyor build 4423. State: success. Details: https://ci.appveyor.com/project/widelands-dev/widelands/build/_widelands_dev_widelands_bug_1821506_new_scenario_crash-4423.

Revision history for this message
hessenfarmer (stephan-lutz) wrote :

Tested this. Works well. Code LGTM.

@bunnybot merge

review: Approve (test review)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/logic/game.cc'
2--- src/logic/game.cc 2019-03-09 10:55:24 +0000
3+++ src/logic/game.cc 2019-03-24 12:06:57 +0000
4@@ -232,7 +232,14 @@
5 loader_ui.step(_("Creating players"));
6 PlayerNumber const nr_players = map().get_nrplayers();
7 iterate_player_numbers(p, nr_players) {
8- add_player(p, 0, map().get_scenario_player_tribe(p), map().get_scenario_player_name(p));
9+ // If tribe name is empty, pick a random tribe
10+ std::string tribe = map().get_scenario_player_tribe(p);
11+ if (tribe.empty()) {
12+ log("Setting random tribe for Player %d\n", static_cast<unsigned int>(p));
13+ const DescriptionIndex random = std::rand() % tribes().nrtribes();
14+ tribe = tribes().get_tribe_descr(random)->name();
15+ }
16+ add_player(p, 0, tribe, map().get_scenario_player_name(p));
17 get_player(p)->set_ai(map().get_scenario_player_ai(p));
18 }
19 win_condition_displayname_ = "Scenario";
20
21=== modified file 'src/logic/playersmanager.cc'
22--- src/logic/playersmanager.cc 2019-02-23 11:00:49 +0000
23+++ src/logic/playersmanager.cc 2019-03-24 12:06:57 +0000
24@@ -75,8 +75,12 @@
25 number_of_players_--;
26 }
27 }
28+ const TribeDescr* player_tribe = egbase_.tribes().get_tribe_descr(egbase_.tribes().tribe_index(tribe));
29+ if (player_tribe == nullptr) {
30+ throw wexception("Tribe '%s' for player %d '%s' does not exist!", tribe.c_str(), static_cast<unsigned int>(player_number), name.c_str());
31+ }
32 p = new Player(egbase_, player_number, initialization_index,
33- *egbase_.tribes().get_tribe_descr(egbase_.tribes().tribe_index(tribe)), name);
34+ *player_tribe, name);
35 p->set_team_number(team);
36 if (player_number <= UserSettings::highest_playernum()) {
37 number_of_players_++;

Subscribers

People subscribed via source and target branches

to status/vote changes: