Merge lp:~widelands-dev/widelands/elk_moose into lp:widelands

Proposed by GunChleoc
Status: Merged
Merged at revision: 9155
Proposed branch: lp:~widelands-dev/widelands/elk_moose
Merge into: lp:widelands
Diff against target: 455 lines (+102/-30)
16 files modified
data/world/critters/moose/init.lua (+2/-2)
data/world/init.lua (+1/-1)
data/world/map_generation.lua (+6/-6)
src/logic/map.cc (+16/-0)
src/logic/map.h (+8/-0)
src/logic/map_objects/world/critter.cc (+3/-2)
src/logic/map_revision.h (+2/-0)
src/map_io/map_bob_packet.cc (+3/-3)
src/map_io/map_bob_packet.h (+1/-1)
src/map_io/map_saver.cc (+1/-1)
src/map_io/map_version_packet.cc (+12/-5)
src/map_io/map_version_packet.h (+17/-2)
src/map_io/widelands_map_loader.cc (+5/-1)
src/map_io/world_legacy_lookup_table.cc (+23/-5)
src/map_io/world_legacy_lookup_table.h (+1/-1)
src/website/map_info.cc (+1/-0)
To merge this branch: bzr merge lp:~widelands-dev/widelands/elk_moose
Reviewer Review Type Date Requested Status
Klaus Halfmann testing Approve
Review via email: mp+369201@code.launchpad.net

Commit message

Rename "elk" to "moose" and add map compatibility code

- Add support for critter renamings depending on packet version to WorldLegacyLookupTable
- New map version property "needs_widelands_version_after" for the website

To post a comment you must log in.
Revision history for this message
Klaus Halfmann (klaus-halfmann) wrote :

Some questions inline Code otherwise LGTM.
Will commpile this and the read that code again.

Revision history for this message
Klaus Halfmann (klaus-halfmann) wrote :

I expect some followup change on the website then.
Widelands will always read older Maps.

Did another review with a look into the complete code.
(We need some Widelands historian for all this legacy :-)

A bit more documentation would help.

Revision history for this message
Klaus Halfmann (klaus-halfmann) wrote :

I openend some buitin and a new Map,
how can I see this new value in a map?

I am missing some info about wl_map_info / wl_map_object_info

Revision history for this message
Klaus Halfmann (klaus-halfmann) wrote :

OTOH the code is OK for me, anything more I can / must do?

review: Approve (review, compile, short test)
Revision history for this message
GunChleoc (gunchleoc) wrote :

I have added comments.

If you run ./wl_map_info without parameters, it will give you command line help. It results in a JSON file for the website.

Revision history for this message
Klaus Halfmann (klaus-halfmann) wrote :

Ahh, the json file is created in thee same dir as the wmf file, e.g.

{
   "name": "CrossriverA",
   "author": "Hasi50",
   "description": "A nice River flows through this land and water can be found there. Metal in the hills nearby, but you are not alone",
   "hint": "",
   "width": 64,
   "height": 64,
   "nr_players": 2,
   "needs_widelands_version_after": 18,
   "world_name": "",
   "minimap": "/Users/klaus/.widelands/maps/My_Maps/CrossriverA1.wmf.png"
}

A map saved with the new version

{
   "name": "27 zu 3 Inseln",
   "author": "Björn alias the-x",
   "description": "Starting with 27 Islands falling together when you find Ways to pass through the rocks to 3 huge Island. Are you unstoppable to manage all 3 Islands under your control? Tipps: Start to find your dream Island real fast and you wont find Iron on your main Island.",
   "hint": "",
   "width": 144,
   "height": 144,
   "nr_players": 4,
   "needs_widelands_version_after": 20,
   "world_name": "",
   "minimap": "/Users/klaus/.widelands/maps/My_Maps/27 zu 3 Inselnx.wmf.png"
}

Trunk gives me:

Exception: map objects: [../src/logic/map_objects/world/critter.cc:323] loading critter:

UnhandledVersionError: This game was saved using an older version of Widelands and cannot be loaded anymore, or it's a new version that can't be handled yet.

Packet Name: Critter
Saved Version: 2
Current Version: 1.

Fine

review: Approve (testing)
Revision history for this message
GunChleoc (gunchleoc) wrote :

Thanks for the review & testing!

@bunnybot merge

Revision history for this message
bunnybot (widelandsofficial) wrote :

Continuous integration builds have changed state:

Travis build 5218. State: errored. Details: https://travis-ci.org/widelands/widelands/builds/549145830.
Appveyor build 4997. State: success. Details: https://ci.appveyor.com/project/widelands-dev/widelands/build/_widelands_dev_widelands_elk_moose-4997.

Revision history for this message
bunnybot (widelandsofficial) wrote :

Refusing to merge, since Travis is not green. Use @bunnybot merge force for merging anyways.

Travis build 5218. State: errored. Details: https://travis-ci.org/widelands/widelands/builds/549145830.

Revision history for this message
Klaus Halfmann (klaus-halfmann) wrote :

Travis:

1 x curl: (6) Could not resolve host: deb.debian.org
Error: An exception occurred within a child process:
  DownloadError: Failed to download resource "isl"

3 x Loading savegame: inputqueues ...
No output has been received in the last 10m0s
-> Adressed elsewhere

All other Builds are fine

@bunnybot merge force

Revision history for this message
bunnybot (widelandsofficial) wrote :

Error merging this proposal:

Output:
stdout:

stderr:
Unable to obtain lock held by <email address hidden> on taotie (process #21580), acquired 37 hours, 41 minutes ago.
See "bzr help break-lock" for more.
bzr: ERROR: Could not acquire lock "(remote lock)": bzr+ssh://bazaar.launchpad.net/~widelands-dev/widelands/trunk/

Revision history for this message
GunChleoc (gunchleoc) wrote :

@bunnybot merge force

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== renamed directory 'data/world/critters/elk' => 'data/world/critters/moose'
2=== modified file 'data/world/critters/moose/init.lua'
3--- data/world/critters/elk/init.lua 2019-04-21 14:57:55 +0000
4+++ data/world/critters/moose/init.lua 2019-06-22 16:21:53 +0000
5@@ -15,8 +15,8 @@
6 add_directional_animation(animations, "walk", dirname, "walk", {21, 34}, 20)
7
8 world:new_critter_type{
9- name = "elk",
10- descname = _ "Elk",
11+ name = "moose",
12+ descname = _ "Moose",
13 editor_category = "critters_herbivores",
14 attributes = { "eatable" },
15 programs = {
16
17=== modified file 'data/world/init.lua'
18--- data/world/init.lua 2017-09-03 10:56:44 +0000
19+++ data/world/init.lua 2019-06-22 16:21:53 +0000
20@@ -288,7 +288,7 @@
21 include "world/critters/deer/init.lua"
22 include "world/critters/reindeer/init.lua"
23 include "world/critters/stag/init.lua"
24- include "world/critters/elk/init.lua"
25+ include "world/critters/moose/init.lua"
26
27 -- Carnivores
28 world:new_editor_critter_category {
29
30=== modified file 'data/world/map_generation.lua'
31--- data/world/map_generation.lua 2017-02-12 09:10:57 +0000
32+++ data/world/map_generation.lua 2019-06-22 16:21:53 +0000
33@@ -77,17 +77,17 @@
34 "alder_summer_old", "birch_summer_old", "beech_summer_old",
35 "larch_summer_old", "rowan_summer_old"
36 },
37- critters = { "brownbear", "chamois", "elk", "lynx", "reindeer", "stag", "wildboar", "wolf" },
38+ critters = { "brownbear", "chamois", "moose", "lynx", "reindeer", "stag", "wildboar", "wolf" },
39 },
40 {
41 name = "bushes",
42 immovables = { "bush1", "bush2", "bush3", "bush4", "bush5" },
43- critters = { "bunny", "elk", "fox", "lynx", "marten", "sheep", "sheep", "wildboar", "wisent", "wolf", "wolf" },
44+ critters = { "bunny", "moose", "fox", "lynx", "marten", "sheep", "sheep", "wildboar", "wisent", "wolf", "wolf" },
45 },
46 {
47 name = "grasses",
48 immovables = { "grass1", "grass2", "grass3" },
49- critters = { "bunny", "elk", "fox", "lynx", "marten", "sheep", "sheep", "wolf" },
50+ critters = { "bunny", "moose", "fox", "lynx", "marten", "sheep", "sheep", "wolf" },
51 },
52 {
53 name = "standing_stones",
54@@ -614,13 +614,13 @@
55 "birch_summer_old", "beech_summer_old",
56 "larch_summer_old", "rowan_summer_old",
57 },
58- critters = { "deer", "elk", "lynx", "reindeer", "wolf" },
59+ critters = { "deer", "moose", "lynx", "reindeer", "wolf" },
60 },
61 {
62 name = "bushes",
63 immovables = { "bush1", "bush2", "bush3", "bush4", "bush5" },
64 critters = {
65- "wisent", "wolf", "bunny", "elk", "fox", "lynx",
66+ "wisent", "wolf", "bunny", "moose", "fox", "lynx",
67 "wolf", "marten", "sheep"
68 },
69 },
70@@ -628,7 +628,7 @@
71 name = "grasses",
72 immovables = { "grass1", "grass2", "grass3" },
73 critters = {
74- "wisent", "wolf", "bunny", "elk", "fox", "lynx",
75+ "wisent", "wolf", "bunny", "moose", "fox", "lynx",
76 "wolf", "marten", "sheep"
77 },
78 },
79
80=== modified file 'src/logic/map.cc'
81--- src/logic/map.cc 2019-05-16 09:15:03 +0000
82+++ src/logic/map.cc 2019-06-22 16:21:53 +0000
83@@ -714,6 +714,22 @@
84 pathfieldmgr_->set_size(field_size);
85 }
86
87+int Map::needs_widelands_version_after() const {
88+ return map_version_.needs_widelands_version_after;
89+}
90+
91+void Map::calculate_needs_widelands_version_after(bool is_post_one_world) {
92+ if (map_version_.needs_widelands_version_after == 0) {
93+ if (nrplayers_ > 8) {
94+ // We introduced support for 16 players after Build 19
95+ map_version_.needs_widelands_version_after = 19;
96+ } else if (is_post_one_world) {
97+ // We merged the worlds in the engine after Build 18
98+ map_version_.needs_widelands_version_after = 18;
99+ }
100+ }
101+}
102+
103 /*
104 * The scenario get/set functions
105 */
106
107=== modified file 'src/logic/map.h'
108--- src/logic/map.h 2019-05-16 09:15:03 +0000
109+++ src/logic/map.h 2019-06-22 16:21:53 +0000
110@@ -289,6 +289,9 @@
111 return height_;
112 }
113
114+ // Map compatibility information for the website
115+ int needs_widelands_version_after() const;
116+
117 // The next few functions are only valid when the map is loaded as a
118 // scenario.
119 const std::string& get_scenario_player_tribe(PlayerNumber) const;
120@@ -518,6 +521,11 @@
121 std::map<Coords, FieldData>
122 resize(EditorGameBase& egbase, const Coords coords, int32_t w, int32_t h);
123
124+protected:
125+ /// Calculate map compatibility information for the website if it wasn't defined in the map packet.
126+ /// If is_post_one_world is true, this map wasn't created for a specific world (Widelands versions up to Build 18).
127+ void calculate_needs_widelands_version_after(bool is_post_one_world);
128+
129 private:
130 void recalc_border(const FCoords&);
131 void recalc_brightness(const FCoords&);
132
133=== modified file 'src/logic/map_objects/world/critter.cc'
134--- src/logic/map_objects/world/critter.cc 2019-05-25 08:51:42 +0000
135+++ src/logic/map_objects/world/critter.cc 2019-06-22 16:21:53 +0000
136@@ -268,7 +268,8 @@
137 ==============================
138 */
139
140-constexpr uint8_t kCurrentPacketVersion = 1;
141+// We need to bump this packet version every time we rename a critter, so that the world legacy lookup table will work.
142+constexpr uint8_t kCurrentPacketVersion = 2;
143
144 Critter::Loader::Loader() {
145 }
146@@ -303,7 +304,7 @@
147 const CritterDescr* descr = nullptr;
148
149 if (critter_owner == "world") {
150- critter_name = lookup_table.lookup_critter(critter_name);
151+ critter_name = lookup_table.lookup_critter(critter_name, packet_version);
152 descr = egbase.world().get_critter_descr(critter_name);
153 } else {
154 throw GameDataError(
155
156=== modified file 'src/logic/map_revision.h'
157--- src/logic/map_revision.h 2019-02-23 11:00:49 +0000
158+++ src/logic/map_revision.h 2019-06-22 16:21:53 +0000
159@@ -37,6 +37,8 @@
160 int32_t map_version_major;
161 int32_t map_version_minor;
162 uint32_t map_version_timestamp;
163+ // Map compatibility information for the website
164+ int needs_widelands_version_after;
165
166 MapVersion();
167 };
168
169=== modified file 'src/map_io/map_bob_packet.cc'
170--- src/map_io/map_bob_packet.cc 2019-02-23 11:00:49 +0000
171+++ src/map_io/map_bob_packet.cc 2019-06-22 16:21:53 +0000
172@@ -36,7 +36,7 @@
173 EditorGameBase& egbase,
174 MapObjectLoader&,
175 const Coords& coords,
176- const WorldLegacyLookupTable& lookup_table) {
177+ const WorldLegacyLookupTable& lookup_table, uint16_t packet_version) {
178 const std::string owner = fr.c_string();
179 char const* const read_name = fr.c_string();
180 uint8_t subtype = fr.unsigned_8();
181@@ -47,7 +47,7 @@
182 throw GameDataError("unknown legacy bob %s/%s", owner.c_str(), read_name);
183 }
184
185- const std::string name = lookup_table.lookup_critter(read_name);
186+ const std::string name = lookup_table.lookup_critter(read_name, packet_version);
187 try {
188 const World& world = egbase.world();
189 DescriptionIndex const idx = world.get_critter(name.c_str());
190@@ -84,7 +84,7 @@
191 for (uint16_t x = 0; x < map->get_width(); ++x) {
192 uint32_t const nr_bobs = fr.unsigned_32();
193 for (uint32_t i = 0; i < nr_bobs; ++i)
194- read_bob(fr, egbase, mol, Coords(x, y), lookup_table);
195+ read_bob(fr, egbase, mol, Coords(x, y), lookup_table, packet_version);
196 }
197 }
198 else {
199
200=== modified file 'src/map_io/map_bob_packet.h'
201--- src/map_io/map_bob_packet.h 2019-02-23 11:00:49 +0000
202+++ src/map_io/map_bob_packet.h 2019-06-22 16:21:53 +0000
203@@ -42,7 +42,7 @@
204 EditorGameBase&,
205 MapObjectLoader&,
206 const Coords&,
207- const WorldLegacyLookupTable& lookup_table);
208+ const WorldLegacyLookupTable& lookup_table, uint16_t packet_version);
209 };
210 } // namespace Widelands
211
212
213=== modified file 'src/map_io/map_saver.cc'
214--- src/map_io/map_saver.cc 2019-03-09 10:01:09 +0000
215+++ src/map_io/map_saver.cc 2019-06-22 16:21:53 +0000
216@@ -156,7 +156,7 @@
217 log("Writing Map Version ... ");
218 {
219 MapVersionPacket p;
220- p.write(fs_, egbase_, *mos_);
221+ p.write(fs_, egbase_);
222 }
223 log("took %ums\n ", timer.ms_since_last_query());
224
225
226=== modified file 'src/map_io/map_version_packet.cc'
227--- src/map_io/map_version_packet.cc 2019-02-23 11:00:49 +0000
228+++ src/map_io/map_version_packet.cc 2019-06-22 16:21:53 +0000
229@@ -30,11 +30,17 @@
230 namespace Widelands {
231
232 constexpr uint16_t kCurrentPacketVersion = 1;
233+// Map compatibility information for the website
234+constexpr int kCurrentNeedsWidelandsVersionAfter = 20;
235
236 void MapVersionPacket::read(FileSystem& fs,
237 EditorGameBase& egbase,
238- bool const skip,
239- MapObjectLoader&) {
240+ bool const skip, bool is_post_one_world) {
241+
242+ pre_read(fs, egbase.mutable_map(), skip, is_post_one_world);
243+}
244+
245+void MapVersionPacket::pre_read(FileSystem& fs, Map* map, bool skip, bool is_post_one_world) {
246 if (skip)
247 return;
248
249@@ -42,7 +48,6 @@
250 try {
251 prof.read("version", nullptr, fs);
252 } catch (...) {
253- Map* map = egbase.mutable_map();
254 map->map_version_.map_version_timestamp = 0;
255 map->map_version_.map_creator_version = "unknown";
256 return;
257@@ -55,7 +60,6 @@
258 if ((packet_version == kCurrentPacketVersion) ||
259 (packet_version > kCurrentPacketVersion &&
260 forward_compatibility <= kCurrentPacketVersion)) {
261- Map* map = egbase.mutable_map();
262 map->map_version_.map_source_url = globv.get_safe_string("map_source_url");
263 map->map_version_.map_source_release = globv.get_safe_string("map_release");
264 map->map_version_.map_creator_version = globv.get_safe_string("map_creator_version");
265@@ -63,6 +67,8 @@
266 map->map_version_.map_version_minor = globv.get_safe_int("map_version_minor");
267 uint32_t ts = static_cast<uint32_t>(globv.get_safe_int("map_version_timestamp"));
268 map->map_version_.map_version_timestamp = ts;
269+ map->map_version_.needs_widelands_version_after = globv.get_int("needs_widelands_version_after", 0);
270+ map->calculate_needs_widelands_version_after(is_post_one_world);
271 } else {
272 throw UnhandledVersionError("MapVersionPacket", packet_version, kCurrentPacketVersion);
273 }
274@@ -71,7 +77,7 @@
275 }
276 }
277
278-void MapVersionPacket::write(FileSystem& fs, EditorGameBase& egbase, MapObjectSaver&) {
279+void MapVersionPacket::write(FileSystem& fs, EditorGameBase& egbase) {
280 Profile prof;
281 Section& globs = prof.create_section("global");
282
283@@ -117,6 +123,7 @@
284 globs.set_int("map_version_timestamp", static_cast<uint32_t>(time(nullptr)));
285 globs.set_int("packet_version", kCurrentPacketVersion);
286 globs.set_int("packet_compatibility", kCurrentPacketVersion);
287+ globs.set_int("needs_widelands_version_after", kCurrentNeedsWidelandsVersionAfter);
288
289 prof.write("version", false, fs);
290 }
291
292=== modified file 'src/map_io/map_version_packet.h'
293--- src/map_io/map_version_packet.h 2019-02-23 11:00:49 +0000
294+++ src/map_io/map_version_packet.h 2019-06-22 16:21:53 +0000
295@@ -20,11 +20,26 @@
296 #ifndef WL_MAP_IO_MAP_VERSION_PACKET_H
297 #define WL_MAP_IO_MAP_VERSION_PACKET_H
298
299-#include "map_io/map_data_packet.h"
300+class FileSystem;
301+
302+namespace Widelands {
303+
304+class EditorGameBase;
305+class Map;
306+class MapObjectLoader;
307+struct MapObjectSaver;
308
309 /*
310 * This packet contains the version information of the map.
311 */
312-MAP_DATA_PACKET(MapVersionPacket)
313+class MapVersionPacket {
314+public:
315+ void read(FileSystem&, EditorGameBase&, bool skip, bool is_post_one_world);
316+ void write(FileSystem&, EditorGameBase&);
317+
318+ void pre_read(FileSystem&, Map*, bool skip, bool is_post_one_world);
319+};
320+
321+} // namespace Widelands
322
323 #endif // end of include guard: WL_MAP_IO_MAP_VERSION_PACKET_H
324
325=== modified file 'src/map_io/widelands_map_loader.cc'
326--- src/map_io/widelands_map_loader.cc 2019-05-26 03:14:41 +0000
327+++ src/map_io/widelands_map_loader.cc 2019-06-22 16:21:53 +0000
328@@ -82,6 +82,10 @@
329 mp.pre_read(*fs_, &map_);
330 old_world_name_ = mp.old_world_name();
331 }
332+ {
333+ MapVersionPacket version_packet;
334+ version_packet.pre_read(*fs_, &map_, false, old_world_name_.empty());
335+ }
336
337 {
338 MapPlayerNamesAndTribesPacket p;
339@@ -198,7 +202,7 @@
340 log("Reading Map Version Data ... ");
341 {
342 MapVersionPacket p;
343- p.read(*fs_, egbase, is_game, *mol_);
344+ p.read(*fs_, egbase, is_game, old_world_name_.empty());
345 }
346 log("took %ums\n ", timer.ms_since_last_query());
347
348
349=== modified file 'src/map_io/world_legacy_lookup_table.cc'
350--- src/map_io/world_legacy_lookup_table.cc 2019-02-23 11:00:49 +0000
351+++ src/map_io/world_legacy_lookup_table.cc 2019-06-22 16:21:53 +0000
352@@ -33,16 +33,24 @@
353 // Implements OneWorldLegacyLookupTable.
354 std::string lookup_resource(const std::string& resource) const override;
355 std::string lookup_terrain(const std::string& terrain) const override;
356- std::string lookup_critter(const std::string& critter) const override;
357+ std::string lookup_critter(const std::string& critter, uint16_t packet_version) const override;
358 std::string lookup_immovable(const std::string& immovable) const override;
359
360 private:
361+ // Old name, <packet version when it got changed, new name>
362+ const std::map<std::string, std::map<uint16_t, std::string>> critters_;
363 const std::map<std::string, std::string> immovables_;
364 const std::map<std::string, std::string> resources_;
365 const std::map<std::string, std::string> terrains_;
366 };
367
368 PostOneWorldLegacyLookupTable::PostOneWorldLegacyLookupTable() :
369+critters_
370+{
371+ // We need to bump the packet version in Critter every time we rename a critter.
372+ // Also, don't forget to edit the OneWorldLegacyLookupTable! You can look up which world had which units in Build 18.
373+ {"elk", {{2, "moose"}}},
374+},
375 immovables_
376 {
377 {"blackland_stones1", "blackland_rocks1"},
378@@ -113,8 +121,16 @@
379 return i->second;
380 }
381
382-std::string PostOneWorldLegacyLookupTable::lookup_critter(const std::string& critter) const {
383- return critter;
384+std::string PostOneWorldLegacyLookupTable::lookup_critter(const std::string& critter, uint16_t packet_version) const {
385+ std::string result = critter;
386+ if (critters_.count(critter) == 1) {
387+ for (const auto& candidate : critters_.at(result)) {
388+ if (candidate.first >= packet_version) {
389+ result = candidate.second;
390+ }
391+ }
392+ }
393+ return result;
394 }
395
396 std::string PostOneWorldLegacyLookupTable::lookup_immovable(const std::string& immovable) const {
397@@ -132,7 +148,7 @@
398 // Implements OneWorldLegacyLookupTable.
399 std::string lookup_resource(const std::string& resource) const override;
400 std::string lookup_terrain(const std::string& terrain) const override;
401- std::string lookup_critter(const std::string& critter) const override;
402+ std::string lookup_critter(const std::string& critter, uint16_t packet_version) const override;
403 std::string lookup_immovable(const std::string& immovable) const override;
404
405 private:
406@@ -205,6 +221,7 @@
407 std::make_pair("greenland",
408 std::map<std::string, std::string>{
409 {"deer", "stag"},
410+ {"elk", "moose"},
411 }),
412 std::make_pair("blackland",
413 std::map<std::string, std::string>{
414@@ -213,6 +230,7 @@
415 std::make_pair("winterland",
416 std::map<std::string, std::string>{
417 {"deer", "stag"},
418+ {"elk", "moose"},
419 }),
420 std::make_pair("desert",
421 std::map<std::string, std::string>{
422@@ -418,7 +436,7 @@
423 return terrain;
424 }
425
426-std::string OneWorldLegacyLookupTable::lookup_critter(const std::string& critter) const {
427+std::string OneWorldLegacyLookupTable::lookup_critter(const std::string& critter, uint16_t) const {
428 const std::map<std::string, std::string>& world_critters = critters_.at(old_world_name_);
429 const auto& i = world_critters.find(critter);
430 if (i != world_critters.end()) {
431
432=== modified file 'src/map_io/world_legacy_lookup_table.h'
433--- src/map_io/world_legacy_lookup_table.h 2019-02-23 11:00:49 +0000
434+++ src/map_io/world_legacy_lookup_table.h 2019-06-22 16:21:53 +0000
435@@ -38,7 +38,7 @@
436 virtual std::string lookup_terrain(const std::string& terrain) const = 0;
437
438 /// Looks up the new name for the 'critter'.
439- virtual std::string lookup_critter(const std::string& critter) const = 0;
440+ virtual std::string lookup_critter(const std::string& critter, uint16_t packet_version) const = 0;
441
442 /// Looks up the new name for the 'immovable'.
443 virtual std::string lookup_immovable(const std::string& immovable) const = 0;
444
445=== modified file 'src/website/map_info.cc'
446--- src/website/map_info.cc 2019-02-23 11:00:49 +0000
447+++ src/website/map_info.cc 2019-06-22 16:21:53 +0000
448@@ -92,6 +92,7 @@
449 json->add_int("width", map->get_width());
450 json->add_int("height", map->get_height());
451 json->add_int("nr_players", map->get_nrplayers());
452+ json->add_int("needs_widelands_version_after", map->needs_widelands_version_after());
453
454 const std::string world_name =
455 static_cast<Widelands::WidelandsMapLoader*>(ml.get())->old_world_name();

Subscribers

People subscribed via source and target branches

to status/vote changes: