From 4ed2f2dc9bcf254552c1f5e0b611b3236d3170ae Mon Sep 17 00:00:00 2001
From: Marko Lindqvist <cazfi74@gmail.com>
Date: Sun, 20 Sep 2026 11:23:04 +0300
Subject: [PATCH 67/67] Add server settings 'armisticelength' and
 'ceasefirelenght'

Requested by FriendAtArms

See RM #2261

Signed-off-by: Marko Lindqvist <cazfi74@gmail.com>
---
 common/game.h                 |  8 ++++++++
 common/networking/packets.def |  2 ++
 server/diplhand.c             | 20 ++++++++------------
 server/settings.c             | 18 ++++++++++++++++++
 4 files changed, 36 insertions(+), 12 deletions(-)

diff --git a/common/game.h b/common/game.h
index 43c120639a..feba1a9ca1 100644
--- a/common/game.h
+++ b/common/game.h
@@ -745,6 +745,14 @@ static inline bool is_ruleset_compat_mode(void)
 #define GAME_MIN_REVOLUTION_LENGTH      1
 #define GAME_MAX_REVOLUTION_LENGTH      20
 
+#define GAME_DEFAULT_ARMISTICE_LENGTH   16
+#define GAME_MIN_ARMISTICE_LENGTH       1
+#define GAME_MAX_ARMISTICE_LENGTH       100
+
+#define GAME_DEFAULT_CEASEFIRE_LENGTH   16
+#define GAME_MIN_CEASEFIRE_LENGTH       1
+#define GAME_MAX_CEASEFIRE_LENGTH       100
+
 #define GAME_DEFAULT_START_YEAR -4000
 
 #define GAME_DEFAULT_AIRLIFTINGSTYLE AIRLIFTING_CLASSICAL
diff --git a/common/networking/packets.def b/common/networking/packets.def
index 9dbd9cb2cb..779c29be45 100644
--- a/common/networking/packets.def
+++ b/common/networking/packets.def
@@ -498,6 +498,7 @@ PACKET_GAME_INFO = 16; sc, is-info
   BOOL airlift_from_always_enabled;
   BOOL airlift_to_always_enabled;
   UINT8 angrycitizen;
+  UINT8 armistice_length;
   SINT16 base_pollution;
   UINT16 base_tech_cost;
   UINT16 min_tech_cost;
@@ -508,6 +509,7 @@ PACKET_GAME_INFO = 16; sc, is-info
   BORDERS_MODE borders;
   UINT32 base_bribe_cost;
   CARAVAN_BONUS_STYLE caravan_bonus_style;
+  UINT8 ceasefire_length;
   UINT32 culture_vic_points;
   UINT16 culture_vic_lead;
   UINT16 culture_migration_pml;
diff --git a/server/diplhand.c b/server/diplhand.c
index f6999a8253..4f6c30352a 100644
--- a/server/diplhand.c
+++ b/server/diplhand.c
@@ -52,10 +52,6 @@
 
 #include "diplhand.h"
 
-
-/* FIXME: Should this be put in a ruleset somewhere? */
-#define TURNS_LEFT 16
-
 /**********************************************************************//**
   Calls treaty_evaluate function if such is set for AI player.
 **************************************************************************/
@@ -567,8 +563,8 @@ void handle_diplomacy_accept_treaty_req(struct player *pplayer,
           pdest_seen_units = get_units_seen_via_ally(pdest, pgiver);
         }
         set_diplstate_type(ds_giverdest, ds_destgiver, DS_CEASEFIRE);
-        ds_giverdest->turns_left = TURNS_LEFT;
-        ds_destgiver->turns_left = TURNS_LEFT;
+        ds_giverdest->turns_left = game.info.ceasefire_length;
+        ds_destgiver->turns_left = game.info.ceasefire_length;
         notify_player(pgiver, NULL, E_TREATY_CEASEFIRE, ftc_server,
                       _("You agree on a cease-fire with %s."),
                       player_name(pdest));
@@ -591,8 +587,8 @@ void handle_diplomacy_accept_treaty_req(struct player *pplayer,
           pdest_seen_units = get_units_seen_via_ally(pdest, pgiver);
         }
         set_diplstate_type(ds_giverdest, ds_destgiver, DS_ARMISTICE);
-        ds_giverdest->turns_left = TURNS_LEFT;
-        ds_destgiver->turns_left = TURNS_LEFT;
+        ds_giverdest->turns_left = game.info.armistice_length;
+        ds_destgiver->turns_left = game.info.armistice_length;
         notify_player(pgiver, NULL, E_TREATY_PEACE, ftc_server,
                       /* TRANS: ... the Poles ... Polish territory */
                       PL_("You agree on an armistice with the %s. In %d turn, "
@@ -603,9 +599,9 @@ void handle_diplomacy_accept_treaty_req(struct player *pplayer,
                           "it will become a peace treaty. Move any "
                           "military units out of %s territory to avoid them "
                           "being disbanded.",
-                          TURNS_LEFT),
+                          game.info.armistice_length),
                       nation_plural_for_player(pdest),
-                      TURNS_LEFT,
+                      game.info.armistice_length,
                       nation_adjective_for_player(pdest));
         notify_player(pdest, NULL, E_TREATY_PEACE, ftc_server,
                       /* TRANS: ... the Poles ... Polish territory */
@@ -617,9 +613,9 @@ void handle_diplomacy_accept_treaty_req(struct player *pplayer,
                           "it will become a peace treaty. Move any "
                           "military units out of %s territory to avoid them "
                           "being disbanded.",
-                          TURNS_LEFT),
+                          game.info.armistice_length),
                       nation_plural_for_player(pgiver),
-                      TURNS_LEFT,
+                      game.info.armistice_length,
                       nation_adjective_for_player(pgiver));
         if (old_diplstate == DS_ALLIANCE) {
           update_players_after_alliance_breakup(pgiver, pdest,
diff --git a/server/settings.c b/server/settings.c
index 450f53c0af..eab7c1398f 100644
--- a/server/settings.c
+++ b/server/settings.c
@@ -2619,6 +2619,24 @@ static struct setting settings[] = {
           GAME_MIN_REVOLUTION_LENGTH, GAME_MAX_REVOLUTION_LENGTH,
           GAME_DEFAULT_REVOLUTION_LENGTH)
 
+  GEN_INT("armisticelength", game.info.armistice_length,
+          SSET_RULES_FLEXIBLE, SSET_MILITARY, SSET_RARE,
+          ALLOW_NONE, ALLOW_BASIC,
+          N_("Length of armistice"),
+          N_("Timee before an armistice turns in to a peace treaty."),
+          nullptr, nullptr, nullptr,
+          GAME_MIN_ARMISTICE_LENGTH, GAME_MAX_ARMISTICE_LENGTH,
+          GAME_DEFAULT_ARMISTICE_LENGTH)
+
+  GEN_INT("ceasefirelength", game.info.ceasefire_length,
+          SSET_RULES_FLEXIBLE, SSET_MILITARY, SSET_RARE,
+          ALLOW_NONE, ALLOW_BASIC,
+          N_("Length of cease-fire"),
+          N_("Time before a cease-fire reverts back to full war."),
+          nullptr, nullptr, nullptr,
+          GAME_MIN_CEASEFIRE_LENGTH, GAME_MAX_CEASEFIRE_LENGTH,
+          GAME_DEFAULT_CEASEFIRE_LENGTH)
+
   GEN_BOOL("fogofwar", game.info.fogofwar,
            SSET_RULES, SSET_MILITARY, SSET_RARE, ALLOW_NONE, ALLOW_BASIC,
            N_("Whether to enable fog of war"),
-- 
2.53.0

