/**************************************************************************** Player has researched a new technology ****************************************************************************/ static void tech_researched(struct player *plr) { struct player_research *research = get_player_research(plr); /* plr will be notified when new tech is chosen */ if (!is_future_tech(research->researching)) { notify_embassies(plr, NULL, NULL, E_TECH_GAIN, FTC_SERVER_INFO, NULL, _("The %s have researched %s."), nation_plural_for_player(plr), advance_name_researching(plr)); } else { notify_embassies(plr, NULL, NULL, E_TECH_GAIN, FTC_SERVER_INFO, NULL, _("The %s have researched Future Tech. %d."), nation_plural_for_player(plr), research->future_tech); } /* Deduct tech cost */ research->bulbs_researched = MAX(research->bulbs_researched - total_bulbs_required(plr), 0); /* cache researched technology for event signal, because found_new_tech() changes the research goal */ Tech_type_id researched_tech = research->researching; /* do all the updates needed after finding new tech */ found_new_tech(plr, research->researching, TRUE, TRUE); script_signal_emit("tech_researched", 3, API_TYPE_TECH_TYPE, advance_by_number(researched_tech), API_TYPE_PLAYER, plr, API_TYPE_STRING, "researched"); }
/***************************************************************************** Notify players which have embassies with pplayer with the given message. *****************************************************************************/ void api_notify_embassies_msg(lua_State *L, Player *pplayer, Tile *ptile, int event, const char *message) { LUASCRIPT_CHECK_STATE(L); notify_embassies(pplayer, NULL, ptile, event, ftc_any, "%s", message); }
/**************************************************************************** Give technologies to players with EFT_TECH_PARASITE (traditionally from the Great Library). ****************************************************************************/ void do_tech_parasite_effect(struct player *pplayer) { int mod; struct effect_list *plist = effect_list_new(); /* Note that two EFT_TECH_PARASITE effects will combine into a single, * much worse effect. */ if ((mod = get_player_bonus_effects(plist, pplayer, EFT_TECH_PARASITE)) > 0) { char buf[512]; buf[0] = '\0'; effect_list_iterate(plist, peffect) { if (buf[0] != '\0') { sz_strlcat(buf, ", "); } get_effect_req_text(peffect, buf, sizeof(buf)); } effect_list_iterate_end; advance_index_iterate(A_FIRST, i) { if (player_invention_reachable(pplayer, i) && player_invention_state(pplayer, i) != TECH_KNOWN) { int num_players = 0; players_iterate(aplayer) { if (player_invention_state(aplayer, i) == TECH_KNOWN) { num_players++; } } players_iterate_end; if (num_players >= mod) { notify_player(pplayer, NULL, E_TECH_GAIN, FTC_SERVER_INFO, NULL, _("%s acquired from %s!"), advance_name_for_player(pplayer, i), buf); notify_embassies(pplayer, NULL, NULL, E_TECH_GAIN, FTC_SERVER_INFO, NULL, _("The %s have acquired %s from %s."), nation_plural_for_player(pplayer), advance_name_for_player(pplayer, i), buf); do_free_cost(pplayer, i); found_new_tech(pplayer, i, FALSE, TRUE); script_signal_emit("tech_researched", 3, API_TYPE_TECH_TYPE, advance_by_number(i), API_TYPE_PLAYER, pplayer, API_TYPE_STRING, "stolen"); break; } } } advance_index_iterate_end;