From 60b81120538f147ab1d9aa82c967bd28937b08cd Mon Sep 17 00:00:00 2001
From: Marko Lindqvist <cazfi74@gmail.com>
Date: Tue, 1 Sep 2026 19:44:34 +0300
Subject: [PATCH 31/31] 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 9829a72495..d393c464a2 100644
--- a/client/gui-qt/dialogs.cpp
+++ b/client/gui-qt/dialogs.cpp
@@ -123,7 +123,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);
@@ -136,20 +138,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);
@@ -160,8 +178,12 @@ static void unit_upgrade(QVariant data1, QVariant data2);
 static void airlift(QVariant data1, QVariant data2);
 static void conquer_city(QVariant data1, QVariant data2);
 static void conquer_city2(QVariant data1, QVariant data2);
+static void conquer_city3(QVariant data1, QVariant data2);
+static void conquer_city4(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);
@@ -246,6 +268,8 @@ static const QHash<action_id, pfcn_void> af_map_init(void)
   action_function[ACTION_AIRLIFT] = airlift;
   action_function[ACTION_CONQUER_CITY] = conquer_city;
   action_function[ACTION_CONQUER_CITY2] = conquer_city2;
+  action_function[ACTION_CONQUER_CITY3] = conquer_city3;
+  action_function[ACTION_CONQUER_CITY4] = conquer_city4;
   action_function[ACTION_STRIKE_BUILDING] = spy_request_strike_bld_list;
   action_function[ACTION_NUKE_CITY] = nuke_city;
 
@@ -274,7 +298,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;
 
@@ -288,8 +314,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;
@@ -302,15 +337,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;
@@ -1874,6 +1919,36 @@ static void conquer_city2(QVariant data1, QVariant data2)
   }
 }
 
+/***********************************************************************//**
+  Action "Conquer City 3" for choice dialog
+***************************************************************************/
+static void conquer_city3(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_CITY3,
+                      actor_id, tgt_city_id, 0, "");
+  }
+}
+
+/***********************************************************************//**
+  Action "Conquer City 4" for choice dialog
+***************************************************************************/
+static void conquer_city4(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_CITY4,
+                      actor_id, tgt_city_id, 0, "");
+  }
+}
+
 /***********************************************************************//**
   Action "Conquer Extras" for choice dialog
 ***************************************************************************/
@@ -1902,6 +1977,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.
 ***************************************************************************/
@@ -2649,6 +2752,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
 ***************************************************************************/
@@ -2679,6 +2812,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
 ***************************************************************************/
@@ -2709,6 +2872,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
 ***************************************************************************/
@@ -2805,6 +2998,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
 ***************************************************************************/
@@ -2817,6 +3022,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
 ***************************************************************************/
@@ -3027,6 +3244,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
 ***************************************************************************/
@@ -3042,6 +3274,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
 ***************************************************************************/
@@ -3057,6 +3304,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
 ***************************************************************************/
@@ -3072,6 +3334,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
 ***************************************************************************/
@@ -3087,6 +3364,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
 ***************************************************************************/
@@ -3102,6 +3394,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
 ***************************************************************************/
@@ -3117,6 +3424,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
 ***************************************************************************/
@@ -3132,6 +3454,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
 ***************************************************************************/
@@ -3650,6 +3987,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

