From f77042a5a18eb8426f8d1966539f55b36266d04c Mon Sep 17 00:00:00 2001 From: Marko Lindqvist Date: Fri, 9 Jun 2023 05:48:06 +0300 Subject: [PATCH 38/38] Add actres_dice_type() It does a quick indexed array lookup for action_dice_roll_initial_odds(), so that the latter does not need to have massive switch-case. See osdn #48146 Signed-off-by: Marko Lindqvist --- common/actions.c | 79 ++----------------------- common/actres.c | 149 ++++++++++++++++++++++++++--------------------- common/actres.h | 3 + 3 files changed, 91 insertions(+), 140 deletions(-) diff --git a/common/actions.c b/common/actions.c index c47b195536..da58750ab1 100644 --- a/common/actions.c +++ b/common/actions.c @@ -6199,84 +6199,17 @@ struct act_prob action_prob_fall_back(const struct act_prob *ap1, **************************************************************************/ int action_dice_roll_initial_odds(const struct action *paction) { - switch (paction->result) { - case ACTRES_STRIKE_BUILDING: - case ACTRES_STRIKE_PRODUCTION: - case ACTRES_SPY_SPREAD_PLAGUE: - case ACTRES_SPY_STEAL_TECH: - case ACTRES_SPY_TARGETED_STEAL_TECH: - case ACTRES_SPY_INCITE_CITY: - case ACTRES_SPY_SABOTAGE_CITY: - case ACTRES_SPY_TARGETED_SABOTAGE_CITY: - case ACTRES_SPY_SABOTAGE_CITY_PRODUCTION: - case ACTRES_SPY_STEAL_GOLD: - case ACTRES_STEAL_MAPS: - case ACTRES_SPY_NUKE: - case ACTRES_SPY_POISON: + switch (actres_dice_type(paction->result)) { + case DRT_DIPLCHANCE: if (BV_ISSET(game.info.diplchance_initial_odds, paction->id)) { /* Take the initial odds from the diplchance setting. */ return server_setting_value_int_get( server_setting_by_name("diplchance")); - } else { - /* No initial odds. */ - return 100; } - case ACTRES_ESTABLISH_EMBASSY: - case ACTRES_SPY_INVESTIGATE_CITY: - case ACTRES_TRADE_ROUTE: - case ACTRES_MARKETPLACE: - case ACTRES_HELP_WONDER: - case ACTRES_SPY_BRIBE_UNIT: - case ACTRES_SPY_SABOTAGE_UNIT: - case ACTRES_CAPTURE_UNITS: - case ACTRES_FOUND_CITY: - case ACTRES_JOIN_CITY: - case ACTRES_BOMBARD: - case ACTRES_NUKE: - case ACTRES_NUKE_UNITS: - case ACTRES_DESTROY_CITY: - case ACTRES_EXPEL_UNIT: - case ACTRES_DISBAND_UNIT_RECOVER: - case ACTRES_DISBAND_UNIT: - case ACTRES_HOME_CITY: - case ACTRES_HOMELESS: - case ACTRES_UPGRADE_UNIT: - case ACTRES_PARADROP: - case ACTRES_PARADROP_CONQUER: - case ACTRES_AIRLIFT: - case ACTRES_ATTACK: - case ACTRES_WIPE_UNITS: - case ACTRES_CONQUER_CITY: - case ACTRES_CONQUER_EXTRAS: - case ACTRES_HEAL_UNIT: - case ACTRES_TRANSFORM_TERRAIN: - case ACTRES_CULTIVATE: - case ACTRES_PLANT: - case ACTRES_PILLAGE: - case ACTRES_CLEAN: - case ACTRES_CLEAN_POLLUTION: - case ACTRES_CLEAN_FALLOUT: - case ACTRES_FORTIFY: - case ACTRES_ROAD: - case ACTRES_CONVERT: - case ACTRES_BASE: - case ACTRES_MINE: - case ACTRES_IRRIGATE: - case ACTRES_TRANSPORT_DEBOARD: - case ACTRES_TRANSPORT_UNLOAD: - case ACTRES_TRANSPORT_LOAD: - case ACTRES_TRANSPORT_DISEMBARK: - case ACTRES_TRANSPORT_BOARD: - case ACTRES_TRANSPORT_EMBARK: - case ACTRES_SPY_ATTACK: - case ACTRES_HUT_ENTER: - case ACTRES_HUT_FRIGHTEN: - case ACTRES_UNIT_MOVE: - case ACTRES_TELEPORT: - case ACTRES_ENABLER_CHECK: - case ACTRES_SPY_ESCAPE: - case ACTRES_NONE: - /* No additional dice roll. */ + fc__fallthrough; + case DRT_CERTAIN: + return 100; + case DRT_NONE: break; } diff --git a/common/actres.c b/common/actres.c index cab162e4a8..f136302db3 100644 --- a/common/actres.c +++ b/common/actres.c @@ -32,139 +32,139 @@ static struct actres act_results[ACTRES_LAST] = { { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_ESTABLISH_EMBASSY */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_SPY_INVESTIGATE_CITY */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_DIPLOMATIC, /* ACTRES_SPY_POISON */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_DIPLCHANCE }, { ACT_TGT_COMPL_SIMPLE, ABK_DIPLOMATIC, /* ACTRES_SPY_STEAL_GOLD */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_DIPLCHANCE }, { ACT_TGT_COMPL_SIMPLE, ABK_DIPLOMATIC, /* ACTRES_SPY_SABOTAGE_CITY */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_DIPLCHANCE }, { ACT_TGT_COMPL_MANDATORY, ABK_DIPLOMATIC, /* ACTRES_SPY_TARGETED_SABOTAGE_CITY */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_DIPLCHANCE }, { ACT_TGT_COMPL_SIMPLE, ABK_DIPLOMATIC, /* ACTRES_SPY_SABOTAGE_CITY_PRODUCTION */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_DIPLCHANCE }, { ACT_TGT_COMPL_SIMPLE, ABK_DIPLOMATIC, /* ACTRES_SPY_STEAL_TECH */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_DIPLCHANCE }, { ACT_TGT_COMPL_MANDATORY, ABK_DIPLOMATIC, /* ACTRES_SPY_TARGETED_STEAL_TECH */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_DIPLCHANCE }, { ACT_TGT_COMPL_SIMPLE, ABK_DIPLOMATIC, /* ACTRES_SPY_INCITE_CITY */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_DIPLCHANCE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_TRADE_ROUTE */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_MARKETPLACE */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_HELP_WONDER */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_DIPLOMATIC, /* ACTRES_SPY_BRIBE_UNIT */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_DIPLOMATIC, /* ACTRES_SPY_SABOTAGE_UNIT */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_CAPTURE_UNITS */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_FOUND_CITY */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE}, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_JOIN_CITY */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_DIPLOMATIC, /* ACTRES_STEAL_MAPS */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_DIPLCHANCE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_BOMBARD */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_NONE}, { ACT_TGT_COMPL_SIMPLE, ABK_DIPLOMATIC, /* ACTRES_SPY_NUKE */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_DIPLCHANCE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_NUKE */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_NUKE_UNITS */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_DESTROY_CITY */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_EXPEL_UNIT */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_DISBAND_UNIT_RECOVER */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_DISBAND_UNIT */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_HOME_CITY */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_UPGRADE_UNIT */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_PARADROP */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_AIRLIFT */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_STANDARD, /* ACTRES_ATTACK */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_MANDATORY, ABK_NONE, /* ACTRES_STRIKE_BUILDING */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_DIPLCHANCE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_STRIKE_PRODUCTION */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_DIPLCHANCE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_CONQUER_CITY */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_HEAL_UNIT */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_TRANSFORM_TERRAIN */ - FALSE, ACTIVITY_TRANSFORM }, + FALSE, ACTIVITY_TRANSFORM, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_CULTIVATE */ - FALSE, ACTIVITY_CULTIVATE }, + FALSE, ACTIVITY_CULTIVATE, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_PLANT */ - FALSE, ACTIVITY_PLANT }, + FALSE, ACTIVITY_PLANT, DRT_NONE }, { ACT_TGT_COMPL_FLEXIBLE, ABK_NONE, /* ACTRES_PILLAGE */ - TRUE, ACTIVITY_PILLAGE }, + TRUE, ACTIVITY_PILLAGE, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_FORTIFY */ - FALSE, ACTIVITY_FORTIFYING }, + FALSE, ACTIVITY_FORTIFYING, DRT_NONE }, { ACT_TGT_COMPL_MANDATORY, ABK_NONE, /* ACTRES_ROAD */ - FALSE, ACTIVITY_GEN_ROAD }, + FALSE, ACTIVITY_GEN_ROAD, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_CONVERT */ - FALSE, ACTIVITY_CONVERT }, + FALSE, ACTIVITY_CONVERT, DRT_NONE }, { ACT_TGT_COMPL_MANDATORY, ABK_NONE, /* ACTRES_BASE */ - FALSE, ACTIVITY_BASE }, + FALSE, ACTIVITY_BASE, DRT_NONE }, { ACT_TGT_COMPL_MANDATORY, ABK_NONE, /* ACTRES_MINE */ - FALSE, ACTIVITY_MINE }, + FALSE, ACTIVITY_MINE, DRT_NONE }, { ACT_TGT_COMPL_MANDATORY, ABK_NONE, /* ACTRES_IRRIGATE */ - FALSE, ACTIVITY_IRRIGATE }, + FALSE, ACTIVITY_IRRIGATE, DRT_NONE }, { ACT_TGT_COMPL_FLEXIBLE, ABK_NONE, /* ACTRES_CLEAN_POLLUTION */ - FALSE, ACTIVITY_POLLUTION }, + FALSE, ACTIVITY_POLLUTION, DRT_NONE }, { ACT_TGT_COMPL_FLEXIBLE, ABK_NONE, /* ACTRES_CLEAN_FALLOUT */ - FALSE, ACTIVITY_FALLOUT }, + FALSE, ACTIVITY_FALLOUT, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_TRANSPORT_DEBOARD */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_TRANSPORT_UNLOAD */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_TRANSPORT_DISEMBARK */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_TRANSPORT_BOARD */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_TRANSPORT_EMBARK */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_DIPLOMATIC, /* ACTRES_SPY_SPREAD_PLAGUE */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_DIPLCHANCE }, { ACT_TGT_COMPL_SIMPLE, ABK_DIPLOMATIC, /* ACTRES_SPY_ATTACK */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_CONQUER_EXTRAS */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_HUT_ENTER */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE}, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_HUT_FRIGHTEN */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_UNIT_MOVE */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_PARADROP_CONQUER */ - FALSE, ACTIVITY_LAST }, /* TODO: Should this be hostile? */ + FALSE, ACTIVITY_LAST, DRT_NONE }, /* TODO: Should this be hostile? */ { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_HOMELESS */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_STANDARD, /* ACTRES_WIPE_UNITS */ - TRUE, ACTIVITY_LAST }, + TRUE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_SPY_ESCAPE */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_TRANSPORT_LOAD */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_FLEXIBLE, ABK_NONE, /* ACTRES_CLEAN */ - FALSE, ACTIVITY_CLEAN }, + FALSE, ACTIVITY_CLEAN, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_TELEPORT */ - FALSE, ACTIVITY_LAST }, + FALSE, ACTIVITY_LAST, DRT_NONE }, { ACT_TGT_COMPL_SIMPLE, ABK_NONE, /* ACTRES_ENABLER_CHECK */ - FALSE, ACTIVITY_LAST } + FALSE, ACTIVITY_LAST, DRT_NONE } }; /*********************************************************************//** @@ -237,6 +237,21 @@ enum unit_activity actres_activity_result(enum action_result result) return act_results[result].activity; } +/**********************************************************************//** + Map actres to initial odds type. + + @param result Action result to check odds for + @return Initial odds type +**************************************************************************/ +enum dice_roll_type actres_dice_type(enum action_result result) +{ + if (result == ACTRES_NONE) { + return DRT_NONE; + } + + return act_results[result].dice; +} + /**********************************************************************//** Returns TRUE iff the specified player knows (has seen) the specified tile. diff --git a/common/actres.h b/common/actres.h index bf619842ef..64b3ddd164 100644 --- a/common/actres.h +++ b/common/actres.h @@ -90,12 +90,14 @@ struct req_context; #define SPECENUM_COUNT ABK_COUNT #include "specenum_gen.h" +enum dice_roll_type { DRT_NONE, DRT_DIPLCHANCE, DRT_CERTAIN }; struct actres { enum act_tgt_compl sub_tgt_compl; enum action_battle_kind battle_kind; bool hostile; enum unit_activity activity; + enum dice_roll_type dice; }; void actres_init(void); @@ -105,6 +107,7 @@ enum act_tgt_compl actres_target_compl_calc(enum action_result result); enum action_battle_kind actres_get_battle_kind(enum action_result result); bool actres_is_hostile(enum action_result result); enum unit_activity actres_activity_result(enum action_result result); +enum dice_roll_type actres_dice_type(enum action_result result); enum fc_tristate actres_possible(enum action_result result, const struct req_context *actor, -- 2.39.2