<URL: http://bugs.freeciv.org/Ticket/Display.html?id=40241 >

 Fixed ACTIVITY_FORTRESS & ACTIVITY_AIRBASE related crash in updating
gui-win actions menu. It was easier to update whole menu to gui-gtk
level of functionality (mainly: handle sensitivity better in respect
to multiple focus units) than to make simple fix.

 For S2_2 and TRUNK


 - ML

diff -Nurd -X.diff_ignore freeciv/client/gui-win32/menu.c freeciv/client/gui-win32/menu.c
--- freeciv/client/gui-win32/menu.c	2008-03-08 16:33:02.000000000 +0200
+++ freeciv/client/gui-win32/menu.c	2008-05-13 03:53:52.000000000 +0300
@@ -37,6 +37,7 @@
 #include "chatline.h"
 #include "cityrep.h"
 #include "civclient.h"
+#include "climisc.h"
 #include "clinet.h"
 #include "connectdlg_common.h"
 #include "control.h"
@@ -725,7 +726,9 @@
       unit_list_iterate(get_units_in_focus(), punit) {
         /* FIXME: this can provide different actions for different units...
          * not good! */
-        if (can_unit_do_activity(punit, ACTIVITY_FORTRESS)) {
+        struct base_type *pbase = get_base_by_gui_type(BASE_GUI_FORTRESS,
+                                                       punit, punit->tile);
+        if (pbase) {
           key_unit_fortress();
         } else {
           key_unit_fortify();
@@ -1031,7 +1034,6 @@
     }
 
   } else {
-    struct unit *punit;
     HMENU govts;
 
     /* remove previous government entries. */
@@ -1106,13 +1108,14 @@
       return;
     }
 
-    if (NULL != (punit = head_of_units_in_focus())) {
+    if (get_num_units_in_focus() > 0) {
       const char *irrfmt = _("Change to %s");
       const char *minfmt = _("Change to %s");
       const char *transfmt = _("Transform to %s");
       char irrtext[128], mintext[128], transtext[128];
       char *roadtext;
       struct terrain *pterrain;
+      struct unit_list *punits = get_units_in_focus();
 
       sz_strlcpy(irrtext, N_("Build Irrigation") "\tI");
       sz_strlcpy(mintext, N_("Build Mine") "\tM");
@@ -1129,137 +1132,160 @@
       /* Enable the button for adding to a city in all cases, so we
 	 get an eventual error message from the server if we try. */
       my_enable_menu(menu, IDM_ORDERS_BUILD_CITY,
-		     can_unit_add_or_build_city(punit)
-		     || unit_can_help_build_wonder_here(punit));
+		     (can_units_do(punits, can_unit_add_or_build_city)
+                      || can_units_do(punits, unit_can_help_build_wonder_here)));
       my_enable_menu(menu, IDM_ORDERS_ROAD,
-                     can_unit_do_activity(punit, ACTIVITY_ROAD)
-		     || can_unit_do_activity(punit, ACTIVITY_RAILROAD)
-		     || unit_can_est_traderoute_here(punit));
+                     (can_units_do_activity(punits, ACTIVITY_ROAD)
+                      || can_units_do_activity(punits, ACTIVITY_RAILROAD)
+                      || can_units_do(punits,
+                                      unit_can_est_traderoute_here)));
       my_enable_menu(menu, IDM_ORDERS_IRRIGATE,
-		     can_unit_do_activity(punit, ACTIVITY_IRRIGATE));
+		     can_units_do_activity(punits, ACTIVITY_IRRIGATE));
       my_enable_menu(menu, IDM_ORDERS_MINE,
-		     can_unit_do_activity(punit, ACTIVITY_MINE));
+		     can_units_do_activity(punits, ACTIVITY_MINE));
       my_enable_menu(menu, IDM_ORDERS_TRANSFORM,
-		     can_unit_do_activity(punit, ACTIVITY_TRANSFORM));
+		     can_units_do_activity(punits, ACTIVITY_TRANSFORM));
       my_enable_menu(menu, IDM_ORDERS_FORTRESS,
-		     can_unit_do_activity(punit, ACTIVITY_FORTRESS)
-		     || can_unit_do_activity(punit, ACTIVITY_FORTIFYING));
+                     can_units_do_base_gui(punits, BASE_GUI_FORTRESS)
+		     || can_units_do_activity(punits, ACTIVITY_FORTIFYING));
       my_enable_menu(menu, IDM_ORDERS_AIRBASE,
-		     can_unit_do_activity(punit, ACTIVITY_AIRBASE));
+                     can_units_do_base_gui(punits, BASE_GUI_AIRBASE));
       my_enable_menu(menu, IDM_ORDERS_POLLUTION,
-		     can_unit_do_activity(punit, ACTIVITY_POLLUTION)
-		     || can_unit_paradrop(punit));
+		     (can_units_do_activity(punits, ACTIVITY_POLLUTION)
+                      || can_units_do(punits, can_unit_paradrop)));
       my_enable_menu(menu, IDM_ORDERS_FALLOUT,
-		     can_unit_do_activity(punit, ACTIVITY_FALLOUT));
+		     can_units_do_activity(punits, ACTIVITY_FALLOUT));
       my_enable_menu(menu, IDM_ORDERS_SENTRY,
-		     can_unit_do_activity(punit, ACTIVITY_SENTRY));
+		     can_units_do_activity(punits, ACTIVITY_SENTRY));
       my_enable_menu(menu, IDM_ORDERS_PILLAGE,
-		     can_unit_do_activity(punit, ACTIVITY_PILLAGE));
+		     can_units_do_activity(punits, ACTIVITY_PILLAGE));
       my_enable_menu(menu, IDM_ORDERS_DISBAND,
-		     !unit_has_type_flag(punit, F_UNDISBANDABLE));
+		     units_have_flag(punits, F_UNDISBANDABLE, FALSE));
+      /* FIXME: Upgrade item missing */
       my_enable_menu(menu, IDM_ORDERS_HOMECITY,
-		     can_unit_change_homecity(punit));
+		     can_units_do(punits, can_unit_change_homecity));
       my_enable_menu(menu, IDM_ORDERS_LOAD,
-                     find_transporter_for_unit(punit)->id);
+                     units_can_load(punits));
       my_enable_menu(menu, IDM_ORDERS_UNLOAD,
-	(can_unit_unload(punit, game_find_unit_by_number(punit->transported_by))
-	 && can_unit_exist_at_tile(punit, punit->tile)) 
-	|| get_transporter_occupancy(punit) > 0);
+                     units_are_occupied(punits));
       my_enable_menu(menu, IDM_ORDERS_WAKEUP_OTHERS,
-		     is_unit_activity_on_tile(ACTIVITY_SENTRY,
-					      punit->tile));
+                     units_have_activity_on_tile(punits,
+                                                 ACTIVITY_SENTRY));
       my_enable_menu(menu, IDM_ORDERS_AUTO_SETTLER,
-		     can_unit_do_autosettlers(punit));
+                     can_units_do(punits, can_unit_do_autosettlers));
       my_enable_menu(menu, IDM_ORDERS_AUTO_EXPLORE,
-		     can_unit_do_activity(punit, ACTIVITY_EXPLORE));
+                     can_units_do_activity(punits, ACTIVITY_EXPLORE));
       my_enable_menu(menu, IDM_ORDERS_CONNECT_ROAD,
-		     can_unit_do_connect(punit, ACTIVITY_ROAD));
+                     can_units_do_connect(punits, ACTIVITY_ROAD));
       my_enable_menu(menu, IDM_ORDERS_CONNECT_RAIL,
-		     can_unit_do_connect(punit, ACTIVITY_RAILROAD));
+                     can_units_do_connect(punits, ACTIVITY_RAILROAD));
       my_enable_menu(menu, IDM_ORDERS_CONNECT_IRRIGATE,
-		     can_unit_do_connect(punit, ACTIVITY_IRRIGATE));
+                     can_units_do_connect(punits, ACTIVITY_IRRIGATE));
       my_enable_menu(menu, IDM_ORDERS_RETURN, TRUE);
       my_enable_menu(menu, IDM_ORDERS_DIPLOMAT_DLG,
-		     is_diplomat_unit(punit)
-		     && diplomat_can_do_action(punit, DIPLOMAT_ANY_ACTION,
-					       punit->tile));
+                     can_units_do_diplomat_action(punits, DIPLOMAT_ANY_ACTION));
       my_enable_menu(menu, IDM_ORDERS_NUKE,
-		     unit_has_type_flag(punit, F_NUCLEAR));
-      if (unit_has_type_flag(punit, F_HELP_WONDER)) {
+                     units_have_flag(punits, F_NUCLEAR, TRUE));
+      if (units_have_flag(punits, F_HELP_WONDER, TRUE)) {
 	my_rename_menu(menu, IDM_ORDERS_BUILD_CITY, N_("Help Build Wonder")
 		       "\tB");
-      } else if (unit_has_type_flag(punit, F_CITIES)) {
-	if (tile_city(punit->tile)) {
-	  my_rename_menu(menu, IDM_ORDERS_BUILD_CITY, N_("Add to City")
-			 "\tB");
-	} else {
+      } else {
+        bool city_on_tile = FALSE;
+
+        /* FIXME: this overloading doesn't work well with multiple focus
+         * units. */
+        unit_list_iterate(punits, punit) {
+          if (tile_city(punit->tile)) {
+            city_on_tile = TRUE;
+            break;
+          }
+        } unit_list_iterate_end;
+
+        if (city_on_tile && units_have_flag(punits, F_ADD_TO_CITY, TRUE)) {
+          my_rename_menu(menu, IDM_ORDERS_BUILD_CITY, N_("Add to City")
+                         "\tB");
+        } else {
 	  my_rename_menu(menu, IDM_ORDERS_BUILD_CITY, N_("Build City")
 			 "\tB");
-	}
-      } else {
-	my_rename_menu(menu, IDM_ORDERS_BUILD_CITY, N_("Build City") "\tB");
+        }
       }
  
-      if (unit_has_type_flag(punit, F_TRADE_ROUTE)) {
-	my_rename_menu(menu, IDM_ORDERS_ROAD, N_("Make Trade Route") "\tR");
-      } else if (unit_has_type_flag(punit, F_SETTLERS)) {
-	if (tile_has_special(punit->tile, S_ROAD)) {
-	  roadtext = N_("Build Railroad") "\tR";
-	  road_activity = ACTIVITY_RAILROAD;  
+      if (units_have_flag(punits, F_TRADE_ROUTE, TRUE)) {
+        my_rename_menu(menu, IDM_ORDERS_ROAD, N_("Make Trade Route") "\tR");
+      } else if (units_have_flag(punits, F_SETTLERS, TRUE)) {
+	bool has_road = FALSE;
+
+	/* FIXME: this overloading doesn't work well with multiple focus
+	 * units. */
+	unit_list_iterate(punits, punit) {
+	  if (tile_has_special(punit->tile, S_ROAD)) {
+	    has_road = TRUE;
+	    break;
+	  }
+	} unit_list_iterate_end;
+
+	if (has_road) {
+          roadtext = N_("Build Railroad") "\tR";
+	  road_activity=ACTIVITY_RAILROAD;
 	} else {
-	  roadtext = N_("Build Road") "\tR";
-	  road_activity = ACTIVITY_ROAD;  
+          roadtext = N_("Build Road") "\tR";
+	  road_activity=ACTIVITY_ROAD;
 	}
+
 	my_rename_menu(menu, IDM_ORDERS_ROAD, roadtext);
       } else {
 	my_rename_menu(menu, IDM_ORDERS_ROAD, N_("Build Road") "\tR");
       }
 
-      pterrain = tile_terrain(punit->tile);
-      if (pterrain->irrigation_result != T_NONE
-	  && pterrain->irrigation_result != pterrain) {
-	my_snprintf(irrtext, sizeof(irrtext), irrfmt,
-		    get_tile_change_menu_text(punit->tile,
-					      ACTIVITY_IRRIGATE));
- 	sz_strlcat(irrtext, "\tI");
-      } else if (tile_has_special(punit->tile, S_IRRIGATION)
-		 && player_knows_techs_with_flag(client.conn.playing,
-						 TF_FARMLAND)) {
-	sz_strlcpy(irrtext, N_("Build Farmland") "\tI");
-      }
-      if (pterrain->mining_result != T_NONE
-	  && pterrain->mining_result != pterrain) {
-	my_snprintf(mintext, sizeof(mintext), minfmt,
-		    get_tile_change_menu_text(punit->tile, ACTIVITY_MINE));
- 	sz_strlcat(mintext, "\tM");
-      }
-      if (pterrain->transform_result != T_NONE
-	  && pterrain->transform_result != pterrain) {
-	my_snprintf(transtext, sizeof(transtext), transfmt,
-		    get_tile_change_menu_text(punit->tile,
-					      ACTIVITY_TRANSFORM));
- 	sz_strlcat(transtext, "\tO");
+      if (unit_list_size(punits) == 1) {
+	struct unit *punit = unit_list_get(punits, 0);
+
+        pterrain = tile_terrain(punit->tile);
+        if (pterrain->irrigation_result != T_NONE
+            && pterrain->irrigation_result != pterrain) {
+          my_snprintf(irrtext, sizeof(irrtext), irrfmt,
+                      get_tile_change_menu_text(punit->tile,
+                                                ACTIVITY_IRRIGATE));
+          sz_strlcat(irrtext, "\tI");
+        } else if (tile_has_special(punit->tile, S_IRRIGATION)
+                   && player_knows_techs_with_flag(client.conn.playing,
+                                                   TF_FARMLAND)) {
+          sz_strlcpy(irrtext, N_("Build Farmland") "\tI");
+        }
+        if (pterrain->mining_result != T_NONE
+            && pterrain->mining_result != pterrain) {
+          my_snprintf(mintext, sizeof(mintext), minfmt,
+                      get_tile_change_menu_text(punit->tile, ACTIVITY_MINE));
+          sz_strlcat(mintext, "\tM");
+        }
+        if (pterrain->transform_result != T_NONE
+            && pterrain->transform_result != pterrain) {
+          my_snprintf(transtext, sizeof(transtext), transfmt,
+                      get_tile_change_menu_text(punit->tile,
+                                                ACTIVITY_TRANSFORM));
+          sz_strlcat(transtext, "\tO");
+        }
       }
 
       my_rename_menu(menu, IDM_ORDERS_IRRIGATE, irrtext);
       my_rename_menu(menu, IDM_ORDERS_MINE, mintext);
       my_rename_menu(menu, IDM_ORDERS_TRANSFORM, transtext);
 
-      if (can_unit_do_activity(punit, ACTIVITY_FORTIFYING)) {
+      if (can_units_do_activity(punits, ACTIVITY_FORTIFYING)) {
 	my_rename_menu(menu, IDM_ORDERS_FORTRESS, N_("Fortify") "\tF");
       } else {
 	my_rename_menu(menu, IDM_ORDERS_FORTRESS, N_("Build Fortress")
 		       "\tF");
       }
 
-      if (unit_has_type_flag(punit, F_PARATROOPERS)) {
+      if (units_have_flag(punits, F_PARATROOPERS, TRUE)) {
 	my_rename_menu(menu, IDM_ORDERS_POLLUTION, N_("Paradrop") "\tP");
       } else {
 	my_rename_menu(menu, IDM_ORDERS_POLLUTION, N_("Clean Pollution")
 		       "\tP");
       }
 
-      if (!unit_has_type_flag(punit, F_SETTLERS)) {
+      if (units_have_flag(punits, F_SETTLERS, FALSE)) {
 	my_rename_menu(menu, IDM_ORDERS_AUTO_SETTLER, N_("Auto Attack")
 		       "\tA");
       } else {
_______________________________________________
Freeciv-dev mailing list
Freeciv-dev@gna.org
https://mail.gna.org/listinfo/freeciv-dev

Reply via email to