From d4598b4ae1eb5be8062ad300fdb6a40b61f7f860 Mon Sep 17 00:00:00 2001
From: Marko Lindqvist <cazfi74@gmail.com>
Date: Thu, 24 Sep 2026 16:38:57 +0300
Subject: [PATCH 68/68] Qt: Fix activation of S3_3 fake generalized actions

...from selection list

See RM #2201

Signed-off-by: Marko Lindqvist <cazfi74@gmail.com>
---
 client/gui-qt/dialogs.cpp | 237 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 237 insertions(+)

diff --git a/client/gui-qt/dialogs.cpp b/client/gui-qt/dialogs.cpp
index 0a2e18679f..e834f19424 100644
--- a/client/gui-qt/dialogs.cpp
+++ b/client/gui-qt/dialogs.cpp
@@ -132,14 +132,23 @@ static void bombard_lethal(QVariant data1, QVariant data2);
 static void bombard_lethal2(QVariant data1, QVariant data2);
 static void found_city(QVariant data1, QVariant data2);
 static void transform_terrain(QVariant data1, QVariant data2);
+static void transform_terrain2(QVariant data1, QVariant data2);
 static void cultivate(QVariant data1, QVariant data2);
+static void cultivate2(QVariant data1, QVariant data2);
 static void plant(QVariant data1, QVariant data2);
+static void plant2(QVariant data1, QVariant data2);
 static void pillage(QVariant data1, QVariant data2);
+static void pillage2(QVariant data1, QVariant data2);
 static void clean(QVariant data1, QVariant data2);
+static void clean2(QVariant data1, QVariant data2);
 static void road(QVariant data1, QVariant data2);
+static void road2(QVariant data1, QVariant data2);
 static void base(QVariant data1, QVariant data2);
+static void base2(QVariant data1, QVariant data2);
 static void mine(QVariant data1, QVariant data2);
+static void mine2(QVariant data1, QVariant data2);
 static void irrigate(QVariant data1, QVariant data2);
+static void irrigate2(QVariant data1, QVariant data2);
 static void nuke(QVariant data1, QVariant data2);
 static void attack(QVariant data1, QVariant data2);
 static void attack2(QVariant data1, QVariant data2);
@@ -152,6 +161,8 @@ static void paradrop_frighten_conquer(QVariant data1, QVariant data2);
 static void paradrop_enter(QVariant data1, QVariant data2);
 static void paradrop_enter_conquer(QVariant data1, QVariant data2);
 static void teleport(QVariant data1, QVariant data2);
+static void teleport2(QVariant data1, QVariant data2);
+static void teleport3(QVariant data1, QVariant data2);
 static void teleport_conquer(QVariant data1, QVariant data2);
 static void teleport_frighten(QVariant data1, QVariant data2);
 static void teleport_frighten_conquer(QVariant data1, QVariant data2);
@@ -174,6 +185,7 @@ static void regular_move2(QVariant data1, QVariant data2);
 static void regular_move3(QVariant data1, QVariant data2);
 static void convert_unit(QVariant data1, QVariant data2);
 static void fortify(QVariant data1, QVariant data2);
+static void fortify2(QVariant data1, QVariant data2);
 static void disband_unit(QVariant data1, QVariant data2);
 static void homeless(QVariant data1, QVariant data2);
 static void join_city(QVariant data1, QVariant data2);
@@ -323,6 +335,8 @@ static const QHash<action_id, pfcn_void> af_map_init(void)
   action_function[ACTION_PARADROP_FRIGHTEN_CONQUER]
       = paradrop_frighten_conquer;
   action_function[ACTION_TELEPORT] = teleport;
+  action_function[ACTION_TELEPORT2] = teleport2;
+  action_function[ACTION_TELEPORT3] = teleport3;
   action_function[ACTION_TELEPORT_CONQUER] = teleport_conquer;
   action_function[ACTION_TELEPORT_ENTER] = teleport_enter;
   action_function[ACTION_TELEPORT_ENTER_CONQUER] = teleport_enter_conquer;
@@ -335,14 +349,23 @@ static const QHash<action_id, pfcn_void> af_map_init(void)
   action_function[ACTION_SUICIDE_ATTACK2] = suicide_attack2;
   action_function[ACTION_WIPE_UNITS] = wipe_units;
   action_function[ACTION_TRANSFORM_TERRAIN] = transform_terrain;
+  action_function[ACTION_TRANSFORM_TERRAIN2] = transform_terrain2;
   action_function[ACTION_CULTIVATE] = cultivate;
+  action_function[ACTION_CULTIVATE2] = cultivate2;
   action_function[ACTION_PLANT] = plant;
+  action_function[ACTION_PLANT2] = plant2;
   action_function[ACTION_PILLAGE] = pillage;
+  action_function[ACTION_PILLAGE2] = pillage2;
   action_function[ACTION_CLEAN] = clean;
+  action_function[ACTION_CLEAN2] = clean2;
   action_function[ACTION_ROAD] = road;
+  action_function[ACTION_ROAD2] = road2;
   action_function[ACTION_BASE] = base;
+  action_function[ACTION_BASE2] = base2;
   action_function[ACTION_MINE] = mine;
+  action_function[ACTION_MINE2] = mine2;
   action_function[ACTION_IRRIGATE] = irrigate;
+  action_function[ACTION_IRRIGATE2] = irrigate2;
   action_function[ACTION_TRANSPORT_DISEMBARK1] = disembark1;
   action_function[ACTION_TRANSPORT_DISEMBARK2] = disembark2;
   action_function[ACTION_TRANSPORT_DISEMBARK3] = disembark3;
@@ -368,6 +391,7 @@ static const QHash<action_id, pfcn_void> af_map_init(void)
   // Unit acting with no target except itself.
   action_function[ACTION_DISBAND_UNIT] = disband_unit;
   action_function[ACTION_FORTIFY] = fortify;
+  action_function[ACTION_FORTIFY2] = fortify2;
   action_function[ACTION_CONVERT] = convert_unit;
   action_function[ACTION_HOMELESS] = homeless;
 
@@ -2526,6 +2550,20 @@ static void fortify(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Fortify 2" for choice dialog
+***************************************************************************/
+static void fortify2(QVariant data1, QVariant data2)
+{
+  int actor_id = data1.toInt();
+  int target_id = data2.toInt();
+
+  if (game_unit_by_number(actor_id) != nullptr) {
+    request_do_action(ACTION_FORTIFY2, actor_id,
+                      target_id, 0, "");
+  }
+}
+
 /***********************************************************************//**
   Action Convert Unit for choice dialog
 ***************************************************************************/
@@ -3115,6 +3153,21 @@ static void transform_terrain(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Transform Terrain 2" for choice dialog
+***************************************************************************/
+static void transform_terrain2(QVariant data1, QVariant data2)
+{
+  int actor_id = data1.toInt();
+  int target_id = data2.toInt();
+
+  if (game_unit_by_number(actor_id) != nullptr
+      && index_to_tile(&(wld.map), target_id) != nullptr) {
+    request_do_action(ACTION_TRANSFORM_TERRAIN2,
+                      actor_id, target_id, 0, "");
+  }
+}
+
 /***********************************************************************//**
   Action "Cultivate" for choice dialog
 ***************************************************************************/
@@ -3130,6 +3183,21 @@ static void cultivate(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Cultivate 2" for choice dialog
+***************************************************************************/
+static void cultivate2(QVariant data1, QVariant data2)
+{
+  int actor_id = data1.toInt();
+  int target_id = data2.toInt();
+
+  if (game_unit_by_number(actor_id) != nullptr
+      && index_to_tile(&(wld.map), target_id) != nullptr) {
+    request_do_action(ACTION_CULTIVATE2,
+                      actor_id, target_id, 0, "");
+  }
+}
+
 /***********************************************************************//**
   Action "Plant" for choice dialog
 ***************************************************************************/
@@ -3145,6 +3213,21 @@ static void plant(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Plant 2" for choice dialog
+***************************************************************************/
+static void plant2(QVariant data1, QVariant data2)
+{
+  int actor_id = data1.toInt();
+  int target_id = data2.toInt();
+
+  if (game_unit_by_number(actor_id) != nullptr
+      && index_to_tile(&(wld.map), target_id) != nullptr) {
+    request_do_action(ACTION_PLANT2,
+                      actor_id, target_id, 0, "");
+  }
+}
+
 /***********************************************************************//**
   Action "Pillage" for choice dialog
 ***************************************************************************/
@@ -3165,6 +3248,26 @@ static void pillage(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Pillage 2" for choice dialog
+***************************************************************************/
+static void pillage2(QVariant data1, QVariant data2)
+{
+  int actor_id = data1.toInt();
+  int target_id = data2.toInt();
+
+  if (game_unit_by_number(actor_id) != nullptr
+      && index_to_tile(&(wld.map), target_id) != nullptr) {
+    request_do_action(ACTION_PILLAGE2,
+                      actor_id, target_id,
+                      /* FIXME: will cause problems if more than
+                       * one action selection dialog at a time
+                       * becomes supported. */
+                      action_selection_target_extra(),
+                      "");
+  }
+}
+
 /***********************************************************************//**
   Action "Clean" for choice dialog
 ***************************************************************************/
@@ -3185,6 +3288,26 @@ static void clean(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Clean 2" for choice dialog
+***************************************************************************/
+static void clean2(QVariant data1, QVariant data2)
+{
+  int actor_id = data1.toInt();
+  int target_id = data2.toInt();
+
+  if (game_unit_by_number(actor_id) != nullptr
+      && index_to_tile(&(wld.map), target_id) != nullptr) {
+    request_do_action(ACTION_CLEAN2,
+                      actor_id, target_id,
+                      /* FIXME: will cause problems if more than
+                       * one action selection dialog at a time
+                       * becomes supported. */
+                      action_selection_target_extra(),
+                      "");
+  }
+}
+
 /***********************************************************************//**
   Action "Build Road" for choice dialog
 ***************************************************************************/
@@ -3206,6 +3329,27 @@ static void road(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Build Road 2" for choice dialog
+***************************************************************************/
+static void road2(QVariant data1, QVariant data2)
+{
+  int actor_id = data1.toInt();
+  int target_id = data2.toInt();
+
+  if (game_unit_by_number(actor_id) != nullptr
+      && index_to_tile(&(wld.map), target_id) != nullptr
+      && extra_by_number(action_selection_target_extra()) != nullptr) {
+    request_do_action(ACTION_ROAD2,
+                      actor_id, target_id,
+                      /* FIXME: will cause problems if more than
+                       * one action selection dialog at a time
+                       * becomes supported. */
+                      action_selection_target_extra(),
+                      "");
+  }
+}
+
 /***********************************************************************//**
   Action "Build Base" for choice dialog
 ***************************************************************************/
@@ -3227,6 +3371,27 @@ static void base(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Build Base 2" for choice dialog
+***************************************************************************/
+static void base2(QVariant data1, QVariant data2)
+{
+  int actor_id = data1.toInt();
+  int target_id = data2.toInt();
+
+  if (game_unit_by_number(actor_id) != nullptr
+      && index_to_tile(&(wld.map), target_id) != nullptr
+      && extra_by_number(action_selection_target_extra()) != nullptr) {
+    request_do_action(ACTION_BASE2,
+                      actor_id, target_id,
+                      /* FIXME: will cause problems if more than
+                       * one action selection dialog at a time
+                       * becomes supported. */
+                      action_selection_target_extra(),
+                      "");
+  }
+}
+
 /***********************************************************************//**
   Action "Build Mine" for choice dialog
 ***************************************************************************/
@@ -3248,6 +3413,27 @@ static void mine(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Build Mine 2" for choice dialog
+***************************************************************************/
+static void mine2(QVariant data1, QVariant data2)
+{
+  int actor_id = data1.toInt();
+  int target_id = data2.toInt();
+
+  if (game_unit_by_number(actor_id) != nullptr
+      && index_to_tile(&(wld.map), target_id) != nullptr
+      && extra_by_number(action_selection_target_extra()) != nullptr) {
+    request_do_action(ACTION_MINE2,
+                      actor_id, target_id,
+                      /* FIXME: will cause problems if more than
+                       * one action selection dialog at a time
+                       * becomes supported. */
+                      action_selection_target_extra(),
+                      "");
+  }
+}
+
 /***********************************************************************//**
   Action "Build Irrigation" for choice dialog
 ***************************************************************************/
@@ -3269,6 +3455,27 @@ static void irrigate(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Build Irrigation 2" for choice dialog
+***************************************************************************/
+static void irrigate2(QVariant data1, QVariant data2)
+{
+  int actor_id = data1.toInt();
+  int target_id = data2.toInt();
+
+  if (game_unit_by_number(actor_id) != nullptr
+      && index_to_tile(&(wld.map), target_id) != nullptr
+      && extra_by_number(action_selection_target_extra()) != nullptr) {
+    request_do_action(ACTION_IRRIGATE2,
+                      actor_id, target_id,
+                      /* FIXME: will cause problems if more than
+                       * one action selection dialog at a time
+                       * becomes supported. */
+                      action_selection_target_extra(),
+                      "");
+  }
+}
+
 /***********************************************************************//**
   Action "Explode Nuclear" for choice dialog
 ***************************************************************************/
@@ -3374,6 +3581,36 @@ static void teleport(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Teleport Unit 2" for choice dialog
+***************************************************************************/
+static void teleport2(QVariant data1, QVariant data2)
+{
+  int actor_id = data1.toInt();
+  int target_id = data2.toInt();
+
+  if (game_unit_by_number(actor_id) != nullptr
+      && index_to_tile(&(wld.map), target_id) != nullptr) {
+    request_do_action(ACTION_TELEPORT2,
+                      actor_id, target_id, 0, "");
+  }
+}
+
+/***********************************************************************//**
+  Action "Teleport Unit 3" for choice dialog
+***************************************************************************/
+static void teleport3(QVariant data1, QVariant data2)
+{
+  int actor_id = data1.toInt();
+  int target_id = data2.toInt();
+
+  if (game_unit_by_number(actor_id) != nullptr
+      && index_to_tile(&(wld.map), target_id) != nullptr) {
+    request_do_action(ACTION_TELEPORT3,
+                      actor_id, target_id, 0, "");
+  }
+}
+
 /***********************************************************************//**
   Action "Paradrop Unit Conquer" for choice dialog
 ***************************************************************************/
-- 
2.53.0

