Freeciv21
Develop your civilization from humble roots to a global empire
player.cpp
Go to the documentation of this file.
1 /*__ ___ ***************************************
2 / \ / \ Copyright (c) 1996-2020 Freeciv21 and Freeciv
3 \_ \ / __/ contributors. This file is part of Freeciv21.
4  _\ \ / /__ Freeciv21 is free software: you can redistribute it
5  \___ \____/ __/ and/or modify it under the terms of the GNU General
6  \_ _/ Public License as published by the Free Software
7  | @ @ \_ Foundation, either version 3 of the License,
8  | or (at your option) any later version.
9  _/ /\ You should have received a copy of the GNU
10  /o) (o/\ \_ General Public License along with Freeciv21.
11  \_____/ / If not, see https://www.gnu.org/licenses/.
12  \____/ ********************************************************/
13 
14 #include <QBitArray>
15 #include <QString>
16 
17 // utility
18 #include "fcintl.h"
19 #include "log.h"
20 #include "shared.h"
21 #include "support.h"
22 
23 // common
24 #include "ai.h"
25 #include "city.h"
26 #include "fc_interface.h"
27 #include "featured_text.h"
28 #include "game.h"
29 #include "government.h"
30 #include "idex.h"
31 #include "improvement.h"
32 #include "map.h"
33 #include "multipliers.h"
34 #include "nation.h"
35 #include "research.h"
36 #include "rgbcolor.h"
37 #include "unit.h"
38 #include "unitlist.h"
39 #include "vision.h"
40 
41 #include "player.h"
42 
43 struct player_slot {
44  struct player *player;
45 };
46 
47 static struct {
49  int used_slots; /* number of used/allocated players in the player slots */
51 
52 static void player_defaults(struct player *pplayer);
53 
54 static void player_diplstate_new(const struct player *plr1,
55  const struct player *plr2);
56 static void player_diplstate_defaults(const struct player *plr1,
57  const struct player *plr2);
58 static void player_diplstate_destroy(const struct player *plr1,
59  const struct player *plr2);
60 
65 enum diplstate_type cancel_pact_result(enum diplstate_type oldstate)
66 {
67  switch (oldstate) {
68  case DS_NO_CONTACT: // possible if someone declares war on our ally
69  case DS_WAR: // no change
70  case DS_ARMISTICE:
71  case DS_CEASEFIRE:
72  case DS_PEACE:
73  return DS_WAR;
74  case DS_ALLIANCE:
75  return DS_ARMISTICE;
76  case DS_TEAM: // no change
77  return DS_TEAM;
78  default:
79  qCritical("non-pact diplstate %d in cancel_pact_result", oldstate);
80  return DS_WAR; // arbitrary
81  }
82 }
83 
90 enum dipl_reason pplayer_can_cancel_treaty(const struct player *p1,
91  const struct player *p2)
92 {
93  enum diplstate_type ds = player_diplstate_get(p1, p2)->type;
94 
95  if (p1 == p2 || ds == DS_WAR || ds == DS_NO_CONTACT) {
96  return DIPL_ERROR;
97  }
98  if (players_on_same_team(p1, p2)) {
99  return DIPL_ERROR;
100  }
101  if (!p1->is_alive || !p2->is_alive) {
102  return DIPL_ERROR;
103  }
104  if (player_diplstate_get(p1, p2)->has_reason_to_cancel == 0
105  && get_player_bonus(p1, EFT_HAS_SENATE) > 0
106  && get_player_bonus(p1, EFT_NO_ANARCHY) <= 0) {
107  return DIPL_SENATE_BLOCKING;
108  }
109  return DIPL_OK;
110 }
111 
123 static bool is_valid_alliance(const struct player *p1,
124  const struct player *p2)
125 {
126  players_iterate_alive(pplayer)
127  {
128  enum diplstate_type ds = player_diplstate_get(p1, pplayer)->type;
129 
130  if (pplayer != p1 && pplayer != p2
131  && ds == DS_WAR // do not count 'never met' as war here
132  && pplayers_allied(p2, pplayer)) {
133  return false;
134  }
135  }
137 
138  return true;
139 }
140 
150 enum dipl_reason pplayer_can_make_treaty(const struct player *p1,
151  const struct player *p2,
152  enum diplstate_type treaty)
153 {
154  enum diplstate_type existing = player_diplstate_get(p1, p2)->type;
155 
156  if (players_on_same_team(p1, p2)) {
157  // This includes the case p1 == p2
158  return DIPL_ERROR;
159  }
160  if (get_player_bonus(p1, EFT_NO_DIPLOMACY) > 0
161  || get_player_bonus(p2, EFT_NO_DIPLOMACY) > 0) {
162  return DIPL_ERROR;
163  }
164  if (treaty == DS_WAR || treaty == DS_NO_CONTACT || treaty == DS_ARMISTICE
165  || treaty == DS_TEAM || treaty == DS_LAST) {
166  return DIPL_ERROR; // these are not negotiable treaties
167  }
168  if (treaty == DS_CEASEFIRE && existing != DS_WAR) {
169  return DIPL_ERROR; // only available from war
170  }
171  if (treaty == DS_PEACE
172  && (existing != DS_WAR && existing != DS_CEASEFIRE)) {
173  return DIPL_ERROR;
174  }
175  if (treaty == DS_ALLIANCE) {
176  if (!is_valid_alliance(p1, p2)) {
177  // Our war with a third party prevents entry to alliance.
179  } else if (!is_valid_alliance(p2, p1)) {
180  // Their war with a third party prevents entry to alliance.
182  }
183  }
184  // this check must be last:
185  if (treaty == existing) {
186  return DIPL_ERROR;
187  }
188  return DIPL_OK;
189 }
190 
195 bool player_has_embassy(const struct player *pplayer,
196  const struct player *pplayer2)
197 {
198  return (pplayer == pplayer2 || player_has_real_embassy(pplayer, pplayer2)
199  || player_has_embassy_from_effect(pplayer, pplayer2));
200 }
201 
206 bool player_has_real_embassy(const struct player *pplayer,
207  const struct player *pplayer2)
208 {
209  return BV_ISSET(pplayer->real_embassy, player_index(pplayer2));
210 }
211 
216 bool player_has_embassy_from_effect(const struct player *pplayer,
217  const struct player *pplayer2)
218 {
219  return (get_player_bonus(pplayer, EFT_HAVE_EMBASSIES) > 0
220  && player_diplstate_get(pplayer, pplayer2)->type != DS_NO_CONTACT
221  && !is_barbarian(pplayer2));
222 }
223 
227 bool player_owns_city(const struct player *pplayer, const struct city *pcity)
228 {
229  return (pcity && pplayer && city_owner(pcity) == pplayer);
230 }
231 
236 bool player_can_invade_tile(const struct player *pplayer,
237  const struct tile *ptile)
238 {
239  const struct player *ptile_owner = tile_owner(ptile);
240 
241  return (!ptile_owner || ptile_owner == pplayer
242  || !players_non_invade(pplayer, ptile_owner));
243 }
244 
249 static void player_diplstate_new(const struct player *plr1,
250  const struct player *plr2)
251 {
252  struct player_diplstate *diplstate;
253 
254  fc_assert_ret(plr1 != nullptr);
255  fc_assert_ret(plr2 != nullptr);
256 
257  const struct player_diplstate **diplstate_slot =
258  plr1->diplstates + player_index(plr2);
259 
260  fc_assert_ret(*diplstate_slot == nullptr);
261 
262  diplstate = new player_diplstate[1]();
263  *diplstate_slot = diplstate;
264 }
265 
269 static void player_diplstate_defaults(const struct player *plr1,
270  const struct player *plr2)
271 {
272  struct player_diplstate *diplstate = player_diplstate_get(plr1, plr2);
273 
274  fc_assert_ret(diplstate != nullptr);
275 
276  diplstate->type = DS_NO_CONTACT;
277  diplstate->max_state = DS_NO_CONTACT;
278  diplstate->first_contact_turn = 0;
279  diplstate->turns_left = 0;
280  diplstate->has_reason_to_cancel = 0;
281  diplstate->contact_turns_left = 0;
282  diplstate->auto_cancel_turn = -1;
283 }
284 
288 struct player_diplstate *player_diplstate_get(const struct player *plr1,
289  const struct player *plr2)
290 {
291  fc_assert_ret_val(plr1 != nullptr, nullptr);
292  fc_assert_ret_val(plr2 != nullptr, nullptr);
293 
294  const struct player_diplstate **diplstate_slot =
295  plr1->diplstates + player_index(plr2);
296 
297  fc_assert_ret_val(*diplstate_slot != nullptr, nullptr);
298 
299  return const_cast<struct player_diplstate *>(*diplstate_slot);
300 }
301 
305 static void player_diplstate_destroy(const struct player *plr1,
306  const struct player *plr2)
307 {
308  fc_assert_ret(plr1 != nullptr);
309  fc_assert_ret(plr2 != nullptr);
310 
311  const struct player_diplstate **diplstate_slot =
312  plr1->diplstates + player_index(plr2);
313 
314  if (*diplstate_slot != nullptr) {
315  delete[] player_diplstate_get(plr1, plr2);
316  }
317 
318  *diplstate_slot = nullptr;
319 }
320 
325 {
326  int i;
327 
328  // Init player slots.
330  /* Can't use the defined functions as the needed data will be
331  * defined here. */
332  for (i = 0; i < MAX_NUM_PLAYER_SLOTS; i++) {
333  player_slots.pslots[i].player = nullptr;
334  }
335  player_slots.used_slots = 0;
336 }
337 
341 bool player_slots_initialised() { return (player_slots.pslots != nullptr); }
342 
347 {
348  players_iterate(pplayer) { player_destroy(pplayer); }
350  delete[] player_slots.pslots;
351  player_slots.pslots = nullptr;
352  player_slots.used_slots = 0;
353 }
354 
358 struct player_slot *player_slot_first() { return player_slots.pslots; }
359 
364 {
365  pslot++;
366  return (pslot < player_slots.pslots + MAX_NUM_PLAYER_SLOTS ? pslot
367  : nullptr);
368 }
369 
373 int player_slot_index(const struct player_slot *pslot)
374 {
375  fc_assert_ret_val(nullptr != pslot, 0);
376 
377  return pslot - player_slots.pslots;
378 }
379 
384 struct player *player_slot_get_player(const struct player_slot *pslot)
385 {
386  fc_assert_ret_val(nullptr != pslot, nullptr);
387 
388  return pslot->player;
389 }
390 
395 bool player_slot_is_used(const struct player_slot *pslot)
396 {
397  fc_assert_ret_val(nullptr != pslot, false);
398 
399  // No player slot available, if the game is not initialised.
400  if (!player_slots_initialised()) {
401  return false;
402  }
403 
404  return nullptr != pslot->player;
405 }
406 
410 struct player_slot *player_slot_by_number(int player_id)
411 {
413  || !(0 <= player_id && player_id < MAX_NUM_PLAYER_SLOTS)) {
414  return nullptr;
415  }
416 
417  return player_slots.pslots + player_id;
418 }
419 
424 {
425  int max_pslot = 0;
426 
427  player_slots_iterate(pslot)
428  {
429  if (player_slot_is_used(pslot)) {
430  max_pslot = player_slot_index(pslot);
431  }
432  }
434 
435  return max_pslot;
436 }
437 
442 struct player *player_new(struct player_slot *pslot)
443 {
444  struct player *pplayer;
445 
447 
448  if (nullptr == pslot) {
449  player_slots_iterate(aslot)
450  {
451  if (!player_slot_is_used(aslot)) {
452  pslot = aslot;
453  break;
454  }
455  }
457 
458  fc_assert_ret_val(nullptr != pslot, nullptr);
459  } else if (nullptr != pslot->player) {
460  return pslot->player;
461  }
462 
463  // Now create the player.
464  log_debug("Create player for slot %d.", player_slot_index(pslot));
465  pplayer = new player();
466  pplayer->slot = pslot;
467  pslot->player = pplayer;
468  pplayer->diplstates = new const player_diplstate *[MAX_NUM_PLAYER_SLOTS]();
469 
470  player_slots_iterate(dslot)
471  {
472  const struct player_diplstate **diplstate_slot =
473  pplayer->diplstates + player_slot_index(dslot);
474 
475  *diplstate_slot = nullptr;
476  }
478 
479  players_iterate(aplayer)
480  {
481  // Create diplomatic states for all other players.
482  player_diplstate_new(pplayer, aplayer);
483  // Create diplomatic state of this player.
484  if (aplayer != pplayer) {
485  player_diplstate_new(aplayer, pplayer);
486  }
487  }
489 
490  // Set default values.
491  player_defaults(pplayer);
492 
493  // Increase number of players.
494  player_slots.used_slots++;
495 
496  return pplayer;
497 }
498 
503 static void player_defaults(struct player *pplayer)
504 {
505  int i;
506 
507  sz_strlcpy(pplayer->name, ANON_PLAYER_NAME);
508  sz_strlcpy(pplayer->username, _(ANON_USER_NAME));
509  pplayer->unassigned_user = true;
511  pplayer->unassigned_ranked = true;
512  pplayer->user_turns = 0;
513  pplayer->is_male = true;
514  pplayer->government = nullptr;
515  pplayer->target_government = nullptr;
516  pplayer->nation = NO_NATION_SELECTED;
517  pplayer->team = nullptr;
518  pplayer->is_ready = false;
519  pplayer->nturns_idle = 0;
520  pplayer->is_alive = true;
521  pplayer->turns_alive = 0;
522  pplayer->is_winner = false;
523  pplayer->last_war_action = -1;
524  pplayer->phase_done = false;
525 
526  pplayer->revolution_finishes = -1;
527  pplayer->primary_capital_id = 0;
528 
529  BV_CLR_ALL(pplayer->real_embassy);
530  players_iterate(aplayer)
531  {
532  // create diplomatic states for all other players
533  player_diplstate_defaults(pplayer, aplayer);
534  // create diplomatic state of this player
535  if (aplayer != pplayer) {
536  player_diplstate_defaults(aplayer, pplayer);
537  }
538  }
540 
541  pplayer->style = 0;
542  pplayer->music_style = -1; // even getting value 0 triggers change
543  pplayer->cities = city_list_new();
544  pplayer->units = unit_list_new();
545 
546  pplayer->economic.gold = 0;
550  pplayer->economic.infra_points = 0;
551 
552  spaceship_init(&pplayer->spaceship);
553 
554  BV_CLR_ALL(pplayer->flags);
555 
556  set_as_human(pplayer);
557  pplayer->ai_common.skill_level = ai_level_invalid();
558  pplayer->ai_common.fuzzy = 0;
559  pplayer->ai_common.expand = 100;
560  pplayer->ai_common.barbarian_type = NOT_A_BARBARIAN;
561  player_slots_iterate(pslot)
562  {
563  pplayer->ai_common.love[player_slot_index(pslot)] = 1;
564  }
566  pplayer->ai_common.traits.clear();
567 
568  pplayer->ai = nullptr;
569  pplayer->was_created = false;
570  pplayer->savegame_ai_type_name = nullptr;
571  pplayer->random_name = true;
572  pplayer->is_connected = false;
573  pplayer->current_conn = nullptr;
574  pplayer->connections = conn_list_new();
576  for (i = 0; i < B_LAST; i++) {
577  pplayer->wonders[i] = WONDER_NOT_BUILT;
578  pplayer->wonder_build_turn[i] = -1;
579  }
580 
581  pplayer->rgb = nullptr;
582 
583  memset(pplayer->multipliers, 0, sizeof(pplayer->multipliers));
584  memset(pplayer->multipliers_target, 0,
585  sizeof(pplayer->multipliers_target));
586 
587  pplayer->tile_known = new QBitArray();
588  /* pplayer->server is initialised in
589  ./server/plrhand.c:server_player_init()
590  and pplayer->client in
591  ./client/climisc.c:client_player_init() */
592 }
593 
598 void player_set_color(struct player *pplayer,
599  const struct rgbcolor *prgbcolor)
600 {
601  if (pplayer->rgb != nullptr) {
602  rgbcolor_destroy(pplayer->rgb);
603  pplayer->rgb = nullptr;
604  }
605 
606  if (prgbcolor) {
607  pplayer->rgb = rgbcolor_copy(prgbcolor);
608  }
609 }
610 
615 void player_clear(struct player *pplayer, bool full)
616 {
617  bool client = !is_server();
618 
619  if (pplayer == nullptr) {
620  return;
621  }
622 
623  delete[] pplayer->savegame_ai_type_name;
624  pplayer->savegame_ai_type_name = nullptr;
625 
626  // Clears the attribute blocks.
627  pplayer->attribute_block.clear();
628  pplayer->attribute_block_buffer.clear();
629 
630  // Clears units and cities.
631  unit_list_iterate(pplayer->units, punit)
632  {
633  // Unload all cargos.
635  {
636  unit_transport_unload(pcargo);
637  if (client) {
638  pcargo->client.transported_by = -1;
639  }
640  }
642  // Unload the unit.
643  unit_transport_unload(punit);
644  if (client) {
645  punit->client.transported_by = -1;
646  }
647 
648  game_remove_unit(&wld, punit);
649  }
651 
652  city_list_iterate(pplayer->cities, pcity)
653  {
654  game_remove_city(&wld, pcity);
655  }
657 
658  if (full) {
659  team_remove_player(pplayer);
660 
661  /* This comes last because log calls in the above functions
662  * may use it. */
663  if (pplayer->nation != nullptr) {
664  player_set_nation(pplayer, nullptr);
665  }
666  }
667 }
668 
673 void player_ruleset_close(struct player *pplayer)
674 {
675  pplayer->government = nullptr;
676  pplayer->target_government = nullptr;
677  player_set_nation(pplayer, nullptr);
678  pplayer->style = nullptr;
679 }
680 
684 void player_destroy(struct player *pplayer)
685 {
686  struct player_slot *pslot;
687 
688  fc_assert_ret(nullptr != pplayer);
689 
690  pslot = pplayer->slot;
691  fc_assert(pslot->player == pplayer);
692 
693  delete pplayer->tile_known;
694  if (!is_server()) {
696  {
697  pplayer->client.tile_vision[v]->clear();
698  delete pplayer->client.tile_vision[v];
699  }
701  }
702  // Remove all that is game-dependent in the player structure.
703  player_clear(pplayer, true);
704 
705  fc_assert(0 == unit_list_size(pplayer->units));
706  unit_list_destroy(pplayer->units);
707  fc_assert(0 == city_list_size(pplayer->cities));
708  city_list_destroy(pplayer->cities);
709 
710  fc_assert(conn_list_size(pplayer->connections) == 0);
711  conn_list_destroy(pplayer->connections);
712 
713  players_iterate(aplayer)
714  {
715  // destroy the diplomatics states of this player with others ...
716  player_diplstate_destroy(pplayer, aplayer);
717  // and of others with this player.
718  if (aplayer != pplayer) {
719  player_diplstate_destroy(aplayer, pplayer);
720  }
721  }
723  delete[] pplayer->diplstates;
724 
725  // Clear player color.
726  if (pplayer->rgb) {
727  rgbcolor_destroy(pplayer->rgb);
728  }
729 
730  delete pplayer;
731  pplayer = nullptr;
732  pslot->player = nullptr;
733  player_slots.used_slots--;
734 }
735 
739 int player_count() { return player_slots.used_slots; }
740 
748 int player_index(const struct player *pplayer)
749 {
750  return player_number(pplayer);
751 }
752 
756 int player_number(const struct player *pplayer)
757 {
758  fc_assert_ret_val(nullptr != pplayer, 0);
759  return player_slot_index(pplayer->slot);
760 }
761 
768 struct player *player_by_number(const int player_id)
769 {
770  struct player_slot *pslot = player_slot_by_number(player_id);
771 
772  return (nullptr != pslot ? player_slot_get_player(pslot) : nullptr);
773 }
774 
780 bool player_set_nation(struct player *pplayer, struct nation_type *pnation)
781 {
782  if (pplayer->nation != pnation) {
783  if (pplayer->nation) {
784  fc_assert(pplayer->nation->player == pplayer);
785  pplayer->nation->player = nullptr;
786  }
787  if (pnation) {
788  fc_assert(pnation->player == nullptr);
789  pnation->player = pplayer;
790  }
791  pplayer->nation = pnation;
792  return true;
793  }
794  return false;
795 }
796 
800 struct player *player_by_name(const char *name)
801 {
802  players_iterate(pplayer)
803  {
804  if (fc_strcasecmp(name, pplayer->name) == 0) {
805  return pplayer;
806  }
807  }
809 
810  return nullptr;
811 }
812 
816 const char *player_name(const struct player *pplayer)
817 {
818  if (!pplayer) {
819  return nullptr;
820  }
821  return pplayer->name;
822 }
823 
830 static const char *player_name_by_number(int i)
831 {
832  struct player *pplayer;
833 
834  pplayer = player_by_number(i);
835  return player_name(pplayer);
836 }
837 
841 struct player *player_by_name_prefix(const char *name,
842  enum m_pre_result *result)
843 {
844  int ind;
845 
848  effectivestrlenquote, name, &ind);
849 
850  if (*result < M_PRE_AMBIGUOUS) {
851  return player_by_number(ind);
852  } else {
853  return nullptr;
854  }
855 }
856 
860 struct player *player_by_user(const char *name)
861 {
862  players_iterate(pplayer)
863  {
864  if (fc_strcasecmp(name, pplayer->username) == 0) {
865  return pplayer;
866  }
867  }
869 
870  return nullptr;
871 }
872 
876 int player_age(const struct player *pplayer)
877 {
878  fc_assert_ret_val(pplayer != nullptr, 0);
879  return pplayer->turns_alive;
880 }
881 
889 bool player_can_trust_tile_has_no_units(const struct player *pplayer,
890  const struct tile *ptile)
891 {
892  // Can't see invisible units.
893  if (!fc_funcs->player_tile_vision_get(ptile, pplayer, V_INVIS)
894  || !fc_funcs->player_tile_vision_get(ptile, pplayer, V_SUBSURFACE)) {
895  return false;
896  }
897 
898  // Units within some extras may be hidden.
899  if (!pplayers_allied(pplayer, ptile->extras_owner)) {
901  {
902  if (tile_has_extra(ptile, pextra)) {
903  return false;
904  }
905  }
907  }
908 
909  return true;
910 }
911 
917 bool can_player_see_hypotetic_units_at(const struct player *pplayer,
918  const struct tile *ptile)
919 {
920  struct city *pcity;
921 
922  if (!player_can_trust_tile_has_no_units(pplayer, ptile)) {
923  // The existance of any units at all is hidden from the player.
924  return false;
925  }
926 
927  // Can't see city units.
928  pcity = tile_city(ptile);
929  if (pcity && !can_player_see_units_in_city(pplayer, pcity)
930  && city_is_occupied(tile_city(ptile))) {
931  return false;
932  }
933 
934  // Can't see non allied units in transports.
935  unit_list_iterate(ptile->units, punit)
936  {
937  if (unit_type_get(punit)->transport_capacity > 0
938  && unit_owner(punit) != pplayer) {
939  // An ally could transport a non ally
940  if (unit_list_size(punit->transporting) > 0) {
941  return false;
942  }
943  }
944  }
946 
947  return true;
948 }
949 
959 bool can_player_see_unit_at(const struct player *pplayer,
960  const struct unit *punit,
961  const struct tile *ptile, bool is_transported)
962 {
963  struct city *pcity;
964 
965  // If the player can't even see the tile...
966  if (TILE_KNOWN_SEEN != tile_get_known(ptile, pplayer)) {
967  return false;
968  }
969 
970  /* Don't show non-allied units that are in transports. This is logical
971  * because allied transports can also contain our units. Shared vision
972  * isn't taken into account. */
973  if (is_transported && unit_owner(punit) != pplayer
974  && !pplayers_allied(pplayer, unit_owner(punit))) {
975  return false;
976  }
977 
978  // Units in cities may be hidden.
979  pcity = tile_city(ptile);
980  if (pcity && !can_player_see_units_in_city(pplayer, pcity)) {
981  return false;
982  }
983 
984  // Units within some extras may be hidden.
985  if (!pplayers_allied(pplayer, ptile->extras_owner)) {
986  const struct unit_type *ptype = unit_type_get(punit);
987 
989  {
990  if (tile_has_extra(ptile, pextra)
991  && is_native_extra_to_utype(pextra, ptype)) {
992  return false;
993  }
994  }
996  }
997 
998  // Allied or non-hiding units are always seen.
999  if (pplayers_allied(unit_owner(punit), pplayer)
1000  || !is_hiding_unit(punit)) {
1001  return true;
1002  }
1003 
1004  // Hiding units are only seen by the V_INVIS fog layer.
1005  return fc_funcs->player_tile_vision_get(ptile, pplayer,
1006  unit_type_get(punit)->vlayer);
1007 
1008  return false;
1009 }
1010 
1016 bool can_player_see_unit(const struct player *pplayer,
1017  const struct unit *punit)
1018 {
1019  return can_player_see_unit_at(pplayer, punit, unit_tile(punit),
1020  unit_transported(punit));
1021 }
1022 
1045 bool can_player_see_units_in_city(const struct player *pplayer,
1046  const struct city *pcity)
1047 {
1048  return (!pplayer || can_player_see_city_internals(pplayer, pcity)
1049  || pplayers_allied(pplayer, city_owner(pcity)));
1050 }
1051 
1060 bool can_player_see_city_internals(const struct player *pplayer,
1061  const struct city *pcity)
1062 {
1063  return (!pplayer || pplayer == city_owner(pcity));
1064 }
1065 
1074 bool player_can_see_city_externals(const struct player *pow_player,
1075  const struct city *target_city)
1076 {
1077  fc_assert_ret_val(target_city, false);
1078  fc_assert_ret_val(pow_player, false);
1079 
1080  if (can_player_see_city_internals(pow_player, target_city)) {
1081  // City internals includes city externals.
1082  return true;
1083  }
1084 
1085  if (tile_is_seen(city_tile(target_city), pow_player)) {
1086  // The tile is being observed.
1087  return true;
1088  }
1089 
1090  fc_assert_ret_val(target_city->routes, false);
1091 
1092  trade_partners_iterate(target_city, trade_city)
1093  {
1094  if (city_owner(trade_city) == pow_player) {
1095  // Revealed because of the trade route.
1096  return true;
1097  }
1098  }
1100 
1101  return false;
1102 }
1103 
1113 struct city *player_city_by_number(const struct player *pplayer, int city_id)
1114 {
1115  // We call idex directly. Should use game_city_by_number() instead?
1116  struct city *pcity = idex_lookup_city(&wld, city_id);
1117 
1118  if (!pcity) {
1119  return nullptr;
1120  }
1121 
1122  if (!pplayer || (city_owner(pcity) == pplayer)) {
1123  // Correct owner
1124  return pcity;
1125  }
1126 
1127  return nullptr;
1128 }
1129 
1139 struct unit *player_unit_by_number(const struct player *pplayer, int unit_id)
1140 {
1141  // We call idex directly. Should use game_unit_by_number() instead?
1142  struct unit *punit = idex_lookup_unit(&wld, unit_id);
1143 
1144  if (!punit) {
1145  return nullptr;
1146  }
1147 
1148  if (!pplayer || (unit_owner(punit) == pplayer)) {
1149  // Correct owner
1150  return punit;
1151  }
1152 
1153  return nullptr;
1154 }
1155 
1159 bool player_in_city_map(const struct player *pplayer,
1160  const struct tile *ptile)
1161 {
1163  {
1164  struct city *pcity = tile_city(ptile1);
1165 
1166  if (pcity && (pplayer == nullptr || city_owner(pcity) == pplayer)
1167  && city_map_radius_sq_get(pcity) >= sq_map_distance(ptile, ptile1)) {
1168  return true;
1169  }
1170  }
1172 
1173  return false;
1174 }
1175 
1181 int num_known_tech_with_flag(const struct player *pplayer,
1182  enum tech_flag_id flag)
1183 {
1184  return research_get(pplayer)->num_known_tech_with_flag[flag];
1185 }
1186 
1194 int player_get_expected_income(const struct player *pplayer)
1195 {
1196  int income = 0;
1197 
1198  /* City income/expenses. */
1199  city_list_iterate(pplayer->cities, pcity)
1200  {
1201  // Gold suplus accounts for imcome plus building and unit upkeep.
1202  income += pcity->surplus[O_GOLD];
1203 
1204  /* Gold upkeep for buildings and units is defined by the setting
1205  * 'game.info.gold_upkeep_style':
1206  * GOLD_UPKEEP_CITY: Cities pay for buildings and units (this is
1207  * included in pcity->surplus[O_GOLD]).
1208  * GOLD_UPKEEP_MIXED: Cities pay only for buildings; the nation pays
1209  * for units.
1210  * GOLD_UPKEEP_NATION: The nation pays for buildings and units. */
1211  switch (game.info.gold_upkeep_style) {
1212  case GOLD_UPKEEP_CITY:
1213  break;
1214  case GOLD_UPKEEP_NATION:
1215  // Nation pays for buildings (and units).
1216  income -= city_total_impr_gold_upkeep(pcity);
1217  fc__fallthrough; // No break.
1218  case GOLD_UPKEEP_MIXED:
1219  // Nation pays for units.
1220  income -= city_total_unit_gold_upkeep(pcity);
1221  break;
1222  }
1223 
1224  // Capitalization income.
1225  if (city_production_has_flag(pcity, IF_GOLD)) {
1226  income += pcity->shield_stock + pcity->surplus[O_SHIELD];
1227  }
1228  }
1230 
1231  return income;
1232 }
1233 
1238 bool player_knows_techs_with_flag(const struct player *pplayer,
1239  enum tech_flag_id flag)
1240 {
1241  return num_known_tech_with_flag(pplayer, flag) > 0;
1242 }
1243 
1247 struct city *player_primary_capital(const struct player *pplayer)
1248 {
1249  struct city *capital;
1250 
1251  if (!pplayer) {
1252  // The client depends on this behavior in some places.
1253  return nullptr;
1254  }
1255 
1256  capital = player_city_by_number(pplayer, pplayer->primary_capital_id);
1257 
1258  return capital;
1259 }
1260 
1264 std::vector<city *> player_gov_centers(const struct player *pplayer)
1265 {
1266  fc_assert_ret_val(pplayer, {});
1267 
1268  auto centers = std::vector<city *>();
1269  city_list_iterate(pplayer->cities, gc)
1270  {
1271  if (is_gov_center(gc)) {
1272  centers.push_back(gc);
1273  }
1274  }
1276 
1277  return centers;
1278 }
1279 
1283 const char *love_text(const int love)
1284 {
1285  if (love <= -MAX_AI_LOVE * 90 / 100) {
1286  /* TRANS: These words should be adjectives which can fit in the sentence
1287  "The x are y towards us"
1288  "The Babylonians are respectful towards us" */
1289  return Q_("?attitude:Genocidal");
1290  } else if (love <= -MAX_AI_LOVE * 70 / 100) {
1291  return Q_("?attitude:Belligerent");
1292  } else if (love <= -MAX_AI_LOVE * 50 / 100) {
1293  return Q_("?attitude:Hostile");
1294  } else if (love <= -MAX_AI_LOVE * 25 / 100) {
1295  return Q_("?attitude:Uncooperative");
1296  } else if (love <= -MAX_AI_LOVE * 10 / 100) {
1297  return Q_("?attitude:Uneasy");
1298  } else if (love <= MAX_AI_LOVE * 10 / 100) {
1299  return Q_("?attitude:Neutral");
1300  } else if (love <= MAX_AI_LOVE * 25 / 100) {
1301  return Q_("?attitude:Respectful");
1302  } else if (love <= MAX_AI_LOVE * 50 / 100) {
1303  return Q_("?attitude:Helpful");
1304  } else if (love <= MAX_AI_LOVE * 70 / 100) {
1305  return Q_("?attitude:Enthusiastic");
1306  } else if (love <= MAX_AI_LOVE * 90 / 100) {
1307  return Q_("?attitude:Admiring");
1308  } else {
1309  fc_assert(love > MAX_AI_LOVE * 90 / 100);
1310  return Q_("?attitude:Worshipful");
1311  }
1312 }
1313 
1317 bool pplayers_at_war(const struct player *pplayer,
1318  const struct player *pplayer2)
1319 {
1320  enum diplstate_type ds;
1321 
1322  if (pplayer == pplayer2) {
1323  return false;
1324  }
1325 
1326  ds = player_diplstate_get(pplayer, pplayer2)->type;
1327 
1328  return ds == DS_WAR || ds == DS_NO_CONTACT;
1329 }
1330 
1334 bool pplayers_allied(const struct player *pplayer,
1335  const struct player *pplayer2)
1336 {
1337  enum diplstate_type ds;
1338 
1339  if (!pplayer || !pplayer2) {
1340  return false;
1341  }
1342 
1343  if (pplayer == pplayer2) {
1344  return true;
1345  }
1346 
1347  ds = player_diplstate_get(pplayer, pplayer2)->type;
1348 
1349  return (ds == DS_ALLIANCE || ds == DS_TEAM);
1350 }
1351 
1355 bool pplayers_in_peace(const struct player *pplayer,
1356  const struct player *pplayer2)
1357 {
1358  enum diplstate_type ds = player_diplstate_get(pplayer, pplayer2)->type;
1359 
1360  if (pplayer == pplayer2) {
1361  return true;
1362  }
1363 
1364  return (ds == DS_PEACE || ds == DS_ALLIANCE || ds == DS_ARMISTICE
1365  || ds == DS_TEAM);
1366 }
1367 
1371 bool players_non_invade(const struct player *pplayer1,
1372  const struct player *pplayer2)
1373 {
1374  if (pplayer1 == pplayer2 || !pplayer1 || !pplayer2) {
1375  return false;
1376  }
1377 
1378  /* Movement during armistice is allowed so that player can withdraw
1379  units deeper inside opponent territory. */
1380 
1381  return player_diplstate_get(pplayer1, pplayer2)->type == DS_PEACE;
1382 }
1383 
1388 bool pplayers_non_attack(const struct player *pplayer,
1389  const struct player *pplayer2)
1390 {
1391  enum diplstate_type ds;
1392 
1393  if (pplayer == pplayer2) {
1394  return false;
1395  }
1396 
1397  ds = player_diplstate_get(pplayer, pplayer2)->type;
1398 
1399  return (ds == DS_PEACE || ds == DS_CEASEFIRE || ds == DS_ARMISTICE);
1400 }
1401 
1405 bool players_on_same_team(const struct player *pplayer1,
1406  const struct player *pplayer2)
1407 {
1408  return pplayer1->team == pplayer2->team;
1409 }
1410 
1414 bool gives_shared_vision(const struct player *me, const struct player *them)
1415 {
1416  return BV_ISSET(me->gives_shared_vision, player_index(them));
1417 }
1418 
1422 bool is_diplrel_between(const struct player *player1,
1423  const struct player *player2, int diplrel)
1424 {
1425  fc_assert(player1 != nullptr);
1426  fc_assert(player2 != nullptr);
1427 
1428  // No relationship to it self.
1429  if (player1 == player2 && diplrel != DRO_FOREIGN) {
1430  return false;
1431  }
1432 
1433  if (diplrel < DS_LAST) {
1434  return player_diplstate_get(player1, player2)->type == diplrel;
1435  }
1436 
1437  switch (static_cast<diplrel_other>(diplrel)) {
1438  case DRO_GIVES_SHARED_VISION:
1439  return gives_shared_vision(player1, player2);
1440  case DRO_RECEIVES_SHARED_VISION:
1441  return gives_shared_vision(player2, player1);
1442  case DRO_HOSTS_EMBASSY:
1443  return player_has_embassy(player2, player1);
1444  case DRO_HAS_EMBASSY:
1445  return player_has_embassy(player1, player2);
1446  case DRO_HOSTS_REAL_EMBASSY:
1447  return player_has_real_embassy(player2, player1);
1448  case DRO_HAS_REAL_EMBASSY:
1449  return player_has_real_embassy(player1, player2);
1450  case DRO_HAS_CASUS_BELLI:
1451  return 0 < player_diplstate_get(player1, player2)->has_reason_to_cancel;
1452  case DRO_PROVIDED_CASUS_BELLI:
1453  return 0 < player_diplstate_get(player2, player1)->has_reason_to_cancel;
1454  case DRO_FOREIGN:
1455  return player1 != player2;
1456  case DRO_HAS_CONTACT:
1457  return player_diplstate_get(player2, player1)->contact_turns_left > 0;
1458  case DRO_LAST:
1459  break;
1460  }
1461 
1462  fc_assert_msg(false, "diplrel_between(): invalid diplrel number %d.",
1463  diplrel);
1464 
1465  return false;
1466 }
1467 
1471 bool is_diplrel_to_other(const struct player *pplayer, int diplrel)
1472 {
1473  fc_assert(pplayer != nullptr);
1474 
1475  players_iterate_alive(oplayer)
1476  {
1477  if (oplayer == pplayer) {
1478  continue;
1479  }
1480  if (is_diplrel_between(pplayer, oplayer, diplrel)) {
1481  return true;
1482  }
1483  }
1485  return false;
1486 }
1487 
1492 int diplrel_by_rule_name(const char *value)
1493 {
1494  // Look for asymmetric diplomatic relations
1495  int diplrel = diplrel_other_by_name(value, fc_strcasecmp);
1496 
1497  if (diplrel != diplrel_other_invalid()) {
1498  return diplrel;
1499  }
1500 
1501  // Look for symmetric diplomatic relations
1502  diplrel = diplstate_type_by_name(value, fc_strcasecmp);
1503 
1504  /*
1505  * Make sure DS_LAST isn't returned as DS_LAST is the first diplrel_other.
1506  *
1507  * Can't happend now. This is in case that changes in the future. */
1508  fc_assert_ret_val(diplrel != DS_LAST, diplrel_other_invalid());
1509 
1510  /*
1511  * Make sure that diplrel_other_invalid() is returned.
1512  *
1513  * Can't happen now. At the moment dpilrel_asym_invalid() is the same as
1514  * diplstate_type_invalid(). This is in case that changes in the future.
1515  */
1516  if (diplrel != diplstate_type_invalid()) {
1517  return diplrel;
1518  }
1519 
1520  return diplrel_other_invalid();
1521 }
1522 
1526 const char *diplrel_rule_name(int value)
1527 {
1528  if (value < DS_LAST) {
1529  return diplstate_type_name(diplstate_type(value));
1530  } else {
1531  return diplrel_other_name(diplrel_other(value));
1532  }
1533 }
1534 
1538 const char *diplrel_name_translation(int value)
1539 {
1540  if (value < DS_LAST) {
1541  return diplstate_type_translated_name(diplstate_type(value));
1542  } else {
1543  return _(diplrel_other_name(diplrel_other(value)));
1544  }
1545 }
1546 
1551 enum casus_belli_range casus_belli_range_for(const struct player *offender,
1552  const struct player *tgt_plr,
1553  const enum effect_type outcome,
1554  const struct action *paction,
1555  const struct tile *tgt_tile)
1556 {
1557  int casus_belli_amount;
1558 
1559  /* The victim gets a casus belli if CASUS_BELLI_VICTIM or above. Everyone
1560  * gets a casus belli if CASUS_BELLI_OUTRAGE or above. */
1561  casus_belli_amount = get_target_bonus_effects(
1562  nullptr, offender, tgt_plr, tile_city(tgt_tile), nullptr, tgt_tile,
1563  nullptr, nullptr, nullptr, nullptr, paction, outcome);
1564 
1565  if (casus_belli_amount >= CASUS_BELLI_OUTRAGE) {
1566  /* International outrage: This isn't just between the offender and the
1567  * victim. */
1568  return CBR_INTERNATIONAL_OUTRAGE;
1569  }
1570 
1571  if (casus_belli_amount >= CASUS_BELLI_VICTIM) {
1572  /* In this situation the specified action provides a casus belli
1573  * against the actor. */
1574  return CBR_VICTIM_ONLY;
1575  }
1576 
1577  return CBR_NONE;
1578 }
1579 
1580 /* The number of mutually exclusive requirement sets that
1581  * diplrel_mess_gen() creates for the DiplRel requirement type. */
1582 #define DIPLREL_MESS_SIZE (3 + (DRO_LAST * (5 + 4 + 3 + 2 + 1)))
1583 
1592 static bv_diplrel_all_reqs *diplrel_mess_gen()
1593 {
1594  // The ranges supported by the DiplRel requiremnt type.
1595  const enum req_range legal_ranges[] = {REQ_RANGE_LOCAL, REQ_RANGE_PLAYER,
1596  REQ_RANGE_ALLIANCE, REQ_RANGE_TEAM,
1597  REQ_RANGE_WORLD};
1598 
1599  // Iterators.
1600  int rel;
1601  int i;
1602  int j;
1603 
1604  // Storage for the mutually exclusive requirement sets.
1605  bv_diplrel_all_reqs *mess = new bv_diplrel_all_reqs[DIPLREL_MESS_SIZE];
1606 
1607  // Position in mess.
1608  int mess_pos = 0;
1609 
1610  // The first mutually exclusive set is about local diplstate.
1611  BV_CLR_ALL(mess[mess_pos]);
1612 
1613  // It is not possible to have more than one diplstate to a nation.
1614  BV_SET(mess[mess_pos],
1615  requirement_diplrel_ereq(DS_ARMISTICE, REQ_RANGE_LOCAL, true));
1616  BV_SET(mess[mess_pos],
1617  requirement_diplrel_ereq(DS_WAR, REQ_RANGE_LOCAL, true));
1618  BV_SET(mess[mess_pos],
1619  requirement_diplrel_ereq(DS_CEASEFIRE, REQ_RANGE_LOCAL, true));
1620  BV_SET(mess[mess_pos],
1621  requirement_diplrel_ereq(DS_PEACE, REQ_RANGE_LOCAL, true));
1622  BV_SET(mess[mess_pos],
1623  requirement_diplrel_ereq(DS_ALLIANCE, REQ_RANGE_LOCAL, true));
1624  BV_SET(mess[mess_pos],
1625  requirement_diplrel_ereq(DS_NO_CONTACT, REQ_RANGE_LOCAL, true));
1626  BV_SET(mess[mess_pos],
1627  requirement_diplrel_ereq(DS_TEAM, REQ_RANGE_LOCAL, true));
1628 
1629  // It is not possible to have a diplstate to your self.
1630  BV_SET(mess[mess_pos],
1631  requirement_diplrel_ereq(DRO_FOREIGN, REQ_RANGE_LOCAL, false));
1632 
1633  mess_pos++;
1634 
1635  // Having a real embassy excludes not having an embassy.
1636  BV_CLR_ALL(mess[mess_pos]);
1637 
1638  BV_SET(mess[mess_pos], requirement_diplrel_ereq(DRO_HAS_REAL_EMBASSY,
1639  REQ_RANGE_LOCAL, true));
1640  BV_SET(mess[mess_pos],
1641  requirement_diplrel_ereq(DRO_HAS_EMBASSY, REQ_RANGE_LOCAL, false));
1642 
1643  mess_pos++;
1644 
1645  // Hosting a real embassy excludes not hosting an embassy.
1646  BV_CLR_ALL(mess[mess_pos]);
1647 
1648  BV_SET(mess[mess_pos], requirement_diplrel_ereq(DRO_HOSTS_REAL_EMBASSY,
1649  REQ_RANGE_LOCAL, true));
1650  BV_SET(mess[mess_pos], requirement_diplrel_ereq(DRO_HOSTS_EMBASSY,
1651  REQ_RANGE_LOCAL, false));
1652 
1653  mess_pos++;
1654 
1655  // Loop over diplstate_type and diplrel_other.
1656  for (rel = 0; rel < DRO_LAST; rel++) {
1657  /* The presence of a DiplRel at a more local range proves that it can't
1658  * be absent in a more global range. (The alliance range includes the
1659  * Team range) */
1660  for (i = 0; i < 5; i++) {
1661  for (j = i; j < 5; j++) {
1662  BV_CLR_ALL(mess[mess_pos]);
1663 
1664  BV_SET(mess[mess_pos],
1665  requirement_diplrel_ereq(rel, legal_ranges[i], true));
1666  BV_SET(mess[mess_pos],
1667  requirement_diplrel_ereq(rel, legal_ranges[j], false));
1668 
1669  mess_pos++;
1670  }
1671  }
1672  }
1673 
1674  // No uninitialized element exists.
1675  fc_assert(mess_pos == DIPLREL_MESS_SIZE);
1676 
1677  return mess;
1678 }
1679 
1680 /* An array of mutually exclusive requirement sets for the DiplRel
1681  * requirement type. Is initialized the first time diplrel_mess_get() is
1682  * called. */
1683 static bv_diplrel_all_reqs *diplrel_mess = nullptr;
1684 
1688 static bv_diplrel_all_reqs *diplrel_mess_get()
1689 {
1690  if (diplrel_mess == nullptr) {
1691  // This is the first call. Initialize diplrel_mess.
1693  }
1694 
1695  return diplrel_mess;
1696 }
1697 
1702 {
1703  delete[] diplrel_mess;
1704  diplrel_mess = nullptr;
1705 }
1706 
1714 bv_diplrel_all_reqs diplrel_req_contradicts(const struct requirement *req)
1715 {
1716  int diplrel_req_num;
1717  bv_diplrel_all_reqs *mess;
1718  bv_diplrel_all_reqs known;
1719  int set;
1720 
1721  // Nothing is known to contradict the requirement yet.
1722  BV_CLR_ALL(known);
1723 
1724  if (req->source.kind != VUT_DIPLREL) {
1725  // No known contradiction of a requirement of any other kind.
1726  fc_assert(req->source.kind == VUT_DIPLREL);
1727 
1728  return known;
1729  }
1730 
1731  /* Convert the requirement to its position in the enumeration of all
1732  * DiplRel requirements. */
1733  diplrel_req_num = requirement_diplrel_ereq(req->source.value.diplrel,
1734  req->range, req->present);
1735 
1736  // Get the mutually exclusive requirement sets for DiplRel.
1737  mess = diplrel_mess_get();
1738 
1739  // Add all known contradictions.
1740  for (set = 0; set < DIPLREL_MESS_SIZE; set++) {
1741  if (BV_ISSET(mess[set], diplrel_req_num)) {
1742  /* The requirement req is mentioned in the set. It is therefore known
1743  * that all other requirements in the set contradicts it. They should
1744  * therefore be added to the known contradictions. */
1745  BV_SET_ALL_FROM(known, mess[set]);
1746  }
1747  }
1748 
1749  /* The requirement isn't self contradicting. It was set by the mutually
1750  * exclusive requirement sets that mentioned it. Remove it. */
1751  BV_CLR(known, diplrel_req_num);
1752 
1753  return known;
1754 }
1755 
1761 int player_in_territory(const struct player *pplayer,
1762  const struct player *pplayer2)
1763 {
1764  int in_territory = 0;
1765 
1766  /* This algorithm should work at server or client. It only returns the
1767  * number of visible units (a unit can potentially hide inside the
1768  * transport of a different player).
1769  *
1770  * Note this may be quite slow. An even slower alternative is to iterate
1771  * over the entire map, checking all units inside the player's territory
1772  * to see if they're owned by the enemy. */
1773  unit_list_iterate(pplayer2->units, punit)
1774  {
1775  /* Get the owner of the tile/territory. */
1776  struct player *owner = tile_owner(unit_tile(punit));
1777 
1778  if (owner == pplayer && can_player_see_unit(pplayer, punit)) {
1779  // Found one!
1780  in_territory += 1;
1781  }
1782  }
1784 
1785  return in_territory;
1786 }
1787 
1793 bool is_valid_username(const char *name)
1794 {
1795  QString username(name);
1796 
1797  if (username.isEmpty()) {
1798  return false;
1799  }
1800  if (username[0].isDigit()) {
1801  return false;
1802  }
1803 
1804  if (!username.compare(QStringLiteral(ANON_USER_NAME),
1805  Qt::CaseInsensitive)) {
1806  return false;
1807  }
1808 
1809  for (auto ch : username) {
1810  if (ch.isLetterOrNumber()) {
1811  continue;
1812  }
1813  if (ch == '#' || ch == '_') {
1814  continue;
1815  }
1816  return false;
1817  }
1818 
1819  return true;
1820 }
1821 
1825 bool is_settable_ai_level(enum ai_level level)
1826 {
1827  if (level == AI_LEVEL_AWAY) {
1828  // Cannot set away level for AI
1829  return false;
1830  }
1831 
1832  return true;
1833 }
1834 
1838 void *player_ai_data(const struct player *pplayer, const struct ai_type *ai)
1839 {
1840  return pplayer->server.ais[ai_type_number(ai)];
1841 }
1842 
1846 void player_set_ai_data(struct player *pplayer, const struct ai_type *ai,
1847  void *data)
1848 {
1849  pplayer->server.ais[ai_type_number(ai)] = data;
1850 }
1851 
1856 int player_multiplier_value(const struct player *pplayer,
1857  const struct multiplier *pmul)
1858 {
1859  return pplayer->multipliers[multiplier_index(pmul)];
1860 }
1861 
1867 int player_multiplier_effect_value(const struct player *pplayer,
1868  const struct multiplier *pmul)
1869 {
1870  return (player_multiplier_value(pplayer, pmul) + pmul->offset)
1871  * pmul->factor;
1872 }
1873 
1879 int player_multiplier_target_value(const struct player *pplayer,
1880  const struct multiplier *pmul)
1881 {
1882  return pplayer->multipliers_target[multiplier_index(pmul)];
1883 }
1884 
1888 bool player_has_flag(const struct player *pplayer, enum plr_flag_id flag)
1889 {
1890  return BV_ISSET(pplayer->flags, flag);
1891 }
int ai_type_number(const struct ai_type *ai)
Returns id of the given ai_type.
Definition: ai.cpp:47
#define BV_SET_ALL_FROM(vec_to, vec_from)
Definition: bitvector.h:86
#define BV_CLR_ALL(bv)
Definition: bitvector.h:62
#define BV_SET(bv, bit)
Definition: bitvector.h:44
bool BV_ISSET(const BV &bv, int bit)
Definition: bitvector.h:37
#define BV_CLR(bv, bit)
Definition: bitvector.h:49
struct player * city_owner(const struct city *pcity)
Return the owner of the city.
Definition: city.cpp:1083
struct tile * city_tile(const struct city *pcity)
Return the tile location of the city.
Definition: city.cpp:1095
bool city_production_has_flag(const struct city *pcity, enum impr_flag_id flag)
Return TRUE when the current production has this flag.
Definition: city.cpp:691
bool city_is_occupied(const struct city *pcity)
Returns TRUE iff the city is occupied.
Definition: city.cpp:1584
int city_map_radius_sq_get(const struct city *pcity)
Returns the current squared radius of the city.
Definition: city.cpp:130
bool is_gov_center(const struct city *pcity)
Return TRUE iff this city is governmental center.
Definition: city.cpp:1503
int city_total_unit_gold_upkeep(const struct city *pcity)
Get the total amount of gold needed to pay upkeep costs for all supported units of the city.
Definition: city.cpp:1168
int city_total_impr_gold_upkeep(const struct city *pcity)
Returns the total amount of gold needed to pay for all buildings in the city.
Definition: city.cpp:1147
#define city_list_iterate(citylist, pcity)
Definition: city.h:482
#define city_tile_iterate(_radius_sq, _city_tile, _tile)
Definition: city.h:202
#define CITY_MAP_MAX_RADIUS_SQ
Definition: city.h:59
#define city_list_iterate_end
Definition: city.h:484
#define city_tile_iterate_end
Definition: city.h:209
struct civclient client
int get_target_bonus_effects(struct effect_list *plist, const struct player *target_player, const struct player *other_player, const struct city *target_city, const struct impr_type *target_building, const struct tile *target_tile, const struct unit *target_unit, const struct unit_type *target_unittype, const struct output_type *target_output, const struct specialist *target_specialist, const struct action *target_action, enum effect_type effect_type, enum vision_layer vision_layer, enum national_intelligence nintel)
Returns the effect bonus of a given type for any target.
Definition: effects.cpp:611
int get_player_bonus(const struct player *pplayer, enum effect_type effect_type)
Returns the effect bonus for a player.
Definition: effects.cpp:673
struct extra_type_list * extra_type_list_of_unit_hiders()
Returns extra types that hide units.
Definition: extras.cpp:234
bool is_native_extra_to_utype(const struct extra_type *pextra, const struct unit_type *punittype)
Is extra native to unit type?
Definition: extras.cpp:770
#define extra_type_list_iterate(extralist, pextra)
Definition: extras.h:145
#define extra_type_list_iterate_end
Definition: extras.h:147
const struct functions * fc_funcs
#define CASUS_BELLI_OUTRAGE
Definition: fc_types.h:399
#define MAX_NUM_PLAYER_SLOTS
Definition: fc_types.h:24
#define CASUS_BELLI_VICTIM
Definition: fc_types.h:393
#define MAX_LEN_NAME
Definition: fc_types.h:61
@ O_SHIELD
Definition: fc_types.h:86
@ O_GOLD
Definition: fc_types.h:88
#define Q_(String)
Definition: fcintl.h:53
#define _(String)
Definition: fcintl.h:50
struct civ_game game
Definition: game.cpp:47
bool is_server()
Is program type server?
Definition: game.cpp:57
struct world wld
Definition: game.cpp:48
void game_remove_unit(struct world *gworld, struct unit *punit)
In the server call wipe_unit(), and never this function directly.
Definition: game.cpp:120
void game_remove_city(struct world *gworld, struct city *pcity)
Remove city from game.
Definition: game.cpp:166
struct unit * idex_lookup_unit(struct world *iworld, int id)
Lookup unit with given id.
Definition: idex.cpp:152
struct city * idex_lookup_city(struct world *iworld, int id)
Lookup city with given id.
Definition: idex.cpp:139
#define WONDER_NOT_BUILT
Definition: improvement.h:144
#define B_LAST
Definition: improvement.h:33
const char * name
Definition: inputfile.cpp:118
#define fc_assert_msg(condition, message,...)
Definition: log.h:96
#define fc_assert_ret(condition)
Definition: log.h:112
#define fc_assert(condition)
Definition: log.h:89
#define fc_assert_ret_val(condition, val)
Definition: log.h:114
#define log_debug(message,...)
Definition: log.h:65
int sq_map_distance(const struct tile *tile0, const struct tile *tile1)
Return squared distance between two tiles.
Definition: map.cpp:610
Multiplier_type_id multiplier_index(const struct multiplier *pmul)
Returns multiplier index.
Definition: multipliers.cpp:77
#define NO_NATION_SELECTED
Definition: nation.h:21
bool is_settable_ai_level(enum ai_level level)
Return is AI can be set to given level.
Definition: player.cpp:1825
bool player_can_invade_tile(const struct player *pplayer, const struct tile *ptile)
Return TRUE iff the player can invade a particular tile (linked with borders and diplomatic states).
Definition: player.cpp:236
bool player_knows_techs_with_flag(const struct player *pplayer, enum tech_flag_id flag)
Returns TRUE iff the player knows at least one tech which has the given flag.
Definition: player.cpp:1238
int player_multiplier_effect_value(const struct player *pplayer, const struct multiplier *pmul)
Return the multiplier value currently in effect for pplayer, scaled from display units to the units u...
Definition: player.cpp:1867
static bv_diplrel_all_reqs * diplrel_mess_get()
Get the mutually exclusive requirement sets for DiplRel.
Definition: player.cpp:1688
struct unit * player_unit_by_number(const struct player *pplayer, int unit_id)
If the specified player owns the unit with the specified id, return pointer to the unit struct.
Definition: player.cpp:1139
struct player_slot * player_slot_by_number(int player_id)
Return the possibly unused and uninitialized player slot.
Definition: player.cpp:410
bool player_slot_is_used(const struct player_slot *pslot)
Returns TRUE is this slot is "used" i.e.
Definition: player.cpp:395
bv_diplrel_all_reqs diplrel_req_contradicts(const struct requirement *req)
Get the DiplRel requirements that are known to contradict the specified DiplRel requirement.
Definition: player.cpp:1714
struct player * player_by_name(const char *name)
Find player by given name.
Definition: player.cpp:800
int num_known_tech_with_flag(const struct player *pplayer, enum tech_flag_id flag)
Returns the number of techs the player has researched which has this flag.
Definition: player.cpp:1181
bool is_valid_username(const char *name)
Returns whether this is a valid username.
Definition: player.cpp:1793
static void player_diplstate_new(const struct player *plr1, const struct player *plr2)
Allocate new diplstate structure for tracking state between given two players.
Definition: player.cpp:249
int player_multiplier_target_value(const struct player *pplayer, const struct multiplier *pmul)
Return the player's target value for a multiplier (which may be different from the value currently in...
Definition: player.cpp:1879
enum casus_belli_range casus_belli_range_for(const struct player *offender, const struct player *tgt_plr, const enum effect_type outcome, const struct action *paction, const struct tile *tgt_tile)
Return the Casus Belli range when offender performs paction to tgt_plr at tgt_tile and the outcome is...
Definition: player.cpp:1551
static bv_diplrel_all_reqs * diplrel_mess
Definition: player.cpp:1683
int diplrel_by_rule_name(const char *value)
Return the diplomatic relation that has the given (untranslated) rule name.
Definition: player.cpp:1492
bool player_in_city_map(const struct player *pplayer, const struct tile *ptile)
Return true iff x,y is inside any of the player's city map.
Definition: player.cpp:1159
bool players_on_same_team(const struct player *pplayer1, const struct player *pplayer2)
Return TRUE if players are in the same team.
Definition: player.cpp:1405
int used_slots
Definition: player.cpp:49
bool player_slots_initialised()
Return whether player slots are already initialized.
Definition: player.cpp:341
bool can_player_see_unit_at(const struct player *pplayer, const struct unit *punit, const struct tile *ptile, bool is_transported)
Checks if a unit can be seen by pplayer at (x,y).
Definition: player.cpp:959
enum diplstate_type cancel_pact_result(enum diplstate_type oldstate)
Return the diplomatic state that cancelling a pact will end up in.
Definition: player.cpp:65
int player_multiplier_value(const struct player *pplayer, const struct multiplier *pmul)
Return the multiplier value currently in effect for pplayer (in display units).
Definition: player.cpp:1856
void * player_ai_data(const struct player *pplayer, const struct ai_type *ai)
Return pointer to ai data of given player and ai type.
Definition: player.cpp:1838
struct player * player_by_number(const int player_id)
Return struct player pointer for the given player index.
Definition: player.cpp:768
const char * diplrel_name_translation(int value)
Return the translated name of the given diplomatic relation.
Definition: player.cpp:1538
int player_get_expected_income(const struct player *pplayer)
Return the expected net income of the player this turn.
Definition: player.cpp:1194
int player_number(const struct player *pplayer)
Return the player index/number/id.
Definition: player.cpp:756
enum dipl_reason pplayer_can_make_treaty(const struct player *p1, const struct player *p2, enum diplstate_type treaty)
Returns true iff p1 can make given treaty with p2.
Definition: player.cpp:150
struct player * player_by_name_prefix(const char *name, enum m_pre_result *result)
Find player by its name prefix.
Definition: player.cpp:841
static void player_diplstate_defaults(const struct player *plr1, const struct player *plr2)
Set diplstate between given two players to default values.
Definition: player.cpp:269
static bv_diplrel_all_reqs * diplrel_mess_gen()
Generate and return an array of mutually exclusive requirement sets for the DiplRel requirement type.
Definition: player.cpp:1592
bool is_diplrel_to_other(const struct player *pplayer, int diplrel)
Return TRUE iff pplayer has the diplomatic relation to any living player.
Definition: player.cpp:1471
static bool is_valid_alliance(const struct player *p1, const struct player *p2)
Returns true iff p1 can be in alliance with p2.
Definition: player.cpp:123
bool can_player_see_unit(const struct player *pplayer, const struct unit *punit)
Checks if a unit can be seen by pplayer at its current location.
Definition: player.cpp:1016
int player_count()
Return the number of players.
Definition: player.cpp:739
bool pplayers_at_war(const struct player *pplayer, const struct player *pplayer2)
Returns true iff players can attack each other.
Definition: player.cpp:1317
static const char * player_name_by_number(int i)
Find player by name, allowing unambigous prefix (ie abbreviation).
Definition: player.cpp:830
std::vector< city * > player_gov_centers(const struct player *pplayer)
Locate the player's government centers.
Definition: player.cpp:1264
void player_set_ai_data(struct player *pplayer, const struct ai_type *ai, void *data)
Attach ai data to player.
Definition: player.cpp:1846
const char * love_text(const int love)
Return a text describing an AI's love for you.
Definition: player.cpp:1283
static void player_diplstate_destroy(const struct player *plr1, const struct player *plr2)
Free resources used by diplstate between given two players.
Definition: player.cpp:305
void player_ruleset_close(struct player *pplayer)
Clear the ruleset dependent pointers of the player structure.
Definition: player.cpp:673
void player_clear(struct player *pplayer, bool full)
Clear all player data.
Definition: player.cpp:615
int player_slot_index(const struct player_slot *pslot)
Returns the index of the player slot.
Definition: player.cpp:373
struct player_slot * player_slot_first()
Returns the first player slot.
Definition: player.cpp:358
bool player_has_flag(const struct player *pplayer, enum plr_flag_id flag)
Check if player has given flag.
Definition: player.cpp:1888
bool player_has_real_embassy(const struct player *pplayer, const struct player *pplayer2)
Returns whether pplayer has a real embassy with pplayer2, established from a diplomat,...
Definition: player.cpp:206
void player_set_color(struct player *pplayer, const struct rgbcolor *prgbcolor)
Set the player's color.
Definition: player.cpp:598
int player_slot_max_used_number()
Return the highest used player slot index.
Definition: player.cpp:423
void player_slots_free()
Remove all player slots.
Definition: player.cpp:346
int player_index(const struct player *pplayer)
Return the player index.
Definition: player.cpp:748
void diplrel_mess_close()
Free diplrel_mess.
Definition: player.cpp:1701
struct city * player_primary_capital(const struct player *pplayer)
Locate the player's primary capital city, (nullptr Otherwise)
Definition: player.cpp:1247
int player_in_territory(const struct player *pplayer, const struct player *pplayer2)
Return the number of pplayer2's visible units in pplayer's territory, from the point of view of pplay...
Definition: player.cpp:1761
struct city * player_city_by_number(const struct player *pplayer, int city_id)
If the specified player owns the city with the specified id, return pointer to the city struct.
Definition: player.cpp:1113
bool is_diplrel_between(const struct player *player1, const struct player *player2, int diplrel)
Return TRUE iff player1 has the diplomatic relation to player2.
Definition: player.cpp:1422
struct player_slot * pslots
Definition: player.cpp:48
static struct @64 player_slots
struct player * player_slot_get_player(const struct player_slot *pslot)
Returns the team corresponding to the slot.
Definition: player.cpp:384
bool player_set_nation(struct player *pplayer, struct nation_type *pnation)
Set the player's nation to the given nation (may be nullptr).
Definition: player.cpp:780
#define DIPLREL_MESS_SIZE
Definition: player.cpp:1582
void player_slots_init()
Initialise all player slots (= pointer to player pointers).
Definition: player.cpp:324
bool player_can_see_city_externals(const struct player *pow_player, const struct city *target_city)
Returns TRUE iff pow_player can see externally visible features of target_city.
Definition: player.cpp:1074
const char * player_name(const struct player *pplayer)
Return the leader name of the player.
Definition: player.cpp:816
int player_age(const struct player *pplayer)
"Age" of the player: number of turns spent alive since created.
Definition: player.cpp:876
enum dipl_reason pplayer_can_cancel_treaty(const struct player *p1, const struct player *p2)
The senate may not allow you to break the treaty.
Definition: player.cpp:90
bool pplayers_allied(const struct player *pplayer, const struct player *pplayer2)
Returns true iff players are allied.
Definition: player.cpp:1334
static void player_defaults(struct player *pplayer)
Set player structure to its default values.
Definition: player.cpp:503
bool can_player_see_hypotetic_units_at(const struct player *pplayer, const struct tile *ptile)
Check if pplayer could see all units on ptile if it had units.
Definition: player.cpp:917
bool player_has_embassy_from_effect(const struct player *pplayer, const struct player *pplayer2)
Returns whether pplayer has got embassy with pplayer2 thanks to an effect (e.g.
Definition: player.cpp:216
bool players_non_invade(const struct player *pplayer1, const struct player *pplayer2)
Returns TRUE if players can't enter each others' territory.
Definition: player.cpp:1371
bool pplayers_non_attack(const struct player *pplayer, const struct player *pplayer2)
Returns true iff players have peace, cease-fire, or armistice.
Definition: player.cpp:1388
bool can_player_see_units_in_city(const struct player *pplayer, const struct city *pcity)
Return TRUE iff the player can see units in the city.
Definition: player.cpp:1045
struct player_slot * player_slot_next(struct player_slot *pslot)
Returns the next slot.
Definition: player.cpp:363
bool can_player_see_city_internals(const struct player *pplayer, const struct city *pcity)
Return TRUE iff the player can see the city's internals.
Definition: player.cpp:1060
bool player_can_trust_tile_has_no_units(const struct player *pplayer, const struct tile *ptile)
Returns TRUE iff pplayer can trust that ptile really has no units when it looks empty.
Definition: player.cpp:889
struct player * player_new(struct player_slot *pslot)
Creates a new player for the slot.
Definition: player.cpp:442
bool player_has_embassy(const struct player *pplayer, const struct player *pplayer2)
Check if pplayer has an embassy with pplayer2.
Definition: player.cpp:195
bool gives_shared_vision(const struct player *me, const struct player *them)
Return TRUE iff the player me gives shared vision to player them.
Definition: player.cpp:1414
bool player_owns_city(const struct player *pplayer, const struct city *pcity)
Return TRUE iff the given player owns the city.
Definition: player.cpp:227
void player_destroy(struct player *pplayer)
Destroys and remove a player from the game.
Definition: player.cpp:684
const char * diplrel_rule_name(int value)
Return the (untranslated) rule name of the given diplomatic relation.
Definition: player.cpp:1526
struct player * player_by_user(const char *name)
Find player by its user name (not player/leader name)
Definition: player.cpp:860
bool pplayers_in_peace(const struct player *pplayer, const struct player *pplayer2)
Returns true iff players are allied or at peace.
Definition: player.cpp:1355
struct player_diplstate * player_diplstate_get(const struct player *plr1, const struct player *plr2)
Returns diplomatic state type between two players.
Definition: player.cpp:288
#define players_iterate_end
Definition: player.h:520
dipl_reason
Definition: player.h:183
@ DIPL_SENATE_BLOCKING
Definition: player.h:186
@ DIPL_ALLIANCE_PROBLEM_THEM
Definition: player.h:188
@ DIPL_ALLIANCE_PROBLEM_US
Definition: player.h:187
@ DIPL_OK
Definition: player.h:184
@ DIPL_ERROR
Definition: player.h:185
#define players_iterate(_pplayer)
Definition: player.h:514
#define MAX_AI_LOVE
Definition: player.h:546
#define ANON_USER_NAME
Definition: player.h:31
static bool is_barbarian(const struct player *pplayer)
Definition: player.h:474
#define player_slots_iterate(_pslot)
Definition: player.h:505
#define PLAYER_DEFAULT_SCIENCE_RATE
Definition: player.h:23
#define set_as_human(plr)
Definition: player.h:228
#define players_iterate_alive_end
Definition: player.h:532
#define player_slots_iterate_end
Definition: player.h:509
#define ANON_PLAYER_NAME
Definition: player.h:26
#define PLAYER_DEFAULT_TAX_RATE
Definition: player.h:22
#define PLAYER_DEFAULT_LUXURY_RATE
Definition: player.h:24
#define players_iterate_alive(_pplayer)
Definition: player.h:526
#define requirement_diplrel_ereq(_id_, _range_, _present_)
Definition: requirements.h:320
struct research * research_get(const struct player *pplayer)
Returns the research structure associated with the player.
Definition: research.cpp:110
void rgbcolor_destroy(struct rgbcolor *prgbcolor)
Free rgbcolor structure.
Definition: rgbcolor.cpp:65
struct rgbcolor * rgbcolor_copy(const struct rgbcolor *prgbcolor)
Allocate new rgbcolor structure and make it copy of one given as input.
Definition: rgbcolor.cpp:41
struct setting_list * level[OLEVELS_NUM]
Definition: settings.cpp:167
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)
See match_prefix_full().
Definition: shared.cpp:986
m_pre_result
Definition: shared.h:152
@ M_PRE_AMBIGUOUS
Definition: shared.h:155
void spaceship_init(struct player_spaceship *ship)
Initialize spaceship struct; could also be used to "cancel" a spaceship (eg, if/when capital-capture ...
Definition: spaceship.cpp:45
Definition: ai.h:42
Definition: city.h:291
enum capital_type capital
Definition: city.h:298
struct trade_route_list * routes
Definition: city.h:313
struct packet_game_info info
Definition: game.h:80
bool(* player_tile_vision_get)(const struct tile *ptile, const struct player *pplayer, enum vision_layer vision)
Definition: fc_interface.h:36
struct player * player
Definition: nation.h:97
enum ai_level skill_level
Definition: player.h:109
std::vector< ai_trait > traits
Definition: player.h:119
enum barbarian_type barbarian_type
Definition: player.h:115
int love[MAX_NUM_PLAYER_SLOTS]
Definition: player.h:117
int expand
Definition: player.h:111
int fuzzy
Definition: player.h:110
int has_reason_to_cancel
Definition: player.h:197
int contact_turns_left
Definition: player.h:198
int auto_cancel_turn
Definition: player.h:200
int first_contact_turn
Definition: player.h:195
enum diplstate_type max_state
Definition: player.h:194
enum diplstate_type type
Definition: player.h:193
int infra_points
Definition: player.h:57
struct player * player
Definition: player.cpp:44
Definition: player.h:231
struct city_list * cities
Definition: player.h:263
bool random_name
Definition: player.h:277
QByteArray attribute_block
Definition: player.h:288
struct player_ai ai_common
Definition: player.h:270
bv_plr_flags flags
Definition: player.h:274
struct player::@65::@68 client
int primary_capital_id
Definition: player.h:257
bool is_male
Definition: player.h:239
int wonders[B_LAST]
Definition: player.h:283
const struct player_diplstate ** diplstates
Definition: player.h:260
bool unassigned_ranked
Definition: player.h:237
struct government * target_government
Definition: player.h:241
char username[MAX_LEN_NAME]
Definition: player.h:234
bool is_winner
Definition: player.h:251
bool is_connected
Definition: player.h:278
int revolution_finishes
Definition: player.h:255
struct player::@65::@67 server
int nturns_idle
Definition: player.h:247
struct government * government
Definition: player.h:240
struct connection * current_conn
Definition: player.h:279
struct team * team
Definition: player.h:243
char * savegame_ai_type_name
Definition: player.h:272
int turns_alive
Definition: player.h:248
bool was_created
Definition: player.h:276
QByteArray attribute_block_buffer
Definition: player.h:289
const struct ai_type * ai
Definition: player.h:271
struct unit_list * units
Definition: player.h:264
int wonder_build_turn[B_LAST]
Definition: player.h:286
char ranked_username[MAX_LEN_NAME]
Definition: player.h:236
struct conn_list * connections
Definition: player.h:280
bool is_alive
Definition: player.h:250
bv_player real_embassy
Definition: player.h:259
struct player_economic economic
Definition: player.h:266
struct player_spaceship spaceship
Definition: player.h:268
char name[MAX_LEN_NAME]
Definition: player.h:233
bv_player gives_shared_vision
Definition: player.h:281
int multipliers[MAX_NUM_MULTIPLIERS]
Definition: player.h:296
struct nation_type * nation
Definition: player.h:242
QBitArray * tile_known
Definition: player.h:291
int music_style
Definition: player.h:262
struct nation_style * style
Definition: player.h:261
int multipliers_target[MAX_NUM_MULTIPLIERS]
Definition: player.h:298
bool phase_done
Definition: player.h:245
struct player_slot * slot
Definition: player.h:232
bool is_ready
Definition: player.h:244
int user_turns
Definition: player.h:238
int last_war_action
Definition: player.h:252
struct rgbcolor * rgb
Definition: player.h:293
bool unassigned_user
Definition: player.h:235
enum req_range range
Definition: requirements.h:69
struct universal source
Definition: requirements.h:68
int num_known_tech_with_flag[TF_COUNT]
Definition: research.h:83
Definition: tile.h:42
struct unit_list * units
Definition: tile.h:50
struct player * extras_owner
Definition: tile.h:55
enum vision_layer vlayer
Definition: unittype.h:532
Definition: unit.h:134
enum universals_n kind
Definition: fc_types.h:740
universals_u value
Definition: fc_types.h:739
int fc_strcasecmp(const char *str0, const char *str1)
Compare strings like strcmp(), but ignoring case.
Definition: support.cpp:89
int fc_strncasequotecmp(const char *str0, const char *str1, size_t n)
Compare strings like strncasecmp() but ignoring surrounding quotes in either string.
Definition: support.cpp:209
size_t effectivestrlenquote(const char *str)
Count length of string without possible surrounding quotes.
Definition: support.cpp:189
#define sz_strlcpy(dest, src)
Definition: support.h:140
#define fc__fallthrough
Definition: support.h:49
void team_remove_player(struct player *pplayer)
Remove the player from the team.
Definition: team.cpp:471
bool tile_is_seen(const struct tile *target_tile, const struct player *pow_player)
Returns TRUE iff the target_tile is seen by pow_player.
Definition: tile.cpp:416
enum known_type tile_get_known(const struct tile *ptile, const struct player *pplayer)
Return a known_type enumeration value for the tile.
Definition: tile.cpp:398
struct city * tile_city(const struct tile *ptile)
Return the city on this tile (or nullptr), checking for city center.
Definition: tile.cpp:72
@ TILE_KNOWN_SEEN
Definition: tile.h:31
#define tile_has_extra(ptile, pextra)
Definition: tile.h:130
#define tile_owner(_tile)
Definition: tile.h:78
#define trade_partners_iterate_end
Definition: traderoutes.h:163
#define trade_partners_iterate(c, p)
Definition: traderoutes.h:153
bool is_hiding_unit(const struct unit *punit)
Is the unit one that is invisible on the map.
Definition: unit.cpp:367
bool unit_transport_unload(struct unit *pcargo)
Unload pcargo from ptrans.
Definition: unit.cpp:2144
struct unit_list * unit_transport_cargo(const struct unit *ptrans)
Returns the list of cargo units.
Definition: unit.cpp:2199
bool unit_transported(const struct unit *pcargo)
Returns TRUE iff the unit is transported.
Definition: unit.cpp:2176
#define unit_tile(_pu)
Definition: unit.h:371
#define unit_owner(_pu)
Definition: unit.h:370
#define unit_list_iterate(unitlist, punit)
Definition: unitlist.h:25
#define unit_list_iterate_end
Definition: unitlist.h:27
const struct unit_type * unit_type_get(const struct unit *punit)
Return the unit type for this unit.
Definition: unittype.cpp:114
#define vision_layer_iterate(v)
Definition: vision.h:72
#define vision_layer_iterate_end
Definition: vision.h:77