Author: cazfi
Date: Thu May 14 23:42:41 2015
New Revision: 29089

URL: http://svn.gna.org/viewcvs/freeciv?rev=29089&view=rev
Log:
Reworked how worker tasks are stored to savegame to avoid breaking tabular 
format
of the cities.

See patch #6086

Modified:
    branches/S2_6/server/savegame2.c

Modified: branches/S2_6/server/savegame2.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_6/server/savegame2.c?rev=29089&r1=29088&r2=29089&view=diff
==============================================================================
--- branches/S2_6/server/savegame2.c    (original)
+++ branches/S2_6/server/savegame2.c    Thu May 14 23:42:41 2015
@@ -4391,6 +4391,7 @@
                                   struct player *plr)
 {
   int ncities, i, plrno = player_number(plr);
+  bool tasks_handled;
 
   /* Check status and return if not OK (sg_success != TRUE). */
   sg_check_ret();
@@ -4448,14 +4449,59 @@
     city_refresh(pcity);
 
     city_list_append(plr->cities, pcity);
-
-    CALL_PLR_AI_FUNC(city_got, plr, plr, pcity);
+  }
+
+  tasks_handled = FALSE;
+  for (i = 0; !tasks_handled; i++) {
+    int city_id;
+    struct city *pcity = NULL;
+
+    city_id = secfile_lookup_int_default(loading->file, -1, 
"player%d.task%d.city",
+                                         plrno, i);
+
+    if (city_id != -1) {
+      pcity = player_city_by_number(plr, city_id);
+    }
+
+    if (pcity != NULL) {
+      const char *str;
+      int nat_x, nat_y;
+      struct worker_task *ptask = fc_malloc(sizeof(struct worker_task));
+
+      nat_x = secfile_lookup_int_default(loading->file, -1, 
"player%d.task%d.x", plrno, i);
+      nat_y = secfile_lookup_int_default(loading->file, -1, 
"player%d.task%d.y", plrno, i);
+
+      ptask->ptile = native_pos_to_tile(nat_x, nat_y);
+
+      str = secfile_lookup_str(loading->file, "player%d.task%d.activity", 
plrno, i);
+      ptask->act = unit_activity_by_name(str, fc_strcasecmp);
+
+      sg_failure_ret(unit_activity_is_valid(ptask->act),
+                     "Unknown workertask activity %s", str);
+
+      str = secfile_lookup_str(loading->file, "player%d.task%d.target", plrno, 
i);
+
+      if (strcmp("-", str)) {
+        ptask->tgt = extra_type_by_rule_name(str);
+
+        sg_failure_ret(ptask->tgt != NULL,
+                       "Unknown workertask target %s", str);
+      }
+
+      ptask->want = secfile_lookup_int_default(loading->file, 1,
+                                               "player%d.task%d.want", plrno, 
i);
+
+      worker_task_list_append(pcity->task_reqs, ptask);
+    } else {
+      tasks_handled = TRUE;
+    }
   }
 
   /* Check the sanity of the cities. */
   city_list_iterate(plr->cities, pcity) {
     city_refresh(pcity);
     sanity_check_city(pcity);
+    CALL_PLR_AI_FUNC(city_got, plr, plr, pcity);
   } city_list_iterate_end;
 }
 
@@ -4471,7 +4517,6 @@
   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());
@@ -4712,41 +4757,6 @@
     }
   }
 
-  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);
 
   return TRUE;
@@ -4973,24 +4983,35 @@
       } players_iterate_end;
     }
 
-    i = 0;
+    i++;
+  } city_list_iterate_end;
+
+  i = 0;
+  city_list_iterate(plr->cities, pcity) {
     worker_task_list_iterate(pcity->task_reqs, ptask) {
+      int nat_x, nat_y;
+
       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);
+      secfile_insert_int(saving->file, pcity->id, "player%d.task%d.city",
+                         plrno, i);
+      secfile_insert_int(saving->file, nat_y, "player%d.task%d.y", plrno, i);
+      secfile_insert_int(saving->file, nat_x, "player%d.task%d.x", plrno, i);
+      secfile_insert_str(saving->file, unit_activity_name(ptask->act),
+                         "player%d.task%d.activity",
+                         plrno, i);
       if (ptask->tgt != NULL) {
-        secfile_insert_str(saving->file, extra_rule_name(ptask->tgt), 
"%s.task%d.target",
-                           buf, i);
+        secfile_insert_str(saving->file, extra_rule_name(ptask->tgt),
+                           "player%d.task%d.target",
+                           plrno, i);
       } else {
-        secfile_insert_str(saving->file, "-", "%s.task%d.target",
-                           buf, i);
-      }
-      secfile_insert_int(saving->file, ptask->want, "%s.task%d.want", buf, i);
+        secfile_insert_str(saving->file, "-",
+                           "player%d.task%d.target",
+                           plrno, i);
+      }
+      secfile_insert_int(saving->file, ptask->want, "player%d.task%d.want", 
plrno, i);
+
+      i++;
     } worker_task_list_iterate_end;
-
-    i++;
   } city_list_iterate_end;
 }
 


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

Reply via email to