From 46f81d6fd380379b80bc1cf47ac3320813af4c3a Mon Sep 17 00:00:00 2001
From: Marko Lindqvist <cazfi74@gmail.com>
Date: Fri, 9 Jun 2023 16:15:59 +0300
Subject: [PATCH 31/31] rscompat: Stop relying in
 ERM_CLEANPOLLUTION/ERM_CLEANFALLOUT

See osdn #48200

Signed-off-by: Marko Lindqvist <cazfi74@gmail.com>
---
 server/rscompat.c | 45 +++++++++++++++++++++++++--------------------
 server/rscompat.h |  3 ++-
 server/ruleset.c  | 26 ++++++++++++++++++--------
 3 files changed, 45 insertions(+), 29 deletions(-)

diff --git a/server/rscompat.c b/server/rscompat.c
index fd11cdfe21..9efe56c03e 100644
--- a/server/rscompat.c
+++ b/server/rscompat.c
@@ -567,14 +567,34 @@ int add_user_extra_flags_3_2(int start)
 /**********************************************************************//**
   Adjust rmcause name of an extra loaded from a 3.1 ruleset.
 **************************************************************************/
-const char *rscompat_extra_rmcause_3_2(const char *old_name)
+const char *rscompat_extra_rmcause_3_2(struct extra_type *pextra,
+                                       const char *old_name)
 {
-  if (!fc_strcasecmp("CleanPollution", old_name)
-      || !fc_strcasecmp("CleanFallout", old_name)) {
-    return "Clean";
+  const char *retname = old_name;
+
+  if (!fc_strcasecmp("CleanPollution", old_name)) {
+    /* Don't give this flag to extras that have been using
+     * removal time not tied to terrain, so it won't get
+     * overridden by "ActivityTime" effects we also add. */
+    if (pextra->removal_time == 0) {
+      BV_SET(pextra->flags,
+             extra_flag_id_by_name("CleanAsPollution", fc_strcasecmp));
+    }
+    retname = "Clean";
+  }
+
+  if (!fc_strcasecmp("CleanFallout", old_name)) {
+    /* Don't give this flag to extras that have been using
+     * removal time not tied to terrain, so it won't get
+     * overridden by "ActivityTime" effects we also add. */
+    if (pextra->removal_time == 0) {
+      BV_SET(pextra->flags,
+             extra_flag_id_by_name("CleanAsFallout", fc_strcasecmp));
+    }
+    retname = "Clean";
   }
 
-  return old_name;
+  return retname;
 }
 
 /**********************************************************************//**
@@ -594,21 +614,6 @@ void rscompat_extra_adjust_3_2(struct extra_type *pextra)
                                            FALSE, TRUE, FALSE,
                                            "-980"));
   }
-
-  /* Don't give these flags to extras that have been using
-   * removal time not tied to terrain, so it won't get
-   * overridden by "ActivityTime" effects we also add. */
-  if (is_extra_removed_by(pextra, ERM_CLEANPOLLUTION)
-      && pextra->removal_time == 0) {
-    BV_SET(pextra->flags,
-           extra_flag_id_by_name("CleanAsPollution", fc_strcasecmp));
-  }
-
-  if (is_extra_removed_by(pextra, ERM_CLEANFALLOUT)
-      && pextra->removal_time == 0) {
-    BV_SET(pextra->flags,
-           extra_flag_id_by_name("CleanAsFallout", fc_strcasecmp));
-  }
 }
 
 /**********************************************************************//**
diff --git a/server/rscompat.h b/server/rscompat.h
index 935ac94050..bc0229700c 100644
--- a/server/rscompat.h
+++ b/server/rscompat.h
@@ -67,7 +67,8 @@ void rscompat_req_adjust_3_2(const struct rscompat_info *compat,
                              const char **ptype, const char **pname,
                              bool *ppresent, const char *sec_name);
 int add_user_extra_flags_3_2(int start);
-const char *rscompat_extra_rmcause_3_2(const char *old_name);
+const char *rscompat_extra_rmcause_3_2(struct extra_type *pextra,
+                                       const char *old_name);
 void rscompat_extra_adjust_3_2(struct extra_type *pextra);
 bool rscompat_setting_needs_special_handling(const char *name);
 void rscompat_settings_do_special_handling(struct section_file *file,
diff --git a/server/ruleset.c b/server/ruleset.c
index 80da8ae40f..641730129c 100644
--- a/server/ruleset.c
+++ b/server/ruleset.c
@@ -3719,13 +3719,25 @@ static bool load_ruleset_terrain(struct section_file *file,
 
       free(slist);
 
+      /* Handle before rscompat_extra_rmcause_3_2() might need the values */
+      pextra->removal_time = 0; /* Default */
+      lookup_time(file, &pextra->removal_time, section, "removal_time",
+                  filename, extra_rule_name(pextra), &ok);
+      pextra->removal_time_factor
+        = secfile_lookup_int_default(file, 1, "%s.removal_time_factor",
+                                     section);
+
+      /* Do not clear after this point.
+       * rscompat_extra_rmcause_3_2() might set a flag we want to keep. */
+      BV_CLR_ALL(pextra->flags);
+
       slist = secfile_lookup_str_vec(file, &nval, "%s.rmcauses", section);
       pextra->rmcauses = 0;
       for (j = 0; j < nval; j++) {
         const char *sval = slist[j];
 
         if (compat->compat_mode && compat->version < RSFORMAT_3_2) {
-          sval = rscompat_extra_rmcause_3_2(sval);
+          sval = rscompat_extra_rmcause_3_2(pextra, sval);
         }
 
         rmcause = extra_rmcause_by_name(sval, fc_strcasecmp);
@@ -3802,16 +3814,15 @@ static bool load_ruleset_terrain(struct section_file *file,
       pextra->generated = secfile_lookup_bool_default(file, TRUE,
                                                       "%s.generated", section);
 
-      pextra->build_time = 0; /* default */
+      pextra->build_time = 0; /* Default */
       lookup_time(file, &pextra->build_time, section, "build_time",
                   filename, extra_rule_name(pextra), &ok);
       pextra->build_time_factor = secfile_lookup_int_default(file, 1,
                                                              "%s.build_time_factor", section);
-      pextra->removal_time = 0; /* default */
-      lookup_time(file, &pextra->removal_time, section, "removal_time",
-                  filename, extra_rule_name(pextra), &ok);
-      pextra->removal_time_factor = secfile_lookup_int_default(file, 1,
-                                                               "%s.removal_time_factor", section);
+
+      /* removal_time handled earlier, so that rscompat_extra_rmcause_3_2()
+       * can use them. */
+
       pextra->infracost = secfile_lookup_int_default(file, 0,
                                                      "%s.infracost", section);
       if (pextra->infracost > 0) {
@@ -3876,7 +3887,6 @@ static bool load_ruleset_terrain(struct section_file *file,
       }
 
       slist = secfile_lookup_str_vec(file, &nval, "%s.flags", section);
-      BV_CLR_ALL(pextra->flags);
       for (j = 0; j < nval; j++) {
         const char *sval = slist[j];
         enum extra_flag_id flag;
-- 
2.39.2