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

New patch: It selects new units on the tiles of the current units in
focus. It selects only 1 unit by tile, to avoid unit selection duplication .

Index: client/control.c
===================================================================
--- client/control.c    (révision 13752)
+++ client/control.c    (copie de travail)
@@ -2726,13 +2726,41 @@
 }
 
 /**************************************************************************
-...
+  Selects new units on the same tiles than the previous selected ones.
+  Allows only one unit by tile.
 **************************************************************************/
 void key_quickselect(enum quickselect_type qtype)
 {
+  struct unit_list *punits = unit_list_new();
+  struct unit *punit2;
+  bool tiles[MAP_INDEX_SIZE], first;
+
+  memset(tiles, 0, sizeof(tiles));
+  /* Collect the units */
   unit_list_iterate(get_units_in_focus(), punit) {
-    struct unit *punit2 = quickselect(punit->tile, qtype);
+    if (tiles[punit->tile->index]) {
+      /* One unit by tile only */
+      continue;
+    }
 
-    set_unit_focus_and_select(punit2);
+    punit2 = quickselect(punit->tile, qtype);
+    if (punit2) {
+      unit_list_append(punits, punit2);
+    }
+    tiles[punit->tile->index] = TRUE;
   } unit_list_iterate_end;
+
+  /* Set them in the focus */
+  first = TRUE;
+  unit_list_iterate(punits, punit) {
+    if (first) {
+      set_unit_focus_and_select(punit);
+      first = FALSE;
+    } else {
+      add_unit_focus(punit);
+    }
+  } unit_list_iterate_end;
+
+  unit_list_unlink_all(punits);
+  unit_list_free(punits);
 }

Index: client/control.c
===================================================================
--- client/control.c	(révision 13752)
+++ client/control.c	(copie de travail)
@@ -2726,13 +2726,41 @@
 }
 
 /**************************************************************************
-...
+  Selects new units on the same tiles than the previous selected ones.
+  Allows only one unit by tile.
 **************************************************************************/
 void key_quickselect(enum quickselect_type qtype)
 {
+  struct unit_list *punits = unit_list_new();
+  struct unit *punit2;
+  bool tiles[MAP_INDEX_SIZE], first;
+
+  memset(tiles, 0, sizeof(tiles));
+  /* Collect the units */
   unit_list_iterate(get_units_in_focus(), punit) {
-    struct unit *punit2 = quickselect(punit->tile, qtype);
+    if (tiles[punit->tile->index]) {
+      /* One unit by tile only */
+      continue;
+    }
 
-    set_unit_focus_and_select(punit2);
+    punit2 = quickselect(punit->tile, qtype);
+    if (punit2) {
+      unit_list_append(punits, punit2);
+    }
+    tiles[punit->tile->index] = TRUE;
   } unit_list_iterate_end;
+
+  /* Set them in the focus */
+  first = TRUE;
+  unit_list_iterate(punits, punit) {
+    if (first) {
+      set_unit_focus_and_select(punit);
+      first = FALSE;
+    } else {
+      add_unit_focus(punit);
+    }
+  } unit_list_iterate_end;
+
+  unit_list_unlink_all(punits);
+  unit_list_free(punits);
 }
_______________________________________________
Freeciv-dev mailing list
Freeciv-dev@gna.org
https://mail.gna.org/listinfo/freeciv-dev

Reply via email to