Freeciv-3.3
Loading...
Searching...
No Matches
Functions
techtools.c File Reference
#include "astring.h"
#include "fcintl.h"
#include "log.h"
#include "mem.h"
#include "rand.h"
#include "shared.h"
#include "support.h"
#include "game.h"
#include "government.h"
#include "movement.h"
#include "player.h"
#include "research.h"
#include "tech.h"
#include "unit.h"
#include "luascript_types.h"
#include "citytools.h"
#include "cityturn.h"
#include "connecthand.h"
#include "gamehand.h"
#include "maphand.h"
#include "notify.h"
#include "plrhand.h"
#include "unittools.h"
#include "script_server.h"
#include "techtools.h"

Go to the source code of this file.

Functions

static Tech_type_id pick_random_tech_to_lose (const struct research *presearch)
 
static Tech_type_id pick_random_tech (const struct research *presearch)
 
static Tech_type_id pick_cheapest_tech (const struct research *presearch)
 
static void research_tech_lost (struct research *presearch, Tech_type_id tech)
 
static void forget_tech_transferred (struct player *pplayer, Tech_type_id tech)
 
void research_apply_penalty (struct research *presearch, Tech_type_id tech, int penalty_percent)
 
void script_tech_learned (struct research *presearch, struct player *originating_plr, struct advance *tech, const char *reason)
 
static void tech_researched (struct research *research)
 
void do_tech_parasite_effects (struct player *pplayer)
 
static void package_research_info (struct packet_research_info *packet, const struct research *presearch)
 
void send_research_info (const struct research *presearch, const struct conn_list *dest)
 
void found_new_tech (struct research *presearch, Tech_type_id tech_found, bool was_discovery, bool saving_bulbs)
 
static bool lose_tech (struct research *research)
 
void update_bulbs (struct player *pplayer, int bulbs, bool check_tech, bool free_bulbs)
 
static struct governmentpick_random_government (struct player *pplayer)
 
void choose_random_tech (struct research *research)
 
void choose_tech (struct research *research, Tech_type_id tech)
 
void choose_tech_goal (struct research *presearch, Tech_type_id tech)
 
void init_tech (struct research *research, bool update)
 
void give_initial_techs (struct research *presearch, int num_random_techs)
 
Tech_type_id steal_a_tech (struct player *pplayer, struct player *victim, Tech_type_id preferred)
 
void handle_player_research (struct player *pplayer, int tech)
 
void handle_player_tech_goal (struct player *pplayer, int tech_goal)
 
Tech_type_id pick_free_tech (struct research *presearch)
 
void give_immediate_free_tech (struct research *presearch, Tech_type_id tech)
 
bool tech_transfer (struct player *plr_recv, struct player *plr_donor, Tech_type_id tech)
 
struct cur_govs_datacreate_current_governments_data (struct research *presearch)
 
struct cur_govs_datacreate_current_governments_data_all (void)
 
void free_current_governments_data (struct cur_govs_data *data)
 
void notify_new_government_options (struct player *pplayer, struct cur_govs_data *data, const char *reason)
 

Function Documentation

◆ choose_random_tech()

void choose_random_tech ( struct research research)

Finds and chooses (sets) a random research target from among all those available until presearch->researching != A_UNSET. Players may research more than one tech in this function. Possible reasons:

  • techpenalty < 100;
  • research.got_tech = TRUE and enough bulbs was saved;
  • research.researching = A_UNSET and enough bulbs was saved.

Definition at line 990 of file techtools.c.

Referenced by end_phase(), and init_tech().

◆ choose_tech()

void choose_tech ( struct research research,
Tech_type_id  tech 
)

Called when a player chooses the tech they want to research (or when the server chooses it for them automatically).

This takes care of all side effects so the research target probably shouldn't be changed outside of this function (doing so has been the cause of several bugs).

Definition at line 1005 of file techtools.c.

Referenced by choose_random_tech(), dai_manage_tech(), end_phase(), found_new_tech(), handle_player_research(), and init_tech().

◆ choose_tech_goal()

void choose_tech_goal ( struct research presearch,
Tech_type_id  tech 
)

Called when a player chooses the tech goal they want to research (or when the server chooses it for them automatically).

Definition at line 1075 of file techtools.c.

Referenced by dai_manage_tech(), and handle_player_tech_goal().

◆ create_current_governments_data()

struct cur_govs_data * create_current_governments_data ( struct research presearch)

Create data block listing what are the current government options of the players participating in the research.

Use free_current_governments_data() to free the returned data.

Definition at line 1490 of file techtools.c.

Referenced by found_new_tech().

◆ create_current_governments_data_all()

struct cur_govs_data * create_current_governments_data_all ( void  )

Create data block listing what are the current government options of the all players.

Use free_current_governments_data() to free the returned data.

Definition at line 1518 of file techtools.c.

Referenced by city_add_improvement_with_gov_notice().

◆ do_tech_parasite_effects()

void do_tech_parasite_effects ( struct player pplayer)

Give technologies to players with EFT_TECH_PARASITE and the like (traditionally from the Great Library).

Definition at line 143 of file techtools.c.

Referenced by end_phase().

◆ forget_tech_transferred()

static void forget_tech_transferred ( struct player pplayer,
Tech_type_id  tech 
)
static

Let the player forget one tech.

Definition at line 1416 of file techtools.c.

Referenced by tech_transfer().

◆ found_new_tech()

void found_new_tech ( struct research presearch,
Tech_type_id  tech_found,
bool  was_discovery,
bool  saving_bulbs 
)

Players sharing the research have got a new technology (from somewhere). 'was_discovery' is passed on to upgrade_city_extras. Logging and notification is not done here as it depends on how the tech came.

Definition at line 347 of file techtools.c.

Referenced by api_edit_give_technology(), do_tech_parasite_effects(), give_immediate_free_tech(), give_initial_techs(), handle_diplomacy_accept_treaty_req(), steal_a_tech(), and tech_researched().

◆ free_current_governments_data()

void free_current_governments_data ( struct cur_govs_data data)

Free the data block returned from the create_current_governments_data()

Definition at line 1538 of file techtools.c.

Referenced by city_add_improvement_with_gov_notice(), and found_new_tech().

◆ give_immediate_free_tech()

void give_immediate_free_tech ( struct research presearch,
Tech_type_id  tech 
)

Give an immediate free tech (probably chosen with pick_free_tech()). Applies freecost.

Definition at line 1407 of file techtools.c.

Referenced by city_build_building(), and found_new_tech().

◆ give_initial_techs()

void give_initial_techs ( struct research presearch,
int  num_random_techs 
)

Gives global (read from the game.ruleset file) and nation (read from the nation ruleset files) initial techs as specified in the ruleset, and random free technologies thanks to the techlevel setting.

Definition at line 1188 of file techtools.c.

Referenced by create_animals(), create_barbarian_player(), create_command_newcomer(), handle_edit_player_create(), and srv_ready().

◆ handle_player_research()

void handle_player_research ( struct player pplayer,
int  tech 
)

Handle incoming research packet. Need to check correctness Set the player to be researching the given tech.

If there are enough accumulated research points, the tech may be acquired immediately.

Definition at line 1339 of file techtools.c.

Referenced by server_handle_packet().

◆ handle_player_tech_goal()

void handle_player_tech_goal ( struct player pplayer,
int  tech_goal 
)

Handle incoming player_tech_goal packet Called from the network or AI code to set the player's tech goal.

Definition at line 1362 of file techtools.c.

Referenced by server_handle_packet().

◆ init_tech()

void init_tech ( struct research research,
bool  update 
)

◆ lose_tech()

static bool lose_tech ( struct research research)
static

Is player about to lose tech?

Definition at line 616 of file techtools.c.

Referenced by update_bulbs().

◆ notify_new_government_options()

void notify_new_government_options ( struct player pplayer,
struct cur_govs_data data,
const char reason 
)

Notify player about any new government options they have compared to the data block provided.

Definition at line 1552 of file techtools.c.

Referenced by city_add_improvement_with_gov_notice(), and found_new_tech().

◆ package_research_info()

static void package_research_info ( struct packet_research_info packet,
const struct research presearch 
)
inlinestatic

Fill packet fields. Helper for following functions.

Definition at line 258 of file techtools.c.

Referenced by send_research_info().

◆ pick_cheapest_tech()

static Tech_type_id pick_cheapest_tech ( const struct research presearch)
static

Returns cheapest researchable tech, random among equal cost ones.

Definition at line 958 of file techtools.c.

Referenced by pick_free_tech().

◆ pick_free_tech()

Tech_type_id pick_free_tech ( struct research presearch)

Choose a free tech.

Definition at line 1388 of file techtools.c.

Referenced by api_edit_give_technology(), city_build_building(), and found_new_tech().

◆ pick_random_government()

static struct government * pick_random_government ( struct player pplayer)
inlinestatic

Helper for research_tech_lost().

Definition at line 804 of file techtools.c.

Referenced by research_tech_lost().

◆ pick_random_tech()

static Tech_type_id pick_random_tech ( const struct research presearch)
static

Returns random researchable tech or A_FUTURE. No side effects.

Definition at line 939 of file techtools.c.

Referenced by choose_random_tech(), found_new_tech(), give_initial_techs(), and pick_free_tech().

◆ pick_random_tech_to_lose()

static Tech_type_id pick_random_tech_to_lose ( const struct research presearch)
static

Choose a random tech for player to lose.

Definition at line 733 of file techtools.c.

Referenced by update_bulbs().

◆ research_apply_penalty()

void research_apply_penalty ( struct research presearch,
Tech_type_id  tech,
int  penalty_percent 
)

◆ research_tech_lost()

static void research_tech_lost ( struct research presearch,
Tech_type_id  tech 
)
static

Remove one tech from the research.

Definition at line 821 of file techtools.c.

Referenced by forget_tech_transferred(), and update_bulbs().

◆ script_tech_learned()

void script_tech_learned ( struct research presearch,
struct player originating_plr,
struct advance tech,
const char reason 
)

Emit script signal(s) for player/team learning new tech. originating_plr is the player whose action caused this; may be NULL, and is only used to order the emission of the signals.

Definition at line 84 of file techtools.c.

Referenced by api_edit_give_technology(), handle_diplomacy_accept_treaty_req(), steal_a_tech(), and tech_researched().

◆ send_research_info()

void send_research_info ( const struct research presearch,
const struct conn_list dest 
)

◆ steal_a_tech()

Tech_type_id steal_a_tech ( struct player pplayer,
struct player victim,
Tech_type_id  preferred 
)

If victim has a tech which pplayer doesn't have, pplayer will get it. The clients will both be notified and the conquer cost penalty applied. Used for diplomats and city conquest. If preferred is A_UNSET one random tech will be chosen. Returns the stolen tech or A_NONE if no tech was found.

Definition at line 1234 of file techtools.c.

Referenced by diplomat_get_tech(), diplomat_incite(), player_loot_player(), and unit_conquer_city().

◆ tech_researched()

static void tech_researched ( struct research research)
static

Players have researched a new technology.

Definition at line 107 of file techtools.c.

Referenced by choose_tech(), and update_bulbs().

◆ tech_transfer()

bool tech_transfer ( struct player plr_recv,
struct player plr_donor,
Tech_type_id  tech 
)

Check if the tech is lost by the donor or receiver. Returns if the receiver gets a new tech.

Definition at line 1438 of file techtools.c.

Referenced by handle_diplomacy_accept_treaty_req(), and steal_a_tech().

◆ update_bulbs()

void update_bulbs ( struct player pplayer,
int  bulbs,
bool  check_tech,
bool  free_bulbs 
)

Adds the given number of bulbs into the player's tech and (if necessary and 'check_tech' is TRUE) completes the research. If the total number of bulbs is negative due to tech upkeep, one (randomly chosen) tech may be lost. free_bulbs allows to set the bulbs free for player to invest into any tech (in multiresearch mode it happens iff the tech is not selected).

The caller is responsible for sending updated player information.

This is called from each city every turn, from caravan revenue, at the end of the phase, and from Lua API.

Definition at line 654 of file techtools.c.

Referenced by api_edit_player_give_bulbs(), do_unit_establish_trade(), end_phase(), srv_ready(), update_city_activity(), and update_national_activities().