Author: sveinung
Date: Tue Mar 15 12:36:52 2016
New Revision: 32241

URL: http://svn.gna.org/viewcvs/freeciv?rev=32241&view=rev
Log:
Base flag to extra flag ruleset upgrade support.

See patch #7059

Modified:
    trunk/common/base.c
    trunk/common/base.h
    trunk/server/rscompat.c
    trunk/server/rssanity.c
    trunk/server/ruleset.c

Modified: trunk/common/base.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/common/base.c?rev=32241&r1=32240&r2=32241&view=diff
==============================================================================
--- trunk/common/base.c (original)
+++ trunk/common/base.c Tue Mar 15 12:36:52 2016
@@ -70,6 +70,18 @@
   return FALSE;
 }
 
+/***************************************************************************
+  Returns TRUE iff the given flag is retired.
+
+  If a base flag is retired without being replaced by an extra flag before
+  3.0 is released rscompat_req_type_name_3_0() must be updated.
+***************************************************************************/
+bool base_flag_is_retired(enum base_flag_id flag)
+{
+  /* No base flags have been retired yet. */
+  return FALSE;
+}
+
 /****************************************************************************
   Is tile native to base?
 ****************************************************************************/

Modified: trunk/common/base.h
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/common/base.h?rev=32241&r1=32240&r2=32241&view=diff
==============================================================================
--- trunk/common/base.h (original)
+++ trunk/common/base.h Tue Mar 15 12:36:52 2016
@@ -87,6 +87,7 @@
                             enum base_flag_id flag);
 bool is_base_flag_near_tile(const struct tile *ptile,
                             enum base_flag_id flag);
+bool base_flag_is_retired(enum base_flag_id flag);
 bool base_has_flag_for_utype(const struct base_type *pbase,
                              enum base_flag_id flag,
                              const struct unit_type *punittype);

Modified: trunk/server/rscompat.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/rscompat.c?rev=32241&r1=32240&r2=32241&view=diff
==============================================================================
--- trunk/server/rscompat.c     (original)
+++ trunk/server/rscompat.c     Tue Mar 15 12:36:52 2016
@@ -712,6 +712,29 @@
                                     TRUE, TRUE, "Targeted Sabotage City"));
   }
 
+  if (info->ver_terrain < 10) {
+    /* Map from retired base flag to current extra flag. */
+    const struct {
+      enum base_flag_id from;
+      enum extra_flag_id to;
+    } base_to_extra_flag_map_3_0[] = {
+    };
+
+    extra_type_by_cause_iterate(EC_BASE, pextra) {
+      int i;
+      struct base_type *pbase = extra_base_get(pextra);
+
+      for (i = 0; i < ARRAY_SIZE(base_to_extra_flag_map_3_0); i++) {
+        if (BV_ISSET(pbase->flags, base_to_extra_flag_map_3_0[i].from)) {
+          /* Set the *extra* user flag */
+          BV_SET(pextra->flags, base_to_extra_flag_map_3_0[i].to);
+          /* Remove the retired *base* flag. */
+          BV_CLR(pbase->flags, base_to_extra_flag_map_3_0[i].from);
+        }
+      }
+    } extra_type_by_cause_iterate_end;
+  }
+
   /* Upgrade existing effects. */
   iterate_effect_cache(effect_list_compat_cb, info);
 }
@@ -776,5 +799,11 @@
     return "Extra";
   }
 
+  if (!fc_strcasecmp("BaseFlag", old_type)
+      && base_flag_is_retired(base_flag_id_by_name(old_value,
+                                                   fc_strcasecmp))) {
+    return "ExtraFlag";
+  }
+
   return old_type;
 }

Modified: trunk/server/rssanity.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/rssanity.c?rev=32241&r1=32240&r2=32241&view=diff
==============================================================================
--- trunk/server/rssanity.c     (original)
+++ trunk/server/rssanity.c     Tue Mar 15 12:36:52 2016
@@ -857,6 +857,26 @@
     } extra_type_list_iterate_end;
   } extra_type_by_cause_iterate_end;
 
+  /* Bases */
+  extra_type_by_cause_iterate(EC_BASE, pextra) {
+    int bfi;
+    struct base_type *pbase = extra_base_get(pextra);
+
+    for (bfi = 0; bfi < BF_COUNT; bfi++) {
+      if (!base_flag_is_retired(bfi)) {
+        /* Still valid. */
+        continue;
+      }
+
+      if (BV_ISSET(pbase->flags, bfi)) {
+        ruleset_error(LOG_ERROR,
+                      "Base %s uses the retired base flag %s!",
+                      extra_name_translation(pextra),
+                      base_flag_id_name(bfi));
+      }
+    }
+  } extra_type_by_cause_iterate_end;
+
   /* City styles */
   for (i = 0; i < game.control.styles_count; i++) {
     if (!sanity_check_req_vec(&city_styles[i].reqs, TRUE, -1,

Modified: trunk/server/ruleset.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/ruleset.c?rev=32241&r1=32240&r2=32241&view=diff
==============================================================================
--- trunk/server/ruleset.c      (original)
+++ trunk/server/ruleset.c      Tue Mar 15 12:36:52 2016
@@ -3276,6 +3276,14 @@
                         sval);
           ok = FALSE;
           break;
+        } else if ((!compat->compat_mode || compat->ver_terrain >= 10)
+                   && base_flag_is_retired(flag)) {
+          ruleset_error(LOG_ERROR, "\"%s\" base \"%s\": retired flag "
+                                   "\"%s\". Please update the ruleset.",
+                        filename,
+                        extra_rule_name(pextra),
+                        sval);
+          ok = FALSE;
         } else {
           BV_SET(pbase->flags, flag);
         }


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

Reply via email to