From 031d7f804d4acca02d0e85422419a65e952d2377 Mon Sep 17 00:00:00 2001
From: Marko Lindqvist <cazfi74@gmail.com>
Date: Tue, 1 Sep 2026 19:41:44 +0300
Subject: [PATCH 71/71] Qt: Fix activation of S3_2 fake generalized actions

...from selection list

See RM #1634

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

diff --git a/client/gui-qt/dialogs.cpp b/client/gui-qt/dialogs.cpp
index f5b7733c5e..be1b9fab80 100644
--- a/client/gui-qt/dialogs.cpp
+++ b/client/gui-qt/dialogs.cpp
@@ -124,7 +124,9 @@ static void expel_unit(QVariant data1, QVariant data2);
 static void bombard(QVariant data1, QVariant data2);
 static void bombard2(QVariant data1, QVariant data2);
 static void bombard3(QVariant data1, QVariant data2);
+static void bombard4(QVariant data1, QVariant data2);
 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 cultivate(QVariant data1, QVariant data2);
@@ -137,20 +139,36 @@ static void mine(QVariant data1, QVariant data2);
 static void irrigate(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);
 static void suicide_attack(QVariant data1, QVariant data2);
+static void suicide_attack2(QVariant data1, QVariant data2);
 static void paradrop(QVariant data1, QVariant data2);
 static void paradrop_conquer(QVariant data1, QVariant data2);
 static void paradrop_frighten(QVariant data1, QVariant data2);
 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 teleport_conquer(QVariant data1, QVariant data2);
+static void teleport_frighten(QVariant data1, QVariant data2);
+static void teleport_frighten_conquer(QVariant data1, QVariant data2);
+static void teleport_enter(QVariant data1, QVariant data2);
+static void teleport_enter_conquer(QVariant data1, QVariant data2);
 static void disembark1(QVariant data1, QVariant data2);
 static void disembark2(QVariant data1, QVariant data2);
+static void disembark3(QVariant data1, QVariant data2);
+static void disembark4(QVariant data1, QVariant data2);
 static void enter_hut(QVariant data1, QVariant data2);
 static void enter_hut2(QVariant data1, QVariant data2);
+static void enter_hut3(QVariant data1, QVariant data2);
+static void enter_hut4(QVariant data1, QVariant data2);
 static void frighten_hut(QVariant data1, QVariant data2);
 static void frighten_hut2(QVariant data1, QVariant data2);
+static void frighten_hut3(QVariant data1, QVariant data2);
+static void frighten_hut4(QVariant data1, QVariant data2);
 static void regular_move(QVariant data1, QVariant data2);
+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 disband_unit(QVariant data1, QVariant data2);
@@ -161,8 +179,12 @@ static void unit_upgrade(QVariant data1, QVariant data2);
 static void airlift(QVariant data1, QVariant data2);
 static void conquer_city_shrink(QVariant data1, QVariant data2);
 static void conquer_city_shrink2(QVariant data1, QVariant data2);
+static void conquer_city_shrink3(QVariant data1, QVariant data2);
+static void conquer_city_shrink4(QVariant data1, QVariant data2);
 static void conquer_extras(QVariant data1, QVariant data2);
 static void conquer_extras2(QVariant data1, QVariant data2);
+static void conquer_extras3(QVariant data1, QVariant data2);
+static void conquer_extras4(QVariant data1, QVariant data2);
 static void heal_unit(QVariant data1, QVariant data2);
 static void heal_unit2(QVariant data1, QVariant data2);
 static void transport_board(QVariant data1, QVariant data2);
@@ -247,6 +269,8 @@ static const QHash<action_id, pfcn_void> af_map_init(void)
   action_function[ACTION_AIRLIFT] = airlift;
   action_function[ACTION_CONQUER_CITY_SHRINK] = conquer_city_shrink;
   action_function[ACTION_CONQUER_CITY_SHRINK2] = conquer_city_shrink2;
+  action_function[ACTION_CONQUER_CITY_SHRINK3] = conquer_city_shrink3;
+  action_function[ACTION_CONQUER_CITY_SHRINK4] = conquer_city_shrink4;
   action_function[ACTION_STRIKE_BUILDING] = spy_request_strike_bld_list;
   action_function[ACTION_NUKE_CITY] = nuke_city;
 
@@ -276,7 +300,9 @@ static const QHash<action_id, pfcn_void> af_map_init(void)
   action_function[ACTION_BOMBARD] = bombard;
   action_function[ACTION_BOMBARD2] = bombard2;
   action_function[ACTION_BOMBARD3] = bombard3;
+  action_function[ACTION_BOMBARD4] = bombard4;
   action_function[ACTION_BOMBARD_LETHAL] = bombard_lethal;
+  action_function[ACTION_BOMBARD_LETHAL2] = bombard_lethal2;
   action_function[ACTION_NUKE_UNITS] = nuke_units;
   action_function[ACTION_COLLECT_RANSOM] = collect_ransom;
 
@@ -290,8 +316,17 @@ static const QHash<action_id, pfcn_void> af_map_init(void)
   action_function[ACTION_PARADROP_FRIGHTEN] = paradrop_frighten;
   action_function[ACTION_PARADROP_FRIGHTEN_CONQUER]
       = paradrop_frighten_conquer;
+  action_function[ACTION_TELEPORT] = teleport;
+  action_function[ACTION_TELEPORT_CONQUER] = teleport_conquer;
+  action_function[ACTION_TELEPORT_ENTER] = teleport_enter;
+  action_function[ACTION_TELEPORT_ENTER_CONQUER] = teleport_enter_conquer;
+  action_function[ACTION_TELEPORT_FRIGHTEN] = teleport_frighten;
+  action_function[ACTION_TELEPORT_FRIGHTEN_CONQUER]
+      = teleport_frighten_conquer;
   action_function[ACTION_ATTACK] = attack;
+  action_function[ACTION_ATTACK2] = attack2;
   action_function[ACTION_SUICIDE_ATTACK] = suicide_attack;
+  action_function[ACTION_SUICIDE_ATTACK2] = suicide_attack2;
   action_function[ACTION_WIPE_UNITS] = wipe_units;
   action_function[ACTION_TRANSFORM_TERRAIN] = transform_terrain;
   action_function[ACTION_CULTIVATE] = cultivate;
@@ -304,15 +339,25 @@ static const QHash<action_id, pfcn_void> af_map_init(void)
   action_function[ACTION_IRRIGATE] = irrigate;
   action_function[ACTION_TRANSPORT_DISEMBARK1] = disembark1;
   action_function[ACTION_TRANSPORT_DISEMBARK2] = disembark2;
+  action_function[ACTION_TRANSPORT_DISEMBARK3] = disembark3;
+  action_function[ACTION_TRANSPORT_DISEMBARK4] = disembark4;
   action_function[ACTION_HUT_ENTER] = enter_hut;
   action_function[ACTION_HUT_ENTER2] = enter_hut2;
+  action_function[ACTION_HUT_ENTER3] = enter_hut3;
+  action_function[ACTION_HUT_ENTER4] = enter_hut4;
   action_function[ACTION_HUT_FRIGHTEN] = frighten_hut;
   action_function[ACTION_HUT_FRIGHTEN2] = frighten_hut2;
+  action_function[ACTION_HUT_FRIGHTEN3] = frighten_hut3;
+  action_function[ACTION_HUT_FRIGHTEN4] = frighten_hut4;
   action_function[ACTION_UNIT_MOVE] = regular_move;
+  action_function[ACTION_UNIT_MOVE2] = regular_move2;
+  action_function[ACTION_UNIT_MOVE3] = regular_move3;
 
   // Unit acting against all tile extras.
   action_function[ACTION_CONQUER_EXTRAS] = conquer_extras;
   action_function[ACTION_CONQUER_EXTRAS2] = conquer_extras2;
+  action_function[ACTION_CONQUER_EXTRAS3] = conquer_extras3;
+  action_function[ACTION_CONQUER_EXTRAS4] = conquer_extras4;
 
   // Unit acting with no target except itself.
   action_function[ACTION_DISBAND_UNIT] = disband_unit;
@@ -1877,6 +1922,36 @@ static void conquer_city_shrink2(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Conquer City Shrink 3" for choice dialog
+***************************************************************************/
+static void conquer_city_shrink3(QVariant data1, QVariant data2)
+{
+  int actor_id = data1.toInt();
+  int tgt_city_id = data2.toInt();
+
+  if (game_unit_by_number(actor_id) != nullptr
+      && game_city_by_number(tgt_city_id) != nullptr) {
+    request_do_action(ACTION_CONQUER_CITY_SHRINK3,
+                      actor_id, tgt_city_id, 0, "");
+  }
+}
+
+/***********************************************************************//**
+  Action "Conquer City Shrink 4" for choice dialog
+***************************************************************************/
+static void conquer_city_shrink4(QVariant data1, QVariant data2)
+{
+  int actor_id = data1.toInt();
+  int tgt_city_id = data2.toInt();
+
+  if (game_unit_by_number(actor_id) != nullptr
+      && game_city_by_number(tgt_city_id) != nullptr) {
+    request_do_action(ACTION_CONQUER_CITY_SHRINK4,
+                      actor_id, tgt_city_id, 0, "");
+  }
+}
+
 /***********************************************************************//**
   Action "Conquer Extras" for choice dialog
 ***************************************************************************/
@@ -1905,6 +1980,34 @@ static void conquer_extras2(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Conquer Extras 3" for choice dialog
+***************************************************************************/
+static void conquer_extras3(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_CONQUER_EXTRAS3,
+                      actor_id, target_id, 0, "");
+  }
+}
+
+/***********************************************************************//**
+  Action "Conquer Extras 4" for choice dialog
+***************************************************************************/
+static void conquer_extras4(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_CONQUER_EXTRAS4,
+                      actor_id, target_id, 0, "");
+  }
+}
+
 /***********************************************************************//**
   Delay selection of what action to take.
 ***************************************************************************/
@@ -2686,6 +2789,36 @@ static void disembark2(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Transport Disembark 3" for choice dialog
+***************************************************************************/
+static void disembark3(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_TRANSPORT_DISEMBARK3,
+                      actor_id, target_id, 0, "");
+  }
+}
+
+/***********************************************************************//**
+  Action "Transport Disembark 4" for choice dialog
+***************************************************************************/
+static void disembark4(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_TRANSPORT_DISEMBARK4,
+                      actor_id, target_id, 0, "");
+  }
+}
+
 /***********************************************************************//**
   Action "Enter Hut" for choice dialog
 ***************************************************************************/
@@ -2716,6 +2849,36 @@ static void enter_hut2(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Enter Hut 3" for choice dialog
+***************************************************************************/
+static void enter_hut3(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_HUT_ENTER3,
+                      actor_id, target_id, 0, "");
+  }
+}
+
+/***********************************************************************//**
+  Action "Enter Hut 4" for choice dialog
+***************************************************************************/
+static void enter_hut4(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_HUT_ENTER4,
+                      actor_id, target_id, 0, "");
+  }
+}
+
 /***********************************************************************//**
   Action "Frighten Hut" for choice dialog
 ***************************************************************************/
@@ -2746,6 +2909,36 @@ static void frighten_hut2(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Frighten Hut 3" for choice dialog
+***************************************************************************/
+static void frighten_hut3(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_HUT_FRIGHTEN3,
+                      actor_id, target_id, 0, "");
+  }
+}
+
+/***********************************************************************//**
+  Action "Frighten Hut 4" for choice dialog
+***************************************************************************/
+static void frighten_hut4(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_HUT_FRIGHTEN4,
+                      actor_id, target_id, 0, "");
+  }
+}
+
 /**********************************************************************//**
   Action "Nuke Units" for choice dialog
 ***************************************************************************/
@@ -2842,6 +3035,18 @@ static void bombard3(QVariant data1, QVariant data2)
                     target_id, 0, "");
 }
 
+/***********************************************************************//**
+  Action "Bombard 4" for choice dialog
+***************************************************************************/
+static void bombard4(QVariant data1, QVariant data2)
+{
+  int actor_id = data1.toInt();
+  int target_id = data2.toInt();
+
+  request_do_action(ACTION_BOMBARD4, actor_id,
+                    target_id, 0, "");
+}
+
 /***********************************************************************//**
   Action "Bombard Lethal" for choice dialog
 ***************************************************************************/
@@ -2854,6 +3059,18 @@ static void bombard_lethal(QVariant data1, QVariant data2)
                     target_id, 0, "");
 }
 
+/***********************************************************************//**
+  Action "Bombard Lethal 2" for choice dialog
+***************************************************************************/
+static void bombard_lethal2(QVariant data1, QVariant data2)
+{
+  int actor_id = data1.toInt();
+  int target_id = data2.toInt();
+
+  request_do_action(ACTION_BOMBARD_LETHAL2, actor_id,
+                    target_id, 0, "");
+}
+
 /***********************************************************************//**
   Action build city for choice dialog
 ***************************************************************************/
@@ -3064,6 +3281,21 @@ static void attack(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Attack 2" for choice dialog
+***************************************************************************/
+static void attack2(QVariant data1, QVariant data2)
+{
+  int diplomat_id = data1.toInt();
+  int diplomat_target_id = data2.toInt();
+
+  if (game_unit_by_number(diplomat_id) != nullptr
+      && index_to_tile(&(wld.map), diplomat_target_id) != nullptr) {
+    request_do_action(ACTION_ATTACK2,
+                      diplomat_id, diplomat_target_id, 0, "");
+  }
+}
+
 /***********************************************************************//**
   Action "Suicide Attack" for choice dialog
 ***************************************************************************/
@@ -3079,6 +3311,21 @@ static void suicide_attack(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Suicide Attack 2" for choice dialog
+***************************************************************************/
+static void suicide_attack2(QVariant data1, QVariant data2)
+{
+  int diplomat_id = data1.toInt();
+  int diplomat_target_id = data2.toInt();
+
+  if (game_unit_by_number(diplomat_id) != nullptr
+      && index_to_tile(&(wld.map), diplomat_target_id) != nullptr) {
+    request_do_action(ACTION_SUICIDE_ATTACK2,
+                      diplomat_id, diplomat_target_id, 0, "");
+  }
+}
+
 /***********************************************************************//**
   Action "Paradrop Unit" for choice dialog
 ***************************************************************************/
@@ -3094,6 +3341,21 @@ static void paradrop(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Teleport Unit" for choice dialog
+***************************************************************************/
+static void teleport(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_TELEPORT,
+                      actor_id, target_id, 0, "");
+  }
+}
+
 /***********************************************************************//**
   Action "Paradrop Unit Conquer" for choice dialog
 ***************************************************************************/
@@ -3109,6 +3371,21 @@ static void paradrop_conquer(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Teleport Unit Conquer" for choice dialog
+***************************************************************************/
+static void teleport_conquer(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_TELEPORT_CONQUER,
+                      actor_id, target_id, 0, "");
+  }
+}
+
 /***********************************************************************//**
   Action "Paradrop Unit Frighten" for choice dialog
 ***************************************************************************/
@@ -3124,6 +3401,21 @@ static void paradrop_frighten(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Teleport Unit Frighten" for choice dialog
+***************************************************************************/
+static void teleport_frighten(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_TELEPORT_FRIGHTEN,
+                      actor_id, target_id, 0, "");
+  }
+}
+
 /***********************************************************************//**
   Action "Paradrop Unit Frighten Conquer" for choice dialog
 ***************************************************************************/
@@ -3139,6 +3431,21 @@ static void paradrop_frighten_conquer(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Teleport Unit Frighten Conquer" for choice dialog
+***************************************************************************/
+static void teleport_frighten_conquer(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_TELEPORT_FRIGHTEN_CONQUER,
+                      actor_id, target_id, 0, "");
+  }
+}
+
 /***********************************************************************//**
   Action "Paradrop Unit Enter" for choice dialog
 ***************************************************************************/
@@ -3154,6 +3461,21 @@ static void paradrop_enter(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Teleport Unit Enter" for choice dialog
+***************************************************************************/
+static void teleport_enter(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_TELEPORT_ENTER,
+                      actor_id, target_id, 0, "");
+  }
+}
+
 /***********************************************************************//**
   Action "Paradrop Unit Enter Conquer" for choice dialog
 ***************************************************************************/
@@ -3169,6 +3491,21 @@ static void paradrop_enter_conquer(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Teleport Unit Enter Conquer" for choice dialog
+***************************************************************************/
+static void teleport_enter_conquer(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_TELEPORT_ENTER_CONQUER,
+                      actor_id, target_id, 0, "");
+  }
+}
+
 /***********************************************************************//**
   Action join city for choice dialog
 ***************************************************************************/
@@ -3687,6 +4024,36 @@ static void regular_move(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Unit Move 2" for choice dialog
+***************************************************************************/
+static void regular_move2(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_UNIT_MOVE2,
+                      actor_id, target_id, 0, "");
+  }
+}
+
+/***********************************************************************//**
+  Action "Unit Move 3" for choice dialog
+***************************************************************************/
+static void regular_move3(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_UNIT_MOVE3,
+                      actor_id, target_id, 0, "");
+  }
+}
+
 /***********************************************************************//**
   Popup a window asking a diplomatic unit if it wishes to incite the
   given enemy city.
-- 
2.53.0

