Freeciv21
Develop your civilization from humble roots to a global empire
research.cpp File Reference
#include "fcintl.h"
#include "iterator.h"
#include "log.h"
#include "shared.h"
#include "support.h"
#include "fc_types.h"
#include "game.h"
#include "name_translation.h"
#include "nation.h"
#include "player.h"
#include "team.h"
#include "tech.h"
#include "research.h"
+ Include dependency graph for research.cpp:

Go to the source code of this file.

Classes

struct  research_player_iter
 

Macros

#define RESEARCH_PLAYER_ITER(p)   ((struct research_player_iter *) p)
 

Functions

std::vector< researchresearch_array (MAX_NUM_PLAYER_SLOTS)
 
 Q_GLOBAL_STATIC (QVector< QString >, future_name_translation)
 
void researches_init ()
 Initializes all player research structure. More...
 
void researches_free ()
 Free all resources allocated for the research system. More...
 
int research_number (const research *presearch)
 Returns the index of the research in the array. More...
 
struct researchresearch_by_number (int number)
 Returns the research for the given index. More...
 
struct researchresearch_get (const struct player *pplayer)
 Returns the research structure associated with the player. More...
 
bool research_is_valid (const struct research &presearch)
 Checks whether the research object is valid in the current game. More...
 
const char * research_rule_name (const struct research *presearch)
 Returns the name of the research owner: a player name or a team name. More...
 
const char * research_name_translation (const struct research *presearch)
 Returns the name of the research owner: a player name or a team name. More...
 
int research_pretty_name (const struct research *presearch, char *buf, size_t buf_len)
 Set in 'buf' the name of the research owner. More...
 
static const struct name_translationresearch_advance_name (Tech_type_id tech)
 Return the name translation for 'tech'. More...
 
static const char * research_future_set_name (QVector< QString > *psv, int no, const char *new_name)
 Set a new future tech name in the string vector, and return the string duplicate stored inside the vector. More...
 
QString research_advance_rule_name (const struct research *presearch, Tech_type_id tech)
 Store the rule name of the given tech (including A_FUTURE) in 'buf'. More...
 
QString research_advance_name_translation (const struct research *presearch, Tech_type_id tech)
 Store the translated name of the given tech (including A_FUTURE) in 'buf'. More...
 
static bool reqs_may_activate (const struct player *target_player, const struct player *other_player, const struct city *target_city, const struct impr_type *target_building, const struct tile *target_tile, const struct unit *target_unit, const struct unit_type *target_unittype, const struct output_type *target_output, const struct specialist *target_specialist, const struct action *target_action, const struct requirement_vector *reqs, const enum req_problem_type prob_type, const enum vision_layer vision_layer, const enum national_intelligence nintel)
 Returns TRUE iff the requirement vector may become active against the given target. More...
 
static bool research_allowed (const struct research *presearch, Tech_type_id tech, bool(*reqs_eval)(const struct player *tplr, const struct player *oplr, const struct city *tcity, const struct impr_type *tbld, const struct tile *ttile, const struct unit *tunit, const struct unit_type *tutype, const struct output_type *top, const struct specialist *tspe, const struct action *tact, const struct requirement_vector *reqs, const enum req_problem_type ptype, const enum vision_layer vlayer, const enum national_intelligence nintel))
 Evaluates the legality of starting to research this tech according to reqs_eval() and the tech's research_reqs. More...
 
static bool research_get_reachable_rreqs (const struct research *presearch, Tech_type_id tech)
 Returns TRUE iff the given tech is ever reachable by the players sharing the research as far as research_reqs are concerned. More...
 
static bool research_get_reachable (const struct research *presearch, Tech_type_id tech)
 Returns TRUE iff the given tech is ever reachable by the players sharing the research by checking tech tree limitations. More...
 
static bool research_get_root_reqs_known (const struct research *presearch, Tech_type_id tech)
 Returns TRUE iff the players sharing 'presearch' already have got the knowledge of all root requirement technologies for 'tech' (without which it's impossible to gain 'tech'). More...
 
void research_update (struct research *presearch)
 Mark as TECH_PREREQS_KNOWN each tech which is available, not known and which has all requirements fullfiled. More...
 
enum tech_state research_invention_state (const struct research *presearch, Tech_type_id tech)
 Returns state of the tech for current research. More...
 
enum tech_state research_invention_set (struct research *presearch, Tech_type_id tech, enum tech_state value)
 Set research knowledge about tech to given state. More...
 
bool research_invention_reachable (const struct research *presearch, const Tech_type_id tech)
 Returns TRUE iff the given tech is ever reachable via research by the players sharing the research by checking tech tree limitations. More...
 
bool research_invention_gettable (const struct research *presearch, const Tech_type_id tech, bool allow_holes)
 Returns TRUE iff the given tech can be given to the players sharing the research immediately. More...
 
Tech_type_id research_goal_step (const struct research *presearch, Tech_type_id goal)
 Return the next tech we should research to advance towards our goal. More...
 
int research_goal_unknown_techs (const struct research *presearch, Tech_type_id goal)
 Returns the number of technologies the player need to research to get the goal technology. More...
 
int research_goal_bulbs_required (const struct research *presearch, Tech_type_id goal)
 Function to determine cost (in bulbs) of reaching goal technology. More...
 
bool research_goal_tech_req (const struct research *presearch, Tech_type_id goal, Tech_type_id tech)
 Returns if the given tech has to be researched to reach the goal. More...
 
int research_total_bulbs_required (const struct research *presearch, Tech_type_id tech, bool loss_value)
 Function to determine cost for technology. More...
 
int player_tech_upkeep (const struct player *pplayer)
 Calculate the bulb upkeep needed for all techs of a player. More...
 
size_t research_player_iter_sizeof ()
 Returns the real size of the research player iterator. More...
 
static bool research_player_iter_valid_state (struct iterator *it)
 Returns whether the iterator is currently at a valid state. More...
 
static void * research_player_iter_pooled_get (const struct iterator *it)
 Returns player of the iterator. More...
 
static void research_player_iter_pooled_next (struct iterator *it)
 Returns the next player sharing the research. More...
 
static bool research_player_iter_pooled_valid (const struct iterator *it)
 Returns whether the iterate is valid. More...
 
static void * research_player_iter_not_pooled_get (const struct iterator *it)
 Returns player of the iterator. More...
 
static void research_player_iter_not_pooled_next (struct iterator *it)
 Invalidate the iterator. More...
 
static bool research_player_iter_not_pooled_valid (const struct iterator *it)
 Returns whether the iterate is valid. More...
 
struct iteratorresearch_player_iter_init (struct research_player_iter *it, const struct research *presearch)
 Initializes a research player iterator. More...
 

Variables

static struct name_translation advance_unset_name = NAME_INIT
 
static struct name_translation advance_future_name = NAME_INIT
 
static struct name_translation advance_unknown_name = NAME_INIT
 

Macro Definition Documentation

◆ RESEARCH_PLAYER_ITER

#define RESEARCH_PLAYER_ITER (   p)    ((struct research_player_iter *) p)

Definition at line 38 of file research.cpp.

Function Documentation

◆ player_tech_upkeep()

int player_tech_upkeep ( const struct player pplayer)

Calculate the bulb upkeep needed for all techs of a player.

See also research_total_bulbs_required().

Definition at line 1037 of file research.cpp.

Referenced by dai_goldequiv_clause(), dai_manage_taxes(), end_phase(), init_tech(), and package_player_info().

◆ Q_GLOBAL_STATIC()

Q_GLOBAL_STATIC ( QVector< QString >  ,
future_name_translation   
)

◆ reqs_may_activate()

static bool reqs_may_activate ( const struct player target_player,
const struct player other_player,
const struct city target_city,
const struct impr_type target_building,
const struct tile target_tile,
const struct unit target_unit,
const struct unit_type target_unittype,
const struct output_type target_output,
const struct specialist target_specialist,
const struct action target_action,
const struct requirement_vector *  reqs,
const enum req_problem_type  prob_type,
const enum vision_layer  vision_layer,
const enum national_intelligence  nintel 
)
static

Returns TRUE iff the requirement vector may become active against the given target.

If may become active if all unchangeable requirements are active.

Definition at line 290 of file research.cpp.

Referenced by research_get_reachable_rreqs().

◆ research_advance_name()

static const struct name_translation* research_advance_name ( Tech_type_id  tech)
inlinestatic

Return the name translation for 'tech'.

Utility for research_advance_rule_name() and research_advance_translated_name().

Definition at line 194 of file research.cpp.

Referenced by research_advance_name_translation(), and research_advance_rule_name().

◆ research_advance_name_translation()

◆ research_advance_rule_name()

QString research_advance_rule_name ( const struct research presearch,
Tech_type_id  tech 
)

Store the rule name of the given tech (including A_FUTURE) in 'buf'.

'presearch' may be nullptr.

Definition at line 233 of file research.cpp.

Referenced by dai_manage_tech(), dai_select_tech(), kill_unit(), and update_bulbs().

◆ research_allowed()

static bool research_allowed ( const struct research presearch,
Tech_type_id  tech,
bool(*)(const struct player *tplr, const struct player *oplr, const struct city *tcity, const struct impr_type *tbld, const struct tile *ttile, const struct unit *tunit, const struct unit_type *tutype, const struct output_type *top, const struct specialist *tspe, const struct action *tact, const struct requirement_vector *reqs, const enum req_problem_type ptype, const enum vision_layer vlayer, const enum national_intelligence nintel)  reqs_eval 
)
static

Evaluates the legality of starting to research this tech according to reqs_eval() and the tech's research_reqs.

Returns TRUE iff legal.

The reqs_eval() argument evaluates the requirements. One variant may check the current situation while another may check potential future situations.

Helper for research_update().

Definition at line 330 of file research.cpp.

Referenced by research_get_reachable_rreqs(), and research_invention_set().

◆ research_array()

◆ research_by_number()

struct research* research_by_number ( int  number)

Returns the research for the given index.

Definition at line 100 of file research.cpp.

Referenced by handle_research_info(), and sg_load_researches().

◆ research_future_set_name()

static const char* research_future_set_name ( QVector< QString > *  psv,
int  no,
const char *  new_name 
)
static

Set a new future tech name in the string vector, and return the string duplicate stored inside the vector.

Definition at line 214 of file research.cpp.

Referenced by research_advance_name_translation(), and research_advance_rule_name().

◆ research_get()

struct research* research_get ( const struct player pplayer)

Returns the research structure associated with the player.

Definition at line 110 of file research.cpp.

Referenced by adjust_improvement_wants_by_effects(), adv_best_government(), adv_data_phase_init(), diplo_wdg::all_advances(), api_edit_give_technology(), api_methods_player_knows_tech(), api_methods_player_shares_research(), api_methods_research_name_translation(), api_methods_research_rule_name(), api_notify_research_embassies_msg(), api_notify_research_msg(), calc_civ_score(), can_player_build_unit_direct(), choose_tech_to_steal(), city_build_building(), client_research_sprite(), client_state(), col_research(), compute_tech_sell_price(), count_stealable_techs(), create_animals(), create_barbarian_player(), create_dummy_reqtree(), dai_choose_diplomat_offensive(), dai_choose_paratrooper(), dai_effect_value(), dai_goldequiv_clause(), dai_goldequiv_tech(), dai_gov_value(), dai_manage_government(), dai_manage_taxes(), dai_manage_tech(), dai_process_defender_want(), dai_select_tech(), dai_share(), dai_tech_base_want(), dai_tech_effect_values(), dai_treaty_evaluate(), dai_wants_defender_against(), dai_wants_role_unit(), dai_war_desire(), diplomat_get_tech(), do_tech_parasite_effect(), do_unit_establish_trade(), draw_reqtree(), end_phase(), establish_embassy(), find_city_to_diplomat(), forget_tech_transfered(), found_new_tech(), get_bulbs_per_turn(), get_edge_type(), get_info_label_text_popup(), get_science_goal_text(), get_science_target_text(), government_change(), handle_diplomacy_accept_treaty_req(), handle_edit_player(), handle_edit_player_create(), handle_player_research(), handle_player_tech_goal(), handle_research_info(), helptext_advance(), historian_generic(), is_req_active(), kill_unit(), science_report::locate_goal(), science_report::locate_researching(), research_diagram::mousePressEvent(), plr_widget::nation_selected(), node_rectangle_minimum_size(), notify_research_embassies(), num_known_tech_with_flag(), player_has_really_useful_tech_parasite(), player_knows_extra_exist(), player_tech_upkeep(), process_attacker_want(), science_report::push_research(), real_science_report_dialog_update(), research_total_bulbs_required(), science_dialog_text(), script_tech_learned(), send_city_info(), send_research_info(), diplo_wdg::show_menu(), show_new_turn_info(), split_player(), spy_steal_shared(), steal_a_tech(), suggest_tech_exchange(), tech_log_prefix(), tech_transfer(), top_bar_right_click_science(), update_bulbs(), science_report::update_report(), and worklist_change_build_target().

◆ research_get_reachable()

static bool research_get_reachable ( const struct research presearch,
Tech_type_id  tech 
)
static

Returns TRUE iff the given tech is ever reachable by the players sharing the research by checking tech tree limitations.

Helper for research_update().

Definition at line 425 of file research.cpp.

Referenced by research_invention_set().

◆ research_get_reachable_rreqs()

static bool research_get_reachable_rreqs ( const struct research presearch,
Tech_type_id  tech 
)
static

Returns TRUE iff the given tech is ever reachable by the players sharing the research as far as research_reqs are concerned.

Helper for research_get_reachable().

Definition at line 377 of file research.cpp.

Referenced by research_get_reachable().

◆ research_get_root_reqs_known()

static bool research_get_root_reqs_known ( const struct research presearch,
Tech_type_id  tech 
)
static

Returns TRUE iff the players sharing 'presearch' already have got the knowledge of all root requirement technologies for 'tech' (without which it's impossible to gain 'tech').

Helper for research_update().

Definition at line 465 of file research.cpp.

Referenced by research_invention_set().

◆ research_goal_bulbs_required()

int research_goal_bulbs_required ( const struct research presearch,
Tech_type_id  goal 
)

Function to determine cost (in bulbs) of reaching goal technology.

These costs include the cost for researching the goal technology itself.

'presearch' may be nullptr in which case it will returns the total number of bulbs needed for reaching the goal.

Definition at line 767 of file research.cpp.

Referenced by adjust_improvement_wants_by_effects(), dai_goldequiv_tech(), dai_process_defender_want(), dai_wants_defender_against(), dai_wants_role_unit(), get_science_goal_text(), helptext_advance(), and process_attacker_want().

◆ research_goal_step()

Tech_type_id research_goal_step ( const struct research presearch,
Tech_type_id  goal 
)

Return the next tech we should research to advance towards our goal.

Returns A_UNSET if nothing is available or the goal is already known.

Definition at line 714 of file research.cpp.

Referenced by end_phase(), found_new_tech(), and init_tech().

◆ research_goal_tech_req()

bool research_goal_tech_req ( const struct research presearch,
Tech_type_id  goal,
Tech_type_id  tech 
)

Returns if the given tech has to be researched to reach the goal.

The goal itself isn't a requirement of itself.

'presearch' may be nullptr.

Definition at line 794 of file research.cpp.

Referenced by dai_choose_paratrooper(), dai_select_tech(), dai_treaty_evaluate(), get_edge_type(), and get_science_goal_text().

◆ research_goal_unknown_techs()

int research_goal_unknown_techs ( const struct research presearch,
Tech_type_id  goal 
)

Returns the number of technologies the player need to research to get the goal technology.

This includes the goal technology. Technologies are only counted once.

'presearch' may be nullptr in which case it will returns the total number of technologies needed for reaching the goal.

Definition at line 745 of file research.cpp.

Referenced by adjust_improvement_wants_by_effects(), adv_best_government(), dai_effect_value(), dai_gov_value(), dai_select_tech(), get_science_goal_text(), helptext_advance(), process_attacker_want(), and tech_log_prefix().

◆ research_invention_gettable()

bool research_invention_gettable ( const struct research presearch,
const Tech_type_id  tech,
bool  allow_holes 
)

Returns TRUE iff the given tech can be given to the players sharing the research immediately.

If allow_holes is TRUE, any tech with known root reqs is ok. If it's FALSE, getting the tech must not leave holes to the known techs tree.

Definition at line 686 of file research.cpp.

Referenced by diplo_wdg::all_advances(), choose_tech_to_steal(), dai_goldequiv_tech(), dai_select_tech(), dai_share(), diplomat_get_tech(), do_tech_parasite_effect(), get_edge_type(), handle_diplomacy_accept_treaty_req(), init_tech(), player_has_really_useful_tech_parasite(), diplo_wdg::show_menu(), spy_steal_shared(), steal_a_tech(), and suggest_tech_exchange().

◆ research_invention_reachable()

bool research_invention_reachable ( const struct research presearch,
const Tech_type_id  tech 
)

Returns TRUE iff the given tech is ever reachable via research by the players sharing the research by checking tech tree limitations.

'presearch' may be nullptr in which case a simplified result is returned (used by the client).

Definition at line 659 of file research.cpp.

Referenced by create_dummy_reqtree(), dai_select_tech(), dai_wants_defender_against(), dai_wants_role_unit(), get_edge_type(), handle_player_tech_goal(), helptext_advance(), init_tech(), research_goal_step(), sg_load_sanitycheck(), and science_report::update_report().

◆ research_invention_set()

enum tech_state research_invention_set ( struct research presearch,
Tech_type_id  tech,
enum tech_state  value 
)

Set research knowledge about tech to given state.

Definition at line 486 of file research.cpp.

Referenced by dai_tech_base_want(), found_new_tech(), handle_edit_player(), handle_research_info(), init_tech(), research_tech_lost(), sg_load_researches(), and split_player().

◆ research_invention_state()

enum tech_state research_invention_state ( const struct research presearch,
Tech_type_id  tech 
)

◆ research_is_valid()

bool research_is_valid ( const struct research presearch)

Checks whether the research object is valid in the current game.

Definition at line 125 of file research.cpp.

Referenced by do_tech_parasite_effect(), end_turn(), research_invention_gettable(), research_invention_reachable(), send_all_info(), sg_load_researches(), sg_load_sanitycheck(), sg_save_researches(), and srv_ready().

◆ research_name_translation()

const char* research_name_translation ( const struct research presearch)

Returns the name of the research owner: a player name or a team name.

For most uses you probably want research_pretty_name() instead.

Definition at line 150 of file research.cpp.

Referenced by sg_load_sanitycheck().

◆ research_number()

int research_number ( const research presearch)

Returns the index of the research in the array.

Definition at line 91 of file research.cpp.

Referenced by init_tech(), package_research_info(), research_is_valid(), research_name_translation(), research_pretty_name(), research_rule_name(), and sg_save_researches().

◆ research_player_iter_init()

struct iterator* research_player_iter_init ( struct research_player_iter it,
const struct research presearch 
)

Initializes a research player iterator.

Definition at line 1197 of file research.cpp.

◆ research_player_iter_not_pooled_get()

static void* research_player_iter_not_pooled_get ( const struct iterator it)
static

Returns player of the iterator.

Definition at line 1173 of file research.cpp.

◆ research_player_iter_not_pooled_next()

static void research_player_iter_not_pooled_next ( struct iterator it)
static

Invalidate the iterator.

Definition at line 1181 of file research.cpp.

◆ research_player_iter_not_pooled_valid()

static bool research_player_iter_not_pooled_valid ( const struct iterator it)
static

Returns whether the iterate is valid.

Definition at line 1189 of file research.cpp.

◆ research_player_iter_pooled_get()

static void* research_player_iter_pooled_get ( const struct iterator it)
static

Returns player of the iterator.

Definition at line 1145 of file research.cpp.

◆ research_player_iter_pooled_next()

static void research_player_iter_pooled_next ( struct iterator it)
static

Returns the next player sharing the research.

Definition at line 1153 of file research.cpp.

◆ research_player_iter_pooled_valid()

static bool research_player_iter_pooled_valid ( const struct iterator it)
static

Returns whether the iterate is valid.

Definition at line 1165 of file research.cpp.

◆ research_player_iter_sizeof()

size_t research_player_iter_sizeof ( )

Returns the real size of the research player iterator.

Definition at line 1127 of file research.cpp.

◆ research_player_iter_valid_state()

static bool research_player_iter_valid_state ( struct iterator it)
inlinestatic

Returns whether the iterator is currently at a valid state.

Definition at line 1135 of file research.cpp.

Referenced by research_player_iter_pooled_next().

◆ research_pretty_name()

int research_pretty_name ( const struct research presearch,
char *  buf,
size_t  buf_len 
)

Set in 'buf' the name of the research owner.

It may be either a nation plural name, or something like "members of team Red".

Definition at line 163 of file research.cpp.

Referenced by api_edit_give_technology(), api_methods_research_name_translation(), city_build_building(), do_tech_parasite_effect(), found_new_tech(), handle_diplomacy_accept_treaty_req(), research_tech_lost(), steal_a_tech(), and tech_researched().

◆ research_rule_name()

const char* research_rule_name ( const struct research presearch)

Returns the name of the research owner: a player name or a team name.

Definition at line 137 of file research.cpp.

Referenced by api_methods_research_rule_name(), research_invention_set(), research_tech_lost(), and update_bulbs().

◆ research_total_bulbs_required()

int research_total_bulbs_required ( const struct research presearch,
Tech_type_id  tech,
bool  loss_value 
)

Function to determine cost for technology.

The equation is determined from game.info.tech_cost_style and game.info.tech_leakage.

tech_cost_style: TECH_COST_CIV1CIV2: Civ (I|II) style. Every new tech add base_tech_cost to cost of next tech. TECH_COST_CLASSIC: Cost of technology is: base_tech_cost * (1 + reqs) * sqrt(1 + reqs) / 2 where reqs == number of requirement for tech, counted recursively. TECH_COST_CLASSIC_PRESET: Cost are read from tech.ruleset. Missing costs are generated by style "Classic". TECH_COST_EXPERIMENTAL: Cost of technology is: base_tech_cost * (reqs^2 / (1 + sqrt(sqrt(reqs + 1)))

  • 0.5) where reqs == number of requirement for tech, counted recursively. TECH_COST_EXPERIMENTAL_PRESET: Cost are read from tech.ruleset. Missing costs are generated by style "Experimental".

tech_leakage: TECH_LEAKAGE_NONE: No reduction of the technology cost. TECH_LEAKAGE_EMBASSIES: Technology cost is reduced depending on the number of players which already know the tech and you have an embassy with. TECH_LEAKAGE_PLAYERS: Technology cost is reduced depending on the number of all players (human, AI and barbarians) which already know the tech. TECH_LEAKAGE_NO_BARBS: Technology cost is reduced depending on the number of normal players (human and AI) which already know the tech.

At the end we multiply by the sciencebox value, as a percentage. The cost can never be less than 1.

'presearch' may be nullptr in which case a simplified result is returned (used by client and manual code).

Definition at line 855 of file research.cpp.

Referenced by choose_tech(), dai_choose_diplomat_offensive(), dai_manage_tech(), helptext_advance(), init_tech(), lose_tech(), package_research_info(), pick_cheapest_tech(), research_apply_penalty(), research_invention_set(), tech_researched(), and update_bulbs().

◆ research_update()

void research_update ( struct research presearch)

Mark as TECH_PREREQS_KNOWN each tech which is available, not known and which has all requirements fullfiled.

Recalculate presearch->num_known_tech_with_flag Should always be called after research_invention_set().

Definition at line 486 of file research.cpp.

Referenced by client_state(), found_new_tech(), government_change(), handle_edit_player(), handle_research_info(), init_tech(), research_tech_lost(), sg_load_researches(), and split_player().

◆ researches_free()

void researches_free ( )

Free all resources allocated for the research system.

Definition at line 82 of file research.cpp.

Referenced by game_free().

◆ researches_init()

void researches_init ( )

Initializes all player research structure.

Definition at line 50 of file research.cpp.

Referenced by game_init(), and game_reset().

Variable Documentation

◆ advance_future_name

struct name_translation advance_future_name = NAME_INIT
static

Definition at line 29 of file research.cpp.

Referenced by research_advance_name(), research_advance_rule_name(), and researches_init().

◆ advance_unknown_name

struct name_translation advance_unknown_name = NAME_INIT
static

Definition at line 29 of file research.cpp.

Referenced by research_advance_name(), and researches_init().

◆ advance_unset_name

struct name_translation advance_unset_name = NAME_INIT
static

Definition at line 29 of file research.cpp.

Referenced by research_advance_name(), and researches_init().