From 7e0f3c6f6ab9f63e1f2e1d2e48f233905dd6ffc4 Mon Sep 17 00:00:00 2001
From: Marko Lindqvist <cazfi74@gmail.com>
Date: Wed, 1 May 2024 12:10:17 +0300
Subject: [PATCH 47/47] Add Bombard 4 action

Requested by elefant

See RM #523

Signed-off-by: Marko Lindqvist <cazfi74@gmail.com>
---
 common/actions.c                    | 23 +++++++++++++++++++++++
 doc/README.actions                  |  9 +++++++++
 gen_headers/enums/actions_enums.def |  1 +
 3 files changed, 33 insertions(+)

diff --git a/common/actions.c b/common/actions.c
index c24beeda18..3839f53d83 100644
--- a/common/actions.c
+++ b/common/actions.c
@@ -295,6 +295,16 @@ static void hard_code_actions(void)
                       /* Overwritten by the ruleset's bombard_3_max_range */
                       1,
                       FALSE);
+  actions[ACTION_BOMBARD4] =
+      unit_action_new(ACTION_BOMBARD4, ACTRES_BOMBARD,
+                      FALSE, TRUE, MAK_STAYS,
+                      /* A single domestic unit at the target tile will make
+                       * the action illegal. It must therefore be performed
+                       * from another tile. */
+                      1,
+                      /* Overwritten by the ruleset's bombard_4_max_range */
+                      1,
+                      FALSE);
   actions[ACTION_BOMBARD_LETHAL] =
       unit_action_new(ACTION_BOMBARD_LETHAL, ACTRES_BOMBARD,
                       FALSE, TRUE, MAK_STAYS,
@@ -5814,6 +5824,8 @@ const char *action_ui_name_ruleset_var_name(int act)
     return "ui_name_bombard_2";
   case ACTION_BOMBARD3:
     return "ui_name_bombard_3";
+  case ACTION_BOMBARD4:
+    return "ui_name_bombard_4";
   case ACTION_BOMBARD_LETHAL:
     return "ui_name_bombard_lethal";
   case ACTION_BOMBARD_LETHAL2:
@@ -6144,6 +6156,9 @@ const char *action_ui_name_default(int act)
   case ACTION_BOMBARD3:
     /* TRANS: B_ombard 3 (100% chance of success). */
     return N_("B%sombard 3%s");
+  case ACTION_BOMBARD4:
+    /* TRANS: B_ombard 4 (100% chance of success). */
+    return N_("B%sombard 4%s");
   case ACTION_BOMBARD_LETHAL:
   case ACTION_BOMBARD_LETHAL2:
     /* TRANS: Lethal B_ombard (100% chance of success). */
@@ -6493,6 +6508,7 @@ const char *action_min_range_ruleset_var_name(int act)
   case ACTION_BOMBARD:
   case ACTION_BOMBARD2:
   case ACTION_BOMBARD3:
+  case ACTION_BOMBARD4:
   case ACTION_BOMBARD_LETHAL:
   case ACTION_BOMBARD_LETHAL2:
   case ACTION_SPY_ATTACK:
@@ -6693,6 +6709,8 @@ const char *action_max_range_ruleset_var_name(int act)
     return "bombard_2_max_range";
   case ACTION_BOMBARD3:
     return "bombard_3_max_range";
+  case ACTION_BOMBARD4:
+    return "bombard_4_max_range";
   case ACTION_BOMBARD_LETHAL:
     return "bombard_lethal_max_range";
   case ACTION_BOMBARD_LETHAL2:
@@ -6850,6 +6868,7 @@ const char *action_target_kind_ruleset_var_name(int act)
   case ACTION_BOMBARD:
   case ACTION_BOMBARD2:
   case ACTION_BOMBARD3:
+  case ACTION_BOMBARD4:
   case ACTION_BOMBARD_LETHAL:
   case ACTION_BOMBARD_LETHAL2:
   case ACTION_SPY_ATTACK:
@@ -7018,6 +7037,7 @@ const char *action_actor_consuming_always_ruleset_var_name(action_id act)
   case ACTION_BOMBARD:
   case ACTION_BOMBARD2:
   case ACTION_BOMBARD3:
+  case ACTION_BOMBARD4:
   case ACTION_BOMBARD_LETHAL:
   case ACTION_BOMBARD_LETHAL2:
   case ACTION_SPY_ATTACK:
@@ -7098,6 +7118,8 @@ const char *action_blocked_by_ruleset_var_name(const struct action *act)
     return "bombard_2_blocked_by";
   case ACTION_BOMBARD3:
     return "bombard_3_blocked_by";
+  case ACTION_BOMBARD4:
+    return "bombard_4_blocked_by";
   case ACTION_BOMBARD_LETHAL:
     return "bombard_lethal_blocked_by";
   case ACTION_BOMBARD_LETHAL2:
@@ -7302,6 +7324,7 @@ action_post_success_forced_ruleset_var_name(const struct action *act)
   case ACTION_BOMBARD:
   case ACTION_BOMBARD2:
   case ACTION_BOMBARD3:
+  case ACTION_BOMBARD4:
   case ACTION_BOMBARD_LETHAL:
   case ACTION_BOMBARD_LETHAL2:
   case ACTION_NUKE:
diff --git a/doc/README.actions b/doc/README.actions
index 807817a5fa..148e26e082 100644
--- a/doc/README.actions
+++ b/doc/README.actions
@@ -805,6 +805,15 @@ Actions done by a unit against all units at a tile
  * A copy of "Bombard".
  * See "Bombard" for everything else.
 
+"Bombard 4" - bombard the units (and city) at the tile.
+ * UI name can be set using ui_name_bombard_4
+ * can't kill target units
+ * any action listed in bombard_4_blocked_by must be impossible
+ * actor must be on a tile next to the target or, if bombard_4_max_range
+   allows it, futher away.
+ * A copy of "Bombard".
+ * See "Bombard" for everything else.
+
 "Bombard Lethal" - bombard the units (and city) at the tile.
  * UI name can be set using ui_name_bombard_lethal
  * any action listed in bombard_lethal_blocked_by must be impossible
diff --git a/gen_headers/enums/actions_enums.def b/gen_headers/enums/actions_enums.def
index 5845b0d2d4..7e71b25035 100644
--- a/gen_headers/enums/actions_enums.def
+++ b/gen_headers/enums/actions_enums.def
@@ -64,6 +64,7 @@ values
   ACTION_BOMBARD                          "Bombard"
   ACTION_BOMBARD2                         "Bombard 2"
   ACTION_BOMBARD3                         "Bombard 3"
+  ACTION_BOMBARD4                         "Bombard 4"
   ACTION_BOMBARD_LETHAL                   "Bombard Lethal"
   ACTION_BOMBARD_LETHAL2                  "Bombard Lethal 2"
   ACTION_ROAD                             "Build Road"
-- 
2.43.0

