← Back to team overview

widelands-dev team mailing list archive

[Merge] lp:~widelands-dev/widelands/get_defeated_fix into lp:widelands

 

cghislai has proposed merging lp:~widelands-dev/widelands/get_defeated_fix into lp:widelands.

Requested reviews:
  Widelands Developers (widelands-dev)
Related bugs:
  Bug #1198624 in widelands: "A player should be considered defeated in Autocrat after losing all warehouses, rather than all buildings"
  https://bugs.launchpad.net/widelands/+bug/1198624

For more details, see:
https://code.launchpad.net/~widelands-dev/widelands/get_defeated_fix/+merge/174470

I added a loop to check for warehouses and port docks in construction as suggested in the bug report.

This is an probably expensive loop, however it should only be run once at the very end of the game. It may be run each tick if it appears a warehouse is in construction. I could not find a better way to do this.

I tested and it works as expected for both warehouses and port docks in construction.
-- 
https://code.launchpad.net/~widelands-dev/widelands/get_defeated_fix/+merge/174470
Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/get_defeated_fix into lp:widelands.
=== modified file 'src/economy/portdock.cc'
--- src/economy/portdock.cc	2013-06-20 19:59:07 +0000
+++ src/economy/portdock.cc	2013-07-12 17:14:29 +0000
@@ -67,10 +67,10 @@
 
 }  // namespace
 
-Map_Object_Descr portdock_descr("portdock", "Port Dock");
+Map_Object_Descr g_portdock_descr("portdock", "Port Dock");
 
 PortDock::PortDock() :
-	PlayerImmovable(portdock_descr),
+	PlayerImmovable(g_portdock_descr),
 	m_fleet(0),
 	m_warehouse(0),
 	m_need_ship(false),

=== modified file 'src/logic/instances.h'
--- src/logic/instances.h	2013-07-09 05:40:36 +0000
+++ src/logic/instances.h	2013-07-12 17:14:29 +0000
@@ -104,6 +104,7 @@
  * \todo move this to another header??
  */
 extern Map_Object_Descr g_flag_descr;
+extern Map_Object_Descr g_portdock_descr;
 
 /**
  * \par Notes on Map_Object

=== modified file 'src/scripting/lua_game.cc'
--- src/scripting/lua_game.cc	2013-07-10 05:09:06 +0000
+++ src/scripting/lua_game.cc	2013-07-12 17:14:29 +0000
@@ -34,6 +34,8 @@
 #include "c_utils.h"
 #include "lua_map.h"
 #include "scripting.h"
+#include "boost/foreach.hpp"
+#include "upcast.h"
 
 #include "lua_game.h"
 
@@ -188,6 +190,26 @@
 		  break;
 		}
 	}
+	if (!have_warehouses) {
+		// Check for warehouses in construction
+		std::vector<Serial> objects = get_egbase(L).objects().all_object_serials_ordered();
+		BOOST_FOREACH (Serial obj_serial, objects) {
+			Map_Object* obj = get_egbase(L).objects().get_object(obj_serial);
+			if (!obj->has_attribute(Map_Object::CONSTRUCTIONSITE))
+				continue;
+			upcast(ConstructionSite, csite, obj);
+			if (csite->get_owner() != &p) {
+				continue;
+			}
+			bool is_warehouse = is_a(Warehouse_Descr, &csite->building());
+			bool is_portdock = &csite->building() == &g_portdock_descr;
+			if (is_warehouse || is_portdock) {
+				log("lua_game.cc:L_Player::::get_defeated: Found warehouse in construction\n");
+				have_warehouses = true;
+				break;
+			}
+		}
+	}
 
 	lua_pushboolean(L, !have_warehouses);
 	return 1;


Follow ups