From def24278507b2fc6e69b540953e2a3e9799bd3ad Mon Sep 17 00:00:00 2001 From: Sveinung Kvilhaugsvik Date: Fri, 28 Apr 2017 11:11:56 +0200 Subject: [PATCH] Split "Establish Embassy". Stop relying on the Spy unit type flag to decide if "Establish Embassy" consumes the actor unit. Split "Investigate City" in an actor unit consuming and in a non actor unit consuming version. See hrm Feature #656188 --- ai/default/aicity.c | 1 + ai/default/aidata.c | 1 + ai/default/aidiplomat.c | 13 ++-- client/gui-gtk-2.0/action_dialog.c | 22 +++++- client/gui-gtk-3.0/action_dialog.c | 22 +++++- client/gui-gtk-3.22/action_dialog.c | 22 +++++- client/gui-qt/dialogs.cpp | 21 +++++- client/gui-qt/menu.cpp | 7 ++ client/gui-sdl2/action_dialog.c | 26 +++++++- client/packhand.c | 1 + common/actions.c | 11 +++ common/actions.h | 130 ++++++++++++++++++------------------ common/aicore/pf_tools.c | 2 + data/civ1/game.ruleset | 18 ++--- data/civ2/game.ruleset | 21 ++++-- data/civ2civ3/game.ruleset | 39 ++++++++--- data/classic/game.ruleset | 30 +++++++-- data/experimental/game.ruleset | 46 +++++++++---- data/multiplayer/game.ruleset | 30 +++++++-- data/sandbox/game.ruleset | 39 ++++++++--- data/webperimental/game.ruleset | 43 ++++++++---- doc/README.actions | 8 +++ server/advisors/advdata.c | 1 + server/diplomats.c | 12 ++-- server/diplomats.h | 3 +- server/rscompat.c | 27 ++++++++ server/ruleset.c | 7 ++ server/savegame3.c | 1 + server/unithand.c | 9 ++- tools/ruleutil/rulesave.c | 3 + 30 files changed, 457 insertions(+), 159 deletions(-) diff --git a/ai/default/aicity.c b/ai/default/aicity.c index 658cca0..9400740 100644 --- a/ai/default/aicity.c +++ b/ai/default/aicity.c @@ -1197,6 +1197,7 @@ static int action_target_neg_util(int action_id, /* Could be worse */ case ACTION_ESTABLISH_EMBASSY: + case ACTION_ESTABLISH_EMBASSY_STAY: case ACTION_SPY_INVESTIGATE_CITY: case ACTION_INV_CITY_SPEND: case ACTION_MARKETPLACE: diff --git a/ai/default/aidata.c b/ai/default/aidata.c index 9950dec..e2394c9 100644 --- a/ai/default/aidata.c +++ b/ai/default/aidata.c @@ -216,6 +216,7 @@ void dai_data_phase_begin(struct ai_type *ait, struct player *pplayer, || unit_can_do_action(punit, ACTION_SPY_TARGETED_SABOTAGE_CITY) || unit_can_do_action(punit, ACTION_SPY_INCITE_CITY) || unit_can_do_action(punit, ACTION_ESTABLISH_EMBASSY) + || unit_can_do_action(punit, ACTION_ESTABLISH_EMBASSY_STAY) || unit_can_do_action(punit, ACTION_SPY_STEAL_TECH) || unit_can_do_action(punit, ACTION_SPY_TARGETED_STEAL_TECH) || unit_can_do_action(punit, ACTION_SPY_INVESTIGATE_CITY) diff --git a/ai/default/aidiplomat.c b/ai/default/aidiplomat.c index c6f16e0..61b5b7a 100644 --- a/ai/default/aidiplomat.c +++ b/ai/default/aidiplomat.c @@ -278,8 +278,10 @@ void dai_choose_diplomat_offensive(struct ai_type *ait, if (!player_has_embassy(pplayer, city_owner(acity)) && want < 99 - && is_action_possible_on_city(ACTION_ESTABLISH_EMBASSY, - pplayer, acity)) { + && (is_action_possible_on_city(ACTION_ESTABLISH_EMBASSY, + pplayer, acity) + || is_action_possible_on_city(ACTION_ESTABLISH_EMBASSY_STAY, + pplayer, acity))) { log_base(LOG_DIPLOMAT_BUILD, "A diplomat desired in %s to establish an embassy with %s " "in %s", @@ -383,6 +385,7 @@ static void dai_diplomat_city(struct ai_type *ait, struct unit *punit, } T(ACTION_ESTABLISH_EMBASSY, 0); + T(ACTION_ESTABLISH_EMBASSY_STAY, 0); if (pplayers_allied(pplayer, tplayer)) { return; /* Don't do the rest to allies */ @@ -552,8 +555,10 @@ static void find_city_to_diplomat(struct player *pplayer, struct unit *punit, * 2. stealing techs OR * 3. inciting revolt */ if ((!has_embassy - && is_action_possible_on_city(ACTION_ESTABLISH_EMBASSY, - pplayer, acity)) + && (is_action_possible_on_city(ACTION_ESTABLISH_EMBASSY, + pplayer, acity) + || is_action_possible_on_city(ACTION_ESTABLISH_EMBASSY_STAY, + pplayer, acity))) || (acity->server.steal == 0 && !dipldef && can_steal && (research_get(pplayer)->techs_researched diff --git a/client/gui-gtk-4.0/action_dialog.c b/client/gui-gtk-4.0/action_dialog.c index 5c99b07..992319d 100644 --- a/client/gui-gtk-4.0/action_dialog.c +++ b/client/gui-gtk-4.0/action_dialog.c @@ -607,7 +607,7 @@ static void bombard_callback(GtkWidget *w, gpointer data) /**************************************************************** User selected embassy establishing from choice dialog *****************************************************************/ -static void diplomat_embassy_callback(GtkWidget *w, gpointer data) +static void spy_embassy_callback(GtkWidget *w, gpointer data) { struct action_data *args = (struct action_data *)data; @@ -622,6 +622,23 @@ static void diplomat_embassy_callback(GtkWidget *w, gpointer data) } /**************************************************************** + User selected embassy establishing from choice dialog +*****************************************************************/ +static void diplomat_embassy_callback(GtkWidget *w, gpointer data) +{ + struct action_data *args = (struct action_data *)data; + + if (NULL != game_unit_by_number(args->actor_unit_id) + && NULL != game_city_by_number(args->target_city_id)) { + request_do_action(ACTION_ESTABLISH_EMBASSY_STAY, args->actor_unit_id, + args->target_city_id, 0, ""); + } + + gtk_widget_destroy(act_sel_dialog); + free(args); +} + +/**************************************************************** User selected to steal gold from choice dialog *****************************************************************/ static void spy_steal_gold_callback(GtkWidget *w, gpointer data) @@ -1307,7 +1324,8 @@ static void act_sel_close_callback(GtkWidget *w, * pushed. */ static const GCallback af_map[ACTION_COUNT] = { /* Unit acting against a city target. */ - [ACTION_ESTABLISH_EMBASSY] = (GCallback)diplomat_embassy_callback, + [ACTION_ESTABLISH_EMBASSY] = (GCallback)spy_embassy_callback, + [ACTION_ESTABLISH_EMBASSY_STAY] = (GCallback)diplomat_embassy_callback, [ACTION_SPY_INVESTIGATE_CITY] = (GCallback)spy_investigate_callback, [ACTION_INV_CITY_SPEND] = (GCallback)diplomat_investigate_callback, [ACTION_SPY_POISON] = (GCallback)spy_poison_callback, diff --git a/client/gui-gtk-3.0/action_dialog.c b/client/gui-gtk-3.0/action_dialog.c index dc5f72f..96b31ae 100644 --- a/client/gui-gtk-3.0/action_dialog.c +++ b/client/gui-gtk-3.0/action_dialog.c @@ -617,7 +617,7 @@ static void bombard_callback(GtkWidget *w, gpointer data) /**************************************************************** User selected embassy establishing from choice dialog *****************************************************************/ -static void diplomat_embassy_callback(GtkWidget *w, gpointer data) +static void spy_embassy_callback(GtkWidget *w, gpointer data) { struct action_data *args = (struct action_data *)data; @@ -632,6 +632,23 @@ static void diplomat_embassy_callback(GtkWidget *w, gpointer data) } /**************************************************************** + User selected embassy establishing from choice dialog +*****************************************************************/ +static void diplomat_embassy_callback(GtkWidget *w, gpointer data) +{ + struct action_data *args = (struct action_data *)data; + + if (NULL != game_unit_by_number(args->actor_unit_id) + && NULL != game_city_by_number(args->target_city_id)) { + request_do_action(ACTION_ESTABLISH_EMBASSY_STAY, args->actor_unit_id, + args->target_city_id, 0, ""); + } + + gtk_widget_destroy(act_sel_dialog); + free(args); +} + +/**************************************************************** User selected to steal gold from choice dialog *****************************************************************/ static void spy_steal_gold_callback(GtkWidget *w, gpointer data) @@ -1395,7 +1412,8 @@ static void act_sel_close_callback(GtkWidget *w, * pushed. */ static const GCallback af_map[ACTION_COUNT] = { /* Unit acting against a city target. */ - [ACTION_ESTABLISH_EMBASSY] = (GCallback)diplomat_embassy_callback, + [ACTION_ESTABLISH_EMBASSY] = (GCallback)spy_embassy_callback, + [ACTION_ESTABLISH_EMBASSY_STAY] = (GCallback)diplomat_embassy_callback, [ACTION_SPY_INVESTIGATE_CITY] = (GCallback)spy_investigate_callback, [ACTION_INV_CITY_SPEND] = (GCallback)diplomat_investigate_callback, [ACTION_SPY_POISON] = (GCallback)spy_poison_callback, diff --git a/client/gui-gtk-3.22/action_dialog.c b/client/gui-gtk-3.22/action_dialog.c index a940ee0..dce051d 100644 --- a/client/gui-gtk-3.22/action_dialog.c +++ b/client/gui-gtk-3.22/action_dialog.c @@ -617,7 +617,7 @@ static void bombard_callback(GtkWidget *w, gpointer data) /**************************************************************** User selected embassy establishing from choice dialog *****************************************************************/ -static void diplomat_embassy_callback(GtkWidget *w, gpointer data) +static void spy_embassy_callback(GtkWidget *w, gpointer data) { struct action_data *args = (struct action_data *)data; @@ -632,6 +632,23 @@ static void diplomat_embassy_callback(GtkWidget *w, gpointer data) } /**************************************************************** + User selected embassy establishing from choice dialog +*****************************************************************/ +static void diplomat_embassy_callback(GtkWidget *w, gpointer data) +{ + struct action_data *args = (struct action_data *)data; + + if (NULL != game_unit_by_number(args->actor_unit_id) + && NULL != game_city_by_number(args->target_city_id)) { + request_do_action(ACTION_ESTABLISH_EMBASSY_STAY, args->actor_unit_id, + args->target_city_id, 0, ""); + } + + gtk_widget_destroy(act_sel_dialog); + free(args); +} + +/**************************************************************** User selected to steal gold from choice dialog *****************************************************************/ static void spy_steal_gold_callback(GtkWidget *w, gpointer data) @@ -1389,7 +1406,8 @@ static void act_sel_close_callback(GtkWidget *w, * pushed. */ static const GCallback af_map[ACTION_COUNT] = { /* Unit acting against a city target. */ - [ACTION_ESTABLISH_EMBASSY] = (GCallback)diplomat_embassy_callback, + [ACTION_ESTABLISH_EMBASSY] = (GCallback)spy_embassy_callback, + [ACTION_ESTABLISH_EMBASSY_STAY] = (GCallback)diplomat_embassy_callback, [ACTION_SPY_INVESTIGATE_CITY] = (GCallback)spy_investigate_callback, [ACTION_INV_CITY_SPEND] = (GCallback)diplomat_investigate_callback, [ACTION_SPY_POISON] = (GCallback)spy_poison_callback, diff --git a/client/gui-qt/dialogs.cpp b/client/gui-qt/dialogs.cpp index 4b1b222..17f48fc 100644 --- a/client/gui-qt/dialogs.cpp +++ b/client/gui-qt/dialogs.cpp @@ -89,6 +89,7 @@ static void spy_steal_maps(QVariant data1, QVariant data2); static void spy_nuke_city(QVariant data1, QVariant data2); static void destroy_city(QVariant data1, QVariant data2); static void diplomat_embassy(QVariant data1, QVariant data2); +static void spy_embassy(QVariant data1, QVariant data2); static void spy_sabotage_unit(QVariant data1, QVariant data2); static void spy_investigate(QVariant data1, QVariant data2); static void diplomat_investigate(QVariant data1, QVariant data2); @@ -145,7 +146,8 @@ static const QHash af_map_init(void) QHash action_function; /* Unit acting against a city target. */ - action_function[ACTION_ESTABLISH_EMBASSY] = diplomat_embassy; + action_function[ACTION_ESTABLISH_EMBASSY] = spy_embassy; + action_function[ACTION_ESTABLISH_EMBASSY_STAY] = diplomat_embassy; action_function[ACTION_SPY_INVESTIGATE_CITY] = spy_investigate; action_function[ACTION_INV_CITY_SPEND] = diplomat_investigate; action_function[ACTION_SPY_POISON] = spy_poison; @@ -2373,7 +2375,7 @@ static void spy_steal_maps(QVariant data1, QVariant data2) /*************************************************************************** Action establish embassy for choice dialog ***************************************************************************/ -static void diplomat_embassy(QVariant data1, QVariant data2) +static void spy_embassy(QVariant data1, QVariant data2) { int diplomat_id = data1.toInt(); int diplomat_target_id = data2.toInt(); @@ -2386,6 +2388,21 @@ static void diplomat_embassy(QVariant data1, QVariant data2) } /*************************************************************************** + Action establish embassy for choice dialog +***************************************************************************/ +static void diplomat_embassy(QVariant data1, QVariant data2) +{ + int diplomat_id = data1.toInt(); + int diplomat_target_id = data2.toInt(); + + if (NULL != game_unit_by_number(diplomat_id) + && NULL != game_city_by_number(diplomat_target_id)) { + request_do_action(ACTION_ESTABLISH_EMBASSY_STAY, diplomat_id, + diplomat_target_id, 0, ""); + } +} + +/*************************************************************************** Action investigate city for choice dialog ***************************************************************************/ static void spy_investigate(QVariant data1, QVariant data2) diff --git a/client/gui-qt/menu.cpp b/client/gui-qt/menu.cpp index c5ac0b7..3d0fc61 100644 --- a/client/gui-qt/menu.cpp +++ b/client/gui-qt/menu.cpp @@ -1435,6 +1435,13 @@ void mr_menu::setup_menus() action_vs_city->addAction(act); connect(act, SIGNAL(triggered()), this, SLOT(slot_action_vs_city())); + act = action_city_menu->addAction(_("Establish embassy (and stay)")); + act->setCheckable(true); + act->setChecked(false); + act->setData(ACTION_ESTABLISH_EMBASSY_STAY); + action_vs_city->addAction(act); + connect(act, SIGNAL(triggered()), this, SLOT(slot_action_vs_city())); + act = action_city_menu->addAction(_("Steal technology")); act->setCheckable(true); act->setChecked(false); diff --git a/client/gui-sdl2/action_dialog.c b/client/gui-sdl2/action_dialog.c index 2618261..9d89c74 100644 --- a/client/gui-sdl2/action_dialog.c +++ b/client/gui-sdl2/action_dialog.c @@ -228,7 +228,7 @@ static int diplomat_dlg_window_callback(struct widget *pWindow) /**************************************************************** User clicked "Establish Embassy" *****************************************************************/ -static int diplomat_embassy_callback(struct widget *pWidget) +static int spy_embassy_callback(struct widget *pWidget) { if (Main.event.button.button == SDL_BUTTON_LEFT) { if (NULL != game_city_by_number( @@ -247,6 +247,27 @@ static int diplomat_embassy_callback(struct widget *pWidget) } /**************************************************************** + User clicked "Establish Embassy" +*****************************************************************/ +static int diplomat_embassy_callback(struct widget *pWidget) +{ + if (Main.event.button.button == SDL_BUTTON_LEFT) { + if (NULL != game_city_by_number( + pDiplomat_Dlg->target_ids[ATK_CITY]) + && NULL != game_unit_by_number(pDiplomat_Dlg->actor_unit_id)) { + request_do_action(ACTION_ESTABLISH_EMBASSY_STAY, + pDiplomat_Dlg->actor_unit_id, + pDiplomat_Dlg->target_ids[ATK_CITY], + 0, ""); + } + + popdown_diplomat_dialog(); + } + + return -1; +} + +/**************************************************************** User clicked "Investigate City" *****************************************************************/ static int spy_investigate_callback(struct widget *pWidget) @@ -1148,7 +1169,8 @@ void popdown_diplomat_dialog(void) * pushed. */ static const act_func af_map[ACTION_COUNT] = { /* Unit acting against a city target. */ - [ACTION_ESTABLISH_EMBASSY] = diplomat_embassy_callback, + [ACTION_ESTABLISH_EMBASSY] = spy_embassy_callback, + [ACTION_ESTABLISH_EMBASSY_STAY] = diplomat_embassy_callback, [ACTION_SPY_INVESTIGATE_CITY] = spy_investigate_callback, [ACTION_INV_CITY_SPEND] = diplomat_investigate_callback, [ACTION_SPY_POISON] = spy_poison_callback, diff --git a/client/packhand.c b/client/packhand.c index 2c09014..cb7f7a2 100644 --- a/client/packhand.c +++ b/client/packhand.c @@ -4502,6 +4502,7 @@ static enum gen_action auto_attack_act(const struct act_prob *act_probs) } break; case ACTION_ESTABLISH_EMBASSY: + case ACTION_ESTABLISH_EMBASSY_STAY: case ACTION_SPY_INVESTIGATE_CITY: case ACTION_INV_CITY_SPEND: case ACTION_SPY_POISON: diff --git a/common/actions.c b/common/actions.c index 0cff5ec..1ee4ac6 100644 --- a/common/actions.c +++ b/common/actions.c @@ -174,6 +174,7 @@ static void hard_code_oblig_hard_reqs(void) "All action enablers for %s must require a " "foreign target.", ACTION_ESTABLISH_EMBASSY, + ACTION_ESTABLISH_EMBASSY_STAY, ACTION_SPY_INVESTIGATE_CITY, ACTION_INV_CITY_SPEND, ACTION_SPY_STEAL_GOLD, @@ -348,6 +349,10 @@ static void hard_code_actions(void) action_new(ACTION_ESTABLISH_EMBASSY, ATK_CITY, FALSE, FALSE, FALSE, TRUE, 0, 1); + actions[ACTION_ESTABLISH_EMBASSY_STAY] = + action_new(ACTION_ESTABLISH_EMBASSY_STAY, ATK_CITY, + FALSE, FALSE, FALSE, TRUE, + 0, 1); actions[ACTION_SPY_STEAL_TECH] = action_new(ACTION_SPY_STEAL_TECH, ATK_CITY, TRUE, FALSE, FALSE, TRUE, @@ -1484,6 +1489,7 @@ action_actor_utype_hard_reqs_ok(const enum gen_action wanted_action, break; case ACTION_ESTABLISH_EMBASSY: + case ACTION_ESTABLISH_EMBASSY_STAY: case ACTION_SPY_INVESTIGATE_CITY: case ACTION_INV_CITY_SPEND: case ACTION_SPY_POISON: @@ -1615,6 +1621,7 @@ action_hard_reqs_actor(const enum gen_action wanted_action, break; case ACTION_ESTABLISH_EMBASSY: + case ACTION_ESTABLISH_EMBASSY_STAY: case ACTION_SPY_INVESTIGATE_CITY: case ACTION_INV_CITY_SPEND: case ACTION_SPY_POISON: @@ -1817,6 +1824,7 @@ is_action_possible(const enum gen_action wanted_action, break; case ACTION_ESTABLISH_EMBASSY: + case ACTION_ESTABLISH_EMBASSY_STAY: /* Why this is a hard requirement: There is currently no point in * establishing an embassy when a real embassy already exists. * (Possible exception: crazy hack using the Lua callback @@ -2898,6 +2906,9 @@ action_prob(const enum gen_action wanted_action, case ACTION_ESTABLISH_EMBASSY: chance = ACTPROB_CERTAIN; break; + case ACTION_ESTABLISH_EMBASSY_STAY: + chance = ACTPROB_CERTAIN; + break; case ACTION_SPY_STEAL_TECH: /* Do the victim have anything worth taking? */ known = fc_tristate_and(known, diff --git a/common/actions.h b/common/actions.h index 088ab5d..9aa39a0 100644 --- a/common/actions.h +++ b/common/actions.h @@ -49,70 +49,72 @@ extern "C" { #define SPECENUM_NAME gen_action #define SPECENUM_VALUE0 ACTION_ESTABLISH_EMBASSY #define SPECENUM_VALUE0NAME "Establish Embassy" -#define SPECENUM_VALUE1 ACTION_SPY_INVESTIGATE_CITY -#define SPECENUM_VALUE1NAME "Investigate City" -#define SPECENUM_VALUE2 ACTION_INV_CITY_SPEND -#define SPECENUM_VALUE2NAME "Investigate City Spend Unit" -#define SPECENUM_VALUE3 ACTION_SPY_POISON -#define SPECENUM_VALUE3NAME "Poison City" -#define SPECENUM_VALUE4 ACTION_SPY_STEAL_GOLD -#define SPECENUM_VALUE4NAME "Steal Gold" -#define SPECENUM_VALUE5 ACTION_SPY_SABOTAGE_CITY -#define SPECENUM_VALUE5NAME "Sabotage City" -#define SPECENUM_VALUE6 ACTION_SPY_TARGETED_SABOTAGE_CITY -#define SPECENUM_VALUE6NAME "Targeted Sabotage City" -#define SPECENUM_VALUE7 ACTION_SPY_STEAL_TECH -#define SPECENUM_VALUE7NAME "Steal Tech" -#define SPECENUM_VALUE8 ACTION_SPY_TARGETED_STEAL_TECH -#define SPECENUM_VALUE8NAME "Targeted Steal Tech" -#define SPECENUM_VALUE9 ACTION_SPY_INCITE_CITY -#define SPECENUM_VALUE9NAME "Incite City" -#define SPECENUM_VALUE10 ACTION_TRADE_ROUTE -#define SPECENUM_VALUE10NAME "Establish Trade Route" -#define SPECENUM_VALUE11 ACTION_MARKETPLACE -#define SPECENUM_VALUE11NAME "Enter Marketplace" -#define SPECENUM_VALUE12 ACTION_HELP_WONDER -#define SPECENUM_VALUE12NAME "Help Wonder" -#define SPECENUM_VALUE13 ACTION_SPY_BRIBE_UNIT -#define SPECENUM_VALUE13NAME "Bribe Unit" -#define SPECENUM_VALUE14 ACTION_SPY_SABOTAGE_UNIT -#define SPECENUM_VALUE14NAME "Sabotage Unit" -#define SPECENUM_VALUE15 ACTION_CAPTURE_UNITS -#define SPECENUM_VALUE15NAME "Capture Units" -#define SPECENUM_VALUE16 ACTION_FOUND_CITY -#define SPECENUM_VALUE16NAME "Found City" -#define SPECENUM_VALUE17 ACTION_JOIN_CITY -#define SPECENUM_VALUE17NAME "Join City" -#define SPECENUM_VALUE18 ACTION_STEAL_MAPS -#define SPECENUM_VALUE18NAME "Steal Maps" -#define SPECENUM_VALUE19 ACTION_BOMBARD -#define SPECENUM_VALUE19NAME "Bombard" -#define SPECENUM_VALUE20 ACTION_SPY_NUKE -#define SPECENUM_VALUE20NAME "Suitcase Nuke" -#define SPECENUM_VALUE21 ACTION_NUKE -#define SPECENUM_VALUE21NAME "Explode Nuclear" -#define SPECENUM_VALUE22 ACTION_DESTROY_CITY -#define SPECENUM_VALUE22NAME "Destroy City" -#define SPECENUM_VALUE23 ACTION_EXPEL_UNIT -#define SPECENUM_VALUE23NAME "Expel Unit" -#define SPECENUM_VALUE24 ACTION_RECYCLE_UNIT -#define SPECENUM_VALUE24NAME "Recycle Unit" -#define SPECENUM_VALUE25 ACTION_DISBAND_UNIT -#define SPECENUM_VALUE25NAME "Disband Unit" -#define SPECENUM_VALUE26 ACTION_HOME_CITY -#define SPECENUM_VALUE26NAME "Home City" -#define SPECENUM_VALUE27 ACTION_UPGRADE_UNIT -#define SPECENUM_VALUE27NAME "Upgrade Unit" -#define SPECENUM_VALUE28 ACTION_PARADROP -#define SPECENUM_VALUE28NAME "Paradrop Unit" -#define SPECENUM_VALUE29 ACTION_AIRLIFT -#define SPECENUM_VALUE29NAME "Airlift Unit" -#define SPECENUM_VALUE30 ACTION_ATTACK -#define SPECENUM_VALUE30NAME "Attack" -#define SPECENUM_VALUE31 ACTION_CONQUER_CITY -#define SPECENUM_VALUE31NAME "Conquer City" -#define SPECENUM_VALUE32 ACTION_HEAL_UNIT -#define SPECENUM_VALUE32NAME "Heal Unit" +#define SPECENUM_VALUE1 ACTION_ESTABLISH_EMBASSY_STAY +#define SPECENUM_VALUE1NAME "Establish Embassy Stay" +#define SPECENUM_VALUE2 ACTION_SPY_INVESTIGATE_CITY +#define SPECENUM_VALUE2NAME "Investigate City" +#define SPECENUM_VALUE3 ACTION_INV_CITY_SPEND +#define SPECENUM_VALUE3NAME "Investigate City Spend Unit" +#define SPECENUM_VALUE4 ACTION_SPY_POISON +#define SPECENUM_VALUE4NAME "Poison City" +#define SPECENUM_VALUE5 ACTION_SPY_STEAL_GOLD +#define SPECENUM_VALUE5NAME "Steal Gold" +#define SPECENUM_VALUE6 ACTION_SPY_SABOTAGE_CITY +#define SPECENUM_VALUE6NAME "Sabotage City" +#define SPECENUM_VALUE7 ACTION_SPY_TARGETED_SABOTAGE_CITY +#define SPECENUM_VALUE7NAME "Targeted Sabotage City" +#define SPECENUM_VALUE8 ACTION_SPY_STEAL_TECH +#define SPECENUM_VALUE8NAME "Steal Tech" +#define SPECENUM_VALUE9 ACTION_SPY_TARGETED_STEAL_TECH +#define SPECENUM_VALUE9NAME "Targeted Steal Tech" +#define SPECENUM_VALUE10 ACTION_SPY_INCITE_CITY +#define SPECENUM_VALUE10NAME "Incite City" +#define SPECENUM_VALUE11 ACTION_TRADE_ROUTE +#define SPECENUM_VALUE11NAME "Establish Trade Route" +#define SPECENUM_VALUE12 ACTION_MARKETPLACE +#define SPECENUM_VALUE12NAME "Enter Marketplace" +#define SPECENUM_VALUE13 ACTION_HELP_WONDER +#define SPECENUM_VALUE13NAME "Help Wonder" +#define SPECENUM_VALUE14 ACTION_SPY_BRIBE_UNIT +#define SPECENUM_VALUE14NAME "Bribe Unit" +#define SPECENUM_VALUE15 ACTION_SPY_SABOTAGE_UNIT +#define SPECENUM_VALUE15NAME "Sabotage Unit" +#define SPECENUM_VALUE16 ACTION_CAPTURE_UNITS +#define SPECENUM_VALUE16NAME "Capture Units" +#define SPECENUM_VALUE17 ACTION_FOUND_CITY +#define SPECENUM_VALUE17NAME "Found City" +#define SPECENUM_VALUE18 ACTION_JOIN_CITY +#define SPECENUM_VALUE18NAME "Join City" +#define SPECENUM_VALUE19 ACTION_STEAL_MAPS +#define SPECENUM_VALUE19NAME "Steal Maps" +#define SPECENUM_VALUE20 ACTION_BOMBARD +#define SPECENUM_VALUE20NAME "Bombard" +#define SPECENUM_VALUE21 ACTION_SPY_NUKE +#define SPECENUM_VALUE21NAME "Suitcase Nuke" +#define SPECENUM_VALUE22 ACTION_NUKE +#define SPECENUM_VALUE22NAME "Explode Nuclear" +#define SPECENUM_VALUE23 ACTION_DESTROY_CITY +#define SPECENUM_VALUE23NAME "Destroy City" +#define SPECENUM_VALUE24 ACTION_EXPEL_UNIT +#define SPECENUM_VALUE24NAME "Expel Unit" +#define SPECENUM_VALUE25 ACTION_RECYCLE_UNIT +#define SPECENUM_VALUE25NAME "Recycle Unit" +#define SPECENUM_VALUE26 ACTION_DISBAND_UNIT +#define SPECENUM_VALUE26NAME "Disband Unit" +#define SPECENUM_VALUE27 ACTION_HOME_CITY +#define SPECENUM_VALUE27NAME "Home City" +#define SPECENUM_VALUE28 ACTION_UPGRADE_UNIT +#define SPECENUM_VALUE28NAME "Upgrade Unit" +#define SPECENUM_VALUE29 ACTION_PARADROP +#define SPECENUM_VALUE29NAME "Paradrop Unit" +#define SPECENUM_VALUE30 ACTION_AIRLIFT +#define SPECENUM_VALUE30NAME "Airlift Unit" +#define SPECENUM_VALUE31 ACTION_ATTACK +#define SPECENUM_VALUE31NAME "Attack" +#define SPECENUM_VALUE32 ACTION_CONQUER_CITY +#define SPECENUM_VALUE32NAME "Conquer City" +#define SPECENUM_VALUE33 ACTION_HEAL_UNIT +#define SPECENUM_VALUE33NAME "Heal Unit" #define SPECENUM_BITVECTOR bv_actions /* Limited by what values num2char() can store in unit orders in * savegames. */ diff --git a/common/aicore/pf_tools.c b/common/aicore/pf_tools.c index 5b3c254..edc982b 100644 --- a/common/aicore/pf_tools.c +++ b/common/aicore/pf_tools.c @@ -710,6 +710,8 @@ pft_enable_default_actions(struct pf_parameter *parameter) || utype_can_do_action(parameter->utype, ACTION_INV_CITY_SPEND) || utype_can_do_action(parameter->utype, + ACTION_ESTABLISH_EMBASSY_STAY) + || utype_can_do_action(parameter->utype, ACTION_ESTABLISH_EMBASSY)) { parameter->actions |= PF_AA_DIPLOMAT; } diff --git a/data/civ1/game.ruleset b/data/civ1/game.ruleset index 3e2d75d..d1577ed 100644 --- a/data/civ1/game.ruleset +++ b/data/civ1/game.ruleset @@ -224,8 +224,8 @@ ui_name_sabotage_city = _("%sSabotage City%s") ; /* TRANS: Incite a _Revolt (3% chance of success). */ ui_name_incite_city = _("Incite a %sRevolt%s") -; /* TRANS: Establish _Embassy (100% chance of success). */ -ui_name_establish_embassy = _("Establish %sEmbassy%s") +; /* TRANS: Establish _Embassy (and stay) (100% chance of success). */ +ui_name_establish_embassy_stay = _("Establish %sEmbassy (and stay)%s") ; /* TRANS: Steal _Technology (3% chance of success). */ ui_name_steal_tech = _("Steal %sTechnology%s") @@ -305,16 +305,16 @@ actor_reqs = } [actionenabler_establish_embassy] -action = "Establish Embassy" +action = "Establish Embassy Stay" actor_reqs = - { "type", "name", "range" - "UnitFlag", "Diplomat", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" + { "type", "name", "range" + "UnitFlag", "Diplomat", "Local" + "UnitState", "OnLivableTile", "Local" + "MinMoveFrags", "1", "Local" + "DiplRel", "Foreign", "Local" } target_reqs = - { "type", "name", "range", "present" + { "type", "name", "range", "present" "NationGroup", "Barbarian", "Player", FALSE } diff --git a/data/civ2/game.ruleset b/data/civ2/game.ruleset index b7cd242..8ae00b6 100644 --- a/data/civ2/game.ruleset +++ b/data/civ2/game.ruleset @@ -253,6 +253,9 @@ ui_name_incite_city = _("Incite a %sRevolt%s") ; /* TRANS: Establish _Embassy (100% chance of success). */ ui_name_establish_embassy = _("Establish %sEmbassy%s") +; /* TRANS: Establish _Embassy (and stay) (100% chance of success). */ +ui_name_establish_embassy_stay = _("Establish %sEmbassy (and stay)%s") + ; /* TRANS: Steal _Technology (3% chance of success). */ ui_name_steal_tech = _("Steal %sTechnology%s") @@ -348,12 +351,22 @@ actor_reqs = } [actionenabler_establish_embassy] +action = "Establish Embassy Stay" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Diplomat", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "Foreign", "Local", TRUE + "UnitFlag", "Spy", "Local", FALSE + } + +[actionenabler_establish_embassy_spy] action = "Establish Embassy" actor_reqs = - { "type", "name", "range" - "UnitFlag", "Diplomat", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" + { "type", "name", "range" + "UnitFlag", "Spy", "Local" + "MinMoveFrags", "1", "Local" + "DiplRel", "Foreign", "Local" } [actionenabler_investigate_city] diff --git a/data/civ2civ3/game.ruleset b/data/civ2civ3/game.ruleset index d3ca5ec..d331f43 100644 --- a/data/civ2civ3/game.ruleset +++ b/data/civ2civ3/game.ruleset @@ -259,6 +259,9 @@ ui_name_incite_city = _("Incite a %sRevolt%s") ; /* TRANS: Establish _Embassy (100% chance of success). */ ui_name_establish_embassy = _("Establish %sEmbassy%s") +; /* TRANS: Establish _Embassy (and stay) (100% chance of success). */ +ui_name_establish_embassy_stay = _("Establish %sEmbassy (and stay)%s") + ; /* TRANS: Steal _Technology (3% chance of success). */ ui_name_steal_tech = _("Steal %sTechnology%s") @@ -362,28 +365,42 @@ actor_reqs = } [actionenabler_establish_embassy] +action = "Establish Embassy Stay" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Diplomat", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "Foreign", "Local", TRUE + "UnitFlag", "Spy", "Local", FALSE + } +target_reqs = + { "type", "name", "range", "present" + "NationGroup", "Barbarian", "Player", FALSE + } + +[actionenabler_establish_embassy_spy] action = "Establish Embassy" actor_reqs = - { "type", "name", "range" - "UnitFlag", "Diplomat", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" + { "type", "name", "range" + "UnitFlag", "Spy", "Local" + "MinMoveFrags", "1", "Local" + "DiplRel", "Foreign", "Local" } target_reqs = - { "type", "name", "range", "present" + { "type", "name", "range", "present" "NationGroup", "Barbarian", "Player", FALSE } [actionenabler_establish_embassy_explorer] -action = "Establish Embassy" +action = "Establish Embassy Stay" actor_reqs = - { "type", "name", "range" - "UnitType", "Explorer", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" + { "type", "name", "range" + "UnitType", "Explorer", "Local" + "MinMoveFrags", "1", "Local" + "DiplRel", "Foreign", "Local" } target_reqs = - { "type", "name", "range", "present" + { "type", "name", "range", "present" "NationGroup", "Barbarian", "Player", FALSE } diff --git a/data/classic/game.ruleset b/data/classic/game.ruleset index ae1bc04..11e97e5 100644 --- a/data/classic/game.ruleset +++ b/data/classic/game.ruleset @@ -254,6 +254,9 @@ ui_name_incite_city = _("Incite a %sRevolt%s") ; /* TRANS: Establish _Embassy (100% chance of success). */ ui_name_establish_embassy = _("Establish %sEmbassy%s") +; /* TRANS: Establish _Embassy (and stay) (100% chance of success). */ +ui_name_establish_embassy_stay = _("Establish %sEmbassy (and stay)%s") + ; /* TRANS: Steal _Technology (3% chance of success). */ ui_name_steal_tech = _("Steal %sTechnology%s") @@ -351,16 +354,31 @@ actor_reqs = } [actionenabler_establish_embassy] +action = "Establish Embassy Stay" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Diplomat", "Local", TRUE + "UnitState", "OnLivableTile", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "Foreign", "Local", TRUE + "UnitFlag", "Spy", "Local", FALSE + } +target_reqs = + { "type", "name", "range", "present" + "NationGroup", "Barbarian", "Player", FALSE + } + +[actionenabler_establish_embassy_spy] action = "Establish Embassy" actor_reqs = - { "type", "name", "range" - "UnitFlag", "Diplomat", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" + { "type", "name", "range" + "UnitFlag", "Spy", "Local" + "UnitState", "OnLivableTile", "Local" + "MinMoveFrags", "1", "Local" + "DiplRel", "Foreign", "Local" } target_reqs = - { "type", "name", "range", "present" + { "type", "name", "range", "present" "NationGroup", "Barbarian", "Player", FALSE } diff --git a/data/experimental/game.ruleset b/data/experimental/game.ruleset index 67497b6..30abd4d 100644 --- a/data/experimental/game.ruleset +++ b/data/experimental/game.ruleset @@ -257,6 +257,9 @@ ui_name_incite_city = _("Incite a %sRevolt%s") ; /* TRANS: Establish _Embassy (100% chance of success). */ ui_name_establish_embassy = _("Establish %sEmbassy%s") +; /* TRANS: Establish _Embassy (and stay) (100% chance of success). */ +ui_name_establish_embassy_stay = _("Establish %sEmbassy (and stay)%s") + ; /* TRANS: Steal _Technology (3% chance of success). */ ui_name_steal_tech = _("Steal %sTechnology%s") @@ -354,31 +357,46 @@ actor_reqs = } [actionenabler_establish_embassy] +action = "Establish Embassy Stay" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Diplomat", "Local", TRUE + "UnitState", "OnLivableTile", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "Foreign", "Local", TRUE + "UnitFlag", "Spy", "Local", FALSE + } +target_reqs = + { "type", "name", "range", "present" + "NationGroup", "Barbarian", "Player", FALSE + } + +[actionenabler_establish_embassy_spy] action = "Establish Embassy" actor_reqs = - { "type", "name", "range" - "UnitFlag", "Diplomat", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" + { "type", "name", "range" + "UnitFlag", "Spy", "Local" + "UnitState", "OnLivableTile", "Local" + "MinMoveFrags", "1", "Local" + "DiplRel", "Foreign", "Local" } target_reqs = - { "type", "name", "range", "present" + { "type", "name", "range", "present" "NationGroup", "Barbarian", "Player", FALSE } [actionenabler_explorer_establish_embassy] -action = "Establish Embassy" +action = "Establish Embassy Stay" actor_reqs = - { "type", "name", "range" - "UnitType", "Explorer", "Local" - "Tech", "Writing", "Player" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" + { "type", "name", "range" + "UnitType", "Explorer", "Local" + "Tech", "Writing", "Player" + "UnitState", "OnLivableTile", "Local" + "MinMoveFrags", "1", "Local" + "DiplRel", "Foreign", "Local" } target_reqs = - { "type", "name", "range", "present" + { "type", "name", "range", "present" "NationGroup", "Barbarian", "Player", FALSE } diff --git a/data/multiplayer/game.ruleset b/data/multiplayer/game.ruleset index 6c63667..a926332 100644 --- a/data/multiplayer/game.ruleset +++ b/data/multiplayer/game.ruleset @@ -257,6 +257,9 @@ ui_name_incite_city = _("Incite a %sRevolt%s") ; /* TRANS: Establish _Embassy (100% chance of success). */ ui_name_establish_embassy = _("Establish %sEmbassy%s") +; /* TRANS: Establish _Embassy (and stay) (100% chance of success). */ +ui_name_establish_embassy_stay = _("Establish %sEmbassy (and stay)%s") + ; /* TRANS: Steal _Technology (3% chance of success). */ ui_name_steal_tech = _("Steal %sTechnology%s") @@ -348,16 +351,31 @@ actor_reqs = } [actionenabler_establish_embassy] +action = "Establish Embassy Stay" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Diplomat", "Local", TRUE + "UnitState", "OnLivableTile", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "Foreign", "Local", TRUE + "UnitFlag", "Spy", "Local", FALSE + } +target_reqs = + { "type", "name", "range", "present" + "NationGroup", "Barbarian", "Player", FALSE + } + +[actionenabler_establish_embassy_spy] action = "Establish Embassy" actor_reqs = - { "type", "name", "range" - "UnitFlag", "Diplomat", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" + { "type", "name", "range" + "UnitFlag", "Spy", "Local" + "UnitState", "OnLivableTile", "Local" + "MinMoveFrags", "1", "Local" + "DiplRel", "Foreign", "Local" } target_reqs = - { "type", "name", "range", "present" + { "type", "name", "range", "present" "NationGroup", "Barbarian", "Player", FALSE } diff --git a/data/sandbox/game.ruleset b/data/sandbox/game.ruleset index cb52343..9f248d4 100644 --- a/data/sandbox/game.ruleset +++ b/data/sandbox/game.ruleset @@ -256,6 +256,9 @@ ui_name_incite_city = _("Incite a %sRevolt%s") ; /* TRANS: Establish _Embassy (100% chance of success). */ ui_name_establish_embassy = _("Establish %sEmbassy%s") +; /* TRANS: Establish _Embassy (and stay) (100% chance of success). */ +ui_name_establish_embassy_stay = _("Establish %sEmbassy (and stay)%s") + ; /* TRANS: Steal _Technology (3% chance of success). */ ui_name_steal_tech = _("Steal %sTechnology%s") @@ -365,28 +368,42 @@ actor_reqs = } [actionenabler_establish_embassy] +action = "Establish Embassy Stay" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Diplomat", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "Foreign", "Local", TRUE + "UnitFlag", "Spy", "Local", FALSE + } +target_reqs = + { "type", "name", "range", "present" + "NationGroup", "Barbarian", "Player", FALSE + } + +[actionenabler_establish_embassy_spy] action = "Establish Embassy" actor_reqs = - { "type", "name", "range" - "UnitFlag", "Diplomat", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" + { "type", "name", "range" + "UnitFlag", "Spy", "Local" + "MinMoveFrags", "1", "Local" + "DiplRel", "Foreign", "Local" } target_reqs = - { "type", "name", "range", "present" + { "type", "name", "range", "present" "NationGroup", "Barbarian", "Player", FALSE } [actionenabler_establish_embassy_explorer] -action = "Establish Embassy" +action = "Establish Embassy Stay" actor_reqs = - { "type", "name", "range" - "UnitType", "Explorer", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" + { "type", "name", "range" + "UnitType", "Explorer", "Local" + "MinMoveFrags", "1", "Local" + "DiplRel", "Foreign", "Local" } target_reqs = - { "type", "name", "range", "present" + { "type", "name", "range", "present" "NationGroup", "Barbarian", "Player", FALSE } diff --git a/data/webperimental/game.ruleset b/data/webperimental/game.ruleset index 79071c2..4d48ada 100644 --- a/data/webperimental/game.ruleset +++ b/data/webperimental/game.ruleset @@ -321,6 +321,9 @@ ui_name_incite_city = _("Incite a %sRevolt%s") ; /* TRANS: Establish _Embassy (100% chance of success). */ ui_name_establish_embassy = _("Establish %sEmbassy%s") +; /* TRANS: Establish _Embassy (and stay) (100% chance of success). */ +ui_name_establish_embassy_stay = _("Establish %sEmbassy (and stay)%s") + ; /* TRANS: Steal _Technology (3% chance of success). */ ui_name_steal_tech = _("Steal %sTechnology%s") @@ -421,29 +424,43 @@ actor_reqs = } [actionenabler_establish_embassy] -action = "Establish Embassy" +action = "Establish Embassy Stay" actor_reqs = - { "type", "name", "range" - "UnitFlag", "Diplomat", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" + { "type", "name", "range", "present" + "UnitFlag", "Diplomat", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "Foreign", "Local", TRUE + "UnitFlag", "Spy", "Local", FALSE } target_reqs = - { "type", "name", "range", "present" + { "type", "name", "range", "present" "NationGroup", "Barbarian", "Player", FALSE } -[actionenabler_explorer_establish_embassy] +[actionenabler_establish_embassy_spy] action = "Establish Embassy" +actor_reqs = + { "type", "name", "range" + "UnitFlag", "Spy", "Local" + "MinMoveFrags", "1", "Local" + "DiplRel", "Foreign", "Local" + } +target_reqs = + { "type", "name", "range", "present" + "NationGroup", "Barbarian", "Player", FALSE + } + +[actionenabler_explorer_establish_embassy] +action = "Establish Embassy Stay" actor_reqs = - { "type", "name", "range" - "UnitType", "Explorer", "Local" - "Tech", "Writing", "Player" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" + { "type", "name", "range" + "UnitType", "Explorer", "Local" + "Tech", "Writing", "Player" + "MinMoveFrags", "1", "Local" + "DiplRel", "Foreign", "Local" } target_reqs = - { "type", "name", "range", "present" + { "type", "name", "range", "present" "NationGroup", "Barbarian", "Player", FALSE } diff --git a/doc/README.actions b/doc/README.actions index 7ea4f40..b6b3400 100644 --- a/doc/README.actions +++ b/doc/README.actions @@ -167,6 +167,14 @@ Actions done by a unit against a city * actor must be on the same tile as the target or on the tile next to it. * target must be foreign. (!) +"Establish Embassy Stay" - Establish a real embassy to the target player + * UI name can be set using ui_name_establish_embassy + * spends the actor unit + * actor must be aware that the target exists + * actor can't have a real embassy to the target player + * actor must be on the same tile as the target or on the tile next to it. + * target must be foreign. (!) + "Investigate City" - Look at the city dialog of a foreign city * UI name can be set using ui_name_investigate_city * actor must be aware that the target exists diff --git a/server/advisors/advdata.c b/server/advisors/advdata.c index aed8e53..424464d 100644 --- a/server/advisors/advdata.c +++ b/server/advisors/advdata.c @@ -879,6 +879,7 @@ void adv_best_government(struct player *pplayer) break; case ACTION_ESTABLISH_EMBASSY: + case ACTION_ESTABLISH_EMBASSY_STAY: case ACTION_TRADE_ROUTE: case ACTION_JOIN_CITY: case ACTION_HELP_WONDER: diff --git a/server/diplomats.c b/server/diplomats.c index 96313af..a9f5b71 100644 --- a/server/diplomats.c +++ b/server/diplomats.c @@ -289,14 +289,15 @@ void spy_send_sabotage_list(struct connection *pc, struct unit *pdiplomat, - Otherwise, the embassy is created. - It costs some minimal movement to establish an embassy. - - Diplomats are consumed in creation of embassy. - - Spies always survive. + - If spends_unit is TRUE the actor unit is consumed in creation of + embassy. If it isn't the actor unit always survive. Returns TRUE iff action could be done, FALSE if it couldn't. Even if this returns TRUE, unit may have died during the action. ****************************************************************************/ bool diplomat_embassy(struct player *pplayer, struct unit *pdiplomat, - struct city *pcity, const enum gen_action action_id) + struct city *pcity, const enum gen_action action_id, + bool spends_unit) { struct player *cplayer; @@ -342,8 +343,9 @@ bool diplomat_embassy(struct player *pplayer, struct unit *pdiplomat, action_id_consequence_success(action_id, pplayer, cplayer, city_tile(pcity), city_link(pcity)); - /* Spies always survive. Diplomats never do. */ - if (!unit_has_type_flag(pdiplomat, UTYF_SPY)) { + /* The actor unit always survive when spends_unit is FALSE, it never does + * when it is TRUE. */ + if (spends_unit) { wipe_unit(pdiplomat, ULR_USED, NULL); } else { send_unit_info(NULL, pdiplomat); diff --git a/server/diplomats.h b/server/diplomats.h index 1d84e58..6f39c86 100644 --- a/server/diplomats.h +++ b/server/diplomats.h @@ -16,7 +16,8 @@ #include "fc_types.h" bool diplomat_embassy(struct player *pplayer, struct unit *pdiplomat, - struct city *pcity, const enum gen_action action_id); + struct city *pcity, const enum gen_action action_id, + bool spends_unit); bool diplomat_investigate(struct player *pplayer, struct unit *pdiplomat, struct city *pcity, const enum gen_action action_id, diff --git a/server/ruleset.c b/server/ruleset.c index 93b30f3..f944316 100644 --- a/server/ruleset.c +++ b/server/ruleset.c @@ -6036,6 +6036,13 @@ static bool load_ruleset_game(struct section_file *file, bool act, text); text = secfile_lookup_str_default(file, + /* TRANS: Establish _Embassy (and stay) (100% chance of success). */ + N_("Establish %sEmbassy (and stay)%s"), + "actions.ui_name_establish_embassy_stay"); + sz_strlcpy(action_by_number(ACTION_ESTABLISH_EMBASSY_STAY)->ui_name, + text); + + text = secfile_lookup_str_default(file, /* TRANS: Steal _Technology (3% chance of success). */ N_("Steal %sTechnology%s"), "actions.ui_name_steal_tech"); diff --git a/server/savegame3.c b/server/savegame3.c index 646e63c..236fde5 100644 --- a/server/savegame3.c +++ b/server/savegame3.c @@ -5541,6 +5541,7 @@ static bool sg_load_player_unit(struct loaddata *loading, } break; case ACTION_ESTABLISH_EMBASSY: + case ACTION_ESTABLISH_EMBASSY_STAY: case ACTION_SPY_INVESTIGATE_CITY: case ACTION_INV_CITY_SPEND: case ACTION_SPY_POISON: diff --git a/server/unithand.c b/server/unithand.c index fe182eb..de1651c 100644 --- a/server/unithand.c +++ b/server/unithand.c @@ -570,6 +570,7 @@ static struct player *need_war_player_hlp(const struct unit *actor, break; case ACTION_ESTABLISH_EMBASSY: + case ACTION_ESTABLISH_EMBASSY_STAY: case ACTION_SPY_INVESTIGATE_CITY: case ACTION_INV_CITY_SPEND: case ACTION_SPY_POISON: @@ -2378,7 +2379,12 @@ bool unit_perform_action(struct player *pplayer, case ACTION_ESTABLISH_EMBASSY: ACTION_STARTED_UNIT_CITY(action_type, actor_unit, pcity, diplomat_embassy(pplayer, actor_unit, pcity, - action_type)); + action_type, FALSE)); + break; + case ACTION_ESTABLISH_EMBASSY_STAY: + ACTION_STARTED_UNIT_CITY(action_type, actor_unit, pcity, + diplomat_embassy(pplayer, actor_unit, pcity, + action_type, TRUE)); break; case ACTION_SPY_INCITE_CITY: ACTION_STARTED_UNIT_CITY(action_type, actor_unit, pcity, @@ -4666,6 +4672,7 @@ void handle_unit_orders(struct player *pplayer, } break; case ACTION_ESTABLISH_EMBASSY: + case ACTION_ESTABLISH_EMBASSY_STAY: case ACTION_SPY_INVESTIGATE_CITY: case ACTION_INV_CITY_SPEND: case ACTION_SPY_POISON: diff --git a/tools/ruleutil/rulesave.c b/tools/ruleutil/rulesave.c index cbbccdd..4639b2f 100644 --- a/tools/ruleutil/rulesave.c +++ b/tools/ruleutil/rulesave.c @@ -1055,6 +1055,9 @@ static bool save_game_ruleset(const char *filename, const char *name) action_by_number(ACTION_ESTABLISH_EMBASSY)->ui_name, "actions.ui_name_establish_embassy"); secfile_insert_str(sfile, + action_by_number(ACTION_ESTABLISH_EMBASSY_STAY)->ui_name, + "actions.ui_name_establish_embassy_stay"); + secfile_insert_str(sfile, action_by_number(ACTION_SPY_STEAL_TECH)->ui_name, "actions.ui_name_steal_tech"); secfile_insert_str(sfile, -- 2.1.4