From 8d880229fbb2beabbeb8df2427650ae6b6cfa893 Mon Sep 17 00:00:00 2001
From: Marko Lindqvist <cazfi74@gmail.com>
Date: Thu, 14 May 2026 16:30:53 +0300
Subject: [PATCH 13/13] AI: Enable rampage when unit can do Nuke Tile attack

See RM #2026

Signed-off-by: Marko Lindqvist <cazfi74@gmail.com>
---
 ai/default/daiunit.c | 50 +++++++++++++++++++++++++++++++-------------
 ai/default/daiunit.h |  4 +++-
 2 files changed, 39 insertions(+), 15 deletions(-)

diff --git a/ai/default/daiunit.c b/ai/default/daiunit.c
index 455ad12bb8..b97d112d2a 100644
--- a/ai/default/daiunit.c
+++ b/ai/default/daiunit.c
@@ -444,29 +444,51 @@ static bool is_my_turn(struct unit *punit, struct unit *pdef)
 **************************************************************************/
 enum gen_action dai_select_tile_attack_action(struct civ_map *nmap,
                                               struct unit *punit,
-                                              struct tile *ptile)
+                                              struct tile *ptile,
+                                              enum action_target_kind *kind)
 {
   enum gen_action selected;
 
   if ((selected = select_actres_action_unit_on_stack(nmap, ACTRES_CAPTURE_UNITS,
                                                      punit, ptile))
-      == ACTION_NONE
-      && (selected = select_actres_action_unit_on_stack(nmap, ACTRES_COLLECT_RANSOM,
+      != ACTION_NONE
+      || (selected = select_actres_action_unit_on_stack(nmap, ACTRES_COLLECT_RANSOM,
                                                         punit, ptile))
-      == ACTION_NONE
-      && (selected = select_actres_action_unit_on_stack(nmap, ACTRES_BOMBARD,
+      != ACTION_NONE
+      || (selected = select_actres_action_unit_on_stack(nmap, ACTRES_BOMBARD,
                                                         punit, ptile))
-      == ACTION_NONE
-      && (selected = select_actres_action_unit_on_stack(nmap, ACTRES_NUKE_UNITS,
+      != ACTION_NONE
+      || (selected = select_actres_action_unit_on_stack(nmap, ACTRES_NUKE_UNITS,
                                                         punit, ptile))
-      == ACTION_NONE
-      && (selected = select_actres_action_unit_on_stack(nmap, ACTRES_ATTACK,
-                                                        punit, ptile))
-      == ACTION_NONE) {
-    return ACTION_NONE;
+      != ACTION_NONE) {
+    if (kind != nullptr) {
+      *kind = ATK_UNITS;
+    }
+
+    return selected;
+  }
+
+  if ((selected = select_actres_action_unit_on_tile(nmap, ACTRES_NUKE,
+                                                    punit, ptile))
+      != ACTION_NONE) {
+    if (kind != nullptr) {
+      *kind = ATK_TILE;
+    }
+
+    return selected;
+  }
+
+  if ((selected = select_actres_action_unit_on_stack(nmap, ACTRES_ATTACK,
+                                                     punit, ptile))
+      != ACTION_NONE) {
+    if (kind != nullptr) {
+      *kind = ATK_UNITS;
+    }
+
+    return selected;
   }
 
-  return selected;
+  return ACTION_NONE;
 }
 
 /**********************************************************************//**
@@ -496,7 +518,7 @@ static int dai_rampage_want(struct unit *punit, struct tile *ptile)
   if (can_unit_attack_tile(punit, NULL, ptile)
       && (pdef = get_defender(nmap, punit, ptile, NULL))
       /* Action enablers might prevent attacking */
-      && dai_select_tile_attack_action(nmap, punit, ptile) != ACTION_NONE) {
+      && dai_select_tile_attack_action(nmap, punit, ptile, nullptr) != ACTION_NONE) {
     /* See description of kill_desire() about these variables. */
     int attack = unit_att_rating_now(punit);
     int benefit = stack_cost(punit, pdef);
diff --git a/ai/default/daiunit.h b/ai/default/daiunit.h
index 12625b5e18..659c5c7657 100644
--- a/ai/default/daiunit.h
+++ b/ai/default/daiunit.h
@@ -14,6 +14,7 @@
 #define FC__DAIUNIT_H
 
 /* common */
+#include "actres.h"
 #include "combat.h"
 #include "fc_types.h"
 #include "terrain.h"
@@ -171,6 +172,7 @@ void dai_switch_to_explore(struct ai_type *ait, struct unit *punit,
 
 enum gen_action dai_select_tile_attack_action(struct civ_map *nmap,
                                               struct unit *punit,
-                                              struct tile *ptile);
+                                              struct tile *ptile,
+                                              enum action_target_kind *kind);
 
 #endif /* FC__DAIUNIT_H */
-- 
2.53.0

