From 46f81d6fd380379b80bc1cf47ac3320813af4c3a Mon Sep 17 00:00:00 2001 From: Marko Lindqvist 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 --- 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