Freeciv-3.4
Loading...
Searching...
No Matches
player.c
Go to the documentation of this file.
1/***********************************************************************
2 Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold
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 "fcintl.h"
20#include "log.h"
21#include "mem.h"
22#include "shared.h"
23#include "support.h"
24
25/* common */
26#include "ai.h"
27#include "city.h"
28#include "fc_interface.h"
29#include "featured_text.h"
30#include "game.h"
31#include "government.h"
32#include "idex.h"
33#include "improvement.h"
34#include "map.h"
35#include "nation.h"
36#include "research.h"
37#include "rgbcolor.h"
38#include "tech.h"
39#include "unit.h"
40#include "unitlist.h"
41#include "vision.h"
42
43#include "player.h"
44
45
47 struct player *player;
48};
49
50static struct {
52 int used_slots; /* number of used/allocated players in the player slots */
54
55static void player_defaults(struct player *pplayer);
56
57static void player_diplstate_new(const struct player *plr1,
58 const struct player *plr2);
59static void player_diplstate_defaults(const struct player *plr1,
60 const struct player *plr2);
61static void player_diplstate_destroy(const struct player *plr1,
62 const struct player *plr2);
63
64/*******************************************************************/
69{
70 switch (oldstate) {
71 case DS_WAR: /* no change */
72 case DS_ARMISTICE:
73 case DS_CEASEFIRE:
74 case DS_PEACE:
75 return DS_WAR;
76 case DS_ALLIANCE:
77 return DS_ARMISTICE;
78 case DS_TEAM: /* no change */
79 return DS_TEAM;
80 case DS_NO_CONTACT: /* Possible if someone declares war on our ally */
81 return DS_NO_CONTACT; /* Can't cancel lack of contact */
82 case DS_LAST:
84 return DS_WAR; /* Arbitrary */
85 }
86
88
89 return DS_WAR; /* Arbitrary */
90}
91
92/*******************************************************************/
99 const struct player *p2)
100{
102
103 if (p1 == p2 || ds == DS_WAR || ds == DS_NO_CONTACT) {
104 return DIPL_ERROR;
105 }
106 if (players_on_same_team(p1, p2)) {
107 return DIPL_ERROR;
108 }
109 if (!p1->is_alive || !p2->is_alive) {
110 return DIPL_ERROR;
111 }
112 if (player_diplstate_get(p1, p2)->has_reason_to_cancel == 0
116 }
117
118 return DIPL_OK;
119}
120
121/*******************************************************************/
132static bool is_valid_alliance(const struct player *p1,
133 const struct player *p2)
134{
135 players_iterate_alive(pplayer) {
136 enum diplstate_type ds = player_diplstate_get(p1, pplayer)->type;
137
138 if (pplayer != p1
139 && pplayer != p2
140 && ds == DS_WAR /* Do not count 'never met' as war here */
141 && pplayers_allied(p2, pplayer)) {
142 return FALSE;
143 }
145
146 return TRUE;
147}
148
149/*******************************************************************/
160 const struct player *p2,
162{
164
165 if (players_on_same_team(p1, p2)) {
166 /* This includes the case p1 == p2 */
167 return DIPL_ERROR;
168 }
171 return DIPL_ERROR;
172 }
173 if (treaty == DS_WAR
175 || treaty == DS_ARMISTICE
176 || treaty == DS_TEAM
177 || treaty == DS_LAST) {
178 return DIPL_ERROR; /* These are not negotiable treaties */
179 }
180 if (treaty == DS_CEASEFIRE && existing != DS_WAR) {
181 return DIPL_ERROR; /* Only available from war */
182 }
183 if (treaty == DS_PEACE
184 && (existing != DS_WAR && existing != DS_CEASEFIRE)) {
185 return DIPL_ERROR;
186 }
187 if (treaty == DS_ALLIANCE) {
188 if (!is_valid_alliance(p1, p2)) {
189 /* Our war with a third party prevents entry to alliance. */
191 } else if (!is_valid_alliance(p2, p1)) {
192 /* Their war with a third party prevents entry to alliance. */
194 }
195 }
196 /* This check must be last: */
197 if (treaty == existing) {
198 return DIPL_ERROR;
199 }
200
201 return DIPL_OK;
202}
203
204/*******************************************************************/
208bool player_has_embassy(const struct player *pplayer,
209 const struct player *pplayer2)
210{
211 return (pplayer == pplayer2
214}
215
216/*******************************************************************/
220bool team_has_embassy(const struct team *pteam, const struct player *tgt_player)
221{
222 if (tgt_player->team == pteam) {
223 return TRUE;
224 }
225
229 return TRUE;
230 }
232
233 return FALSE;
234}
235
236/*******************************************************************/
240bool player_has_real_embassy(const struct player *pplayer,
241 const struct player *pplayer2)
242{
243 return BV_ISSET(pplayer->real_embassy, player_index(pplayer2));
244}
245
246/*******************************************************************/
250bool player_has_embassy_from_effect(const struct player *pplayer,
251 const struct player *pplayer2)
252{
253 return (get_player_bonus(pplayer, EFT_HAVE_EMBASSIES) > 0
256}
257
258/*******************************************************************/
261bool player_owns_city(const struct player *pplayer, const struct city *pcity)
262{
263 return (pcity && pplayer && city_owner(pcity) == pplayer);
264}
265
266/*******************************************************************/
270bool player_can_invade_tile(const struct player *pplayer,
271 const struct tile *ptile)
272{
273 const struct player *ptile_owner = tile_owner(ptile);
274
275 return (!ptile_owner
276 || ptile_owner == pplayer
278 || !players_non_invade(pplayer, ptile_owner));
279}
280
281/*******************************************************************/
285static void player_diplstate_new(const struct player *plr1,
286 const struct player *plr2)
287{
289
290 fc_assert_ret(plr1 != nullptr);
291 fc_assert_ret(plr2 != nullptr);
292
293 const struct player_diplstate **diplstate_slot
294 = plr1->diplstates + player_index(plr2);
295
296 fc_assert_ret(*diplstate_slot == nullptr);
297
298 diplstate = fc_calloc(1, sizeof(*diplstate));
300}
301
302/*******************************************************************/
305static void player_diplstate_defaults(const struct player *plr1,
306 const struct player *plr2)
307{
308 struct player_diplstate *diplstate = player_diplstate_get(plr1, plr2);
309
310 fc_assert_ret(diplstate != nullptr);
311
312 diplstate->type = DS_NO_CONTACT;
313 diplstate->max_state = DS_NO_CONTACT;
314 diplstate->first_contact_turn = 0;
315 diplstate->turns_left = 0;
316 diplstate->has_reason_to_cancel = 0;
317 diplstate->contact_turns_left = 0;
318 diplstate->auto_cancel_turn = -1;
319}
320
321/*******************************************************************/
325 const struct player *plr2)
326{
327 fc_assert_ret_val(plr1 != nullptr, nullptr);
328 fc_assert_ret_val(plr2 != nullptr, nullptr);
329
330 const struct player_diplstate **diplstate_slot
331 = plr1->diplstates + player_index(plr2);
332
333 fc_assert_ret_val(*diplstate_slot != nullptr, nullptr);
334
335 return (struct player_diplstate *) *diplstate_slot;
336}
337
338/*******************************************************************/
341static void player_diplstate_destroy(const struct player *plr1,
342 const struct player *plr2)
343{
344 fc_assert_ret(plr1 != nullptr);
345 fc_assert_ret(plr2 != nullptr);
346
347 const struct player_diplstate **diplstate_slot
348 = plr1->diplstates + player_index(plr2);
349
350 if (*diplstate_slot != nullptr) {
351 free(player_diplstate_get(plr1, plr2));
352 }
353
354 *diplstate_slot = nullptr;
355}
356
357/*******************************************************************/
361{
362 int i;
363
364 /* Init player slots. */
366 sizeof(*player_slots.slots));
367 /* Can't use the defined functions as the needed data will be
368 * defined here. */
369 for (i = 0; i < player_slot_count(); i++) {
370 player_slots.slots[i].player = nullptr;
371 }
372 player_slots.used_slots = 0;
373}
374
375/*******************************************************************/
379{
380 return (player_slots.slots != nullptr);
381}
382
383/*******************************************************************/
387{
388 players_iterate(pplayer) {
389 player_destroy(pplayer);
391 free(player_slots.slots);
392 player_slots.slots = nullptr;
393 player_slots.used_slots = 0;
394}
395
396/*******************************************************************/
400{
401 return player_slots.slots;
402}
403
404/*******************************************************************/
408{
409 pslot++;
410
411 return (pslot < player_slots.slots + player_slot_count()
412 ? pslot : nullptr);
413}
414
415/*******************************************************************/
421{
422 return (MAX_NUM_PLAYER_SLOTS);
423}
424
425/*******************************************************************/
428int player_slot_index(const struct player_slot *pslot)
429{
430 fc_assert_ret_val(pslot != nullptr, -1);
431
432 return pslot - player_slots.slots;
433}
434
435/*******************************************************************/
439struct player *player_slot_get_player(const struct player_slot *pslot)
440{
441 fc_assert_ret_val(pslot != nullptr, nullptr);
442
443 return pslot->player;
444}
445
446/*******************************************************************/
450bool player_slot_is_used(const struct player_slot *pslot)
451{
452 fc_assert_ret_val(pslot != nullptr, FALSE);
453
454 /* No player slot available, if the game is not initialised. */
456 return FALSE;
457 }
458
459 return pslot->player != nullptr;
460}
461
462/*******************************************************************/
465struct player_slot *player_slot_by_number(int player_id)
466{
468 || !(0 <= player_id && player_id < player_slot_count())) {
469 return nullptr;
470 }
471
472 return player_slots.slots + player_id;
473}
474
475/*******************************************************************/
479{
480 int max_pslot = 0;
481
482 player_slots_iterate(pslot) {
483 if (player_slot_is_used(pslot)) {
485 }
487
488 return max_pslot;
489}
490
491/*******************************************************************/
495struct player *player_new(struct player_slot *pslot)
496{
497 struct player *pplayer;
498
500
501 if (pslot == nullptr) {
504 pslot = aslot;
505 break;
506 }
508
509 if (pslot == nullptr) {
510 return nullptr;
511 }
512 } else if (pslot->player != nullptr) {
513 return pslot->player;
514 }
515
516 /* Now create the player. */
517 log_debug("Create player for slot %d.", player_slot_index(pslot));
518 pplayer = fc_calloc(1, sizeof(*pplayer));
519 pplayer->slot = pslot;
520 pslot->player = pplayer;
521
523 sizeof(*pplayer->diplstates));
525 const struct player_diplstate **diplstate_slot
526 = pplayer->diplstates + player_slot_index(dslot);
527
528 *diplstate_slot = nullptr;
530
532 /* Create diplomatic states for all other players. */
534 /* Create diplomatic state of this player. */
535 if (aplayer != pplayer) {
537 }
539
540 /* Set default values. */
541 player_defaults(pplayer);
542
543 /* Increase number of players. */
544 player_slots.used_slots++;
545
546 return pplayer;
547}
548
549/*******************************************************************/
553static void player_defaults(struct player *pplayer)
554{
555 int i;
556
559 pplayer->unassigned_user = TRUE;
561 pplayer->unassigned_ranked = TRUE;
562 pplayer->user_turns = 0;
563 pplayer->is_male = TRUE;
564 pplayer->government = nullptr;
565 pplayer->target_government = nullptr;
566 pplayer->nation = NO_NATION_SELECTED;
567 pplayer->team = nullptr;
568 pplayer->is_ready = FALSE;
569 pplayer->nturns_idle = 0;
570 pplayer->is_alive = TRUE;
571 pplayer->turns_alive = 0;
572 pplayer->is_winner = FALSE;
573 pplayer->last_war_action = -1;
574 pplayer->phase_done = FALSE;
575
576 pplayer->revolution_finishes = -1;
577 pplayer->primary_capital_id = 0;
578
579 BV_CLR_ALL(pplayer->real_embassy);
581 /* create diplomatic states for all other players */
583 /* create diplomatic state of this player */
584 if (aplayer != pplayer) {
586 }
588
589 pplayer->style = 0;
590 pplayer->music_style = -1; /* even getting value 0 triggers change */
591 pplayer->cities = city_list_new();
592 pplayer->units = unit_list_new();
593
594 pplayer->economic.gold = 0;
598 pplayer->economic.infra_points = 0;
599
600 spaceship_init(&pplayer->spaceship);
601
602 BV_CLR_ALL(pplayer->flags);
603
604 set_as_human(pplayer);
606 pplayer->ai_common.fuzzy = 0;
607 pplayer->ai_common.expand = 100;
609 player_slots_iterate(pslot) {
610 pplayer->ai_common.love[player_slot_index(pslot)] = 1;
612 pplayer->ai_common.traits = nullptr;
613
614 pplayer->ai = nullptr;
615 pplayer->was_created = FALSE;
616 pplayer->savegame_ai_type_name = nullptr;
617 pplayer->random_name = TRUE;
618 pplayer->is_connected = FALSE;
619 pplayer->current_conn = nullptr;
620 pplayer->connections = conn_list_new();
621 pplayer->autoselect_weight = -1;
624 for (i = 0; i < B_LAST; i++) {
625 pplayer->wonders[i] = WONDER_NOT_BUILT;
626 }
627
628 pplayer->attribute_block.data = nullptr;
629 pplayer->attribute_block.length = 0;
630 pplayer->attribute_block_buffer.data = nullptr;
631 pplayer->attribute_block_buffer.length = 0;
632
633 pplayer->tile_known.vec = nullptr;
634 pplayer->tile_known.bits = 0;
635
636 pplayer->rgb = nullptr;
637
638 memset(pplayer->multipliers, 0, sizeof(pplayer->multipliers));
639
640 /* pplayer->server is initialised in
641 ./server/plrhand.c:server_player_init()
642 and pplayer->client in
643 ./client/climisc.c:client_player_init() */
644}
645
646/*******************************************************************/
650void player_set_color(struct player *pplayer,
651 const struct rgbcolor *prgbcolor)
652{
653 if (pplayer->rgb != nullptr) {
654 rgbcolor_destroy(pplayer->rgb);
655 pplayer->rgb = nullptr;
656 }
657
658 if (prgbcolor) {
659 pplayer->rgb = rgbcolor_copy(prgbcolor);
660 }
661}
662
663/*******************************************************************/
671void player_clear(struct player *pplayer, bool full)
672{
673 bool client = !is_server();
674
675 if (pplayer == nullptr) {
676 return;
677 }
678
679 if (pplayer->savegame_ai_type_name != nullptr) {
680 free(pplayer->savegame_ai_type_name);
681 pplayer->savegame_ai_type_name = nullptr;
682 }
683
684 /* Clears the attribute blocks. */
685 if (pplayer->attribute_block.data) {
686 free(pplayer->attribute_block.data);
687 pplayer->attribute_block.data = nullptr;
688 }
689 pplayer->attribute_block.length = 0;
690
691 if (pplayer->attribute_block_buffer.data) {
693 pplayer->attribute_block_buffer.data = nullptr;
694 }
695 pplayer->attribute_block_buffer.length = 0;
696
697 /* Clears units and cities. */
698 unit_list_iterate(pplayer->units, punit) {
699 /* Unload all cargos. */
702 if (client) {
703 pcargo->client.transported_by = -1;
704 }
706 /* Unload the unit. */
708 if (client) {
710 }
711
714
715 city_list_iterate(pplayer->cities, pcity) {
716 if (fc_funcs->destroy_city != nullptr) {
718 } else {
720 }
722
723 if (full) {
724 team_remove_player(pplayer);
725
727 unit_list_iterate(owner->units, owned) {
728 if (unit_nationality(owned) == pplayer) {
729 /* Switch nationality to that of current owner. */
730 owned->nationality = owner;
731 }
734
735 /* This comes last because log calls in the above functions
736 * may use it. */
737 if (pplayer->nation != nullptr) {
738 player_set_nation(pplayer, nullptr);
739 }
740 }
741}
742
743/*******************************************************************/
747void player_ruleset_close(struct player *pplayer)
748{
749 pplayer->government = nullptr;
750 pplayer->target_government = nullptr;
751 player_set_nation(pplayer, nullptr);
752 pplayer->style = nullptr;
753}
754
755/*******************************************************************/
758void player_destroy(struct player *pplayer)
759{
760 struct player_slot *pslot;
761
762 fc_assert_ret(pplayer != nullptr);
763
764 pslot = pplayer->slot;
765 fc_assert(pslot->player == pplayer);
766
767 /* Remove all that is game-dependent in the player structure. */
768 player_clear(pplayer, TRUE);
769
770 fc_assert(0 == unit_list_size(pplayer->units));
771 unit_list_destroy(pplayer->units);
772 fc_assert(0 == city_list_size(pplayer->cities));
773 city_list_destroy(pplayer->cities);
774
775 fc_assert(conn_list_size(pplayer->connections) == 0);
777
779 /* Destroy the diplomatic states of this player with others ... */
781 /* ...and of others with this player. */
782 if (aplayer != pplayer) {
784
785 /* Check if any cities of the other player have been founded
786 * by the removed player. */
788 if (pcity->original == pplayer) {
789 /* Unknown origin is better than giving baseless
790 * benefits to current owner */
791 pcity->original = nullptr;
792 }
794 }
796 free(pplayer->diplstates);
797
798 /* Clear player color. */
799 if (pplayer->rgb) {
800 rgbcolor_destroy(pplayer->rgb);
801 }
802
803 dbv_free(&pplayer->tile_known);
804
805 if (!is_server()) {
807 dbv_free(&pplayer->client.tile_vision[v]);
809 }
810
811 free(pplayer);
812 pslot->player = nullptr;
813 player_slots.used_slots--;
814}
815
816/*******************************************************************/
820{
821 return player_slots.used_slots;
822}
823
824/*******************************************************************/
831int player_index(const struct player *pplayer)
832{
833 return player_number(pplayer);
834}
835
836/*******************************************************************/
839int player_number(const struct player *pplayer)
840{
841 fc_assert_ret_val(pplayer != nullptr, -1);
842
843 return player_slot_index(pplayer->slot);
844}
845
846/*******************************************************************/
852struct player *player_by_number(const int player_id)
853{
854 struct player_slot *pslot = player_slot_by_number(player_id);
855
856 return (pslot != nullptr ? player_slot_get_player(pslot) : nullptr);
857}
858
859/*******************************************************************/
864bool player_set_nation(struct player *pplayer, struct nation_type *pnation)
865{
866 if (pplayer->nation != pnation) {
867 if (pplayer->nation) {
868 fc_assert(pplayer->nation->player == pplayer);
869 pplayer->nation->player = nullptr;
870 }
871 if (pnation) {
872 fc_assert(pnation->player == nullptr);
873 pnation->player = pplayer;
874 }
875 pplayer->nation = pnation;
876
877 return TRUE;
878 }
879
880 return FALSE;
881}
882
883/*******************************************************************/
886struct player *player_by_name(const char *name)
887{
888 players_iterate(pplayer) {
889 if (fc_strcasecmp(name, pplayer->name) == 0) {
890 return pplayer;
891 }
893
894 return nullptr;
895}
896
897/*******************************************************************/
900const char *player_name(const struct player *pplayer)
901{
902 if (!pplayer) {
903 return nullptr;
904 }
905
906 return pplayer->name;
907}
908
909/*******************************************************************/
915static const char *player_name_by_number(int i)
916{
917 struct player *pplayer;
918
919 pplayer = player_by_number(i);
920
921 return player_name(pplayer);
922}
923
924/*******************************************************************/
928 enum m_pre_result *result)
929{
930 int ind;
931
935 name, &ind);
936
937 if (*result < M_PRE_AMBIGUOUS) {
938 return player_by_number(ind);
939 } else {
940 return nullptr;
941 }
942}
943
944/*******************************************************************/
947struct player *player_by_user(const char *name)
948{
949 players_iterate(pplayer) {
950 if (fc_strcasecmp(name, pplayer->username) == 0) {
951 return pplayer;
952 }
954
955 return nullptr;
956}
957
958/*******************************************************************/
961int player_age(const struct player *pplayer)
962{
963 fc_assert_ret_val(pplayer != nullptr, 0);
964
965 return pplayer->turns_alive;
966}
967
968/*******************************************************************/
976 const struct tile *ptile)
977{
978 /* Can't see invisible units. */
979 if (!fc_funcs->player_tile_vision_get(ptile, pplayer, V_INVIS)
980 || !fc_funcs->player_tile_vision_get(ptile, pplayer, V_SUBSURFACE)) {
981 return FALSE;
982 }
983
984 /* Units within some extras may be hidden. */
985 if (!pplayers_allied(pplayer, ptile->extras_owner)) {
987 if (tile_has_extra(ptile, pextra)) {
988 return FALSE;
989 }
991 }
992
993 return TRUE;
994}
995
996/*******************************************************************/
1002 const struct tile *ptile)
1003{
1004 struct city *pcity;
1005
1006 if (!player_can_trust_tile_has_no_units(pplayer, ptile)) {
1007 /* The existence of any units at all is hidden from the player. */
1008 return FALSE;
1009 }
1010
1011 /* Can't see city units. */
1012 pcity = tile_city(ptile);
1013 if (pcity && !can_player_see_units_in_city(pplayer, pcity)
1014 && unit_list_size(ptile->units) > 0) {
1015 return FALSE;
1016 }
1017
1018 /* Can't see non-allied units in transports. */
1019 unit_list_iterate(ptile->units, punit) {
1020 if (unit_type_get(punit)->transport_capacity > 0
1021 && unit_owner(punit) != pplayer) {
1022
1023 /* An ally could transport a non ally */
1024 if (unit_list_size(punit->transporting) > 0) {
1025 return FALSE;
1026 }
1027 }
1029
1030 return TRUE;
1031}
1032
1033/*******************************************************************/
1042bool can_player_see_unit_at(const struct player *pplayer,
1043 const struct unit *punit,
1044 const struct tile *ptile,
1045 bool is_transported)
1046{
1047 struct city *pcity;
1048 bool allied;
1049 struct unit_class *pclass;
1050
1051 /* If the player can't even see the tile... */
1052 if (TILE_KNOWN_SEEN != tile_get_known(ptile, pplayer)) {
1053 return FALSE;
1054 }
1055
1056 /* Don't show non-allied units that are in transports. This is logical
1057 * because allied transports can also contain our units. Shared vision
1058 * isn't taken into account. */
1060 if (is_transported && !allied) {
1061 return FALSE;
1062 }
1063
1064 /* Units in cities may be hidden. */
1065 pcity = tile_city(ptile);
1066 if (pcity && !can_player_see_units_in_city(pplayer, pcity)) {
1067 return FALSE;
1068 }
1069
1070 /* Allied units are always seen.
1071 * See also stealth unit hiding part in map_change_seen() */
1072 if (allied) {
1073 return TRUE;
1074 }
1075
1076 /* Units within some extras may be hidden. */
1078
1079 extra_type_list_iterate(pclass->cache.hiding_extras, pextra) {
1080 if (tile_has_extra(ptile, pextra)) {
1081 return FALSE;
1082 }
1084
1085 /* Non-hiding units are always seen.
1086 * See also stealth unit hiding part in map_change_seen() */
1087 if (!is_hiding_unit(punit)) {
1088 return TRUE;
1089 }
1090
1091 /* Hiding units are only seen by the V_INVIS fog layer. */
1092 return fc_funcs->player_tile_vision_get(ptile, pplayer,
1093 unit_type_get(punit)->vlayer);
1094}
1095
1096/**********************************************************************/
1099bool can_player_see_tile(const struct player *plr,
1100 const struct tile *ptile)
1101{
1102 return plr != nullptr
1103 && ptile != nullptr
1104 && (tile_get_known(ptile, plr) == TILE_KNOWN_SEEN);
1105}
1106
1107/*******************************************************************/
1112bool can_player_see_unit(const struct player *pplayer,
1113 const struct unit *punit)
1114{
1115 return can_player_see_unit_at(pplayer, punit, unit_tile(punit),
1117}
1118
1119/*******************************************************************/
1141bool can_player_see_units_in_city(const struct player *pplayer,
1142 const struct city *pcity)
1143{
1144 return (!pplayer
1146 || pplayers_allied(pplayer, city_owner(pcity)));
1147}
1148
1149/*******************************************************************/
1157bool can_player_see_city_internals(const struct player *pplayer,
1158 const struct city *pcity)
1159{
1160 return (!pplayer || pplayer == city_owner(pcity));
1161}
1162
1163/*******************************************************************/
1173 const struct city *target_city)
1174{
1177
1179 /* City internals includes city externals. */
1180 return TRUE;
1181 }
1182
1184 /* The tile is being observed. */
1185 return TRUE;
1186 }
1187
1189
1193 /* Revealed because of the trade route. */
1194 return TRUE;
1195 }
1197 }
1198
1199 return FALSE;
1200}
1201
1202/*******************************************************************/
1211struct city *player_city_by_number(const struct player *pplayer, int city_id)
1212{
1213 /* We call idex directly. Should use game_city_by_number() instead? */
1214 struct city *pcity = idex_lookup_city(&wld, city_id);
1215
1216 if (!pcity) {
1217 return nullptr;
1218 }
1219
1220 if (!pplayer || (city_owner(pcity) == pplayer)) {
1221 /* Correct owner */
1222 return pcity;
1223 }
1224
1225 return nullptr;
1226}
1227
1228/*******************************************************************/
1237struct unit *player_unit_by_number(const struct player *pplayer, int unit_id)
1238{
1239 /* We call idex directly. Should use game_unit_by_number() instead? */
1240 struct unit *punit = idex_lookup_unit(&wld, unit_id);
1241
1242 if (!punit) {
1243 return nullptr;
1244 }
1245
1246 if (!pplayer || (unit_owner(punit) == pplayer)) {
1247 /* Correct owner */
1248 return punit;
1249 }
1250
1251 return nullptr;
1252}
1253
1254/*******************************************************************/
1257bool player_in_city_map(const struct player *pplayer,
1258 const struct tile *ptile)
1259{
1260 const struct civ_map *nmap = &(wld.map);
1261
1263 struct city *pcity = tile_city(ptile1);
1264
1265 if (pcity
1266 && (pplayer == nullptr || city_owner(pcity) == pplayer)
1268 ptile1)) {
1269 return TRUE;
1270 }
1272
1273 return FALSE;
1274}
1275
1276/*******************************************************************/
1281int num_known_tech_with_flag(const struct player *pplayer,
1282 enum tech_flag_id flag)
1283{
1284 return research_get(pplayer)->num_known_tech_with_flag[flag];
1285}
1286
1287/*******************************************************************/
1294int player_get_expected_income(const struct player *pplayer)
1295{
1296 int income = 0;
1297
1298 /* City income/expenses. */
1299 city_list_iterate(pplayer->cities, pcity) {
1300 /* Gold suplus accounts for imcome plus building and unit upkeep. */
1301 income += pcity->surplus[O_GOLD];
1302
1303 /* Gold upkeep for buildings and units is defined by the setting
1304 * 'game.info.gold_upkeep_style':
1305 * GOLD_UPKEEP_CITY: Cities pay for buildings and units (this is
1306 * included in pcity->surplus[O_GOLD]).
1307 * GOLD_UPKEEP_MIXED: Cities pay only for buildings; the nation pays
1308 * for units.
1309 * GOLD_UPKEEP_NATION: The nation pays for buildings and units. */
1310 switch (game.info.gold_upkeep_style) {
1311 case GOLD_UPKEEP_CITY:
1312 break;
1313 case GOLD_UPKEEP_NATION:
1314 /* Nation pays for buildings (and units). */
1316 fc__fallthrough; /* No break. */
1317 case GOLD_UPKEEP_MIXED:
1318 /* Nation pays for units. */
1320 break;
1321 }
1322
1323 /* Capitalization income. */
1325 income += pcity->shield_stock + pcity->surplus[O_SHIELD];
1326 }
1328
1329 return income;
1330}
1331
1332/*******************************************************************/
1336bool player_knows_techs_with_flag(const struct player *pplayer,
1337 enum tech_flag_id flag)
1338{
1339 return num_known_tech_with_flag(pplayer, flag) > 0;
1340}
1341
1342/*******************************************************************/
1345struct city *player_primary_capital(const struct player *pplayer)
1346{
1347 struct city *capital;
1348
1349 if (!pplayer) {
1350 /* The client depends on this behavior in some places. */
1351 return nullptr;
1352 }
1353
1355
1356 return capital;
1357}
1358
1359/*******************************************************************/
1362const char *love_text(const int love)
1363{
1364 if (love <= - MAX_AI_LOVE * 90 / 100) {
1365 /* TRANS: These words should be adjectives which can fit in the sentence
1366 "The x are y towards us"
1367 "The Babylonians are respectful towards us" */
1368 return Q_("?attitude:Genocidal");
1369 } else if (love <= - MAX_AI_LOVE * 70 / 100) {
1370 return Q_("?attitude:Belligerent");
1371 } else if (love <= - MAX_AI_LOVE * 50 / 100) {
1372 return Q_("?attitude:Hostile");
1373 } else if (love <= - MAX_AI_LOVE * 25 / 100) {
1374 return Q_("?attitude:Uncooperative");
1375 } else if (love <= - MAX_AI_LOVE * 10 / 100) {
1376 return Q_("?attitude:Uneasy");
1377 } else if (love <= MAX_AI_LOVE * 10 / 100) {
1378 return Q_("?attitude:Neutral");
1379 } else if (love <= MAX_AI_LOVE * 25 / 100) {
1380 return Q_("?attitude:Respectful");
1381 } else if (love <= MAX_AI_LOVE * 50 / 100) {
1382 return Q_("?attitude:Helpful");
1383 } else if (love <= MAX_AI_LOVE * 70 / 100) {
1384 return Q_("?attitude:Enthusiastic");
1385 } else if (love <= MAX_AI_LOVE * 90 / 100) {
1386 return Q_("?attitude:Admiring");
1387 } else {
1388 fc_assert(love > MAX_AI_LOVE * 90 / 100);
1389 return Q_("?attitude:Worshipful");
1390 }
1391}
1392
1393/*******************************************************************/
1396bool pplayers_at_war(const struct player *pplayer,
1397 const struct player *pplayer2)
1398{
1399 enum diplstate_type ds;
1400
1401 if (pplayer == nullptr || pplayer2 == nullptr) {
1402 return TRUE;
1403 }
1404
1405 if (pplayer == pplayer2) {
1406 return FALSE;
1407 }
1408
1409 ds = player_diplstate_get(pplayer, pplayer2)->type;
1410
1411 return ds == DS_WAR || ds == DS_NO_CONTACT;
1412}
1413
1414/*******************************************************************/
1417bool pplayers_allied(const struct player *pplayer,
1418 const struct player *pplayer2)
1419{
1420 enum diplstate_type ds;
1421
1422 if (!pplayer || !pplayer2) {
1423 return FALSE;
1424 }
1425
1426 if (pplayer == pplayer2) {
1427 return TRUE;
1428 }
1429
1430 ds = player_diplstate_get(pplayer, pplayer2)->type;
1431
1432 return (ds == DS_ALLIANCE || ds == DS_TEAM);
1433}
1434
1435/*******************************************************************/
1438bool pplayers_in_peace(const struct player *pplayer,
1439 const struct player *pplayer2)
1440{
1442
1443 if (pplayer == pplayer2) {
1444 return TRUE;
1445 }
1446
1447 return (ds == DS_PEACE || ds == DS_ALLIANCE
1448 || ds == DS_ARMISTICE || ds == DS_TEAM);
1449}
1450
1451/*******************************************************************/
1455 const struct player *pplayer2)
1456{
1457 if (pplayer1 == pplayer2 || !pplayer1 || !pplayer2) {
1458 return FALSE;
1459 }
1460
1461 /* Movement during armistice is allowed so that player can withdraw
1462 units deeper inside opponent territory. */
1463
1465}
1466
1467/*******************************************************************/
1471bool pplayers_non_attack(const struct player *pplayer,
1472 const struct player *pplayer2)
1473{
1474 enum diplstate_type ds;
1475
1476 if (pplayer == pplayer2) {
1477 return FALSE;
1478 }
1479
1480 ds = player_diplstate_get(pplayer, pplayer2)->type;
1481
1482 return (ds == DS_PEACE || ds == DS_CEASEFIRE || ds == DS_ARMISTICE);
1483}
1484
1485/*******************************************************************/
1489 const struct player *pplayer2)
1490{
1491 return pplayer1->team == pplayer2->team;
1492}
1493
1494/*******************************************************************/
1497bool gives_shared_vision(const struct player *me, const struct player *them)
1498{
1499 return BV_ISSET(me->gives_shared_vision, player_index(them));
1500}
1501
1502/*******************************************************************/
1505bool gives_shared_tiles(const struct player *me, const struct player *them)
1506{
1507 return BV_ISSET(me->gives_shared_tiles, player_index(them));
1508}
1509
1510/*******************************************************************/
1514 const struct player_diplstate *pds2)
1515{
1516 return (pds1->type == pds2->type && pds1->turns_left == pds2->turns_left
1517 && pds1->has_reason_to_cancel == pds2->has_reason_to_cancel
1518 && pds1->contact_turns_left == pds2->contact_turns_left);
1519}
1520
1521/*******************************************************************/
1525 const struct player *player2,
1526 int diplrel)
1527{
1528 fc_assert(player1 != nullptr);
1529 fc_assert(player2 != nullptr);
1530
1531 /* No relationship to it self. */
1532 if (player1 == player2 && diplrel != DRO_FOREIGN) {
1533 return FALSE;
1534 }
1535
1536 if (diplrel < DS_LAST) {
1537 return player_diplstate_get(player1, player2)->type == diplrel;
1538 }
1539
1540 switch (diplrel) {
1545 case DRO_HOSTS_EMBASSY:
1548 return team_has_embassy(player2->team, player1);
1549 case DRO_HAS_EMBASSY:
1552 return team_has_embassy(player1->team, player2);
1561 case DRO_FOREIGN:
1562 return player1 != player2;
1563 }
1564
1565 fc_assert_msg(FALSE, "diplrel_between(): invalid diplrel number %d.",
1566 diplrel);
1567
1568 return FALSE;
1569}
1570
1571/*******************************************************************/
1574bool is_diplrel_to_other(const struct player *pplayer, int diplrel)
1575{
1576 fc_assert(pplayer != nullptr);
1577
1579 if (oplayer == pplayer) {
1580 continue;
1581 }
1582 if (is_diplrel_between(pplayer, oplayer, diplrel)) {
1583 return TRUE;
1584 }
1586 return FALSE;
1587}
1588
1589/*******************************************************************/
1593int diplrel_by_rule_name(const char *value)
1594{
1595 /* Look for asymmetric diplomatic relations */
1596 int diplrel = diplrel_other_by_name(value, fc_strcasecmp);
1597
1598 if (diplrel != diplrel_other_invalid()) {
1599 return diplrel;
1600 }
1601
1602 /* Look for symmetric diplomatic relations */
1603 diplrel = diplstate_type_by_name(value, fc_strcasecmp);
1604
1605 /*
1606 * Make sure DS_LAST isn't returned as DS_LAST is the first diplrel_other.
1607 *
1608 * Can't happend now. This is in case that changes in the future. */
1610
1611 /*
1612 * Make sure that diplrel_other_invalid() is returned.
1613 *
1614 * Can't happen now. At the moment dpilrel_asym_invalid() is the same as
1615 * diplstate_type_invalid(). This is in case that changes in the future.
1616 */
1617 if (diplrel != diplstate_type_invalid()) {
1618 return diplrel;
1619 }
1620
1621 return diplrel_other_invalid();
1622}
1623
1624/*******************************************************************/
1627const char *diplrel_rule_name(int value)
1628{
1629 if (value < DS_LAST) {
1630 return diplstate_type_name(value);
1631 } else {
1632 return diplrel_other_name(value);
1633 }
1634}
1635
1636/*******************************************************************/
1639const char *diplrel_name_translation(int value)
1640{
1641 if (value < DS_LAST) {
1642 return diplstate_type_translated_name(value);
1643 } else {
1644 return _(diplrel_other_name(value));
1645 }
1646}
1647
1648/**************************************************************************
1649 Return the Casus Belli range when offender performs paction to tgt_plr
1650 at tgt_tile and the outcome is outcome.
1651**************************************************************************/
1653 const struct unit_type *off_ut,
1654 const struct player *tgt_plr,
1655 const enum effect_type outcome,
1656 const struct action *paction,
1657 const struct tile *tgt_tile)
1658{
1660
1661 /* The victim gets a casus belli if CASUS_BELLI_VICTIM or above. Everyone
1662 * gets a casus belli if CASUS_BELLI_OUTRAGE or above. */
1665 &(const struct req_context) {
1666 .player = offender,
1667 .city = tile_city(tgt_tile),
1668 .tile = tgt_tile,
1669 .unittype = off_ut,
1670 .action = paction,
1671 },
1672 &(const struct req_context) {
1673 .player = tgt_plr,
1674 },
1675 outcome);
1676
1678 /* International outrage: This isn't just between the offender and the
1679 * victim. */
1681 }
1682
1684 /* In this situation the specified action provides a casus belli
1685 * against the actor. */
1686 return CBR_VICTIM_ONLY;
1687 }
1688
1689 return CBR_NONE;
1690}
1691
1692/* The number of mutually exclusive requirement sets that
1693 * diplrel_mess_gen() creates for the DiplRel requirement type. */
1694#define DIPLREL_MESS_SIZE (3 + (DRO_LAST * (5 + 4 + 3 + 2 + 1)))
1695
1696/*******************************************************************/
1705{
1706 /* The ranges supported by the DiplRel requiremnt type. */
1707 const enum req_range legal_ranges[] = {
1713 };
1714
1715 /* Iterators. */
1716 int rel;
1717 int i;
1718 int j;
1719
1720 /* Storage for the mutually exclusive requirement sets. */
1722 * sizeof(bv_diplrel_all_reqs));
1723
1724 /* Position in mess. */
1725 int mess_pos = 0;
1726
1727 /* The first mutually exclusive set is about local diplstate. */
1729
1730 /* It is not possible to have more than one diplstate to a nation. */
1745
1746 /* It is not possible to have a diplstate to your self. */
1749
1750 mess_pos++;
1751
1752 /* Having a real embassy excludes not having an embassy. */
1754
1757 TRUE));
1760 FALSE));
1761
1762 mess_pos++;
1763
1764 /* Hosting a real embassy excludes not hosting an embassy. */
1766
1769 TRUE));
1772 FALSE));
1773
1774 mess_pos++;
1775
1776 /* Loop over diplstate_type and diplrel_other. */
1777 for (rel = 0; rel < DRO_LAST; rel++) {
1778 /* The presence of a DiplRel at a more local range proves that it can't
1779 * be absent in a more global range. (The alliance range includes the
1780 * Team range) */
1781 for (i = 0; i < 5; i++) {
1782 for (j = i; j < 5; j++) {
1784
1789
1790 mess_pos++;
1791 }
1792 }
1793 }
1794
1795 /* No uninitialized element exists. */
1797
1798 return mess;
1799}
1800
1801/* An array of mutually exclusive requirement sets for the DiplRel
1802 * requirement type. Is initialized the first time diplrel_mess_get() is
1803 * called. */
1805
1806/*******************************************************************/
1810{
1811 if (diplrel_mess == nullptr) {
1812 /* This is the first call. Initialize diplrel_mess. */
1814 }
1815
1816 return diplrel_mess;
1817}
1818
1819/*******************************************************************/
1823{
1824 if (diplrel_mess != nullptr) {
1826 diplrel_mess = nullptr;
1827 }
1828}
1829
1830/*******************************************************************/
1838{
1839 int diplrel_req_num;
1841 bv_diplrel_all_reqs known;
1842 int set;
1843
1844 /* Nothing is known to contradict the requirement yet. */
1845 BV_CLR_ALL(known);
1846
1847 if (!(req->source.kind == VUT_DIPLREL
1848 || req->source.kind == VUT_DIPLREL_TILE
1849 || req->source.kind == VUT_DIPLREL_TILE_O
1851 || req->source.kind == VUT_DIPLREL_UNITANY_O)) {
1852 /* No known contradiction of a requirement of any other kind. */
1854 || req->source.kind == VUT_DIPLREL_TILE
1855 || req->source.kind == VUT_DIPLREL_TILE_O
1857 || req->source.kind == VUT_DIPLREL_UNITANY_O);
1858
1859 return known;
1860 }
1861
1862 /* Convert the requirement to its position in the enumeration of all
1863 * DiplRel requirements. */
1865 req->range, req->present);
1866
1867 /* Get the mutually exclusive requirement sets for DiplRel. */
1869
1870 /* Add all known contradictions. */
1871 for (set = 0; set < DIPLREL_MESS_SIZE; set++) {
1872 if (BV_ISSET(mess[set], diplrel_req_num)) {
1873 /* The requirement req is mentioned in the set. It is therefore known
1874 * that all other requirements in the set contradicts it. They should
1875 * therefore be added to the known contradictions. */
1876 BV_SET_ALL_FROM(known, mess[set]);
1877 }
1878 }
1879
1880 /* The requirement isn't self contradicting. It was set by the mutually
1881 * exclusive requirement sets that mentioned it. Remove it. */
1882 BV_CLR(known, diplrel_req_num);
1883
1884 return known;
1885}
1886
1887/*******************************************************************/
1892int player_in_territory(const struct player *pplayer,
1893 const struct player *pplayer2)
1894{
1895 int in_territory = 0;
1896
1897 /* This algorithm should work at server or client. It only returns the
1898 * number of visible units (a unit can potentially hide inside the
1899 * transport of a different player).
1900 *
1901 * Note this may be quite slow. An even slower alternative is to iterate
1902 * over the entire map, checking all units inside the player's territory
1903 * to see if they're owned by the enemy. */
1905 /* Get the owner of the tile/territory. */
1907
1908 if (owner == pplayer && can_player_see_unit(pplayer, punit)) {
1909 /* Found one! */
1910 in_territory++;
1911 }
1913
1914 return in_territory;
1915}
1916
1917/*******************************************************************/
1922bool is_valid_username(const char *name)
1923{
1924 return (strlen(name) > 0
1925 && !fc_isdigit(name[0])
1928}
1929
1930/*******************************************************************/
1933bool is_settable_ai_level(enum ai_level level)
1934{
1935 if (level == AI_LEVEL_AWAY) {
1936 /* Cannot set away level for AI */
1937 return FALSE;
1938 }
1939
1940 return TRUE;
1941}
1942
1943/*******************************************************************/
1947{
1948 return AI_LEVEL_COUNT - 1; /* AI_LEVEL_AWAY is not real AI */
1949}
1950
1951/*******************************************************************/
1954void *player_ai_data(const struct player *pplayer, const struct ai_type *ai)
1955{
1956 return pplayer->server.ais[ai_type_number(ai)];
1957}
1958
1959/*******************************************************************/
1962void player_set_ai_data(struct player *pplayer, const struct ai_type *ai,
1963 void *data)
1964{
1965 pplayer->server.ais[ai_type_number(ai)] = data;
1966}
1967
1968/*******************************************************************/
1972int player_multiplier_value(const struct player *pplayer,
1973 const struct multiplier *pmul)
1974{
1975 return pplayer->multipliers[multiplier_index(pmul)].value;
1976}
1977
1978/*******************************************************************/
1983int player_multiplier_effect_value(const struct player *pplayer,
1984 const struct multiplier *pmul)
1985{
1986 return (player_multiplier_value(pplayer, pmul) + pmul->offset)
1987 * pmul->factor;
1988}
1989
1990/*******************************************************************/
1995int player_multiplier_target_value(const struct player *pplayer,
1996 const struct multiplier *pmul)
1997{
1998 return pplayer->multipliers[multiplier_index(pmul)].target;
1999}
2000
2001/*******************************************************************/
2004bool player_has_flag(const struct player *pplayer, enum plr_flag_id flag)
2005{
2006 return BV_ISSET(pplayer->flags, flag);
2007}
2008
2009/*******************************************************************/
2012bool player_has_state(const struct player *pplayer,
2013 enum plrstate_type state)
2014{
2015 switch (state) {
2016 case PLRS_BARBARIAN:
2017 return is_barbarian(pplayer);
2018 case PLRS_HAS_CAPITAL:
2019 return player_primary_capital(pplayer) != nullptr;
2020 case PLRS_LAST:
2021 fc_assert(state != PLRS_LAST);
2022 break;
2023 }
2024
2026 return FALSE;
2027}
2028
2029/*******************************************************************/
2037 enum action_result result)
2038{
2041 penabler) {
2042 struct universal u[2] = {
2043 {.kind = VUT_GOVERNMENT, .value = {.govern = (pplayer->government)}},
2044 {.kind = VUT_MINCITIES, .value = {.min_cities = (city_list_size(pplayer->cities))}},
2045 };
2046
2047 if (!universals_mean_unfulfilled(&(penabler->actor_reqs), u, 2)) {
2048 return TRUE;
2049 }
2052
2053 return FALSE;
2054}
struct action_enabler_list * action_enablers_for_action(action_id action)
Definition actions.c:1580
#define action_by_result_iterate(_paction_, _result_)
Definition actions.h:245
#define action_enabler_list_iterate_end
Definition actions.h:194
#define action_by_result_iterate_end
Definition actions.h:249
#define action_enabler_list_iterate(action_enabler_list, aenabler)
Definition actions.h:192
#define action_id(_act_)
Definition actions.h:426
int ai_type_number(const struct ai_type *ai)
Definition ai.c:278
void dbv_free(struct dbv *pdbv)
Definition bitvector.c:95
#define BV_SET_ALL_FROM(vec_to, vec_from)
Definition bitvector.h:128
#define BV_CLR_ALL(bv)
Definition bitvector.h:103
#define BV_SET(bv, bit)
Definition bitvector.h:89
#define BV_ISSET(bv, bit)
Definition bitvector.h:86
#define BV_CLR(bv, bit)
Definition bitvector.h:94
bool city_production_has_flag(const struct city *pcity, enum impr_flag_id flag)
Definition city.c:727
int city_map_radius_sq_get(const struct city *pcity)
Definition city.c:137
int city_total_unit_gold_upkeep(const struct city *pcity)
Definition city.c:1222
int city_total_impr_gold_upkeep(const struct city *pcity)
Definition city.c:1201
#define city_list_iterate(citylist, pcity)
Definition city.h:508
#define city_tile(_pcity_)
Definition city.h:564
#define CITY_MAP_MAX_RADIUS_SQ
Definition city.h:84
#define city_owner(_pcity_)
Definition city.h:563
#define city_list_iterate_end
Definition city.h:510
#define city_tile_iterate(_nmap, _radius_sq, _city_tile, _tile)
Definition city.h:228
#define city_tile_iterate_end
Definition city.h:236
struct civclient client
char * incite_cost
Definition comments.c:76
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 unit struct city struct unit struct tile struct extra_type const struct act_prob *act_probs int actor_unit_id struct unit struct unit int const struct action *paction struct unit struct city * pcity
Definition dialogs_g.h:78
struct unit struct city * target_city
Definition dialogs_g.h:56
int get_target_bonus_effects(struct effect_list *plist, const struct req_context *context, const struct req_context *other_context, enum effect_type effect_type)
Definition effects.c:744
int get_player_bonus(const struct player *pplayer, enum effect_type effect_type)
Definition effects.c:824
struct extra_type_list * extra_type_list_of_unit_hiders(void)
Definition extras.c:259
#define extra_type_list_iterate(extralist, pextra)
Definition extras.h:165
#define extra_type_list_iterate_end
Definition extras.h:167
const struct functions * fc_funcs
static bool is_server(void)
#define CASUS_BELLI_OUTRAGE
Definition fc_types.h:342
#define MAX_NUM_PLAYER_SLOTS
Definition fc_types.h:32
#define CASUS_BELLI_VICTIM
Definition fc_types.h:336
#define MAX_LEN_NAME
Definition fc_types.h:67
@ O_SHIELD
Definition fc_types.h:102
@ O_GOLD
Definition fc_types.h:102
#define Q_(String)
Definition fcintl.h:70
#define _(String)
Definition fcintl.h:67
struct civ_game game
Definition game.c:62
struct world wld
Definition game.c:63
void game_remove_unit(struct world *gworld, struct unit *punit)
Definition game.c:124
void game_remove_city(struct world *gworld, struct city *pcity)
Definition game.c:185
struct city * owner
Definition citydlg.c:226
GType type
Definition repodlgs.c:1313
struct city * idex_lookup_city(const struct world *iworld, int id)
Definition idex.c:133
struct unit * idex_lookup_unit(const struct world *iworld, int id)
Definition idex.c:146
#define WONDER_NOT_BUILT
#define B_LAST
Definition improvement.h:42
const char * name
Definition inputfile.c:127
#define fc_assert_msg(condition, message,...)
Definition log.h:182
#define fc_assert_ret(condition)
Definition log.h:192
#define fc_assert(condition)
Definition log.h:177
#define fc_assert_ret_val(condition, val)
Definition log.h:195
#define log_debug(message,...)
Definition log.h:116
int sq_map_distance(const struct tile *tile0, const struct tile *tile1)
Definition map.c:686
#define fc_calloc(n, esz)
Definition mem.h:38
#define fc_malloc(sz)
Definition mem.h:34
Multiplier_type_id multiplier_index(const struct multiplier *pmul)
Definition multipliers.c:80
#define NO_NATION_SELECTED
Definition nation.h:30
bool is_settable_ai_level(enum ai_level level)
Definition player.c:1933
bool are_diplstates_equal(const struct player_diplstate *pds1, const struct player_diplstate *pds2)
Definition player.c:1513
bool player_can_invade_tile(const struct player *pplayer, const struct tile *ptile)
Definition player.c:270
bool player_knows_techs_with_flag(const struct player *pplayer, enum tech_flag_id flag)
Definition player.c:1336
int player_multiplier_effect_value(const struct player *pplayer, const struct multiplier *pmul)
Definition player.c:1983
void * player_ai_data(const struct player *pplayer, const struct ai_type *ai)
Definition player.c:1954
bool player_has_state(const struct player *pplayer, enum plrstate_type state)
Definition player.c:2012
bool player_slot_is_used(const struct player_slot *pslot)
Definition player.c:450
bv_diplrel_all_reqs diplrel_req_contradicts(const struct requirement *req)
Definition player.c:1837
static bv_diplrel_all_reqs * diplrel_mess_get(void)
Definition player.c:1809
int num_known_tech_with_flag(const struct player *pplayer, enum tech_flag_id flag)
Definition player.c:1281
bool is_valid_username(const char *name)
Definition player.c:1922
static void player_diplstate_new(const struct player *plr1, const struct player *plr2)
Definition player.c:285
int player_multiplier_target_value(const struct player *pplayer, const struct multiplier *pmul)
Definition player.c:1995
bool can_player_see_tile(const struct player *plr, const struct tile *ptile)
Definition player.c:1099
struct unit * player_unit_by_number(const struct player *pplayer, int unit_id)
Definition player.c:1237
static bv_diplrel_all_reqs * diplrel_mess
Definition player.c:1804
struct player * player_by_name_prefix(const char *name, enum m_pre_result *result)
Definition player.c:927
int diplrel_by_rule_name(const char *value)
Definition player.c:1593
struct player * player_new(struct player_slot *pslot)
Definition player.c:495
struct player * player_by_number(const int player_id)
Definition player.c:852
bool player_in_city_map(const struct player *pplayer, const struct tile *ptile)
Definition player.c:1257
bool players_on_same_team(const struct player *pplayer1, const struct player *pplayer2)
Definition player.c:1488
static bv_diplrel_all_reqs * diplrel_mess_gen(void)
Definition player.c:1704
int used_slots
Definition player.c:52
bool can_player_see_unit_at(const struct player *pplayer, const struct unit *punit, const struct tile *ptile, bool is_transported)
Definition player.c:1042
int player_count(void)
Definition player.c:819
enum diplstate_type cancel_pact_result(enum diplstate_type oldstate)
Definition player.c:68
int player_slot_count(void)
Definition player.c:420
struct player_slot * player_slot_by_number(int player_id)
Definition player.c:465
int player_multiplier_value(const struct player *pplayer, const struct multiplier *pmul)
Definition player.c:1972
int player_get_expected_income(const struct player *pplayer)
Definition player.c:1294
int player_number(const struct player *pplayer)
Definition player.c:839
enum dipl_reason pplayer_can_make_treaty(const struct player *p1, const struct player *p2, enum diplstate_type treaty)
Definition player.c:159
const char * player_name(const struct player *pplayer)
Definition player.c:900
static void player_diplstate_defaults(const struct player *plr1, const struct player *plr2)
Definition player.c:305
void player_slots_free(void)
Definition player.c:386
bool is_diplrel_to_other(const struct player *pplayer, int diplrel)
Definition player.c:1574
int player_slot_max_used_number(void)
Definition player.c:478
static bool is_valid_alliance(const struct player *p1, const struct player *p2)
Definition player.c:132
bool can_player_see_unit(const struct player *pplayer, const struct unit *punit)
Definition player.c:1112
bool pplayers_at_war(const struct player *pplayer, const struct player *pplayer2)
Definition player.c:1396
void player_set_ai_data(struct player *pplayer, const struct ai_type *ai, void *data)
Definition player.c:1962
static void player_diplstate_destroy(const struct player *plr1, const struct player *plr2)
Definition player.c:341
void player_ruleset_close(struct player *pplayer)
Definition player.c:747
void player_clear(struct player *pplayer, bool full)
Definition player.c:671
int player_slot_index(const struct player_slot *pslot)
Definition player.c:428
struct player * player_by_name(const char *name)
Definition player.c:886
void player_slots_init(void)
Definition player.c:360
bool player_has_flag(const struct player *pplayer, enum plr_flag_id flag)
Definition player.c:2004
bool player_has_real_embassy(const struct player *pplayer, const struct player *pplayer2)
Definition player.c:240
bool team_has_embassy(const struct team *pteam, const struct player *tgt_player)
Definition player.c:220
void player_set_color(struct player *pplayer, const struct rgbcolor *prgbcolor)
Definition player.c:650
struct city * player_city_by_number(const struct player *pplayer, int city_id)
Definition player.c:1211
struct city * player_primary_capital(const struct player *pplayer)
Definition player.c:1345
int player_index(const struct player *pplayer)
Definition player.c:831
int player_in_territory(const struct player *pplayer, const struct player *pplayer2)
Definition player.c:1892
struct player * player_by_user(const char *name)
Definition player.c:947
const char * diplrel_name_translation(int value)
Definition player.c:1639
bool is_diplrel_between(const struct player *player1, const struct player *player2, int diplrel)
Definition player.c:1524
bool player_set_nation(struct player *pplayer, struct nation_type *pnation)
Definition player.c:864
#define DIPLREL_MESS_SIZE
Definition player.c:1694
bool player_can_see_city_externals(const struct player *pow_player, const struct city *target_city)
Definition player.c:1172
int player_age(const struct player *pplayer)
Definition player.c:961
enum dipl_reason pplayer_can_cancel_treaty(const struct player *p1, const struct player *p2)
Definition player.c:98
struct player_diplstate * player_diplstate_get(const struct player *plr1, const struct player *plr2)
Definition player.c:324
int number_of_ai_levels(void)
Definition player.c:1946
static struct @72 player_slots
bool pplayers_allied(const struct player *pplayer, const struct player *pplayer2)
Definition player.c:1417
static void player_defaults(struct player *pplayer)
Definition player.c:553
bool can_player_see_hypotetic_units_at(const struct player *pplayer, const struct tile *ptile)
Definition player.c:1001
struct player_slot * slots
Definition player.c:51
bool player_has_embassy_from_effect(const struct player *pplayer, const struct player *pplayer2)
Definition player.c:250
void diplrel_mess_close(void)
Definition player.c:1822
bool players_non_invade(const struct player *pplayer1, const struct player *pplayer2)
Definition player.c:1454
bool player_can_do_action_result(struct player *pplayer, enum action_result result)
Definition player.c:2036
bool pplayers_non_attack(const struct player *pplayer, const struct player *pplayer2)
Definition player.c:1471
bool can_player_see_units_in_city(const struct player *pplayer, const struct city *pcity)
Definition player.c:1141
struct player * player_slot_get_player(const struct player_slot *pslot)
Definition player.c:439
static const char * player_name_by_number(int i)
Definition player.c:915
bool can_player_see_city_internals(const struct player *pplayer, const struct city *pcity)
Definition player.c:1157
struct player_slot * player_slot_next(struct player_slot *pslot)
Definition player.c:407
bool player_can_trust_tile_has_no_units(const struct player *pplayer, const struct tile *ptile)
Definition player.c:975
bool player_slots_initialised(void)
Definition player.c:378
const char * love_text(const int love)
Definition player.c:1362
bool gives_shared_tiles(const struct player *me, const struct player *them)
Definition player.c:1505
bool player_has_embassy(const struct player *pplayer, const struct player *pplayer2)
Definition player.c:208
enum casus_belli_range casus_belli_range_for(const struct player *offender, const struct unit_type *off_ut, const struct player *tgt_plr, const enum effect_type outcome, const struct action *paction, const struct tile *tgt_tile)
Definition player.c:1652
const char * diplrel_rule_name(int value)
Definition player.c:1627
bool gives_shared_vision(const struct player *me, const struct player *them)
Definition player.c:1497
bool player_owns_city(const struct player *pplayer, const struct city *pcity)
Definition player.c:261
struct player_slot * player_slot_first(void)
Definition player.c:399
void player_destroy(struct player *pplayer)
Definition player.c:758
bool pplayers_in_peace(const struct player *pplayer, const struct player *pplayer2)
Definition player.c:1438
#define players_iterate_end
Definition player.h:542
dipl_reason
Definition player.h:192
@ DIPL_SENATE_BLOCKING
Definition player.h:193
@ DIPL_ALLIANCE_PROBLEM_THEM
Definition player.h:194
@ DIPL_ALLIANCE_PROBLEM_US
Definition player.h:194
@ DIPL_OK
Definition player.h:193
@ DIPL_ERROR
Definition player.h:193
#define players_iterate(_pplayer)
Definition player.h:537
#define player_list_iterate(playerlist, pplayer)
Definition player.h:560
#define MAX_AI_LOVE
Definition player.h:566
#define ANON_USER_NAME
Definition player.h:48
static bool is_barbarian(const struct player *pplayer)
Definition player.h:491
#define player_slots_iterate(_pslot)
Definition player.h:528
#define player_list_iterate_end
Definition player.h:562
#define PLAYER_DEFAULT_SCIENCE_RATE
Definition player.h:40
#define set_as_human(plr)
Definition player.h:233
#define players_iterate_alive_end
Definition player.h:552
#define player_slots_iterate_end
Definition player.h:532
#define ANON_PLAYER_NAME
Definition player.h:43
#define PLAYER_DEFAULT_TAX_RATE
Definition player.h:39
#define PLAYER_DEFAULT_LUXURY_RATE
Definition player.h:41
#define players_iterate_alive(_pplayer)
Definition player.h:547
bool universals_mean_unfulfilled(struct requirement_vector *reqs, struct universal *unis, size_t n_unis)
#define requirement_diplrel_ereq(_id_, _range_, _present_)
struct research * research_get(const struct player *pplayer)
Definition research.c:130
void rgbcolor_destroy(struct rgbcolor *prgbcolor)
Definition rgbcolor.c:74
struct rgbcolor * rgbcolor_copy(const struct rgbcolor *prgbcolor)
Definition rgbcolor.c:51
struct setting_list * level[OLEVELS_NUM]
Definition settings.c:190
enum m_pre_result match_prefix(m_pre_accessor_fn_t accessor_fn, size_t n_names, size_t max_len_name, m_pre_strncmp_fn_t cmp_fn, m_strlen_fn_t len_fn, const char *prefix, int *ind_result)
Definition shared.c:1583
bool is_ascii_name(const char *name)
Definition shared.c:286
m_pre_result
Definition shared.h:213
@ M_PRE_AMBIGUOUS
Definition shared.h:216
void spaceship_init(struct player_spaceship *ship)
Definition spaceship.c:96
Definition ai.h:50
Definition city.h:318
enum capital_type capital
Definition city.h:326
struct tile * tile
Definition city.h:320
struct packet_game_info info
Definition game.h:89
int bits
Definition bitvector.h:33
unsigned char * vec
Definition bitvector.h:34
bool(* player_tile_vision_get)(const struct tile *ptile, const struct player *pplayer, enum vision_layer vision)
void(* destroy_city)(struct city *pcity)
struct player * player
Definition nation.h:118
enum gold_upkeep_style gold_upkeep_style
enum ai_level skill_level
Definition player.h:116
struct ai_trait * traits
Definition player.h:126
enum barbarian_type barbarian_type
Definition player.h:122
int love[MAX_NUM_PLAYER_SLOTS]
Definition player.h:124
int expand
Definition player.h:118
int fuzzy
Definition player.h:117
enum diplstate_type type
Definition player.h:199
char has_reason_to_cancel
Definition player.h:203
int infra_points
Definition player.h:67
struct player * player
Definition player.c:47
struct city_list * cities
Definition player.h:281
bool random_name
Definition player.h:295
struct player_ai ai_common
Definition player.h:288
bv_plr_flags flags
Definition player.h:292
struct dbv tile_vision[V_COUNT]
Definition player.h:359
int primary_capital_id
Definition player.h:275
bool is_male
Definition player.h:257
int wonders[B_LAST]
Definition player.h:305
const struct player_diplstate ** diplstates
Definition player.h:278
bool unassigned_ranked
Definition player.h:255
struct government * target_government
Definition player.h:259
int autoselect_weight
Definition player.h:299
char username[MAX_LEN_NAME]
Definition player.h:252
bool is_winner
Definition player.h:269
bool is_connected
Definition player.h:296
int revolution_finishes
Definition player.h:273
void * ais[FREECIV_AI_MOD_LAST]
Definition player.h:336
int nturns_idle
Definition player.h:265
struct government * government
Definition player.h:258
struct dbv tile_known
Definition player.h:310
struct connection * current_conn
Definition player.h:297
struct team * team
Definition player.h:261
char * savegame_ai_type_name
Definition player.h:290
int turns_alive
Definition player.h:266
bool was_created
Definition player.h:294
const struct ai_type * ai
Definition player.h:289
struct unit_list * units
Definition player.h:282
char ranked_username[MAX_LEN_NAME]
Definition player.h:254
struct conn_list * connections
Definition player.h:298
bool is_alive
Definition player.h:268
bv_player real_embassy
Definition player.h:277
struct player::@73::@75 server
struct player_economic economic
Definition player.h:284
struct player_spaceship spaceship
Definition player.h:286
struct attribute_block_s attribute_block
Definition player.h:307
char name[MAX_LEN_NAME]
Definition player.h:251
bv_player gives_shared_vision
Definition player.h:302
struct attribute_block_s attribute_block_buffer
Definition player.h:308
struct multiplier_value multipliers[MAX_NUM_MULTIPLIERS]
Definition player.h:314
struct nation_type * nation
Definition player.h:260
int music_style
Definition player.h:280
struct nation_style * style
Definition player.h:279
bool phase_done
Definition player.h:263
struct player_slot * slot
Definition player.h:250
bv_player gives_shared_tiles
Definition player.h:304
bool is_ready
Definition player.h:262
int user_turns
Definition player.h:256
int last_war_action
Definition player.h:270
struct player::@73::@76 client
struct rgbcolor * rgb
Definition player.h:312
bool unassigned_user
Definition player.h:253
enum req_range range
struct universal source
int num_known_tech_with_flag[TF_COUNT]
Definition research.h:88
Definition team.c:40
Definition tile.h:50
struct unit_list * units
Definition tile.h:58
struct player * extras_owner
Definition tile.h:63
Definition unit.h:140
struct unit_list * transporting
Definition unit.h:187
struct unit::@84::@86 client
int transported_by
Definition unit.h:219
enum universals_n kind
Definition fc_types.h:593
universals_u value
Definition fc_types.h:592
struct civ_map map
int fc_strcasecmp(const char *str0, const char *str1)
Definition support.c:186
bool fc_isdigit(char c)
Definition support.c:1218
int fc_strncasequotecmp(const char *str0, const char *str1, size_t n)
Definition support.c:377
size_t effectivestrlenquote(const char *str)
Definition support.c:356
#define sz_strlcpy(dest, src)
Definition support.h:195
#define TRUE
Definition support.h:46
#define FALSE
Definition support.h:47
#define fc__fallthrough
Definition support.h:119
const struct player_list * team_members(const struct team *pteam)
Definition team.c:456
void team_remove_player(struct player *pplayer)
Definition team.c:502
#define terrain_has_flag(terr, flag)
Definition terrain.h:176
bool tile_is_seen(const struct tile *target_tile, const struct player *pow_player)
Definition tile.c:408
enum known_type tile_get_known(const struct tile *ptile, const struct player *pplayer)
Definition tile.c:393
struct city * tile_city(const struct tile *ptile)
Definition tile.c:83
@ TILE_KNOWN_SEEN
Definition tile.h:38
#define tile_terrain(_tile)
Definition tile.h:115
#define tile_has_extra(ptile, pextra)
Definition tile.h:152
#define tile_owner(_tile)
Definition tile.h:97
#define trade_partners_iterate_end
#define trade_partners_iterate(c, p)
bool is_hiding_unit(const struct unit *punit)
Definition unit.c:469
struct player * unit_nationality(const struct unit *punit)
Definition unit.c:1301
bool unit_transport_unload(struct unit *pcargo)
Definition unit.c:2494
bool unit_transported(const struct unit *pcargo)
Definition unit.c:2529
struct unit_list * unit_transport_cargo(const struct unit *ptrans)
Definition unit.c:2555
#define unit_tile(_pu)
Definition unit.h:407
#define unit_owner(_pu)
Definition unit.h:406
#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:126
struct unit_class * unit_class_get(const struct unit *punit)
Definition unittype.c:2530
#define vision_layer_iterate(v)
Definition vision.h:77
#define vision_layer_iterate_end
Definition vision.h:80