Freeciv-3.2
Loading...
Searching...
No Matches
advdata.c
Go to the documentation of this file.
1/***********************************************************************
2 Freeciv - Copyright (C) 2002 - The Freeciv Project
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 2, or (at your option)
6 any later version.
7
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12***********************************************************************/
13
14#ifdef HAVE_CONFIG_H
15#include <fc_config.h>
16#endif
17
18/* utility */
19#include "log.h"
20#include "mem.h"
21
22/* common */
23#include "actions.h"
24#include "ai.h"
25#include "city.h"
26#include "effects.h"
27#include "game.h"
28#include "government.h"
29#include "map.h"
30#include "movement.h"
31#include "research.h"
32#include "unit.h"
33#include "unitlist.h"
34
35/* common/aicore */
36#include "aisupport.h"
37#include "path_finding.h"
38#include "pf_tools.h"
39
40/* server */
41#include "cityturn.h"
42#include "diplhand.h"
43#include "maphand.h"
44#include "plrhand.h"
45#include "srv_log.h"
46#include "unittools.h"
47
48/* server/advisors */
49#include "advbuilding.h"
50#include "advcity.h"
51#include "advtools.h"
52#include "autosettlers.h"
53
54/* ai */
55#include "handicaps.h"
56
57#include "advdata.h"
58
59static void adv_dipl_new(const struct player *plr1,
60 const struct player *plr2);
61static void adv_dipl_free(const struct player *plr1,
62 const struct player *plr2);
63static struct adv_dipl *adv_dipl_get(const struct player *plr1,
64 const struct player *plr2);
65
66/**********************************************************************/
74static void adv_data_city_impr_calc(struct player *pplayer,
75 struct adv_data *adv)
76{
77 int count[ADV_IMPR_LAST];
78
79 memset(count, 0, sizeof(count));
80
81 improvement_iterate(pimprove) {
82 struct universal source = {
84 .value = {.building = pimprove}
85 };
86
88
89 /* Find largest extension */
91 switch (peffect->type) {
92#if 0
93 /* TODO */
100 case EFT_MAKE_HAPPY:
101#endif
102 case EFT_CAPITAL_CITY:
106 case EFT_OUTPUT_BONUS:
109 case EFT_UPKEEP_FREE:
111 if (VUT_IMPROVEMENT == preq->source.kind
112 && preq->source.value.building == pimprove) {
113 if (adv->impr_calc[improvement_index(pimprove)] != ADV_IMPR_CALCULATE_FULL) {
115 }
116 if (preq->range > adv->impr_range[improvement_index(pimprove)]) {
117 adv->impr_range[improvement_index(pimprove)] = preq->range;
118 }
119 }
121 break;
126 if (VUT_IMPROVEMENT == preq->source.kind
127 && preq->source.value.building == pimprove) {
129 if (preq->range > adv->impr_range[improvement_index(pimprove)]) {
130 adv->impr_range[improvement_index(pimprove)] = preq->range;
131 }
132 }
134 break;
135 default:
136 /* Nothing! */
137 break;
138 }
141}
142
143/**********************************************************************/
149{
150 struct research *presearch, *aresearch;
152
153 if (players_needed == 0) {
154 return FALSE;
155 }
156
157 presearch = research_get(pplayer);
159 int players_having;
160
164 continue;
165 }
166
167 players_having = 0;
168
170 if (aplayer == pplayer) {
171 continue;
172 }
173
176 || aresearch->researching == tech) {
179 return TRUE;
180 }
181 }
184 return FALSE;
185}
186
187/**********************************************************************/
193{
194 struct adv_data *adv = pplayer->server.adv;
195
196 fc_assert_ret(adv != NULL);
197
198 adv_data_city_impr_calc(pplayer, adv);
199}
200
201/**********************************************************************/
204static void count_my_units(struct player *pplayer)
205{
206 struct adv_data *adv = adv_data_get(pplayer, NULL);
207
208 memset(&adv->stats.units, 0, sizeof(adv->stats.units));
209
210 unit_list_iterate(pplayer->units, punit) {
212
213 adv->stats.units.byclass[uclass_index(pclass)]++;
214
216 adv->stats.units.coast_strict++;
217 }
219 adv->stats.units.suicide_attackers++;
220 }
227 /* TODO: Cover also teleporting */
228 adv->stats.units.paratroopers++;
229 }
231 adv->stats.units.airliftable++;
232 }
233 if (can_upgrade_unittype(pplayer, unit_type_get(punit)) >= 0) {
234 adv->stats.units.upgradeable++;
235 }
237}
238
239/**********************************************************************/
243bool is_adv_data_phase_open(struct player *pplayer)
244{
245 struct adv_data *adv = pplayer->server.adv;
246
247 return adv->phase_is_initialized;
248}
249
250/**********************************************************************/
263bool adv_data_phase_init(struct player *pplayer, bool is_new_phase)
264{
265 struct adv_data *adv = pplayer->server.adv;
266 bool danger_of_nukes;
268
269 {
270 int i = 0;
271
272 /* Conventional nukes */
275 /* TODO: worry about spy nuking too? */
277 }
278
280
281 if (adv->phase_is_initialized) {
282 return FALSE;
283 }
285
287
289
290 /*** Threats ***/
291
294 adv->continents = fc_calloc(adv->num_continents + 1, sizeof(struct adv_area_info));
295 adv->oceans = fc_calloc(adv->num_oceans + 1, sizeof(struct adv_area_info));
296 adv->threats.invasions = FALSE;
297 adv->threats.nuclear = 0; /* None */
298 adv->threats.igwall = FALSE;
299
300 whole_map_iterate(&(wld.map), ptile) {
301 Continent_id cont = tile_continent(ptile);
302
303 if (cont >= 0) {
304 adv->continents[cont].size++;
305 } else {
306 adv->oceans[-cont].size++;
307 }
309
311 if (!adv_is_player_dangerous(pplayer, aplayer)) {
312 continue;
313 }
314
315 /* The idea is that if there aren't any hostile cities on
316 * our continent, the danger of land attacks is not big
317 * enough to warrant city walls. Concentrate instead on
318 * coastal fortresses and hunting down enemy transports. */
321
322 if (continent >= 0) {
324 }
326
328 const struct unit_class *pclass = unit_class_get(punit);
329
331 adv->threats.igwall = TRUE;
332 }
333
334 if (pclass->adv.sea_move != MOVE_NONE) {
335 /* If the enemy has not started sailing yet, or we have total
336 * control over the seas, don't worry, keep attacking. */
338 /* Enemy represents a cross-continental threat! */
339 adv->threats.invasions = TRUE;
340 } else if (get_transporter_capacity(punit) > 0) {
345 /* Enemy can transport some threatening units! */
346 adv->threats.invasions = TRUE;
347 break;
348 }
350 }
351
352 /* The idea is that while our enemies don't have any offensive
353 * seaborne units, we don't have to worry. Go on the offensive! */
354 if (unit_type_get(punit)->attack_strength > 1) {
357
358 adv->oceans[-continent].threat = TRUE;
359 } else {
361 if (is_ocean_tile(tile2)) {
362 Continent_id continent = tile_continent(tile2);
363
364 adv->oceans[-continent].threat = TRUE;
365 }
367 }
368 }
369 continue;
370 }
371
372 /* If our enemy builds missiles, worry about missile defense. */
374 && unit_type_get(punit)->attack_strength > 1) {
375 adv->threats.suicide_attack = TRUE;
376 }
377
378 /* If they build nukes, worry a lot. */
380 if (unit_can_do_action(punit, act_id)) {
382 }
385
386 /* Check for nuke capability */
388 int i;
390
391 for (i = 0; i < nuke_units; i++) {
392 struct unit_type *nuke =
394
396 adv->threats.nuclear = 1;
397 }
398 }
401
402 /* Increase from fear to terror if opponent actually has nukes */
403 if (danger_of_nukes) {
404 adv->threats.nuclear++; /* sum of both fears */
405 }
406
407 /*** Exploration ***/
408
409 adv->explore.land_done = TRUE;
410 adv->explore.sea_done = TRUE;
411 adv->explore.continent = fc_calloc(adv->num_continents + 1, sizeof(bool));
412 adv->explore.ocean = fc_calloc(adv->num_oceans + 1, sizeof(bool));
413
414 whole_map_iterate(&(wld.map), ptile) {
415 Continent_id continent = tile_continent(ptile);
416
417 if (is_ocean_tile(ptile)) {
418 if (adv->explore.sea_done && has_handicap(pplayer, H_TARGETS)
419 && !map_is_known(ptile, pplayer)) {
420 /* We're not done there. */
421 adv->explore.sea_done = FALSE;
422 adv->explore.ocean[-continent] = TRUE;
423 }
424 /* skip rest, which is land only */
425 continue;
426 }
427 if (adv->explore.continent[tile_continent(ptile)]) {
428 /* we don't need more explaining, we got the point */
429 continue;
430 }
431 if (hut_on_tile(ptile)
432 && (!has_handicap(pplayer, H_HUTS)
433 || map_is_known(ptile, pplayer))) {
434 adv->explore.land_done = FALSE;
435 adv->explore.continent[continent] = TRUE;
436 continue;
437 }
438 if (has_handicap(pplayer, H_TARGETS) && !map_is_known(ptile, pplayer)) {
439 /* this AI must explore */
440 adv->explore.land_done = FALSE;
441 adv->explore.continent[continent] = TRUE;
442 }
444
445 /*** Statistics ***/
446
447 adv->stats.cities = fc_calloc(adv->num_continents + 1, sizeof(int));
448 adv->stats.ocean_cities = fc_calloc(adv->num_oceans + 1, sizeof(int));
449 adv->stats.average_production = 0;
450 city_list_iterate(pplayer->cities, pcity) {
451 Continent_id continent = tile_continent(pcity->tile);
452
453 if (continent >= 0) {
454 adv->stats.cities[continent]++;
455 } else {
456 adv->stats.ocean_cities[-continent]++;
457 }
458 adv->stats.average_production += pcity->surplus[O_SHIELD];
460 adv->stats.average_production /= MAX(1, city_list_size(pplayer->cities));
461
462 /*** Diplomacy ***/
463
465 struct adv_dipl *dip = adv_dipl_get(pplayer, aplayer);
466
467 dip->allied_with_enemy = FALSE;
470 && player_diplstate_get(pplayer, check_pl)->type == DS_WAR) {
471 dip->allied_with_enemy = TRUE;
472 }
475
477
480 if (adv->dipl.production_leader == NULL
481 || adv->dipl.production_leader->score.mfg < aplayer->score.mfg) {
483 }
485
486 adv->dipl.tech_leader = NULL;
488 if (adv->dipl.tech_leader == NULL
489 || adv->dipl.tech_leader->score.techs < aplayer->score.techs) {
490 adv->dipl.tech_leader = aplayer;
491 }
493
494 /*** Priorities ***/
495
496 /* NEVER set these to zero! Weight values are usually multiplied by
497 * these values, so be careful with them. They are used in city
498 * and government calculations, and food and shields should be
499 * slightly bigger because we only look at surpluses there. They
500 * are all WAGs. */
503 if (adv_wants_science(pplayer)) {
504 adv->luxury_priority = 1;
506 } else {
508 adv->science_priority = 1;
509 }
511 adv->happy_priority = 1;
512 adv->unhappy_priority = TRADE_WEIGHTING; /* danger */
513 adv->angry_priority = TRADE_WEIGHTING * 3; /* grave danger */
516
517 /* Research want */
518 if (is_future_tech(research_get(pplayer)->researching)
520 adv->wants_science = FALSE;
521 } else {
522 adv->wants_science = TRUE;
523 }
524
525 /* max num cities
526 * The idea behind this code is that novice players don't understand that
527 * expansion is critical and find it very annoying.
528 * With the following code AI players will try to be only a bit better
529 * than the best human players. This should lead to more exciting games
530 * for the beginners.
531 */
532 if (has_handicap(pplayer, H_EXPANSION)) {
533 bool found_human = FALSE;
534 adv->max_num_cities = 3;
536 if (aplayer == pplayer || is_ai(aplayer)) {
537 continue;
538 }
540 city_list_size(aplayer->cities) + 3);
543 if (!found_human) {
545 }
546 } else {
548 }
549
550 count_my_units(pplayer);
551
553
554 /* Government */
556 adv_best_government(pplayer);
558
559 return TRUE;
560}
561
562/**********************************************************************/
565void adv_data_phase_done(struct player *pplayer)
566{
567 struct adv_data *adv = pplayer->server.adv;
568
569 fc_assert_ret(adv != NULL);
570
571 if (!adv->phase_is_initialized) {
572 return;
573 }
574
575 free(adv->explore.ocean);
576 adv->explore.ocean = NULL;
577
578 free(adv->explore.continent);
579 adv->explore.continent = NULL;
580
581 free(adv->continents);
582 adv->continents = NULL;
583
584 free(adv->oceans);
585 adv->oceans = NULL;
586
587 free(adv->stats.cities);
588 adv->stats.cities = NULL;
589
590 free(adv->stats.ocean_cities);
591 adv->stats.ocean_cities = NULL;
592
593 adv->num_continents = 0;
594 adv->num_oceans = 0;
595
597}
598
599/**********************************************************************/
605struct adv_data *adv_data_get(struct player *pplayer, bool *caller_closes)
606{
607 struct adv_data *adv = pplayer->server.adv;
608
609 fc_assert_ret_val(adv != NULL, NULL);
610
611 /* It's certainly indication of bug causing problems
612 if this adv_data_get() gets called between adv_data_phase_done() and
613 adv_data_phase_init(), since we may end up calling those
614 functions if number of known continents has changed.
615
616 Consider following case:
617 Correct call order would be:
618 a) adv_data_phase_init()
619 b) adv_data_get() -> adv_data_phase_done()
620 c) adv_data_get() -> adv_data_phase_init()
621 d) adv_data_phase_done()
622 e) do something
623 f) adv_data_phase_init()
624
625 In (e) data phase would be closed and data would be
626 correctly initialized at (f), which is probably beginning
627 next turn.
628
629 Buggy version where adv_data_get() (b&c) gets called after (d):
630 a) adv_data_phase_init()
631 d) adv_data_phase_done()
632 b) adv_data_get() -> adv_data_phase_done()
633 c) adv_data_get() -> adv_data_phase_init()
634 e) do something
635 f) adv_data_phase_init()
636
637 Now in (e) data phase would be open. When adv_data_phase_init()
638 then finally gets called and it really should recreate data
639 to match situation of new turn, it detects that data phase
640 is already initialized and does nothing.
641
642 So, this assertion is here for a reason!
643
644 Code below tries to fix the situation best it can if such a bug is
645 encountered. Since we are probably going to trust that to be enough
646 instead of making intrusive fixes for actual bug in stable branch,
647 do not assert for non-debug builds of stable versions. */
648#if defined(FREECIV_DEBUG) || defined(IS_DEVEL_VERSION)
650#endif
651
652 if (caller_closes != NULL) {
654 }
655
657 || adv->num_oceans != wld.map.num_oceans) {
658 /* we discovered more continents, recalculate! */
659
660 if (adv->phase_is_initialized) {
661 /* Only call these in this order if inside data phase.
662 This is blanket "fix" for all cases where adv_data_get() is called
663 at illegal time. This at least minimize bad effects of such calls. */
664 adv_data_phase_done(pplayer);
665 adv_data_phase_init(pplayer, FALSE);
666 } else {
667 /* Call them in "wrong" order so we return recalculated data to caller,
668 but leave data phase closed.
669 This is blanket "fix" for all cases where adv_data_get() is called
670 at illegal time. This at least minimize bad effects of such calls.
671
672 Arguably this is not buggy at all but works just as designed in
673 case of being called in alternate movement mode for players
674 other than currently moving one (for diplomacy between the two,
675 for example) */
676 log_debug("%s advisor data phase closed when adv_data_get() called",
677 player_name(pplayer));
678 adv_data_phase_init(pplayer, FALSE);
679 if (caller_closes != NULL) {
681 } else {
682 adv_data_phase_done(pplayer);
683 }
684 }
685 } else {
686 if (!adv->phase_is_initialized && caller_closes != NULL) {
687 adv_data_phase_init(pplayer, FALSE);
689 }
690 }
691
692 return adv;
693}
694
695/**********************************************************************/
698void adv_data_init(struct player *pplayer)
699{
700 struct adv_data *adv;
701
702 if (pplayer->server.adv == NULL) {
703 pplayer->server.adv = fc_calloc(1, sizeof(*pplayer->server.adv));
704 }
705 adv = pplayer->server.adv;
706
707 adv->government_want = NULL;
708
710 sizeof(*adv->dipl.adv_dipl_slots));
711 player_slots_iterate(pslot) {
712 struct adv_dipl **dip_slot =
714 *dip_slot = NULL;
716
718 adv_dipl_new(pplayer, aplayer);
719 if (aplayer != pplayer) {
720 adv_dipl_new(aplayer, pplayer);
721 }
723
724 adv_data_default(pplayer);
725}
726
727/**********************************************************************/
730void adv_data_default(struct player *pplayer)
731{
732 struct adv_data *adv = pplayer->server.adv;
733
734 fc_assert_ret(adv != NULL);
735
736 adv->govt_reeval = 0;
738 (government_count() + 1)
739 * sizeof(*adv->government_want));
740 memset(adv->government_want, 0,
741 (government_count() + 1) * sizeof(*adv->government_want));
742
743 adv->wonder_city = 0;
744
745 adv->wants_science = TRUE;
746 adv->celebrate = FALSE;
747 adv->max_num_cities = 10000;
748}
749
750/**********************************************************************/
753void adv_data_close(struct player *pplayer)
754{
755 struct adv_data *adv = pplayer->server.adv;
756
757 fc_assert_ret(NULL != adv);
758
759 adv_data_phase_done(pplayer);
760
761 if (adv->government_want != NULL) {
762 free(adv->government_want);
763 }
764
765 if (adv->dipl.adv_dipl_slots != NULL) {
767 adv_dipl_free(pplayer, aplayer);
768 if (aplayer != pplayer) {
769 adv_dipl_free(aplayer, pplayer);
770 }
773 }
774
775 if (adv != NULL) {
776 free(adv);
777 }
778
779 pplayer->server.adv = NULL;
780}
781
782/**********************************************************************/
785static void adv_dipl_new(const struct player *plr1,
786 const struct player *plr2)
787{
788 struct adv_dipl **dip_slot =
790
791 *dip_slot = fc_calloc(1, sizeof(struct adv_dipl));
792}
793
794/**********************************************************************/
797static void adv_dipl_free(const struct player *plr1,
798 const struct player *plr2)
799{
800 struct adv_dipl **dip_slot =
802
803 if (*dip_slot != NULL) {
805 *dip_slot = NULL;
806 }
807}
808
809/**********************************************************************/
812static struct adv_dipl *adv_dipl_get(const struct player *plr1,
813 const struct player *plr2)
814{
815 struct adv_dipl **dip_slot =
817
818 return *dip_slot;
819}
820
821/**********************************************************************/
825{
826 adv_want bonus = 0;
827
828 /* TODO: Individual and well balanced value. */
829 action_iterate(act) {
830 struct action *paction = action_by_number(act);
831
832 if (!action_immune_government(gov, act)) {
833 /* This government doesn't provide immunity against this
834 * action. */
835 continue;
836 }
837
838 switch (paction->result) {
839 case ACTRES_ATTACK:
843 bonus += 4;
844 break;
846 bonus += 2;
847 break;
849 bonus += 1.5;
850 break;
851 case ACTRES_CULTIVATE:
852 case ACTRES_PLANT:
853 bonus += 0.3;
854 break;
856 case ACTRES_PILLAGE:
858 bonus += 0.2;
859 break;
860 case ACTRES_HUT_ENTER:
862 /* It is mine. My own. My precious. */
863 bonus += 0.1;
864 break;
877 case ACTRES_BOMBARD:
878 case ACTRES_SPY_NUKE:
879 case ACTRES_NUKE:
886 /* Being a target of this is usually undesirable */
887 /* TODO: Individual and well balanced values. */
888 bonus += 0.1;
889 break;
890
891 case ACTRES_UNIT_MOVE:
892 case ACTRES_TELEPORT:
898 case ACTRES_PARADROP:
900 case ACTRES_FORTIFY:
902 /* Wants the ability to do this to it self. Don't want others
903 * to target it. Do nothing since action_immune_government()
904 * doesn't separate based on who the actor is. */
905 break;
906
907 case ACTRES_NONE:
908 /* Ruleset defined */
909 break;
910
913 case ACTRES_JOIN_CITY:
916 case ACTRES_HOME_CITY:
917 case ACTRES_HOMELESS:
919 case ACTRES_AIRLIFT:
920 case ACTRES_HEAL_UNIT:
921 case ACTRES_ROAD:
922 case ACTRES_CONVERT:
923 case ACTRES_BASE:
924 case ACTRES_MINE:
925 case ACTRES_IRRIGATE:
926 case ACTRES_CLEAN:
933 /* Could be good. An embassy gives permanent contact. A trade
934 * route gives gold per turn. Join city gives population.
935 * Help wonder gives shields. */
936 /* TODO: Individual and well balanced values. */
937 break;
938
940 }
942
943 return bonus;
944}
945
946/**********************************************************************/
953{
954 adv_want bonus = 0;
955
956 /* Bonuses for non-economic abilities. We increase val by
957 * a very small amount here to choose govt in cases where
958 * we have no cities yet. */
959 bonus += get_player_bonus(pplayer, EFT_VETERAN_BUILD) > 0 ? 3 : 0;
960 bonus += get_player_bonus(pplayer, EFT_INSPIRE_PARTISANS) > 0 ? 3 : 0;
961 bonus += get_player_bonus(pplayer, EFT_RAPTURE_GROW) > 0 ? 2 : 0;
962 bonus += get_player_bonus(pplayer, EFT_FANATICS) > 0 ? 3 : 0;
963 bonus += get_player_bonus(pplayer, EFT_OUTPUT_INC_TILE) * 8;
964
965 return bonus;
966}
967
968/**********************************************************************/
980void adv_best_government(struct player *pplayer)
981{
982 struct adv_data *adv = adv_data_get(pplayer, NULL);
983 int best_val = 0;
985
986 adv->goal.govt.gov = current_gov;
987 adv->goal.govt.val = 0;
988 adv->goal.govt.req = A_UNSET;
990
991 if (has_handicap(pplayer, H_AWAY) || !pplayer->is_alive) {
992 return;
993 }
994
995 if (adv->govt_reeval == 0) {
996 const struct research *presearch = research_get(pplayer);
997
999 adv_want val = 0;
1000 bool override = FALSE;
1001
1003 continue; /* pointless */
1004 }
1005 if (gov->ai.better
1006 && can_change_to_government(pplayer, gov->ai.better)) {
1007 continue; /* we have better governments available */
1008 }
1009
1010 CALL_PLR_AI_FUNC(gov_value, pplayer, pplayer, gov, &val, &override);
1011
1012 if (!override) {
1013 int dist;
1014 adv_want bonus = 0; /* in percentage */
1015 int revolution_turns;
1016
1017 pplayer->government = gov;
1018 /* Ideally we should change tax rates here, but since
1019 * this is a rather big CPU operation, we'd rather not. */
1020 check_player_max_rates(pplayer);
1021 city_list_iterate(pplayer->cities, acity) {
1024 city_list_iterate(pplayer->cities, pcity) {
1025 val += adv_eval_calc_city(pcity, adv);
1027
1028 bonus += adv_gov_action_immunity_want(gov);
1029 bonus += adv_gov_player_bonus_want(pplayer);
1030
1032 if (revolution_turns > 0) {
1033 bonus -= 6 / revolution_turns;
1034 }
1035
1036 val += (val * bonus) / 100;
1037
1038 /* FIXME: handle reqs other than technologies. */
1039 dist = 0;
1040 requirement_vector_iterate(&gov->reqs, preq) {
1041 if (VUT_ADVANCE == preq->source.kind) {
1043 advance_number(preq->source.value.advance));
1044
1045 dist += MAX(1, gut);
1046 }
1048 val = amortize(val, dist);
1049 }
1050
1051 adv->government_want[government_index(gov)] = val; /* Save want */
1053 /* Now reset our gov to it's real state. */
1054 pplayer->government = current_gov;
1055 city_list_iterate(pplayer->cities, acity) {
1058 if (player_is_cpuhog(pplayer)) {
1059 adv->govt_reeval = 1;
1060 } else {
1061 adv->govt_reeval = CLIP(5, city_list_size(pplayer->cities), 20);
1062 }
1063 }
1064 adv->govt_reeval--;
1065
1066 /* Figure out which government is the best for us this turn. */
1067 governments_iterate(gov) {
1068 int gi = government_index(gov);
1069 if (adv->government_want[gi] > best_val
1070 && can_change_to_government(pplayer, gov)) {
1071 best_val = adv->government_want[gi];
1072 adv->goal.revolution = gov;
1073 }
1074 if (adv->government_want[gi] > adv->goal.govt.val) {
1075 adv->goal.govt.gov = gov;
1076 adv->goal.govt.val = adv->government_want[gi];
1077
1078 /* FIXME: handle reqs other than technologies. */
1079 adv->goal.govt.req = A_NONE;
1080 requirement_vector_iterate(&gov->reqs, preq) {
1081 if (VUT_ADVANCE == preq->source.kind) {
1082 adv->goal.govt.req = advance_number(preq->source.value.advance);
1083 break;
1084 }
1086 }
1088 /* Goodness of the ideal gov is calculated relative to the goodness of the
1089 * best of the available ones. */
1090 adv->goal.govt.val -= best_val;
1091}
1092
1093/**********************************************************************/
1096bool adv_wants_science(struct player *pplayer)
1097{
1098 return adv_data_get(pplayer, NULL)->wants_science;
1099}
1100
1101/**********************************************************************/
1107bool adv_is_player_dangerous(struct player *pplayer,
1108 struct player *aplayer)
1109{
1110 struct adv_dipl *dip;
1111 enum diplstate_type ds;
1113
1114 if (is_ai(pplayer)) {
1115 /* Give AI code possibility to decide itself */
1116 CALL_PLR_AI_FUNC(consider_plr_dangerous, pplayer, pplayer, aplayer, &dang);
1117 }
1118
1119 if (dang == OVERRIDE_FALSE) {
1120 return FALSE;
1121 }
1122
1123 if (dang == OVERRIDE_TRUE) {
1124 return TRUE;
1125 }
1126
1127 if (pplayer == aplayer) {
1128 /* We always trust ourself */
1129 return FALSE;
1130 }
1131
1132 ds = player_diplstate_get(pplayer, aplayer)->type;
1133
1134 if (ds == DS_WAR || ds == DS_CEASEFIRE) {
1135 /* It's already a war or aplayer can declare it soon */
1136 return TRUE;
1137 }
1138
1139 dip = adv_dipl_get(pplayer, aplayer);
1140
1141 if (dip->allied_with_enemy) {
1142 /* Don't trust someone who will declare war on us soon */
1143 return TRUE;
1144 }
1145
1146 if (player_diplstate_get(pplayer, aplayer)->has_reason_to_cancel > 0) {
1147 return TRUE;
1148 }
1149
1150 if (pplayer->ai_common.love[player_index(aplayer)] < MAX_AI_LOVE / 10) {
1151 /* We don't trust players who we don't like. Note that
1152 * aplayer's units inside pplayer's borders decreases AI's love */
1153 return TRUE;
1154 }
1155
1156 return FALSE;
1157}
void action_array_add_all_by_result(action_id *act_array, int *position, enum action_result result)
Definition actions.c:6486
void action_array_end(action_id *act_array, int size)
Definition actions.c:6469
bool action_immune_government(struct government *gov, action_id act)
Definition actions.c:6173
static struct action * action_by_number(action_id act_id)
Definition actions.h:635
#define action_array_iterate(_act_array_, _act_id_)
Definition actions.h:497
#define action_id_get_role(act_id)
Definition actions.h:696
#define action_array_iterate_end
Definition actions.h:509
#define action_iterate_end
Definition actions.h:465
#define MAX_NUM_ACTIONS
Definition actions.h:314
#define action_iterate(_act_)
Definition actions.h:461
#define ASSERT_UNUSED_ACTRES_CASES
Definition actres.h:37
#define TRADE_WEIGHTING
Definition advbuilding.h:21
#define INFRA_WEIGHTING
Definition advbuilding.h:29
#define FOOD_WEIGHTING
Definition advbuilding.h:19
#define SHIELD_WEIGHTING
Definition advbuilding.h:20
#define POLLUTION_WEIGHTING
Definition advbuilding.h:28
int adv_eval_calc_city(struct city *pcity, struct adv_data *adv)
Definition advcity.c:32
static void adv_data_city_impr_calc(struct player *pplayer, struct adv_data *adv)
Definition advdata.c:74
void adv_data_analyze_rulesets(struct player *pplayer)
Definition advdata.c:192
void adv_data_close(struct player *pplayer)
Definition advdata.c:753
adv_want adv_gov_player_bonus_want(struct player *pplayer)
Definition advdata.c:952
void adv_data_init(struct player *pplayer)
Definition advdata.c:698
static void adv_dipl_free(const struct player *plr1, const struct player *plr2)
Definition advdata.c:797
struct adv_data * adv_data_get(struct player *pplayer, bool *caller_closes)
Definition advdata.c:605
bool is_adv_data_phase_open(struct player *pplayer)
Definition advdata.c:243
bool adv_wants_science(struct player *pplayer)
Definition advdata.c:1096
bool adv_data_phase_init(struct player *pplayer, bool is_new_phase)
Definition advdata.c:263
void adv_data_phase_done(struct player *pplayer)
Definition advdata.c:565
bool adv_is_player_dangerous(struct player *pplayer, struct player *aplayer)
Definition advdata.c:1107
static void adv_dipl_new(const struct player *plr1, const struct player *plr2)
Definition advdata.c:785
static void count_my_units(struct player *pplayer)
Definition advdata.c:204
adv_want adv_gov_action_immunity_want(struct government *gov)
Definition advdata.c:824
static struct adv_dipl * adv_dipl_get(const struct player *plr1, const struct player *plr2)
Definition advdata.c:812
static bool player_has_really_useful_tech_parasite(struct player *pplayer)
Definition advdata.c:148
void adv_best_government(struct player *pplayer)
Definition advdata.c:980
void adv_data_default(struct player *pplayer)
Definition advdata.c:730
@ ADV_IMPR_CALCULATE_FULL
Definition advdata.h:35
@ ADV_IMPR_LAST
Definition advdata.h:37
@ ADV_IMPR_ESTIMATE
Definition advdata.h:36
@ ADV_IMPR_CALCULATE
Definition advdata.h:34
adv_want amortize(adv_want benefit, int delay)
Definition advtools.c:29
#define CALL_PLR_AI_FUNC(_func, _player,...)
Definition ai.h:377
struct player * player_leading_spacerace(void)
Definition aisupport.c:38
#define city_list_iterate(citylist, pcity)
Definition city.h:508
#define city_list_iterate_end
Definition city.h:510
void auto_arrange_workers(struct city *pcity)
Definition cityturn.c:367
char * incite_cost
Definition comments.c:75
static void nuke_units(QVariant data1, QVariant data2)
Definition dialogs.cpp:2718
static void nuke(QVariant data1, QVariant data2)
Definition dialogs.cpp:2994
struct unit struct city struct unit struct tile struct extra_type const struct act_prob *act_probs int actor_unit_id struct unit struct unit * punit
Definition dialogs_g.h:74
struct effect_list * get_req_source_effects(const struct universal *psource)
Definition effects.c:153
int get_player_bonus(const struct player *pplayer, enum effect_type effect_type)
Definition effects.c:828
#define effect_list_iterate_end
Definition effects.h:406
#define effect_list_iterate(effect_list, peffect)
Definition effects.h:404
bool hut_on_tile(const struct tile *ptile)
Definition extras.c:697
float adv_want
Definition fc_types.h:1354
int action_id
Definition fc_types.h:389
#define ACTRES_NONE
Definition fc_types.h:327
@ O_SHIELD
Definition fc_types.h:101
signed short Continent_id
Definition fc_types.h:372
override_bool
Definition fc_types.h:94
@ OVERRIDE_TRUE
Definition fc_types.h:94
@ NO_OVERRIDE
Definition fc_types.h:94
@ OVERRIDE_FALSE
Definition fc_types.h:94
struct civ_game game
Definition game.c:62
struct world wld
Definition game.c:63
Government_type_id government_count(void)
Definition government.c:71
struct government * government_of_player(const struct player *pplayer)
Definition government.c:114
bool can_change_to_government(struct player *pplayer, const struct government *gov)
Definition government.c:166
Government_type_id government_index(const struct government *pgovern)
Definition government.c:82
#define governments_iterate(NAME_pgov)
Definition government.h:124
#define governments_iterate_end
Definition government.h:127
static GtkWidget * source
Definition gotodlg.c:58
GType type
Definition repodlgs.c:1313
bool has_handicap(const struct player *pplayer, enum handicap_type htype)
Definition handicaps.c:66
@ H_TARGETS
Definition handicaps.h:24
@ H_AWAY
Definition handicaps.h:19
@ H_HUTS
Definition handicaps.h:25
@ H_EXPANSION
Definition handicaps.h:31
Impr_type_id improvement_index(const struct impr_type *pimprove)
#define improvement_iterate_end
#define improvement_iterate(_p)
#define fc_assert_ret(condition)
Definition log.h:191
#define fc_assert(condition)
Definition log.h:176
#define fc_assert_ret_val(condition, val)
Definition log.h:194
#define log_debug(message,...)
Definition log.h:115
#define adjc_iterate_end
Definition map.h:433
#define MAP_INDEX_SIZE
Definition map.h:137
#define adjc_iterate(nmap, center_tile, itr_tile)
Definition map.h:428
#define whole_map_iterate(_map, _tile)
Definition map.h:545
#define whole_map_iterate_end
Definition map.h:554
bool map_is_known(const struct tile *ptile, const struct player *pplayer)
Definition maphand.c:894
#define fc_calloc(n, esz)
Definition mem.h:38
#define FC_FREE(ptr)
Definition mem.h:41
#define fc_realloc(ptr, sz)
Definition mem.h:36
bool can_unit_type_transport(const struct unit_type *transporter, const struct unit_class *transported)
Definition movement.c:868
int player_slot_count(void)
Definition player.c:418
const char * player_name(const struct player *pplayer)
Definition player.c:895
int player_slot_index(const struct player_slot *pslot)
Definition player.c:426
int player_index(const struct player *pplayer)
Definition player.c:829
struct player_diplstate * player_diplstate_get(const struct player *plr1, const struct player *plr2)
Definition player.c:324
bool pplayers_allied(const struct player *pplayer, const struct player *pplayer2)
Definition player.c:1405
#define players_iterate_end
Definition player.h:537
#define players_iterate(_pplayer)
Definition player.h:532
#define MAX_AI_LOVE
Definition player.h:561
#define player_slots_iterate(_pslot)
Definition player.h:523
#define is_ai(plr)
Definition player.h:230
#define players_iterate_alive_end
Definition player.h:547
#define player_slots_iterate_end
Definition player.h:527
static bool player_is_cpuhog(const struct player *pplayer)
Definition player.h:575
#define players_iterate_alive(_pplayer)
Definition player.h:542
void check_player_max_rates(struct player *pplayer)
Definition plrhand.c:776
#define requirement_vector_iterate_end
#define requirement_vector_iterate(req_vec, preq)
int research_goal_unknown_techs(const struct research *presearch, Tech_type_id goal)
Definition research.c:750
struct research * research_get(const struct player *pplayer)
Definition research.c:128
enum tech_state research_invention_state(const struct research *presearch, Tech_type_id tech)
Definition research.c:619
bool research_invention_gettable(const struct research *presearch, const Tech_type_id tech, bool allow_holes)
Definition research.c:693
#define CLIP(lower, current, upper)
Definition shared.h:57
#define MAX(x, y)
Definition shared.h:54
@ AIT_GOVERNMENT
Definition srv_log.h:47
@ AIT_AIDATA
Definition srv_log.h:46
@ TIMER_STOP
Definition srv_log.h:76
@ TIMER_START
Definition srv_log.h:76
#define TIMING_LOG(timer, activity)
Definition srv_log.h:125
bool threat
Definition advdata.h:47
bool wants_science
Definition advdata.h:139
int req
Definition advdata.h:133
short govt_reeval
Definition advdata.h:126
adv_want val
Definition advdata.h:132
int pollution_priority
Definition advdata.h:121
int shield_priority
Definition advdata.h:113
bool * ocean
Definition advdata.h:74
struct adv_data::@89 threats
int * cities
Definition advdata.h:96
int * ocean_cities
Definition advdata.h:97
bool invasions
Definition advdata.h:66
struct government * revolution
Definition advdata.h:135
int infra_priority
Definition advdata.h:122
struct adv_dipl ** adv_dipl_slots
Definition advdata.h:102
bool igwall
Definition advdata.h:69
bool celebrate
Definition advdata.h:142
struct adv_data::@92 dipl
struct adv_data::@91::@94 units
int num_oceans
Definition advdata.h:110
int unhappy_priority
Definition advdata.h:119
int luxury_priority
Definition advdata.h:115
int nuclear
Definition advdata.h:68
int angry_priority
Definition advdata.h:120
int food_priority
Definition advdata.h:114
int max_num_cities
Definition advdata.h:145
int num_continents
Definition advdata.h:109
adv_want * government_want
Definition advdata.h:125
struct adv_area_info * oceans
Definition advdata.h:62
struct player * production_leader
Definition advdata.h:106
struct government * gov
Definition advdata.h:131
struct adv_data::@93 goal
struct adv_area_info * continents
Definition advdata.h:61
int happy_priority
Definition advdata.h:118
bool * continent
Definition advdata.h:75
struct adv_data::@91 stats
struct adv_data::@93::@95 govt
enum adv_improvement_status impr_calc[B_LAST]
Definition advdata.h:58
bool phase_is_initialized
Definition advdata.h:52
int wonder_city
Definition advdata.h:55
enum req_range impr_range[B_LAST]
Definition advdata.h:59
struct adv_data::@90 explore
int science_priority
Definition advdata.h:117
int gold_priority
Definition advdata.h:116
struct player * tech_leader
Definition advdata.h:105
struct player * spacerace_leader
Definition advdata.h:104
struct packet_game_info info
Definition game.h:89
struct government * government_during_revolution
Definition game.h:94
Continent_id num_continents
Definition map_types.h:81
Continent_id num_oceans
Definition map_types.h:82
bool tech_parasite_allow_holes
int love[MAX_NUM_PLAYER_SLOTS]
Definition player.h:122
enum diplstate_type type
Definition player.h:197
int techs
Definition player.h:90
struct city_list * cities
Definition player.h:279
struct player_ai ai_common
Definition player.h:286
struct government * government
Definition player.h:256
const struct ai_type * ai
Definition player.h:287
struct unit_list * units
Definition player.h:280
bool is_alive
Definition player.h:266
struct player_score score
Definition player.h:281
struct adv_data * adv
Definition player.h:332
struct player::@70::@72 server
struct unit_class::@85 adv
struct unit_type::@87 adv
struct unit_class * uclass
Definition unittype.h:556
bool igwall
Definition unittype.h:574
const struct unit_type * utype
Definition unit.h:139
enum universals_n kind
Definition fc_types.h:902
struct civ_map map
#define TRUE
Definition support.h:46
#define FALSE
Definition support.h:47
bool is_future_tech(Tech_type_id tech)
Definition tech.c:281
Tech_type_id advance_number(const struct advance *padvance)
Definition tech.c:98
#define advance_index_iterate_end
Definition tech.h:248
#define A_FIRST
Definition tech.h:44
#define A_NONE
Definition tech.h:43
#define A_UNSET
Definition tech.h:48
#define advance_index_iterate(_start, _index)
Definition tech.h:244
#define is_ocean_tile(ptile)
Definition terrain.h:303
#define tile_continent(_tile)
Definition tile.h:92
bool unit_can_do_action(const struct unit *punit, const action_id act_id)
Definition unit.c:359
int get_transporter_capacity(const struct unit *punit)
Definition unit.c:297
#define unit_tile(_pu)
Definition unit.h:397
#define unit_list_iterate(unitlist, punit)
Definition unitlist.h:31
#define unit_list_iterate_end
Definition unitlist.h:33
const struct unit_type * unit_type_get(const struct unit *punit)
Definition unittype.c:123
bool can_player_build_unit_direct(const struct player *p, const struct unit_type *punittype, bool consider_reg_impr_req)
Definition unittype.c:1968
struct unit_type * get_role_unit(int role, int role_index)
Definition unittype.c:2253
int num_role_units(int role)
Definition unittype.c:2203
const struct unit_type * can_upgrade_unittype(const struct player *pplayer, const struct unit_type *punittype)
Definition unittype.c:1703
struct unit_class * unit_class_get(const struct unit *punit)
Definition unittype.c:2499
bool unit_has_type_flag(const struct unit *punit, enum unit_type_flag_id flag)
Definition unittype.c:190
bool unit_can_take_over(const struct unit *punit)
Definition unittype.c:264
bool utype_can_take_over(const struct unit_type *punittype)
Definition unittype.c:276
bool utype_can_do_action(const struct unit_type *putype, const action_id act_id)
Definition unittype.c:371
@ MOVE_NONE
Definition unittype.h:144
#define unit_type_iterate(_p)
Definition unittype.h:855
#define uclass_index(_c_)
Definition unittype.h:742
#define unit_type_iterate_end
Definition unittype.h:862