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 fc__attribute((nonnull(1, 2)));
64
65static void player_diplstate_new(const struct player *plr1,
66 const struct player *plr2)
67 fc__attribute((nonnull(1, 2)));
68
69/*******************************************************************/
74{
75 switch (oldstate) {
76 case DS_WAR: /* no change */
77 case DS_ARMISTICE:
78 case DS_CEASEFIRE:
79 case DS_PEACE:
80 return DS_WAR;
81 case DS_ALLIANCE:
82 return DS_ARMISTICE;
83 case DS_TEAM: /* no change */
84 return DS_TEAM;
85 case DS_NO_CONTACT: /* Possible if someone declares war on our ally */
86 return DS_NO_CONTACT; /* Can't cancel lack of contact */
87 case DS_LAST:
89 return DS_WAR; /* Arbitrary */
90 }
91
93
94 return DS_WAR; /* Arbitrary */
95}
96
97/*******************************************************************/
104 const struct player *p2)
105{
107
108 if (p1 == p2 || ds == DS_WAR || ds == DS_NO_CONTACT) {
109 return DIPL_ERROR;
110 }
111 if (players_on_same_team(p1, p2)) {
112 return DIPL_ERROR;
113 }
114 if (!p1->is_alive || !p2->is_alive) {
115 return DIPL_ERROR;
116 }
117 if (player_diplstate_get(p1, p2)->has_reason_to_cancel == 0
121 }
122
123 return DIPL_OK;
124}
125
126/*******************************************************************/
137static bool is_valid_alliance(const struct player *p1,
138 const struct player *p2)
139{
140 players_iterate_alive(pplayer) {
141 enum diplstate_type ds = player_diplstate_get(p1, pplayer)->type;
142
143 if (pplayer != p1
144 && pplayer != p2
145 && ds == DS_WAR /* Do not count 'never met' as war here */
146 && pplayers_allied(p2, pplayer)) {
147 return FALSE;
148 }
150
151 return TRUE;
152}
153
154/*******************************************************************/
165 const struct player *p2,
167{
169
170 if (players_on_same_team(p1, p2)) {
171 /* This includes the case p1 == p2 */
172 return DIPL_ERROR;
173 }
176 return DIPL_ERROR;
177 }
178 if (treaty == DS_WAR
180 || treaty == DS_ARMISTICE
181 || treaty == DS_TEAM
182 || treaty == DS_LAST) {
183 return DIPL_ERROR; /* These are not negotiable treaties */
184 }
185 if (treaty == DS_CEASEFIRE && existing != DS_WAR) {
186 return DIPL_ERROR; /* Only available from war */
187 }
188 if (treaty == DS_PEACE
189 && (existing != DS_WAR && existing != DS_CEASEFIRE)) {
190 return DIPL_ERROR;
191 }
192 if (treaty == DS_ALLIANCE) {
193 if (!is_valid_alliance(p1, p2)) {
194 /* Our war with a third party prevents entry to alliance. */
196 } else if (!is_valid_alliance(p2, p1)) {
197 /* Their war with a third party prevents entry to alliance. */
199 }
200 }
201 /* This check must be last: */
202 if (treaty == existing) {
203 return DIPL_ERROR;
204 }
205
206 return DIPL_OK;
207}
208
209/*******************************************************************/
213bool player_has_embassy(const struct player *pplayer,
214 const struct player *pplayer2)
215{
216 return (pplayer == pplayer2
219}
220
221/*******************************************************************/
225bool team_has_embassy(const struct team *pteam, const struct player *tgt_player)
226{
227 if (tgt_player->team == pteam) {
228 return TRUE;
229 }
230
234 return TRUE;
235 }
237
238 return FALSE;
239}
240
241/*******************************************************************/
245bool player_has_real_embassy(const struct player *pplayer,
246 const struct player *pplayer2)
247{
248 return BV_ISSET(pplayer->real_embassy, player_index(pplayer2));
249}
250
251/*******************************************************************/
255bool player_has_embassy_from_effect(const struct player *pplayer,
256 const struct player *pplayer2)
257{
258 return (get_player_bonus(pplayer, EFT_HAVE_EMBASSIES) > 0
261}
262
263/*******************************************************************/
266bool player_owns_city(const struct player *pplayer, const struct city *pcity)
267{
268 return (pcity && pplayer && city_owner(pcity) == pplayer);
269}
270
271/*******************************************************************/
275bool player_can_invade_tile(const struct player *pplayer,
276 const struct tile *ptile)
277{
278 const struct player *ptile_owner = tile_owner(ptile);
279
280 return (!ptile_owner
281 || ptile_owner == pplayer
283 || !players_non_invade(pplayer, ptile_owner));
284}
285
286/*******************************************************************/
290static void player_diplstate_new(const struct player *plr1,
291 const struct player *plr2)
292{
294 const struct player_diplstate **diplstate_slot
295 = plr1->diplstates + player_index(plr2);
296
297 fc_assert_ret(*diplstate_slot == nullptr);
298
299 diplstate = fc_calloc(1, sizeof(*diplstate));
301}
302
303/*******************************************************************/
306static void player_diplstate_defaults(const struct player *plr1,
307 const struct player *plr2)
308{
309 struct player_diplstate *diplstate = player_diplstate_get(plr1, plr2);
310
311 fc_assert_ret(diplstate != nullptr);
312
313 diplstate->type = DS_NO_CONTACT;
314 diplstate->max_state = DS_NO_CONTACT;
315 diplstate->first_contact_turn = 0;
316 diplstate->turns_left = 0;
317 diplstate->has_reason_to_cancel = 0;
318 diplstate->contact_turns_left = 0;
319 diplstate->auto_cancel_turn = -1;
320}
321
322/*******************************************************************/
326 const struct player *plr2)
327{
328 const struct player_diplstate **diplstate_slot
329 = plr1->diplstates + player_index(plr2);
330
331 fc_assert_ret_val(*diplstate_slot != nullptr, nullptr);
332
333 return (struct player_diplstate *) *diplstate_slot;
334}
335
336/*******************************************************************/
339static void player_diplstate_destroy(const struct player *plr1,
340 const struct player *plr2)
341{
342 const struct player_diplstate **diplstate_slot
343 = plr1->diplstates + player_index(plr2);
344
345 if (*diplstate_slot != nullptr) {
346 free(player_diplstate_get(plr1, plr2));
347 }
348
349 *diplstate_slot = nullptr;
350}
351
352/*******************************************************************/
356{
357 int i;
358
359 /* Init player slots. */
361 sizeof(*player_slots.slots));
362 /* Can't use the defined functions as the needed data will be
363 * defined here. */
364 for (i = 0; i < player_slot_count(); i++) {
365 player_slots.slots[i].player = nullptr;
366 }
367 player_slots.used_slots = 0;
368}
369
370/*******************************************************************/
374{
375 return (player_slots.slots != nullptr);
376}
377
378/*******************************************************************/
382{
383 players_iterate(pplayer) {
384 player_destroy(pplayer);
386 free(player_slots.slots);
387 player_slots.slots = nullptr;
388 player_slots.used_slots = 0;
389}
390
391/*******************************************************************/
395{
396 return player_slots.slots;
397}
398
399/*******************************************************************/
403{
404 pslot++;
405
406 return (pslot < player_slots.slots + player_slot_count()
407 ? pslot : nullptr);
408}
409
410/*******************************************************************/
416{
417 return (MAX_NUM_PLAYER_SLOTS);
418}
419
420/*******************************************************************/
423int player_slot_index(const struct player_slot *pslot)
424{
425 return pslot - player_slots.slots;
426}
427
428/*******************************************************************/
432struct player *player_slot_get_player(const struct player_slot *pslot)
433{
434 return pslot->player;
435}
436
437/*******************************************************************/
441bool player_slot_is_used(const struct player_slot *pslot)
442{
443 /* No player slot available, if the game is not initialised. */
445 return FALSE;
446 }
447
448 return pslot->player != nullptr;
449}
450
451/*******************************************************************/
454struct player_slot *player_slot_by_number(int player_id)
455{
457 || !(0 <= player_id && player_id < player_slot_count())) {
458 return nullptr;
459 }
460
461 return player_slots.slots + player_id;
462}
463
464/*******************************************************************/
468{
469 int max_pslot = 0;
470
471 player_slots_iterate(pslot) {
472 if (player_slot_is_used(pslot)) {
474 }
476
477 return max_pslot;
478}
479
480/*******************************************************************/
484struct player *player_new(struct player_slot *pslot)
485{
486 struct player *pplayer;
487
489
490 if (pslot == nullptr) {
493 pslot = aslot;
494 break;
495 }
497
498 if (pslot == nullptr) {
499 return nullptr;
500 }
501 } else if (pslot->player != nullptr) {
502 return pslot->player;
503 }
504
505 /* Now create the player. */
506 log_debug("Create player for slot %d.", player_slot_index(pslot));
507 pplayer = fc_calloc(1, sizeof(*pplayer));
508 pplayer->slot = pslot;
509 pslot->player = pplayer;
510
512 sizeof(*pplayer->diplstates));
514 const struct player_diplstate **diplstate_slot
515 = pplayer->diplstates + player_slot_index(dslot);
516
517 *diplstate_slot = nullptr;
519
521 /* Create diplomatic states for all other players. */
523 /* Create diplomatic state of this player. */
524 if (aplayer != pplayer) {
526 }
528
529 /* Set default values. */
530 player_defaults(pplayer);
531
532 /* Increase number of players. */
533 player_slots.used_slots++;
534
535 return pplayer;
536}
537
538/*******************************************************************/
542static void player_defaults(struct player *pplayer)
543{
544 int i;
545
548 pplayer->unassigned_user = TRUE;
550 pplayer->unassigned_ranked = TRUE;
551 pplayer->user_turns = 0;
552 pplayer->is_male = TRUE;
553 pplayer->government = nullptr;
554 pplayer->target_government = nullptr;
555 pplayer->nation = NO_NATION_SELECTED;
556 pplayer->team = nullptr;
557 pplayer->is_ready = FALSE;
558 pplayer->nturns_idle = 0;
559 pplayer->is_alive = TRUE;
560 pplayer->turns_alive = 0;
561 pplayer->is_winner = FALSE;
562 pplayer->last_war_action = -1;
563 pplayer->phase_done = FALSE;
564
565 pplayer->revolution_finishes = -1;
566 pplayer->primary_capital_id = 0;
567
568 BV_CLR_ALL(pplayer->real_embassy);
570 /* create diplomatic states for all other players */
572 /* create diplomatic state of this player */
573 if (aplayer != pplayer) {
575 }
577
578 pplayer->style = 0;
579 pplayer->music_style = -1; /* even getting value 0 triggers change */
580 pplayer->cities = city_list_new();
581 pplayer->units = unit_list_new();
582
583 pplayer->economic.gold = 0;
587 pplayer->economic.infra_points = 0;
588
589 spaceship_init(&pplayer->spaceship);
590
591 BV_CLR_ALL(pplayer->flags);
592
593 set_as_human(pplayer);
595 pplayer->ai_common.fuzzy = 0;
596 pplayer->ai_common.expand = 100;
598 player_slots_iterate(pslot) {
599 pplayer->ai_common.love[player_slot_index(pslot)] = 1;
601 pplayer->ai_common.traits = nullptr;
602
603 pplayer->ai = nullptr;
604 pplayer->was_created = FALSE;
605 pplayer->savegame_ai_type_name = nullptr;
606 pplayer->random_name = TRUE;
607 pplayer->is_connected = FALSE;
608 pplayer->current_conn = nullptr;
609 pplayer->connections = conn_list_new();
610 pplayer->autoselect_weight = -1;
613 for (i = 0; i < B_LAST; i++) {
614 pplayer->wonders[i] = WONDER_NOT_BUILT;
615 }
616
617 pplayer->attribute_block.data = nullptr;
618 pplayer->attribute_block.length = 0;
619 pplayer->attribute_block_buffer.data = nullptr;
620 pplayer->attribute_block_buffer.length = 0;
621
622 pplayer->tile_known.vec = nullptr;
623 pplayer->tile_known.bits = 0;
624
625 pplayer->rgb = nullptr;
626
627 memset(pplayer->multipliers, 0, sizeof(pplayer->multipliers));
628
629 /* pplayer->server is initialised in
630 ./server/plrhand.c:server_player_init()
631 and pplayer->client in
632 ./client/climisc.c:client_player_init() */
633}
634
635/*******************************************************************/
639void player_set_color(struct player *pplayer,
640 const struct rgbcolor *prgbcolor)
641{
642 if (pplayer->rgb != nullptr) {
643 rgbcolor_destroy(pplayer->rgb);
644 pplayer->rgb = nullptr;
645 }
646
647 if (prgbcolor) {
648 pplayer->rgb = rgbcolor_copy(prgbcolor);
649 }
650}
651
652/*******************************************************************/
660void player_clear(struct player *pplayer, bool full)
661{
662 bool client = !is_server();
663
664 if (pplayer == nullptr) {
665 return;
666 }
667
668 if (pplayer->savegame_ai_type_name != nullptr) {
669 free(pplayer->savegame_ai_type_name);
670 pplayer->savegame_ai_type_name = nullptr;
671 }
672
673 /* Clears the attribute blocks. */
674 if (pplayer->attribute_block.data) {
675 free(pplayer->attribute_block.data);
676 pplayer->attribute_block.data = nullptr;
677 }
678 pplayer->attribute_block.length = 0;
679
680 if (pplayer->attribute_block_buffer.data) {
682 pplayer->attribute_block_buffer.data = nullptr;
683 }
684 pplayer->attribute_block_buffer.length = 0;
685
686 /* Clears units and cities. */
687 unit_list_iterate(pplayer->units, punit) {
688 /* Unload all cargos. */
691 if (client) {
692 pcargo->client.transported_by = -1;
693 }
695 /* Unload the unit. */
697 if (client) {
699 }
700
703
704 city_list_iterate(pplayer->cities, pcity) {
705 if (fc_funcs->destroy_city != nullptr) {
707 } else {
709 }
711
712 if (full) {
713 team_remove_player(pplayer);
714
716 unit_list_iterate(owner->units, owned) {
717 if (unit_nationality(owned) == pplayer) {
718 /* Switch nationality to that of current owner. */
719 owned->nationality = owner;
720 }
723
724 /* This comes last because log calls in the above functions
725 * may use it. */
726 if (pplayer->nation != nullptr) {
727 player_set_nation(pplayer, nullptr);
728 }
729 }
730}
731
732/*******************************************************************/
736void player_ruleset_close(struct player *pplayer)
737{
738 pplayer->government = nullptr;
739 pplayer->target_government = nullptr;
740 player_set_nation(pplayer, nullptr);
741 pplayer->style = nullptr;
742}
743
744/*******************************************************************/
747void player_destroy(struct player *pplayer)
748{
749 struct player_slot *pslot;
750
751 pslot = pplayer->slot;
752 fc_assert(pslot->player == pplayer);
753
754 /* Remove all that is game-dependent in the player structure. */
755 player_clear(pplayer, TRUE);
756
757 fc_assert(0 == unit_list_size(pplayer->units));
758 unit_list_destroy(pplayer->units);
759 fc_assert(0 == city_list_size(pplayer->cities));
760 city_list_destroy(pplayer->cities);
761
762 fc_assert(conn_list_size(pplayer->connections) == 0);
764
766 /* Destroy the diplomatic states of this player with others ... */
768 /* ...and of others with this player. */
769 if (aplayer != pplayer) {
771
772 /* Check if any cities of the other player have been founded
773 * by the removed player. */
775 if (pcity->original == pplayer) {
776 /* Unknown origin is better than giving baseless
777 * benefits to current owner */
778 pcity->original = nullptr;
779 }
781 }
783 free(pplayer->diplstates);
784
785 /* Clear player color. */
786 if (pplayer->rgb) {
787 rgbcolor_destroy(pplayer->rgb);
788 }
789
790 dbv_free(&pplayer->tile_known);
791
792 if (!is_server()) {
794 dbv_free(&pplayer->client.tile_vision[v]);
796 }
797
798 free(pplayer);
799 pslot->player = nullptr;
800 player_slots.used_slots--;
801}
802
803/*******************************************************************/
807{
808 return player_slots.used_slots;
809}
810
811/*******************************************************************/
818int player_index(const struct player *pplayer)
819{
820 return player_number(pplayer);
821}
822
823/*******************************************************************/
826int player_number(const struct player *pplayer)
827{
828 return player_slot_index(pplayer->slot);
829}
830
831/*******************************************************************/
837struct player *player_by_number(const int player_id)
838{
839 struct player_slot *pslot = player_slot_by_number(player_id);
840
841 return (pslot != nullptr ? player_slot_get_player(pslot) : nullptr);
842}
843
844/*******************************************************************/
849bool player_set_nation(struct player *pplayer, struct nation_type *pnation)
850{
851 if (pplayer->nation != pnation) {
852 if (pplayer->nation) {
853 fc_assert(pplayer->nation->player == pplayer);
854 pplayer->nation->player = nullptr;
855 }
856 if (pnation) {
857 fc_assert(pnation->player == nullptr);
858 pnation->player = pplayer;
859 }
860 pplayer->nation = pnation;
861
862 return TRUE;
863 }
864
865 return FALSE;
866}
867
868/*******************************************************************/
871struct player *player_by_name(const char *name)
872{
873 players_iterate(pplayer) {
874 if (fc_strcasecmp(name, pplayer->name) == 0) {
875 return pplayer;
876 }
878
879 return nullptr;
880}
881
882/*******************************************************************/
885const char *player_name(const struct player *pplayer)
886{
887 if (!pplayer) {
888 return nullptr;
889 }
890
891 return pplayer->name;
892}
893
894/*******************************************************************/
900static const char *player_name_by_number(int i)
901{
902 struct player *pplayer;
903
904 pplayer = player_by_number(i);
905
906 return player_name(pplayer);
907}
908
909/*******************************************************************/
913 enum m_pre_result *result)
914{
915 int ind;
916
920 name, &ind);
921
922 if (*result < M_PRE_AMBIGUOUS) {
923 return player_by_number(ind);
924 } else {
925 return nullptr;
926 }
927}
928
929/*******************************************************************/
932struct player *player_by_user(const char *name)
933{
934 players_iterate(pplayer) {
935 if (fc_strcasecmp(name, pplayer->username) == 0) {
936 return pplayer;
937 }
939
940 return nullptr;
941}
942
943/*******************************************************************/
946int player_age(const struct player *pplayer)
947{
948 return pplayer->turns_alive;
949}
950
951/*******************************************************************/
959 const struct tile *ptile)
960{
961 /* Can't see invisible units. */
962 if (!fc_funcs->player_tile_vision_get(ptile, pplayer, V_INVIS)
963 || !fc_funcs->player_tile_vision_get(ptile, pplayer, V_SUBSURFACE)) {
964 return FALSE;
965 }
966
967 /* Units within some extras may be hidden. */
968 if (!pplayers_allied(pplayer, ptile->extras_owner)) {
970 if (tile_has_extra(ptile, pextra)) {
971 return FALSE;
972 }
974 }
975
976 return TRUE;
977}
978
979/*******************************************************************/
984bool can_player_see_hypotetic_units_at(const struct player *pplayer,
985 const struct tile *ptile)
986{
987 struct city *pcity;
988
989 if (!player_can_trust_tile_has_no_units(pplayer, ptile)) {
990 /* The existence of any units at all is hidden from the player. */
991 return FALSE;
992 }
993
994 /* Can't see city units. */
995 pcity = tile_city(ptile);
997 && unit_list_size(ptile->units) > 0) {
998 return FALSE;
999 }
1000
1001 /* Can't see non-allied units in transports. */
1002 unit_list_iterate(ptile->units, punit) {
1003 if (unit_type_get(punit)->transport_capacity > 0
1004 && unit_owner(punit) != pplayer) {
1005
1006 /* An ally could transport a non ally */
1007 if (unit_list_size(punit->transporting) > 0) {
1008 return FALSE;
1009 }
1010 }
1012
1013 return TRUE;
1014}
1015
1016/*******************************************************************/
1025bool can_player_see_unit_at(const struct player *pplayer,
1026 const struct unit *punit,
1027 const struct tile *ptile,
1028 bool is_transported)
1029{
1030 struct city *pcity;
1031 bool allied;
1032 struct unit_class *pclass;
1033
1034 /* If the player can't even see the tile... */
1035 if (TILE_KNOWN_SEEN != tile_get_known(ptile, pplayer)) {
1036 return FALSE;
1037 }
1038
1039 /* Don't show non-allied units that are in transports. This is logical
1040 * because allied transports can also contain our units. Shared vision
1041 * isn't taken into account. */
1043 if (is_transported && !allied) {
1044 return FALSE;
1045 }
1046
1047 /* Units in cities may be hidden. */
1048 pcity = tile_city(ptile);
1049 if (pcity && !can_player_see_units_in_city(pplayer, pcity)) {
1050 return FALSE;
1051 }
1052
1053 /* Allied units are always seen.
1054 * See also stealth unit hiding part in map_change_seen() */
1055 if (allied) {
1056 return TRUE;
1057 }
1058
1059 /* Units within some extras may be hidden. */
1061
1062 extra_type_list_iterate(pclass->cache.hiding_extras, pextra) {
1063 if (tile_has_extra(ptile, pextra)) {
1064 return FALSE;
1065 }
1067
1068 /* Non-hiding units are always seen.
1069 * See also stealth unit hiding part in map_change_seen() */
1070 if (!is_hiding_unit(punit)) {
1071 return TRUE;
1072 }
1073
1074 /* Hiding units are only seen by the V_INVIS fog layer. */
1075 return fc_funcs->player_tile_vision_get(ptile, pplayer,
1076 unit_type_get(punit)->vlayer);
1077}
1078
1079/**********************************************************************/
1082bool can_player_see_tile(const struct player *plr,
1083 const struct tile *ptile)
1084{
1085 return plr != nullptr
1086 && ptile != nullptr
1087 && (tile_get_known(ptile, plr) == TILE_KNOWN_SEEN);
1088}
1089
1090/*******************************************************************/
1095bool can_player_see_unit(const struct player *pplayer,
1096 const struct unit *punit)
1097{
1098 return can_player_see_unit_at(pplayer, punit, unit_tile(punit),
1100}
1101
1102/*******************************************************************/
1124bool can_player_see_units_in_city(const struct player *pplayer,
1125 const struct city *pcity)
1126{
1127 return (!pplayer
1129 || pplayers_allied(pplayer, city_owner(pcity)));
1130}
1131
1132/*******************************************************************/
1140bool can_player_see_city_internals(const struct player *pplayer,
1141 const struct city *pcity)
1142{
1143 return (!pplayer || pplayer == city_owner(pcity));
1144}
1145
1146/*******************************************************************/
1156 const struct city *target_city)
1157{
1159 /* City internals includes city externals. */
1160 return TRUE;
1161 }
1162
1164 /* The tile is being observed. */
1165 return TRUE;
1166 }
1167
1169
1173 /* Revealed because of the trade route. */
1174 return TRUE;
1175 }
1177 }
1178
1179 return FALSE;
1180}
1181
1182/*******************************************************************/
1191struct city *player_city_by_number(const struct player *pplayer, int city_id)
1192{
1193 /* We call idex directly. Should use game_city_by_number() instead? */
1194 struct city *pcity = idex_lookup_city(&wld, city_id);
1195
1196 if (!pcity) {
1197 return nullptr;
1198 }
1199
1200 if (!pplayer || (city_owner(pcity) == pplayer)) {
1201 /* Correct owner */
1202 return pcity;
1203 }
1204
1205 return nullptr;
1206}
1207
1208/*******************************************************************/
1217struct unit *player_unit_by_number(const struct player *pplayer, int unit_id)
1218{
1219 /* We call idex directly. Should use game_unit_by_number() instead? */
1220 struct unit *punit = idex_lookup_unit(&wld, unit_id);
1221
1222 if (!punit) {
1223 return nullptr;
1224 }
1225
1226 if (!pplayer || (unit_owner(punit) == pplayer)) {
1227 /* Correct owner */
1228 return punit;
1229 }
1230
1231 return nullptr;
1232}
1233
1234/*******************************************************************/
1237bool player_in_city_map(const struct player *pplayer,
1238 const struct tile *ptile)
1239{
1240 const struct civ_map *nmap = &(wld.map);
1241
1243 struct city *pcity = tile_city(ptile1);
1244
1245 if (pcity
1246 && (pplayer == nullptr || city_owner(pcity) == pplayer)
1248 ptile1)) {
1249 return TRUE;
1250 }
1252
1253 return FALSE;
1254}
1255
1256/*******************************************************************/
1261int num_known_tech_with_flag(const struct player *pplayer,
1262 enum tech_flag_id flag)
1263{
1264 return research_get(pplayer)->num_known_tech_with_flag[flag];
1265}
1266
1267/*******************************************************************/
1274int player_get_expected_income(const struct player *pplayer)
1275{
1276 int income = 0;
1277
1278 /* City income/expenses. */
1279 city_list_iterate(pplayer->cities, pcity) {
1280 /* Gold suplus accounts for imcome plus building and unit upkeep. */
1281 income += pcity->surplus[O_GOLD];
1282
1283 /* Gold upkeep for buildings and units is defined by the setting
1284 * 'game.info.gold_upkeep_style':
1285 * GOLD_UPKEEP_CITY: Cities pay for buildings and units (this is
1286 * included in pcity->surplus[O_GOLD]).
1287 * GOLD_UPKEEP_MIXED: Cities pay only for buildings; the nation pays
1288 * for units.
1289 * GOLD_UPKEEP_NATION: The nation pays for buildings and units. */
1290 switch (game.info.gold_upkeep_style) {
1291 case GOLD_UPKEEP_CITY:
1292 break;
1293 case GOLD_UPKEEP_NATION:
1294 /* Nation pays for buildings (and units). */
1296 fc__fallthrough; /* No break. */
1297 case GOLD_UPKEEP_MIXED:
1298 /* Nation pays for units. */
1300 break;
1301 }
1302
1303 /* Capitalization income. */
1305 income += pcity->shield_stock + pcity->surplus[O_SHIELD];
1306 }
1308
1309 return income;
1310}
1311
1312/*******************************************************************/
1316bool player_knows_techs_with_flag(const struct player *pplayer,
1317 enum tech_flag_id flag)
1318{
1319 return num_known_tech_with_flag(pplayer, flag) > 0;
1320}
1321
1322/*******************************************************************/
1325struct city *player_primary_capital(const struct player *pplayer)
1326{
1327 struct city *capital;
1328
1329 if (!pplayer) {
1330 /* The client depends on this behavior in some places. */
1331 return nullptr;
1332 }
1333
1335
1336 return capital;
1337}
1338
1339/*******************************************************************/
1342const char *love_text(const int love)
1343{
1344 if (love <= - MAX_AI_LOVE * 90 / 100) {
1345 /* TRANS: These words should be adjectives which can fit in the sentence
1346 "The x are y towards us"
1347 "The Babylonians are respectful towards us" */
1348 return Q_("?attitude:Genocidal");
1349 } else if (love <= - MAX_AI_LOVE * 70 / 100) {
1350 return Q_("?attitude:Belligerent");
1351 } else if (love <= - MAX_AI_LOVE * 50 / 100) {
1352 return Q_("?attitude:Hostile");
1353 } else if (love <= - MAX_AI_LOVE * 25 / 100) {
1354 return Q_("?attitude:Uncooperative");
1355 } else if (love <= - MAX_AI_LOVE * 10 / 100) {
1356 return Q_("?attitude:Uneasy");
1357 } else if (love <= MAX_AI_LOVE * 10 / 100) {
1358 return Q_("?attitude:Neutral");
1359 } else if (love <= MAX_AI_LOVE * 25 / 100) {
1360 return Q_("?attitude:Respectful");
1361 } else if (love <= MAX_AI_LOVE * 50 / 100) {
1362 return Q_("?attitude:Helpful");
1363 } else if (love <= MAX_AI_LOVE * 70 / 100) {
1364 return Q_("?attitude:Enthusiastic");
1365 } else if (love <= MAX_AI_LOVE * 90 / 100) {
1366 return Q_("?attitude:Admiring");
1367 } else {
1368 fc_assert(love > MAX_AI_LOVE * 90 / 100);
1369 return Q_("?attitude:Worshipful");
1370 }
1371}
1372
1373/*******************************************************************/
1376bool pplayers_at_war(const struct player *pplayer,
1377 const struct player *pplayer2)
1378{
1379 enum diplstate_type ds;
1380
1381 if (pplayer == nullptr || pplayer2 == nullptr) {
1382 return TRUE;
1383 }
1384
1385 if (pplayer == pplayer2) {
1386 return FALSE;
1387 }
1388
1389 ds = player_diplstate_get(pplayer, pplayer2)->type;
1390
1391 return ds == DS_WAR || ds == DS_NO_CONTACT;
1392}
1393
1394/*******************************************************************/
1397bool pplayers_allied(const struct player *pplayer,
1398 const struct player *pplayer2)
1399{
1400 enum diplstate_type ds;
1401
1402 if (!pplayer || !pplayer2) {
1403 return FALSE;
1404 }
1405
1406 if (pplayer == pplayer2) {
1407 return TRUE;
1408 }
1409
1410 ds = player_diplstate_get(pplayer, pplayer2)->type;
1411
1412 return (ds == DS_ALLIANCE || ds == DS_TEAM);
1413}
1414
1415/*******************************************************************/
1418bool pplayers_in_peace(const struct player *pplayer,
1419 const struct player *pplayer2)
1420{
1422
1423 if (pplayer == pplayer2) {
1424 return TRUE;
1425 }
1426
1427 return (ds == DS_PEACE || ds == DS_ALLIANCE
1428 || ds == DS_ARMISTICE || ds == DS_TEAM);
1429}
1430
1431/*******************************************************************/
1435 const struct player *pplayer2)
1436{
1437 if (pplayer1 == pplayer2 || !pplayer1 || !pplayer2) {
1438 return FALSE;
1439 }
1440
1441 /* Movement during armistice is allowed so that player can withdraw
1442 units deeper inside opponent territory. */
1443
1445}
1446
1447/*******************************************************************/
1451bool pplayers_non_attack(const struct player *pplayer,
1452 const struct player *pplayer2)
1453{
1454 enum diplstate_type ds;
1455
1456 if (pplayer == pplayer2) {
1457 return FALSE;
1458 }
1459
1460 ds = player_diplstate_get(pplayer, pplayer2)->type;
1461
1462 return (ds == DS_PEACE || ds == DS_CEASEFIRE || ds == DS_ARMISTICE);
1463}
1464
1465/*******************************************************************/
1469 const struct player *pplayer2)
1470{
1471 return pplayer1->team == pplayer2->team;
1472}
1473
1474/*******************************************************************/
1477bool gives_shared_vision(const struct player *me, const struct player *them)
1478{
1479 return BV_ISSET(me->gives_shared_vision, player_index(them));
1480}
1481
1482/*******************************************************************/
1485bool gives_shared_tiles(const struct player *me, const struct player *them)
1486{
1487 return BV_ISSET(me->gives_shared_tiles, player_index(them));
1488}
1489
1490/*******************************************************************/
1494 const struct player_diplstate *pds2)
1495{
1496 return (pds1->type == pds2->type && pds1->turns_left == pds2->turns_left
1497 && pds1->has_reason_to_cancel == pds2->has_reason_to_cancel
1498 && pds1->contact_turns_left == pds2->contact_turns_left);
1499}
1500
1501/*******************************************************************/
1505 const struct player *player2,
1506 int diplrel)
1507{
1508 /* No relationship to it self. */
1509 if (player1 == player2 && diplrel != DRO_FOREIGN) {
1510 return FALSE;
1511 }
1512
1513 if (diplrel < DS_LAST) {
1514 return player_diplstate_get(player1, player2)->type == diplrel;
1515 }
1516
1517 switch (diplrel) {
1522 case DRO_HOSTS_EMBASSY:
1525 return team_has_embassy(player2->team, player1);
1526 case DRO_HAS_EMBASSY:
1529 return team_has_embassy(player1->team, player2);
1538 case DRO_FOREIGN:
1539 return player1 != player2;
1540 }
1541
1542 fc_assert_msg(FALSE, "diplrel_between(): invalid diplrel number %d.",
1543 diplrel);
1544
1545 return FALSE;
1546}
1547
1548/*******************************************************************/
1551bool is_diplrel_to_other(const struct player *pplayer, int diplrel)
1552{
1554 if (oplayer == pplayer) {
1555 continue;
1556 }
1557 if (is_diplrel_between(pplayer, oplayer, diplrel)) {
1558 return TRUE;
1559 }
1561 return FALSE;
1562}
1563
1564/*******************************************************************/
1568int diplrel_by_rule_name(const char *value)
1569{
1570 /* Look for asymmetric diplomatic relations */
1571 int diplrel = diplrel_other_by_name(value, fc_strcasecmp);
1572
1573 if (diplrel != diplrel_other_invalid()) {
1574 return diplrel;
1575 }
1576
1577 /* Look for symmetric diplomatic relations */
1578 diplrel = diplstate_type_by_name(value, fc_strcasecmp);
1579
1580 /*
1581 * Make sure DS_LAST isn't returned as DS_LAST is the first diplrel_other.
1582 *
1583 * Can't happend now. This is in case that changes in the future. */
1585
1586 /*
1587 * Make sure that diplrel_other_invalid() is returned.
1588 *
1589 * Can't happen now. At the moment dpilrel_asym_invalid() is the same as
1590 * diplstate_type_invalid(). This is in case that changes in the future.
1591 */
1592 if (diplrel != diplstate_type_invalid()) {
1593 return diplrel;
1594 }
1595
1596 return diplrel_other_invalid();
1597}
1598
1599/*******************************************************************/
1602const char *diplrel_rule_name(int value)
1603{
1604 if (value < DS_LAST) {
1605 return diplstate_type_name(value);
1606 } else {
1607 return diplrel_other_name(value);
1608 }
1609}
1610
1611/*******************************************************************/
1614const char *diplrel_name_translation(int value)
1615{
1616 if (value < DS_LAST) {
1617 return diplstate_type_translated_name(value);
1618 } else {
1619 return _(diplrel_other_name(value));
1620 }
1621}
1622
1623/**************************************************************************
1624 Return the Casus Belli range when offender performs paction to tgt_plr
1625 at tgt_tile and the outcome is outcome.
1626**************************************************************************/
1628 const struct unit_type *off_ut,
1629 const struct player *tgt_plr,
1630 const enum effect_type outcome,
1631 const struct action *paction,
1632 const struct tile *tgt_tile)
1633{
1635
1636 /* The victim gets a casus belli if CASUS_BELLI_VICTIM or above. Everyone
1637 * gets a casus belli if CASUS_BELLI_OUTRAGE or above. */
1640 &(const struct req_context) {
1641 .player = offender,
1642 .city = tile_city(tgt_tile),
1643 .tile = tgt_tile,
1644 .unittype = off_ut,
1645 .action = paction,
1646 },
1647 &(const struct req_context) {
1648 .player = tgt_plr,
1649 },
1650 outcome);
1651
1653 /* International outrage: This isn't just between the offender and the
1654 * victim. */
1656 }
1657
1659 /* In this situation the specified action provides a casus belli
1660 * against the actor. */
1661 return CBR_VICTIM_ONLY;
1662 }
1663
1664 return CBR_NONE;
1665}
1666
1667/* The number of mutually exclusive requirement sets that
1668 * diplrel_mess_gen() creates for the DiplRel requirement type. */
1669#define DIPLREL_MESS_SIZE (3 + (DRO_LAST * (5 + 4 + 3 + 2 + 1)))
1670
1671/*******************************************************************/
1680{
1681 /* The ranges supported by the DiplRel requiremnt type. */
1682 const enum req_range legal_ranges[] = {
1688 };
1689
1690 /* Iterators. */
1691 int rel;
1692 int i;
1693 int j;
1694
1695 /* Storage for the mutually exclusive requirement sets. */
1697 * sizeof(bv_diplrel_all_reqs));
1698
1699 /* Position in mess. */
1700 int mess_pos = 0;
1701
1702 /* The first mutually exclusive set is about local diplstate. */
1704
1705 /* It is not possible to have more than one diplstate to a nation. */
1720
1721 /* It is not possible to have a diplstate to your self. */
1724
1725 mess_pos++;
1726
1727 /* Having a real embassy excludes not having an embassy. */
1729
1732 TRUE));
1735 FALSE));
1736
1737 mess_pos++;
1738
1739 /* Hosting a real embassy excludes not hosting an embassy. */
1741
1744 TRUE));
1747 FALSE));
1748
1749 mess_pos++;
1750
1751 /* Loop over diplstate_type and diplrel_other. */
1752 for (rel = 0; rel < DRO_LAST; rel++) {
1753 /* The presence of a DiplRel at a more local range proves that it can't
1754 * be absent in a more global range. (The alliance range includes the
1755 * Team range) */
1756 for (i = 0; i < 5; i++) {
1757 for (j = i; j < 5; j++) {
1759
1764
1765 mess_pos++;
1766 }
1767 }
1768 }
1769
1770 /* No uninitialized element exists. */
1772
1773 return mess;
1774}
1775
1776/* An array of mutually exclusive requirement sets for the DiplRel
1777 * requirement type. Is initialized the first time diplrel_mess_get() is
1778 * called. */
1780
1781/*******************************************************************/
1785{
1786 if (diplrel_mess == nullptr) {
1787 /* This is the first call. Initialize diplrel_mess. */
1789 }
1790
1791 return diplrel_mess;
1792}
1793
1794/*******************************************************************/
1798{
1799 if (diplrel_mess != nullptr) {
1801 diplrel_mess = nullptr;
1802 }
1803}
1804
1805/*******************************************************************/
1813{
1814 int diplrel_req_num;
1816 bv_diplrel_all_reqs known;
1817 int set;
1818
1819 /* Nothing is known to contradict the requirement yet. */
1820 BV_CLR_ALL(known);
1821
1822 if (!(req->source.kind == VUT_DIPLREL
1823 || req->source.kind == VUT_DIPLREL_TILE
1824 || req->source.kind == VUT_DIPLREL_TILE_O
1826 || req->source.kind == VUT_DIPLREL_UNITANY_O)) {
1827 /* No known contradiction of a requirement of any other kind. */
1829 || req->source.kind == VUT_DIPLREL_TILE
1830 || req->source.kind == VUT_DIPLREL_TILE_O
1832 || req->source.kind == VUT_DIPLREL_UNITANY_O);
1833
1834 return known;
1835 }
1836
1837 /* Convert the requirement to its position in the enumeration of all
1838 * DiplRel requirements. */
1840 req->range, req->present);
1841
1842 /* Get the mutually exclusive requirement sets for DiplRel. */
1844
1845 /* Add all known contradictions. */
1846 for (set = 0; set < DIPLREL_MESS_SIZE; set++) {
1847 if (BV_ISSET(mess[set], diplrel_req_num)) {
1848 /* The requirement req is mentioned in the set. It is therefore known
1849 * that all other requirements in the set contradicts it. They should
1850 * therefore be added to the known contradictions. */
1851 BV_SET_ALL_FROM(known, mess[set]);
1852 }
1853 }
1854
1855 /* The requirement isn't self contradicting. It was set by the mutually
1856 * exclusive requirement sets that mentioned it. Remove it. */
1857 BV_CLR(known, diplrel_req_num);
1858
1859 return known;
1860}
1861
1862/*******************************************************************/
1867int player_in_territory(const struct player *pplayer,
1868 const struct player *pplayer2)
1869{
1870 int in_territory = 0;
1871
1872 /* This algorithm should work at server or client. It only returns the
1873 * number of visible units (a unit can potentially hide inside the
1874 * transport of a different player).
1875 *
1876 * Note this may be quite slow. An even slower alternative is to iterate
1877 * over the entire map, checking all units inside the player's territory
1878 * to see if they're owned by the enemy. */
1880 /* Get the owner of the tile/territory. */
1882
1883 if (owner == pplayer && can_player_see_unit(pplayer, punit)) {
1884 /* Found one! */
1885 in_territory++;
1886 }
1888
1889 return in_territory;
1890}
1891
1892/*******************************************************************/
1897bool is_valid_username(const char *name)
1898{
1899 return (strlen(name) > 0
1900 && !fc_isdigit(name[0])
1903}
1904
1905/*******************************************************************/
1908bool is_settable_ai_level(enum ai_level level)
1909{
1910 if (level == AI_LEVEL_AWAY) {
1911 /* Cannot set away level for AI */
1912 return FALSE;
1913 }
1914
1915 return TRUE;
1916}
1917
1918/*******************************************************************/
1922{
1923 return AI_LEVEL_COUNT - 1; /* AI_LEVEL_AWAY is not real AI */
1924}
1925
1926/*******************************************************************/
1929void *player_ai_data(const struct player *pplayer, const struct ai_type *ai)
1930{
1931 return pplayer->server.ais[ai_type_number(ai)];
1932}
1933
1934/*******************************************************************/
1937void player_set_ai_data(struct player *pplayer, const struct ai_type *ai,
1938 void *data)
1939{
1940 pplayer->server.ais[ai_type_number(ai)] = data;
1941}
1942
1943/*******************************************************************/
1947int player_multiplier_value(const struct player *pplayer,
1948 const struct multiplier *pmul)
1949{
1950 return pplayer->multipliers[multiplier_index(pmul)].value;
1951}
1952
1953/*******************************************************************/
1958int player_multiplier_effect_value(const struct player *pplayer,
1959 const struct multiplier *pmul)
1960{
1961 return (player_multiplier_value(pplayer, pmul) + pmul->offset)
1962 * pmul->factor;
1963}
1964
1965/*******************************************************************/
1970int player_multiplier_target_value(const struct player *pplayer,
1971 const struct multiplier *pmul)
1972{
1973 return pplayer->multipliers[multiplier_index(pmul)].target;
1974}
1975
1976/*******************************************************************/
1979bool player_has_flag(const struct player *pplayer, enum plr_flag_id flag)
1980{
1981 return BV_ISSET(pplayer->flags, flag);
1982}
1983
1984/*******************************************************************/
1987bool player_has_state(const struct player *pplayer,
1988 enum plrstate_type state)
1989{
1990 switch (state) {
1991 case PLRS_BARBARIAN:
1992 return is_barbarian(pplayer);
1993 case PLRS_HAS_CAPITAL:
1994 return player_primary_capital(pplayer) != nullptr;
1995 case PLRS_LAST:
1996 fc_assert(state != PLRS_LAST);
1997 break;
1998 }
1999
2001 return FALSE;
2002}
2003
2004/*******************************************************************/
2012 enum action_result result)
2013{
2016 penabler) {
2017 struct universal u[2] = {
2018 {.kind = VUT_GOVERNMENT, .value = {.govern = (pplayer->government)}},
2019 {.kind = VUT_MINCITIES, .value = {.min_cities = (city_list_size(pplayer->cities))}},
2020 };
2021
2022 if (!universals_mean_unfulfilled(&(penabler->actor_reqs), u, 2)) {
2023 return TRUE;
2024 }
2027
2028 return FALSE;
2029}
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:77
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:343
#define MAX_NUM_PLAYER_SLOTS
Definition fc_types.h:32
#define CASUS_BELLI_VICTIM
Definition fc_types.h:337
#define MAX_LEN_NAME
Definition fc_types.h:68
@ O_SHIELD
Definition fc_types.h:103
@ O_GOLD
Definition fc_types.h:103
#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:1908
bool are_diplstates_equal(const struct player_diplstate *pds1, const struct player_diplstate *pds2)
Definition player.c:1493
bool player_can_invade_tile(const struct player *pplayer, const struct tile *ptile)
Definition player.c:275
bool player_knows_techs_with_flag(const struct player *pplayer, enum tech_flag_id flag)
Definition player.c:1316
int player_multiplier_effect_value(const struct player *pplayer, const struct multiplier *pmul)
Definition player.c:1958
void * player_ai_data(const struct player *pplayer, const struct ai_type *ai)
Definition player.c:1929
bool player_has_state(const struct player *pplayer, enum plrstate_type state)
Definition player.c:1987
bool player_slot_is_used(const struct player_slot *pslot)
Definition player.c:441
bv_diplrel_all_reqs diplrel_req_contradicts(const struct requirement *req)
Definition player.c:1812
static bv_diplrel_all_reqs * diplrel_mess_get(void)
Definition player.c:1784
int num_known_tech_with_flag(const struct player *pplayer, enum tech_flag_id flag)
Definition player.c:1261
bool is_valid_username(const char *name)
Definition player.c:1897
static void player_diplstate_new(const struct player *plr1, const struct player *plr2)
Definition player.c:290
int player_multiplier_target_value(const struct player *pplayer, const struct multiplier *pmul)
Definition player.c:1970
bool can_player_see_tile(const struct player *plr, const struct tile *ptile)
Definition player.c:1082
struct unit * player_unit_by_number(const struct player *pplayer, int unit_id)
Definition player.c:1217
static bv_diplrel_all_reqs * diplrel_mess
Definition player.c:1779
struct player * player_by_name_prefix(const char *name, enum m_pre_result *result)
Definition player.c:912
int diplrel_by_rule_name(const char *value)
Definition player.c:1568
struct player * player_new(struct player_slot *pslot)
Definition player.c:484
struct player * player_by_number(const int player_id)
Definition player.c:837
bool player_in_city_map(const struct player *pplayer, const struct tile *ptile)
Definition player.c:1237
bool players_on_same_team(const struct player *pplayer1, const struct player *pplayer2)
Definition player.c:1468
static bv_diplrel_all_reqs * diplrel_mess_gen(void)
Definition player.c:1679
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:1025
int player_count(void)
Definition player.c:806
int player_slot_count(void)
Definition player.c:415
struct player_slot * player_slot_by_number(int player_id)
Definition player.c:454
int player_multiplier_value(const struct player *pplayer, const struct multiplier *pmul)
Definition player.c:1947
int player_get_expected_income(const struct player *pplayer)
Definition player.c:1274
int player_number(const struct player *pplayer)
Definition player.c:826
enum dipl_reason pplayer_can_make_treaty(const struct player *p1, const struct player *p2, enum diplstate_type treaty)
Definition player.c:164
const char * player_name(const struct player *pplayer)
Definition player.c:885
static void player_diplstate_defaults(const struct player *plr1, const struct player *plr2)
Definition player.c:306
void player_slots_free(void)
Definition player.c:381
bool is_diplrel_to_other(const struct player *pplayer, int diplrel)
Definition player.c:1551
int player_slot_max_used_number(void)
Definition player.c:467
static bool is_valid_alliance(const struct player *p1, const struct player *p2)
Definition player.c:137
bool can_player_see_unit(const struct player *pplayer, const struct unit *punit)
Definition player.c:1095
bool pplayers_at_war(const struct player *pplayer, const struct player *pplayer2)
Definition player.c:1376
static void player_diplstate_destroy(const struct player *plr1, const struct player *plr2) fc__attribute((nonnull(1
Definition player.c:339
void player_set_ai_data(struct player *pplayer, const struct ai_type *ai, void *data)
Definition player.c:1937
void player_ruleset_close(struct player *pplayer)
Definition player.c:736
void player_clear(struct player *pplayer, bool full)
Definition player.c:660
int player_slot_index(const struct player_slot *pslot)
Definition player.c:423
struct player * player_by_name(const char *name)
Definition player.c:871
void player_slots_init(void)
Definition player.c:355
bool player_has_flag(const struct player *pplayer, enum plr_flag_id flag)
Definition player.c:1979
bool player_has_real_embassy(const struct player *pplayer, const struct player *pplayer2)
Definition player.c:245
static void static void enum diplstate_type cancel_pact_result(enum diplstate_type oldstate)
Definition player.c:73
bool team_has_embassy(const struct team *pteam, const struct player *tgt_player)
Definition player.c:225
void player_set_color(struct player *pplayer, const struct rgbcolor *prgbcolor)
Definition player.c:639
struct city * player_city_by_number(const struct player *pplayer, int city_id)
Definition player.c:1191
struct city * player_primary_capital(const struct player *pplayer)
Definition player.c:1325
int player_index(const struct player *pplayer)
Definition player.c:818
int player_in_territory(const struct player *pplayer, const struct player *pplayer2)
Definition player.c:1867
struct player * player_by_user(const char *name)
Definition player.c:932
const char * diplrel_name_translation(int value)
Definition player.c:1614
bool is_diplrel_between(const struct player *player1, const struct player *player2, int diplrel)
Definition player.c:1504
bool player_set_nation(struct player *pplayer, struct nation_type *pnation)
Definition player.c:849
#define DIPLREL_MESS_SIZE
Definition player.c:1669
bool player_can_see_city_externals(const struct player *pow_player, const struct city *target_city)
Definition player.c:1155
int player_age(const struct player *pplayer)
Definition player.c:946
enum dipl_reason pplayer_can_cancel_treaty(const struct player *p1, const struct player *p2)
Definition player.c:103
struct player_diplstate * player_diplstate_get(const struct player *plr1, const struct player *plr2)
Definition player.c:325
int number_of_ai_levels(void)
Definition player.c:1921
static struct @72 player_slots
bool pplayers_allied(const struct player *pplayer, const struct player *pplayer2)
Definition player.c:1397
static void player_defaults(struct player *pplayer)
Definition player.c:542
bool can_player_see_hypotetic_units_at(const struct player *pplayer, const struct tile *ptile)
Definition player.c:984
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:255
void diplrel_mess_close(void)
Definition player.c:1797
bool players_non_invade(const struct player *pplayer1, const struct player *pplayer2)
Definition player.c:1434
bool player_can_do_action_result(struct player *pplayer, enum action_result result)
Definition player.c:2011
bool pplayers_non_attack(const struct player *pplayer, const struct player *pplayer2)
Definition player.c:1451
bool can_player_see_units_in_city(const struct player *pplayer, const struct city *pcity)
Definition player.c:1124
struct player * player_slot_get_player(const struct player_slot *pslot)
Definition player.c:432
static const char * player_name_by_number(int i)
Definition player.c:900
bool can_player_see_city_internals(const struct player *pplayer, const struct city *pcity)
Definition player.c:1140
struct player_slot * player_slot_next(struct player_slot *pslot)
Definition player.c:402
bool player_can_trust_tile_has_no_units(const struct player *pplayer, const struct tile *ptile)
Definition player.c:958
bool player_slots_initialised(void)
Definition player.c:373
const char * love_text(const int love)
Definition player.c:1342
bool gives_shared_tiles(const struct player *me, const struct player *them)
Definition player.c:1485
bool player_has_embassy(const struct player *pplayer, const struct player *pplayer2)
Definition player.c:213
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:1627
const char * diplrel_rule_name(int value)
Definition player.c:1602
bool gives_shared_vision(const struct player *me, const struct player *them)
Definition player.c:1477
bool player_owns_city(const struct player *pplayer, const struct city *pcity)
Definition player.c:266
struct player_slot * player_slot_first(void)
Definition player.c:394
void player_destroy(struct player *pplayer)
Definition player.c:747
bool pplayers_in_peace(const struct player *pplayer, const struct player *pplayer2)
Definition player.c:1418
#define players_iterate_end
Definition player.h:552
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:547
#define player_list_iterate(playerlist, pplayer)
Definition player.h:570
#define MAX_AI_LOVE
Definition player.h:576
#define ANON_USER_NAME
Definition player.h:48
static bool is_barbarian(const struct player *pplayer)
Definition player.h:499
#define player_slots_iterate(_pslot)
Definition player.h:538
#define player_list_iterate_end
Definition player.h:572
#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:562
#define player_slots_iterate_end
Definition player.h:542
#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:557
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:595
universals_u value
Definition fc_types.h:594
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 fc__attribute(x)
Definition support.h:99
#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:457
void team_remove_player(struct player *pplayer)
Definition team.c:503
#define terrain_has_flag(terr, flag)
Definition terrain.h:177
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:76
#define vision_layer_iterate_end
Definition vision.h:79