Author: cazfi
Date: Mon Apr 27 19:40:51 2015
New Revision: 28927

URL: http://svn.gna.org/viewcvs/freeciv?rev=28927&view=rev
Log:
Store city worker task to a list (of one element, at the moment).

See patch #6032

Modified:
    branches/S2_6/ai/threaded/taicity.c
    branches/S2_6/client/gui-gtk-3.0/citydlg.c
    branches/S2_6/client/packhand.c
    branches/S2_6/client/tilespec.c
    branches/S2_6/common/city.c
    branches/S2_6/common/city.h
    branches/S2_6/common/workertask.h
    branches/S2_6/server/advisors/autosettlers.c
    branches/S2_6/server/citytools.c
    branches/S2_6/server/savegame2.c
    branches/S2_6/server/unithand.c

Modified: branches/S2_6/ai/threaded/taicity.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_6/ai/threaded/taicity.c?rev=28927&r1=28926&r2=28927&view=diff
==============================================================================
--- branches/S2_6/ai/threaded/taicity.c (original)
+++ branches/S2_6/ai/threaded/taicity.c Mon Apr 27 19:40:51 2015
@@ -376,13 +376,20 @@
 
   if (pcity != NULL && city_owner(pcity) == req->plr) {
     /* City has not been lost meanwhile */
+    struct worker_task *ptask = worker_task_list_get(pcity->task_reqs, 0);
+
+    if (ptask == NULL) {
+      ptask = fc_malloc(sizeof(struct worker_task));
+      worker_task_init(ptask);
+      worker_task_list_append(pcity->task_reqs, ptask);
+    }
 
     log_debug("%s storing req for act %d at (%d,%d)",
               pcity->name, data->task.act, TILE_XY(data->task.ptile));
-    pcity->task_req.ptile = data->task.ptile;
-    pcity->task_req.act   = data->task.act;
-    pcity->task_req.tgt   = data->task.tgt;
-    pcity->task_req.want  = data->task.want;
+    ptask->ptile = data->task.ptile;
+    ptask->act   = data->task.act;
+    ptask->tgt   = data->task.tgt;
+    ptask->want  = data->task.want;
 
     /* Send info to observers */
     package_and_send_worker_task(pcity);

Modified: branches/S2_6/client/gui-gtk-3.0/citydlg.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_6/client/gui-gtk-3.0/citydlg.c?rev=28927&r1=28926&r2=28927&view=diff
==============================================================================
--- branches/S2_6/client/gui-gtk-3.0/citydlg.c  (original)
+++ branches/S2_6/client/gui-gtk-3.0/citydlg.c  Mon Apr 27 19:40:51 2015
@@ -2805,6 +2805,7 @@
     struct terrain *pterr = tile_terrain(ptile);
     struct universal for_terr = { .kind = VUT_TERRAIN,
                                   .value = { .terrain = pterr }};
+    struct worker_task *ptask;
 
     is_showing_workertask_dialog = TRUE;
     workertask_req.owner = pcity;
@@ -2813,7 +2814,9 @@
     shl = choice_dialog_start(GTK_WINDOW(toplevel),
                               _("What Action to Request"),
                               _("Select autosettler activity:"));
-    if (pcity->task_req.ptile != NULL) {
+
+    ptask = worker_task_list_get(pcity->task_reqs, 0);
+    if (ptask != NULL) {
       choice_dialog_add(shl, _("Clear request"),
                         G_CALLBACK(set_city_workertask),
                         GINT_TO_POINTER(ACTIVITY_IDLE), NULL);

Modified: branches/S2_6/client/packhand.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_6/client/packhand.c?rev=28927&r1=28926&r2=28927&view=diff
==============================================================================
--- branches/S2_6/client/packhand.c     (original)
+++ branches/S2_6/client/packhand.c     Mon Apr 27 19:40:51 2015
@@ -1101,26 +1101,34 @@
 void handle_worker_task(const struct packet_worker_task *packet)
 {
   struct city *pcity = game_city_by_number(packet->city_id);
+  struct worker_task *ptask;
 
   if (pcity == NULL
       || (pcity->owner != client.conn.playing && 
!client_is_global_observer())) {
     return;
   }
 
-  /* It's ok for the tile to be NULL. That means clearing
-   * existing worker task. */
-  if (packet->tile_id >= 0) {
-    pcity->task_req.ptile = index_to_tile(packet->tile_id);
-  } else {
-    pcity->task_req.ptile = NULL;
-  }
-  pcity->task_req.act = packet->activity;
-  if (packet->tgt >= 0) {
-    pcity->task_req.tgt = extra_by_number(packet->tgt);
-  } else {
-    pcity->task_req.tgt = NULL;
-  }
-  pcity->task_req.want = packet->want;
+  ptask = worker_task_list_get(pcity->task_reqs, 0);
+
+  if (ptask == NULL && packet->tile_id >= 0) {
+    ptask = fc_malloc(sizeof(struct worker_task));
+    worker_task_list_append(pcity->task_reqs, ptask);
+  } else if (ptask != NULL && packet->tile_id < 0) {
+    worker_task_list_remove(pcity->task_reqs, ptask);
+    free(ptask);
+    ptask = NULL;
+  }
+
+  if (ptask != NULL) {
+    ptask->ptile = index_to_tile(packet->tile_id);
+    ptask->act = packet->activity;
+    if (packet->tgt >= 0) {
+      ptask->tgt = extra_by_number(packet->tgt);
+    } else {
+      ptask->tgt = NULL;
+    }
+    ptask->want = packet->want;
+  }
 
   refresh_city_dialog(pcity);
 }

Modified: branches/S2_6/client/tilespec.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_6/client/tilespec.c?rev=28927&r1=28926&r2=28927&view=diff
==============================================================================
--- branches/S2_6/client/tilespec.c     (original)
+++ branches/S2_6/client/tilespec.c     Mon Apr 27 19:40:51 2015
@@ -5381,24 +5381,26 @@
 
   case LAYER_WORKERTASK:
     if (citymode != NULL && ptile != NULL) {
-      if (citymode->task_req.ptile == ptile) {
-        switch (citymode->task_req.act) {
+      struct worker_task *ptask = worker_task_list_get(citymode->task_reqs, 0);
+
+      if (ptask != NULL && ptask->ptile == ptile) {
+        switch (ptask->act) {
         case ACTIVITY_MINE:
-          if (citymode->task_req.tgt == NULL) {
+          if (ptask->tgt == NULL) {
             ADD_SPRITE_SIMPLE(t->sprites.unit.mine);
           } else {
-            
ADD_SPRITE_SIMPLE(t->sprites.extras[extra_index(citymode->task_req.tgt)].activity);
+            
ADD_SPRITE_SIMPLE(t->sprites.extras[extra_index(ptask->tgt)].activity);
           }
           break;
         case ACTIVITY_IRRIGATE:
-          if (citymode->task_req.tgt == NULL) {
+          if (ptask->tgt == NULL) {
             ADD_SPRITE_SIMPLE(t->sprites.unit.irrigate);
           } else {
-            
ADD_SPRITE_SIMPLE(t->sprites.extras[extra_index(citymode->task_req.tgt)].activity);
+            
ADD_SPRITE_SIMPLE(t->sprites.extras[extra_index(ptask->tgt)].activity);
           }
           break;
         case ACTIVITY_GEN_ROAD:
-          
ADD_SPRITE_SIMPLE(t->sprites.extras[extra_index(citymode->task_req.tgt)].activity);
+          
ADD_SPRITE_SIMPLE(t->sprites.extras[extra_index(ptask->tgt)].activity);
           break;
         case ACTIVITY_TRANSFORM:
           ADD_SPRITE_SIMPLE(t->sprites.unit.transform);

Modified: branches/S2_6/common/city.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_6/common/city.c?rev=28927&r1=28926&r2=28927&view=diff
==============================================================================
--- branches/S2_6/common/city.c (original)
+++ branches/S2_6/common/city.c Mon Apr 27 19:40:51 2015
@@ -3072,8 +3072,7 @@
   worklist_init(&pcity->worklist);
 
   pcity->units_supported = unit_list_new();
-
-  worker_task_init(&pcity->task_req);
+  pcity->task_reqs = worker_task_list_new();
 
   if (is_server()) {
     pcity->server.mgr_score_calc_turn = -1; /* -1 = never */
@@ -3101,6 +3100,8 @@
 
   citizens_free(pcity);
 
+  worker_task_list_destroy(pcity->task_reqs);
+
   unit_list_destroy(pcity->units_supported);
   if (pcity->tile_cache != NULL) {
     free(pcity->tile_cache);

Modified: branches/S2_6/common/city.h
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_6/common/city.h?rev=28927&r1=28926&r2=28927&view=diff
==============================================================================
--- branches/S2_6/common/city.h (original)
+++ branches/S2_6/common/city.h Mon Apr 27 19:40:51 2015
@@ -385,7 +385,7 @@
 
   int history;                 /* Cumulative culture */
 
-  struct worker_task task_req;
+  struct worker_task_list *task_reqs;
 
   union {
     struct {

Modified: branches/S2_6/common/workertask.h
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_6/common/workertask.h?rev=28927&r1=28926&r2=28927&view=diff
==============================================================================
--- branches/S2_6/common/workertask.h   (original)
+++ branches/S2_6/common/workertask.h   Mon Apr 27 19:40:51 2015
@@ -25,6 +25,15 @@
   int want;
 };
 
+/* get 'struct worker_task_list' and related functions: */
+#define SPECLIST_TAG worker_task
+#define SPECLIST_TYPE struct worker_task
+#include "speclist.h"
+
+#define worker_task_list_iterate(tasklist, ptask) \
+  TYPED_LIST_ITERATE(struct worker_task, tasklist, ptask)
+#define worker_task_list_iterate_end LIST_ITERATE_END
+
 void worker_task_init(struct worker_task *ptask);
 
 #ifdef __cplusplus

Modified: branches/S2_6/server/advisors/autosettlers.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_6/server/advisors/autosettlers.c?rev=28927&r1=28926&r2=28927&view=diff
==============================================================================
--- branches/S2_6/server/advisors/autosettlers.c        (original)
+++ branches/S2_6/server/advisors/autosettlers.c        Mon Apr 27 19:40:51 2015
@@ -762,9 +762,9 @@
 
   /* Have nearby cities requests? */
   city_list_iterate(pplayer->cities, pcity) {
-    struct worker_task *ptask = &pcity->task_req;
-
-    if (ptask->ptile != NULL) {
+    struct worker_task *ptask = worker_task_list_get(pcity->task_reqs, 0);
+
+    if (ptask != NULL) {
       bool consider = TRUE;
 
       /* Do not go to tiles that already have workers there. */

Modified: branches/S2_6/server/citytools.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_6/server/citytools.c?rev=28927&r1=28926&r2=28927&view=diff
==============================================================================
--- branches/S2_6/server/citytools.c    (original)
+++ branches/S2_6/server/citytools.c    Mon Apr 27 19:40:51 2015
@@ -3040,8 +3040,12 @@
 void clear_worker_task(struct city *pcity)
 {
   struct packet_worker_task packet;
-
-  worker_task_init(&pcity->task_req);
+  struct worker_task *ptask = worker_task_list_get(pcity->task_reqs, 0);
+
+  if (ptask != NULL) {
+    worker_task_list_remove(pcity->task_reqs, ptask);
+    free(ptask);
+  }
 
   packet.city_id = pcity->id;
   packet.tile_id = -1;
@@ -3059,20 +3063,24 @@
 void package_and_send_worker_task(struct city *pcity)
 {
   struct packet_worker_task packet;
+  struct worker_task *ptask = worker_task_list_get(pcity->task_reqs, 0);
 
   packet.city_id = pcity->id;
-  if (pcity->task_req.ptile == NULL) {
+  if (ptask != NULL) {
+    packet.tile_id = tile_index(ptask->ptile);
+    packet.activity = ptask->act;
+    if (ptask->tgt == NULL) {
+      packet.tgt = -1;
+    } else {
+      packet.tgt = extra_number(ptask->tgt);
+    }
+    packet.want = ptask->want;
+  } else {
     packet.tile_id = -1;
-  } else {
-    packet.tile_id = tile_index(pcity->task_req.ptile);
-  }
-  packet.activity = pcity->task_req.act;
-  if (pcity->task_req.tgt == NULL) {
-    packet.tgt = -1;
-  } else {
-    packet.tgt = extra_number(pcity->task_req.tgt);
-  }
-  packet.want = pcity->task_req.want;
+    packet.activity = ACTIVITY_IDLE;
+    packet.tgt = 0;
+    packet.want = 0;
+  }
 
   lsend_packet_worker_task(city_owner(pcity)->connections, &packet);
   lsend_packet_worker_task(game.glob_observers, &packet);

Modified: branches/S2_6/server/savegame2.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_6/server/savegame2.c?rev=28927&r1=28926&r2=28927&view=diff
==============================================================================
--- branches/S2_6/server/savegame2.c    (original)
+++ branches/S2_6/server/savegame2.c    Mon Apr 27 19:40:51 2015
@@ -4366,6 +4366,7 @@
   int nat_x, nat_y;
   citizens size;
   const char *stylename;
+  bool tasks_handled;
 
   sg_warn_ret_val(secfile_lookup_int(loading->file, &nat_x, "%s.x", citystr),
                   FALSE, "%s", secfile_error());
@@ -4606,31 +4607,39 @@
     }
   }
 
-  nat_x = secfile_lookup_int_default(loading->file, -1, "%s.task1.x", citystr);
-  nat_y = secfile_lookup_int_default(loading->file, -1, "%s.task1.y", citystr);
-
-  if (nat_x >= 0 && nat_y >= 0) {
-    const char *str;
-
-    pcity->task_req.ptile = native_pos_to_tile(nat_x, nat_y);
-
-    str = secfile_lookup_str(loading->file, "%s.task1.activity", citystr);
-    pcity->task_req.act = unit_activity_by_name(str, fc_strcasecmp);
-
-    sg_failure_ret_val(unit_activity_is_valid(pcity->task_req.act), FALSE,
-                       "Unknown workertask activity %s", str);
-
-    str = secfile_lookup_str(loading->file, "%s.task1.target", citystr);
-
-    if (strcmp("-", str)) {
-      pcity->task_req.tgt = extra_type_by_rule_name(str);
-
-      sg_failure_ret_val(pcity->task_req.tgt != NULL, FALSE,
-                         "Unknown workertask target %s", str);
-    }
-
-    pcity->task_req.want = secfile_lookup_int_default(loading->file, 1,
-                                                      "%s.task1.want", 
citystr);
+  tasks_handled = FALSE;
+  for (i = 0; !tasks_handled; i++) {
+    nat_x = secfile_lookup_int_default(loading->file, -1, "%s.task%d.x", 
citystr, i);
+    nat_y = secfile_lookup_int_default(loading->file, -1, "%s.task%d.y", 
citystr, i);
+
+    if (nat_x >= 0 && nat_y >= 0) {
+      const char *str;
+      struct worker_task *ptask = fc_malloc(sizeof(struct worker_task));
+
+      ptask->ptile = native_pos_to_tile(nat_x, nat_y);
+
+      str = secfile_lookup_str(loading->file, "%s.task%d.activity", citystr, 
i);
+      ptask->act = unit_activity_by_name(str, fc_strcasecmp);
+
+      sg_failure_ret_val(unit_activity_is_valid(ptask->act), FALSE,
+                         "Unknown workertask activity %s", str);
+
+      str = secfile_lookup_str(loading->file, "%s.task%d.target", citystr, i);
+
+      if (strcmp("-", str)) {
+        ptask->tgt = extra_type_by_rule_name(str);
+
+        sg_failure_ret_val(ptask->tgt != NULL, FALSE,
+                           "Unknown workertask target %s", str);
+      }
+
+      ptask->want = secfile_lookup_int_default(loading->file, 1,
+                                               "%s.task%d.want", citystr, i);
+
+      worker_task_list_append(pcity->task_reqs, ptask);
+    } else {
+      tasks_handled = TRUE;
+    }
   }
 
   CALL_FUNC_EACH_AI(city_load, loading->file, pcity, citystr);
@@ -4859,28 +4868,22 @@
       } players_iterate_end;
     }
 
-    if (pcity->task_req.ptile != NULL) {
-      index_to_native_pos(&nat_x, &nat_y, tile_index(pcity->task_req.ptile));
-      secfile_insert_int(saving->file, nat_y, "%s.task1.y", buf);
-      secfile_insert_int(saving->file, nat_x, "%s.task1.x", buf);
-      secfile_insert_str(saving->file, 
unit_activity_name(pcity->task_req.act), "%s.task1.activity",
-                         buf);
-      if (pcity->task_req.tgt != NULL) {
-        secfile_insert_str(saving->file, extra_rule_name(pcity->task_req.tgt), 
"%s.task1.target",
-                           buf);
+    i = 0;
+    worker_task_list_iterate(pcity->task_reqs, ptask) {
+      index_to_native_pos(&nat_x, &nat_y, tile_index(ptask->ptile));
+      secfile_insert_int(saving->file, nat_y, "%s.task%d.y", buf, i);
+      secfile_insert_int(saving->file, nat_x, "%s.task%d.x", buf, i);
+      secfile_insert_str(saving->file, unit_activity_name(ptask->act), 
"%s.task%d.activity",
+                         buf, i);
+      if (ptask->tgt != NULL) {
+        secfile_insert_str(saving->file, extra_rule_name(ptask->tgt), 
"%s.task%d.target",
+                           buf, i);
       } else {
-        secfile_insert_str(saving->file, "-", "%s.task1.target",
-                           buf);
-      }
-      secfile_insert_int(saving->file, pcity->task_req.want, "%s.task1.want", 
buf);
-    } else {
-      /* Dummy data to keep tabular format happy */
-      secfile_insert_int(saving->file, -1, "%s.task1.y", buf);
-      secfile_insert_int(saving->file, -1, "%s.task1.x", buf);
-      secfile_insert_str(saving->file, "-", "%s.task1.activity", buf);
-      secfile_insert_str(saving->file, "-", "%s.task1.target", buf);
-      secfile_insert_int(saving->file, 0, "%s.task1.want", buf);
-    }
+        secfile_insert_str(saving->file, "-", "%s.task%d.target",
+                           buf, i);
+      }
+      secfile_insert_int(saving->file, ptask->want, "%s.task%d.want", buf, i);
+    } worker_task_list_iterate_end;
 
     i++;
   } city_list_iterate_end;

Modified: branches/S2_6/server/unithand.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_6/server/unithand.c?rev=28927&r1=28926&r2=28927&view=diff
==============================================================================
--- branches/S2_6/server/unithand.c     (original)
+++ branches/S2_6/server/unithand.c     Mon Apr 27 19:40:51 2015
@@ -3037,25 +3037,34 @@
                         const struct packet_worker_task *packet)
 {
   struct city *pcity = game_city_by_number(packet->city_id);
+  struct worker_task *ptask;
 
   if (pcity == NULL || pcity->owner != pplayer) {
     return;
   }
 
-  /* It's ok for the tile to be NULL. That means clearing
-   * existing worker task. */
-  if (packet->tile_id >= 0) {
-    pcity->task_req.ptile = index_to_tile(packet->tile_id);
-  } else {
-    pcity->task_req.ptile = NULL;
-  }
-  pcity->task_req.act = packet->activity;
-  if (packet->tgt >= 0) {
-    pcity->task_req.tgt = extra_by_number(packet->tgt);
-  } else {
-    pcity->task_req.tgt = NULL;
-  }
-  pcity->task_req.want = packet->want;
+  ptask = worker_task_list_get(pcity->task_reqs, 0);
+
+  if (ptask == NULL && packet->tile_id >= 0) {
+    ptask = fc_malloc(sizeof(struct worker_task));
+    worker_task_init(ptask);
+    worker_task_list_append(pcity->task_reqs, ptask);
+  } else if (ptask != NULL && packet->tile_id < 0) {
+    worker_task_list_remove(pcity->task_reqs, ptask);
+    free(ptask);
+    ptask = NULL;
+  }
+
+  if (ptask != NULL) {
+    ptask->ptile = index_to_tile(packet->tile_id);
+    ptask->act = packet->activity;
+    if (packet->tgt >= 0) {
+      ptask->tgt = extra_by_number(packet->tgt);
+    } else {
+      ptask->tgt = NULL;
+    }
+    ptask->want = packet->want;
+  }
 
   lsend_packet_worker_task(pplayer->connections, packet);
 }


_______________________________________________
Freeciv-commits mailing list
Freeciv-commits@gna.org
https://mail.gna.org/listinfo/freeciv-commits

Reply via email to