Author: sveinung
Date: Tue Mar 29 08:27:49 2016
New Revision: 32269

URL: http://svn.gna.org/viewcvs/freeciv?rev=32269&view=rev
Log:
rscompat: user extra flag insertion skeleton.

See patch #7076

Modified:
    trunk/server/rscompat.c

Modified: trunk/server/rscompat.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/rscompat.c?rev=32269&r1=32268&r2=32269&view=diff
==============================================================================
--- trunk/server/rscompat.c     (original)
+++ trunk/server/rscompat.c     Tue Mar 29 08:27:49 2016
@@ -133,6 +133,25 @@
 
   /* All unit type user flags are taken. */
   return MAX_NUM_USER_UCLASS_FLAGS;
+}
+
+/**************************************************************************
+  Find and return the first unused extra user flag. If all extra user
+  flags are taken MAX_NUM_USER_EXTRA_FLAGS is returned.
+**************************************************************************/
+static int first_free_extra_user_flag(void)
+{
+  int flag;
+
+  /* Find the first unused user defined extra flag. */
+  for (flag = 0; flag < MAX_NUM_USER_EXTRA_FLAGS; flag++) {
+    if (extra_flag_id_name_cb(flag + EF_USER_FLAG_1) == NULL) {
+      return flag;
+    }
+  }
+
+  /* All unit type user flags are taken. */
+  return MAX_NUM_USER_EXTRA_FLAGS;
 }
 
 /**************************************************************************
@@ -233,6 +252,48 @@
     }
   }
 
+  if (info->ver_terrain < 10) {
+    /* Some extra flags moved to the ruleset between 2.6 and 3.0.
+     * Add them back as user flags.
+     * XXX: ruleset might not need all of these, and may have enough
+     * flags of its own that these additional ones prevent conversion. */
+    const struct {
+      const char *name;
+      const char *helptxt;
+    } new_extra_flags_30[] = {
+    };
+
+    int first_free;
+    int i;
+
+    /* Extra flags. */
+    first_free = first_free_extra_user_flag() + EF_USER_FLAG_1;
+
+    for (i = 0; i < ARRAY_SIZE(new_extra_flags_30); i++) {
+      if (EF_USER_FLAG_1 + MAX_NUM_USER_EXTRA_FLAGS <= first_free + i) {
+        /* Can't add the user extra flags. */
+        ruleset_error(LOG_ERROR,
+                      "Can't upgrade the ruleset. Not enough free extra "
+                      "user flags to add user flags for the extra flags "
+                      "that used to be hardcoded.");
+        return FALSE;
+      }
+
+      /* Shouldn't be possible for valid old ruleset to have flag names that
+       * clash with these ones */
+      if (extra_flag_id_by_name(new_extra_flags_30[i].name, fc_strcasecmp)
+          != extra_flag_id_invalid()) {
+        ruleset_error(LOG_ERROR,
+                      "Ruleset had illegal user extra flag '%s'",
+                      new_extra_flags_30[i].name);
+        return FALSE;
+      }
+      set_user_extra_flag_name(first_free + i,
+                               new_extra_flags_30[i].name,
+                               new_extra_flags_30[i].helptxt);
+    }
+  }
+
   /* No errors encountered. */
   return TRUE;
 }


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

Reply via email to