Freeciv-3.3
Loading...
Searching...
No Matches
plrhand.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#include <stdarg.h>
19
20/* utility */
21#include "bitvector.h"
22#include "fcintl.h"
23#include "log.h"
24#include "mem.h"
25#include "rand.h"
26#include "shared.h"
27#include "support.h"
28
29/* common */
30#include "citizens.h"
31#include "culture.h"
32#include "diptreaty.h"
33#include "government.h"
34#include "map.h"
35#include "movement.h"
36#include "multipliers.h"
37#include "nation.h"
38#include "packets.h"
39#include "player.h"
40#include "research.h"
41#include "rgbcolor.h"
42#include "specialist.h"
43#include "tech.h"
44#include "unitlist.h"
45
46/* common/scriptcore */
47#include "luascript_types.h"
48
49/* server */
50#include "aiiface.h"
51#include "barbarian.h"
52#include "citytools.h"
53#include "cityturn.h"
54#include "connecthand.h"
55#include "diplhand.h"
56#include "gamehand.h"
57#include "maphand.h"
58#include "mood.h"
59#include "notify.h"
60#include "plrhand.h"
61#include "sernet.h"
62#include "srv_main.h"
63#include "stdinhand.h"
64#include "spaceship.h"
65#include "spacerace.h"
66#include "techtools.h"
67#include "unittools.h"
68#include "voting.h"
69
70/* server/advisors */
71#include "advdata.h"
72
73/* server/scripting */
74#include "script_server.h"
75
76/* ai */
77#include "aitraits.h"
78#include "difficulty.h"
79#include "handicaps.h"
80
81
82struct rgbcolor;
83
84static void package_player_common(struct player *plr,
85 struct packet_player_info *packet,
88
89static void package_player_diplstate(struct player *plr1,
90 struct player *plr2,
92 struct player *receiver,
94static void package_player_info(struct player *plr,
95 struct packet_player_info *packet,
98 struct player *receiver,
100static enum plr_info_level player_info_level(struct player *plr,
101 struct player *receiver);
102
103static void send_player_remove_info_c(const struct player_slot *pslot,
104 struct conn_list *dest);
105static void send_player_info_c_real(struct player *src,
106 struct conn_list *dest);
107static void send_player_diplstate_c_real(struct player *src,
108 struct conn_list *dest);
109
110static void send_nation_availability_real(struct conn_list *dest,
111 bool nationset_change);
112
113/* Used by shuffle_players() and shuffled_player(). */
115
116/* Used by player_info_freeze() and player_info_thaw(). */
118
119/**********************************************************************/
125void kill_player(struct player *pplayer)
126{
127 bool save_palace;
128 struct player *barbarians = nullptr;
129
130 pplayer->is_alive = FALSE;
131
132 /* Reset player status */
133 player_status_reset(pplayer);
134
135 /* Remove shared vision from dead player to friends. */
137 if (gives_shared_vision(pplayer, aplayer)) {
139 }
141
142 cancel_all_meetings(pplayer);
143
144 /* Show entire map for players who are *not* in a team if revealmap is set
145 * to REVEAL_MAP_DEAD. */
147 bool someone_alive = FALSE;
148
150 if (pteam_member->is_alive) {
152 break;
153 }
155
156 if (!someone_alive) {
160 }
161 }
162
163 if (!is_barbarian(pplayer)) {
164 notify_player(nullptr, nullptr, E_DESTROYED, ftc_server,
165 _("The %s are no more!"),
166 nation_plural_for_player(pplayer));
167 }
168
169 /* Transfer back all cities not originally owned by player to their
170 rightful owners, if they are still around */
172 game.server.savepalace = FALSE; /* Moving it around is dumb */
174 if (pcity->original != pplayer && pcity->original != nullptr
175 && pcity->original->is_alive) {
176 /* Transfer city to original owner, kill all its units outside of
177 a radius of 3, give verbose messages of every unit transferred,
178 and raze buildings according to raze chance (also removes palace) */
179 if (transfer_city(pcity->original, pcity, 3, TRUE, TRUE, TRUE,
180 TRUE)) {
181 script_server_signal_emit("city_transferred", pcity, pplayer,
182 pcity->original, "death-back_to_original");
183 }
184 }
187
188 /* Let there be civil war */
190 if (city_list_size(pplayer->cities) >= 2 + MIN(GAME_MIN_CIVILWARSIZE, 2)) {
191 log_verbose("Civil war strikes the remaining empire of %s",
192 pplayer->name);
193 /* Out of sheer cruelty we reanimate the player
194 * so they can behold what happens to their empire */
195 pplayer->is_alive = TRUE;
196 (void) civil_war(pplayer);
197 } else {
198 log_verbose("The empire of %s is too small for civil war.",
199 pplayer->name);
200 }
201 }
202 pplayer->is_alive = FALSE;
203
205 /* If parameter, create a barbarian, if possible */
207 }
208
209 /* if there are barbarians around, they will take the remaining cities */
210 /* vae victis! */
211 if (barbarians) {
212 /* Moving victim's palace around is a waste of time, as they're dead */
214
216
217 log_verbose("Barbarians take the empire of %s", pplayer->name);
219
220 /* Transfer any remaining cities */
223 FALSE)) {
224 script_server_signal_emit("city_transferred", pcity, pplayer,
225 barbarians, "death-barbarians_get");
226 }
228
230
232
233 /* Barbarians don't get free buildings like Palaces, so we don't
234 * call city_build_free_buildings().
235 * FIXME: maybe this should be a ruleset option? */
236 } else {
237 /* Destroy any remaining cities */
238 city_list_iterate(pplayer->cities, pcity) {
241 }
242
243 /* Remove all units that are still ours */
247
248 /* Remove ownership of tiles */
249 whole_map_iterate(&(wld.map), ptile) {
250 if (tile_owner(ptile) == pplayer) {
251 map_claim_ownership(ptile, nullptr, nullptr, FALSE);
252 }
253 if (extra_owner(ptile) == pplayer) {
254 ptile->extras_owner = nullptr;
255 }
257
258 /* Ensure this dead player doesn't win with a spaceship.
259 * Now that would be truly unbelievably dumb - Per */
260 spaceship_init(&pplayer->spaceship);
261 send_spaceship_info(pplayer, nullptr);
262
264}
265
266/**********************************************************************/
269static int get_player_maxrate(struct player *pplayer)
270{
271 int maxrate = get_player_bonus(pplayer, EFT_MAX_RATES);
272
273 if (maxrate == 0) {
274 return 100; /* effects not initialized yet */
275 }
276
277 /* 34 + 33 + 33 = 100 */
278 return CLIP(34, maxrate, 100);
279}
280
281/**********************************************************************/
285void handle_player_rates(struct player *pplayer,
286 int tax, int luxury, int science)
287{
288 int maxrate;
289
290 if (S_S_RUNNING != server_state()) {
291 log_error("received player_rates packet from %s before start",
292 player_name(pplayer));
293 notify_player(pplayer, nullptr, E_BAD_COMMAND, ftc_server,
294 _("Cannot change rates before game start."));
295 return;
296 }
297
298 if (tax + luxury + science != 100) {
299 return;
300 }
301 if (tax < 0 || tax > 100 || luxury < 0 || luxury > 100 || science < 0
302 || science > 100) {
303 return;
304 }
305 maxrate = get_player_maxrate(pplayer);
306 if (tax > maxrate || luxury > maxrate || science > maxrate) {
307 const char *rtype;
308
309 if (tax > maxrate) {
310 rtype = _("Tax");
311 } else if (luxury > maxrate) {
312 rtype = _("Luxury");
313 } else {
314 rtype = _("Science");
315 }
316
317 notify_player(pplayer, nullptr, E_BAD_COMMAND, ftc_server,
318 _("%s rate exceeds the max rate for %s."),
319 rtype,
321 } else {
322 pplayer->economic.tax = tax;
323 pplayer->economic.luxury = luxury;
324 pplayer->economic.science = science;
325
327 send_player_info_c(pplayer, pplayer->connections);
328 }
329}
330
331/**********************************************************************/
336void government_change(struct player *pplayer, struct government *gov,
338{
339 struct research *presearch;
340
344 && nullptr != pplayer->target_government);
346
347 gov->changed_to_times++;
348 }
349
350 pplayer->government = gov;
351 pplayer->target_government = nullptr;
352
354 log_debug("Revolution finished for %s. Government is %s. "
355 "Revofin %d (%d).", player_name(pplayer),
358 }
359
360 notify_player(pplayer, nullptr, E_REVOLT_DONE, ftc_server,
361 _("%s now governs the %s as a %s."),
362 player_name(pplayer),
365
366 if (is_human(pplayer)) {
367 /* Keep luxuries if we have any. Try to max out science. -GJW */
368 int max = get_player_maxrate(pplayer);
369
370 /* Only change rates if one exceeds the maximal rate */
371 if (pplayer->economic.science > max || pplayer->economic.tax > max
372 || pplayer->economic.luxury > max) {
373 int save_science = pplayer->economic.science;
374 int save_tax = pplayer->economic.tax;
375 int save_luxury = pplayer->economic.luxury;
376
377 pplayer->economic.science = MIN(100 - pplayer->economic.luxury, max);
378 pplayer->economic.tax = MIN(100 - pplayer->economic.luxury
379 - pplayer->economic.science, max);
380 pplayer->economic.luxury = 100 - pplayer->economic.science
381 - pplayer->economic.tax;
382
383 notify_player(pplayer, nullptr, E_REVOLT_DONE, ftc_server,
384 _("The tax rates for the %s are changed from "
385 "%3d%%/%3d%%/%3d%% (tax/luxury/science) to "
386 "%3d%%/%3d%%/%3d%%."),
389 pplayer->economic.tax, pplayer->economic.luxury,
390 pplayer->economic.science);
391 }
392 }
393
394 check_player_max_rates(pplayer);
396 send_player_info_c(pplayer, pplayer->connections);
397
398 presearch = research_get(pplayer);
401}
402
403/**********************************************************************/
411{
412 int ransom = fc_rand(1 + pvictim->economic.gold);
413 int n = 1 + fc_rand(3);
414
415 /* Give map */
419 _("You looted parts of %s map!"),
421 }
422
423 log_debug("victim has money: %d", pvictim->economic.gold);
424
425 if (ransom > 0) {
428 PL_("You loot %d gold!", "You loot %d gold!", ransom),
429 ransom);
430 }
431 pvictor->economic.gold += ransom;
432 pvictim->economic.gold -= ransom;
433
434 while (n > 0) {
436
437 /* steal_a_tech() handles also notifying of the player */
439
440 if (ttid == A_NONE) {
441 log_debug("Worthless enemy doesn't have more techs to steal.");
442 break;
443 } else {
444 log_debug("Pressed tech %s from captured enemy",
446 if (!fc_rand(3)) {
447 break; /* Out of luck */
448 }
449 n--;
450 }
451 }
452
453 {
454 /* Try to submit some cities */
455 int vcsize = city_list_size(pvictim->cities);
456 int evcsize = vcsize;
457 int conqsize;
458
459 if (evcsize < 3) {
460 evcsize = 0;
461 } else {
462 evcsize -=3;
463 }
464
465 /* About a quarter on average with high numbers less probable */
467
468 log_debug("conqsize=%d", conqsize);
469
470 if (conqsize > 0) {
472 bool submit = FALSE;
473
474 game.server.savepalace = FALSE; /* Moving it around is dumb */
475
477 /* Kindly ask the citizens to submit */
478 if (fc_rand(vcsize) < conqsize) {
479 submit = TRUE;
480 }
481 vcsize--;
482 if (submit) {
483 conqsize--;
484 /* Transfer city to the victorious player
485 * kill all its units outside of a radius of 7,
486 * give verbose messages of every unit transferred,
487 * and raze buildings according to raze chance
488 * (also removes palace) */
491 /* TRANS: Getting a city as loot */
492 _("You conquer %s as loot!"),
494
497 submit = FALSE;
498 }
499 if (conqsize <= 0) {
500 break;
501 }
504 }
505 }
506}
507
508/**********************************************************************/
516 struct government *gov)
517{
518 int max_turns;
519 int change_speed;
520
521 switch (rltype) {
522 case REVOLEN_FIXED:
524 case REVOLEN_RANDOM:
528 /* If everyone changes to this government once, the last 50% of players doing so
529 * will get the minimum time (1 turn) */
531 /* It never takes zero players to make revlen shorter */
534 max_turns = MAX(1, max_turns);
536 return fc_rand(max_turns) + 1;
537 }
538 return max_turns;
539 }
540
542
544}
545
546/**********************************************************************/
549int revolution_length(struct government *gov, struct player *plr)
550{
553 /* Targetless revolution not acceptable */
555 _("You can't revolt without selecting target government."));
556 return -1;
557 }
558
560}
561
562/**********************************************************************/
567{
568 int turns;
570 bool anarchy;
571
572 if (!gov || !can_change_to_government(pplayer, gov)) {
573 return;
574 }
575
576 log_debug("Government changed for %s. Target government is %s; "
577 "old %s. Revofin %d, Turn %d.", player_name(pplayer),
581
582 anarchy = get_player_bonus(pplayer, EFT_NO_ANARCHY) <= 0;
583
584 /* Set revolution_finishes value. */
585 if (pplayer->revolution_finishes > 0) {
586 /* Player already has an active revolution. Note that the finish time
587 * may be in the future (we're waiting for it to finish), the current
588 * turn (it just finished - but isn't reset until the end of the turn)
589 * or even in the past (if the player is in anarchy and hasn't chosen
590 * a government). */
591 turns = pplayer->revolution_finishes - game.info.turn;
592 } else if ((is_ai(pplayer) && !has_handicap(pplayer, H_REVOLUTION))
593 || !anarchy) {
594 /* AI players without the H_REVOLUTION handicap can skip anarchy */
595 anarchy = FALSE;
596 turns = 0;
597 } else {
598 turns = revolution_length(gov, pplayer);
599 if (turns < 0) {
600 return;
601 }
602 }
603
604 if (anarchy && turns <= 0
606 /* Multiple changes attempted after single anarchy period */
609 notify_player(pplayer, nullptr, E_REVOLT_DONE, ftc_server,
610 _("You can't revolt the same turn you finished previous revolution."));
611 return;
612 }
613 }
614
616 pplayer->target_government = gov;
617 pplayer->revolution_finishes = game.info.turn + turns;
618
619 log_debug("Revolution started for %s. Target government is %s. "
620 "Revofin %d (%d).", player_name(pplayer),
623
624 CALL_PLR_AI_FUNC(revolution_start, pplayer, pplayer);
625
626 /* Now see if the revolution is instantaneous. */
627 if (turns <= 0
629 notify_player(pplayer, nullptr, E_REVOLT_START, ftc_server,
630 /* TRANS: Switching to a new form of government */
631 _("The %s will switch to %s in the end of "
632 "the player phase."),
635 return;
636 } else if (turns > 0) {
637 notify_player(pplayer, nullptr, E_REVOLT_START, ftc_server,
638 /* TRANS: This is a message event so don't make it
639 * too long. */
640 PL_("The %s have incited a revolt! "
641 "%d turn of anarchy will ensue! "
642 "Target government is %s.",
643 "The %s have incited a revolt! "
644 "%d turns of anarchy will ensue! "
645 "Target government is %s.",
646 turns),
648 turns,
650 } else {
652
653 notify_player(pplayer, nullptr, E_REVOLT_START, ftc_server,
654 _("Revolution: returning to anarchy."));
655 }
656
657 check_player_max_rates(pplayer);
659 send_player_info_c(pplayer, pplayer->connections);
660
661 log_debug("Government change complete for %s. Target government is %s; "
662 "now %s. Turn %d; revofin %d.", player_name(pplayer),
666}
667
668/**********************************************************************/
672void update_revolution(struct player *pplayer)
673{
674 struct government *current_gov;
675
676 /* The player's revolution counter is stored in the revolution_finishes
677 * field. This value has the following meanings:
678 * - If negative (-1), then the player is not in a revolution. In this
679 * case the player should never be in anarchy.
680 * - If positive, the player is in the middle of a revolution. In this
681 * case the value indicates the turn in which the revolution finishes.
682 * * If this value is > than the current turn, then the revolution is
683 * in progress. In this case the player should always be in anarchy.
684 * * If the value is == to the current turn, then the revolution is
685 * finished. The player may now choose a government. However the
686 * value isn't reset until the end of the turn. If the player has
687 * chosen a government by the end of the turn, then the revolution is
688 * over and the value is reset to -1.
689 * * If the player doesn't pick a government then the revolution
690 * continues. At this point the value is <= to the current turn,
691 * and the player can leave the revolution at any time. The value
692 * is reset at the end of any turn when a non-anarchy government is
693 * chosen.
694 */
695 log_debug("Update revolution for %s. Current government %s, "
696 "target %s, revofin %d, turn %d.", player_name(pplayer),
698 pplayer->target_government
699 ? government_rule_name(pplayer->target_government) : "(none)",
701
703
705 && pplayer->revolution_finishes <= game.info.turn) {
707 /* If the revolution is over and a target government is set, go into
708 * the new government. */
709 log_debug("Update: finishing revolution for %s.", player_name(pplayer));
710 government_change(pplayer, pplayer->target_government, TRUE);
711 } else {
712 /* If the revolution is over but there's no target government set,
713 * alert the player. */
714 notify_player(pplayer, nullptr, E_REVOLT_DONE, ftc_any,
715 _("You should choose a new government from the "
716 "government menu."));
717 }
719 && pplayer->revolution_finishes < game.info.turn) {
720 /* Reset the revolution counter. If the player has another revolution
721 * they'll have to re-enter anarchy. */
722 log_debug("Update: resetting revofin for %s.", player_name(pplayer));
723 pplayer->revolution_finishes = -1;
724 send_player_info_c(pplayer, pplayer->connections);
725 }
726}
727
728/**********************************************************************/
731void update_capital(struct player *pplayer)
732{
733 int max_value = 0;
734 struct city *primary_capital = nullptr;
735 int same_value_count = 0;
736
737 city_list_iterate(pplayer->cities, pcity) {
739
740 if (value > max_value) {
741 max_value = value;
744 /* Mark it at least some kind of capital, might turn to named capital
745 * after all have been processed. */
746 pcity->capital = CAPITAL_SECONDARY;
747 } else if (value > 0) {
748 /* Mark it at least some kind of capital. */
749 pcity->capital = CAPITAL_SECONDARY;
750 if (value == max_value) {
753 if (fc_rand(same_value_count) == 1) {
755 }
756 }
757 } else {
758 /* Not capital at all */
759 pcity->capital = CAPITAL_NOT;
760 }
762
763 if (primary_capital != nullptr) {
765 pplayer->primary_capital_id = primary_capital->id;
766 } else {
767 pplayer->primary_capital_id = 0;
768 }
769}
770
771/**********************************************************************/
776void check_player_max_rates(struct player *pplayer)
777{
778 struct player_economic old_econ = pplayer->economic;
779
781 if (old_econ.tax > pplayer->economic.tax) {
782 notify_player(pplayer, nullptr, E_NEW_GOVERNMENT, ftc_server,
783 _("Tax rate exceeded the max rate; adjusted."));
784 }
785 if (old_econ.science > pplayer->economic.science) {
786 notify_player(pplayer, nullptr, E_NEW_GOVERNMENT, ftc_server,
787 _("Science rate exceeded the max rate; adjusted."));
788 }
789 if (old_econ.luxury > pplayer->economic.luxury) {
790 notify_player(pplayer, nullptr, E_NEW_GOVERNMENT, ftc_server,
791 _("Luxury rate exceeded the max rate; adjusted."));
792 }
793}
794
795/**********************************************************************/
805 struct player *pplayer2,
806 const struct unit_list
808 const struct unit_list
810{
811 /* The client needs updated diplomatic state, because it is used
812 * during calculation of new states of occupied flags in cities */
813 send_player_all_c(pplayer, nullptr);
814 send_player_all_c(pplayer2, nullptr);
818}
819
820/**********************************************************************/
823static void maybe_claim_base(struct tile *ptile, struct player *new_owner,
824 struct player *old_owner)
825{
826 bool claim = FALSE;
827
828 unit_list_iterate(ptile->units, punit) {
831 claim = TRUE;
832 break;
833 }
835
836 if (claim) {
838 map_claim_base(ptile, pextra, new_owner, old_owner);
840
841 ptile->extras_owner = new_owner;
842 }
843}
844
845/**********************************************************************/
848void enter_war(struct player *pplayer, struct player *pplayer2)
849{
850 /* Claim bases where units are already standing */
851 whole_map_iterate(&(wld.map), ptile) {
852 struct player *old_owner = extra_owner(ptile);
853
854 if (old_owner == pplayer2) {
855 maybe_claim_base(ptile, pplayer, old_owner);
856 } else if (old_owner == pplayer) {
858 }
860}
861
862/**********************************************************************/
866{
867 pplayer->last_war_action = game.info.turn;
868 send_player_info_c(pplayer, nullptr);
869}
870
871/**********************************************************************/
883 int other_player_id,
884 enum clause_type clause)
885{
889 bool repeat = FALSE;
890 struct player *pplayer2 = player_by_number(other_player_id);
892 struct unit_list *pplayer_seen_units, *pplayer2_seen_units;
893
894 if (nullptr == pplayer2 || players_on_same_team(pplayer, pplayer2)) {
895 return;
896 }
897
899
900 if (clause == CLAUSE_VISION) {
901 if (!gives_shared_vision(pplayer, pplayer2)) {
902 return;
903 }
906 _("%s no longer gives us shared vision!"),
907 player_name(pplayer));
908 return;
909 }
910
911 if (clause == CLAUSE_SHARED_TILES) {
912 if (!gives_shared_tiles(pplayer, pplayer2)) {
913 return;
914 }
916 whole_map_iterate(&(wld.map), ptile) {
917 if (tile_owner(ptile) == pplayer && ptile->worked != nullptr
918 && city_owner(ptile->worked) == pplayer2) {
919 struct city *pcity = ptile->worked;
920
922 pcity->specialists[DEFAULT_SPECIALIST]++;
923 }
926 _("%s no longer shares tiles with us!"),
927 player_name(pplayer));
928 return;
929 }
930
932
933 /* The senate may not allow you to break the treaty. In this case you
934 * must first dissolve the senate then you can break it. */
936 notify_player(pplayer, nullptr, E_TREATY_BROKEN, ftc_server,
937 _("The senate will not allow you to break treaty "
938 "with the %s. You must either dissolve the senate "
939 "or wait until a more timely moment."),
941 return;
942 }
943
944 if (diplcheck != DIPL_OK) {
945 return;
946 }
947
948 reject_all_treaties(pplayer);
950 /* Else, breaking a treaty */
951
952 /* Check what the new status will be */
954
955 if (new_type == old_type) {
956 /* No change */
957 return;
958 }
959
962
963 if (old_type == DS_ALLIANCE) {
966 } else {
967 pplayer_seen_units = nullptr;
968 pplayer2_seen_units = nullptr;
969 }
970
971 /* Do the change */
972 ds_plrplr2->type = ds_plr2plr->type = new_type;
973 ds_plrplr2->turns_left = ds_plr2plr->turns_left = 16;
974
975 if (new_type == DS_WAR) {
978 }
979
980 /* If the old state was alliance, the players' units can share tiles
981 illegally, and we need to call resolve_unit_stacks() */
982 if (old_type == DS_ALLIANCE) {
983
984 fc_assert(pplayer_seen_units != nullptr);
985 fc_assert(pplayer2_seen_units != nullptr);
986
992 }
993
994 /* If there's a reason to cancel the pact, do it without penalty */
995 /* FIXME: in the current implementation if you break more than one
996 * treaty simultaneously it may success partially: the first treaty-breaking
997 * will happen but the second one will fail. */
998 if (get_player_bonus(pplayer, EFT_HAS_SENATE) > 0 && !repeat) {
999 if (ds_plrplr2->has_reason_to_cancel > 0) {
1000 notify_player(pplayer, nullptr, E_TREATY_BROKEN, ftc_server,
1001 _("The senate passes your bill because of the "
1002 "constant provocations of the %s."),
1004 } else if (new_type == DS_WAR) {
1005 notify_player(pplayer, nullptr, E_TREATY_BROKEN, ftc_server,
1006 _("The senate refuses to break treaty with the %s, "
1007 "but you have no trouble finding a new senate."),
1009 }
1010 }
1011 if (new_type == DS_WAR) {
1013
1014 enter_war(pplayer, pplayer2);
1015 }
1016 ds_plrplr2->has_reason_to_cancel = 0;
1017
1018 send_player_all_c(pplayer, nullptr);
1019 send_player_all_c(pplayer2, nullptr);
1020
1021 /*
1022 * Refresh all cities which have a unit of the other side within
1023 * city range.
1024 */
1027 sync_cities();
1028
1029 notify_player(pplayer, nullptr, E_TREATY_BROKEN, ftc_server,
1030 _("The diplomatic state between the %s "
1031 "and the %s is now %s."),
1032 nation_plural_for_player(pplayer),
1036 _(" %s canceled the diplomatic agreement! "
1037 "The diplomatic state between the %s and the %s "
1038 "is now %s."),
1039 player_name(pplayer),
1041 nation_plural_for_player(pplayer),
1043
1044 /* Check fall-out of a war declaration. */
1046 if (other != pplayer && other != pplayer2
1048 && pplayers_allied(pplayer, other)) {
1049 if (!players_on_same_team(pplayer, other)) {
1050 /* If an ally declares war on another ally, break off your alliance
1051 * to the aggressor. This prevents in-alliance wars, which are not
1052 * permitted. */
1054 _("%s has attacked your ally %s! "
1055 "You cancel your alliance to the aggressor."),
1056 player_name(pplayer),
1062 } else {
1063 /* We are in the same team as the aggressor; we cannot break
1064 * alliance with them. We trust our team mate and break alliance
1065 * with the attacked player */
1067 _("Your team mate %s declared war on %s. "
1068 "You are obligated to cancel alliance with %s."),
1069 player_name(pplayer),
1073 }
1074 }
1076}
1077
1078/**********************************************************************/
1081static void send_player_remove_info_c(const struct player_slot *pslot,
1082 struct conn_list *dest)
1083{
1084 if (!dest) {
1085 dest = game.est_connections;
1086 }
1087
1089
1090 conn_list_iterate(dest, pconn) {
1093}
1094
1095/**********************************************************************/
1102{
1104}
1105
1106/**********************************************************************/
1111{
1112 if (0 == --player_info_frozen_level) {
1114 send_player_info_c(nullptr, nullptr);
1115 }
1116
1118}
1119
1120/**********************************************************************/
1131void send_player_all_c(struct player *src, struct conn_list *dest)
1132{
1133 send_player_info_c(src, dest);
1134 send_player_diplstate_c(src, dest);
1135}
1136
1137/**********************************************************************/
1148void send_player_info_c(struct player *src, struct conn_list *dest)
1149{
1150 if (0 < player_info_frozen_level) {
1151 return; /* Discard, see comment for player_info_freeze(). */
1152 }
1153
1154 if (src != nullptr) {
1155 send_player_info_c_real(src, dest);
1156 return;
1157 }
1158
1159 players_iterate(pplayer) {
1160 send_player_info_c_real(pplayer, dest);
1162}
1163
1164/**********************************************************************/
1168static void send_player_info_c_real(struct player *src,
1169 struct conn_list *dest)
1170{
1171 struct packet_player_info info;
1174
1175 fc_assert_ret(src != nullptr);
1176
1177 if (!dest) {
1178 dest = game.est_connections;
1179 }
1180
1181 if (any_web_conns()) {
1182 webp_ptr = &web_info;
1183 } else {
1184 webp_ptr = nullptr;
1185 }
1186
1187 package_player_common(src, &info, webp_ptr);
1188
1189 conn_list_iterate(dest, pconn) {
1190 if (nullptr == pconn->playing && pconn->observer) {
1191 /* Global observer. */
1192 package_player_info(src, &info, webp_ptr, pconn->playing, INFO_FULL);
1193 } else if (nullptr != pconn->playing) {
1194 /* Players (including regular observers) */
1195 package_player_info(src, &info, webp_ptr,
1196 pconn->playing, INFO_MINIMUM);
1197 } else {
1198 package_player_info(src, &info, webp_ptr, nullptr, INFO_MINIMUM);
1199 }
1203}
1204
1205/**********************************************************************/
1214void send_player_diplstate_c(struct player *src, struct conn_list *dest)
1215{
1216 if (src != nullptr) {
1218 return;
1219 }
1220
1221 players_iterate(pplayer) {
1222 send_player_diplstate_c_real(pplayer, dest);
1224}
1225
1226/**********************************************************************/
1230static void send_player_diplstate_c_real(struct player *plr1,
1231 struct conn_list *dest)
1232{
1233 fc_assert_ret(plr1 != nullptr);
1234
1235 if (!dest) {
1236 dest = game.est_connections;
1237 }
1238
1239 conn_list_iterate(dest, pconn) {
1240 players_iterate(plr2) {
1242
1243 if (nullptr == pconn->playing && pconn->observer) {
1244 /* Global observer. */
1246 INFO_FULL);
1247 } else if (nullptr != pconn->playing) {
1248 /* Players (including regular observers) */
1250 INFO_MINIMUM);
1251 } else {
1253 INFO_MINIMUM);
1254 }
1258}
1259
1260/**********************************************************************/
1263static void package_player_common(struct player *plr,
1264 struct packet_player_info *packet,
1266 web_packet)
1267{
1268 int i;
1269 struct music_style *music;
1270
1271 packet->playerno = player_number(plr);
1272 sz_strlcpy(packet->name, player_name(plr));
1273 sz_strlcpy(packet->username, plr->username);
1274 packet->unassigned_user = plr->unassigned_user;
1275 packet->nation = plr->nation ? nation_number(plr->nation) : NATION_NONE;
1276 packet->is_male = plr->is_male;
1277 packet->team = plr->team ? team_number(plr->team) : team_count();
1278 packet->is_ready = plr->is_ready;
1279 packet->was_created = plr->was_created;
1280 packet->style = plr->style ? style_number(plr->style) : 0;
1281
1282 /* I think we could safely move the music style selection to
1283 * client side to not have it burden server side. Client could
1284 * actually avoid it completely when music disabled from the client options.
1285 * Client has no use for music styles of other players, and there should
1286 * be no such information about the player themself needed to determine
1287 * the music style that client does not know. */
1289 if (music != nullptr) {
1291 } else {
1292 packet->music_style = -1; /* No music style available */
1293 }
1294
1295 packet->is_alive = plr->is_alive;
1296 packet->turns_alive = plr->turns_alive;
1297 packet->is_connected = plr->is_connected;
1298 packet->flags = plr->flags;
1299 packet->ai_skill_level = is_ai(plr)
1300 ? plr->ai_common.skill_level : 0;
1301 for (i = 0; i < player_slot_count(); i++) {
1302 packet->love[i] = plr->ai_common.love[i];
1303 }
1305
1306 packet->phase_done = plr->phase_done;
1307 packet->nturns_idle = plr->nturns_idle;
1308 packet->science_cost = plr->ai_common.science_cost;
1309
1310#ifdef FREECIV_WEB
1311 if (web_packet != nullptr) {
1312 web_packet->playerno = player_number(plr);
1313 }
1314#endif /* FREECIV_WEB */
1315}
1316
1317/**********************************************************************/
1326static void package_player_info(struct player *plr,
1327 struct packet_player_info *packet,
1329 web_packet,
1330 struct player *receiver,
1332{
1335 struct government *pgov = nullptr;
1337
1338 if (receiver) {
1339 info_level = player_info_level(plr, receiver);
1341 } else {
1343 }
1344
1345 /* Multipliers */
1346 packet->multip_count = multiplier_count();
1347 if (info_level >= INFO_FULL) {
1348 multipliers_iterate(pmul) {
1349 int idx = multiplier_index(pmul);
1350
1351 packet->multiplier[idx] = plr->multipliers[idx].value;
1352 packet->multiplier_target[idx] = plr->multipliers[idx].target;
1353 packet->multiplier_changed[idx] = plr->multipliers[idx].changed;
1355 } else {
1356 multipliers_iterate(pmul) {
1357 int idx = multiplier_index(pmul);
1358
1359 packet->multiplier[idx] = 0;
1360 packet->multiplier_target[idx] = 0;
1361 packet->multiplier_changed[idx] = 0;
1363 }
1364
1365 /* We need to send all tech info for all players on the same
1366 * team, even if they are not in contact yet; otherwise we will
1367 * overwrite team research or confuse the client. */
1370 if (players_on_same_team(plr, aplayer) && receiver) {
1372 player_info_level(aplayer, receiver));
1373 }
1375
1376 if (plr->rgb != nullptr) {
1377 packet->color_valid = TRUE;
1378 packet->color_red = plr->rgb->r;
1379 packet->color_green = plr->rgb->g;
1380 packet->color_blue = plr->rgb->b;
1381 } else {
1382 /* In pregame, send the color we expect to use, for consistency with
1383 * '/list colors' etc. */
1384 const struct rgbcolor *preferred = player_preferred_color(plr);
1385
1386 if (preferred != nullptr) {
1387 packet->color_valid = TRUE;
1388 packet->color_red = preferred->r;
1389 packet->color_green = preferred->g;
1390 packet->color_blue = preferred->b;
1391 } else {
1392 fc_assert(game.info.turn < 1); /* Game has not yet started */
1393 packet->color_valid = FALSE;
1394 /* Client shouldn't use these dummy values */
1395 packet->color_red = 0;
1396 packet->color_green = 0;
1397 packet->color_blue = 0;
1398 }
1399 }
1400 packet->color_changeable = player_color_changeable(plr, nullptr);
1401
1402 /* Only send score if we have contact */
1403 if (info_level >= INFO_MEETING) {
1404 packet->score = plr->score.game;
1405 } else {
1406 packet->score = -1;
1407 }
1408
1409 packet->autoselect_weight = plr->autoselect_weight;
1410
1411 if (info_level >= INFO_MEETING) {
1412 packet->gold = plr->economic.gold;
1414 } else {
1415 packet->gold = 0;
1416 pgov = NULL;
1417 }
1419
1420 /* Send diplomatic status of the player to everyone they are in
1421 * contact with. */
1423 || (receiver
1424 && player_diplstate_get(receiver, plr)->contact_turns_left > 0)) {
1427 : government_count();
1428 packet->real_embassy = plr->real_embassy;
1431 } else {
1432 packet->target_government = packet->government;
1433 BV_CLR_ALL(packet->real_embassy);
1436
1437 if (receiver != nullptr) {
1438 int ridx = player_index(receiver);
1439
1440 if (player_has_real_embassy(plr, receiver)) {
1441 BV_SET(packet->real_embassy, ridx);
1442 }
1443
1444 if (gives_shared_vision(plr, receiver)) {
1446 }
1447
1448 if (gives_shared_tiles(plr, receiver)) {
1449 BV_SET(packet->gives_shared_tiles, ridx);
1450 }
1451 }
1452 }
1453
1454 /* Make absolutely sure - in case you lose your embassy! */
1456 || (receiver
1457 && player_diplstate_get(plr, receiver)->type == DS_TEAM)) {
1458 packet->tech_upkeep = player_tech_upkeep(plr);
1459 } else {
1460 packet->tech_upkeep = 0;
1461 }
1462
1463 /* Send most civ info about the player only to players who have an
1464 * embassy. */
1466 packet->tax = plr->economic.tax;
1467 packet->science = plr->economic.science;
1468 packet->luxury = plr->economic.luxury;
1470 packet->culture = player_culture(plr);
1471 } else {
1472 packet->tax = 0;
1473 packet->science = 0;
1474 packet->luxury = 0;
1475 packet->revolution_finishes = -1;
1476 packet->culture = 0;
1477 }
1478
1479 if (info_level >= INFO_FULL
1480 || (receiver
1481 && player_diplstate_get(plr, receiver)->type == DS_TEAM)) {
1482 packet->mood = player_mood(plr);
1483 } else {
1484 packet->mood = MOOD_COUNT;
1485 }
1486
1487 if (info_level >= INFO_FULL) {
1488 packet->history = plr->history;
1489 packet->infrapoints = plr->economic.infra_points;
1490 } else {
1491 packet->history = 0;
1492 packet->infrapoints = 0;
1493 }
1494
1495 for (imp = 0; imp < B_LAST; imp++) {
1496 if (plr->wonders[imp] != WONDER_NOT_BUILT) {
1498 receiver, plr,
1500 packet->wonders[imp] = plr->wonders[imp];
1501 } else {
1502 packet->wonders[imp] = WONDER_NOT_BUILT;
1503 }
1504 } else {
1505 packet->wonders[imp] = WONDER_NOT_BUILT;
1506 }
1507 }
1508
1509#ifdef FREECIV_WEB
1510 if (web_packet != nullptr) {
1511 if (info_level >= INFO_FULL) {
1512 web_packet->expected_income = player_get_expected_income(plr);
1513 } else {
1514 web_packet->expected_income = 0;
1515 }
1516 }
1517#endif /* FREECIV_WEB */
1518}
1519
1520/**********************************************************************/
1529static void package_player_diplstate(struct player *plr1,
1530 struct player *plr2,
1532 struct player *receiver,
1534{
1536 struct player_diplstate *ds = player_diplstate_get(plr1, plr2);
1537
1538 if (receiver) {
1539 info_level = player_info_level(plr1, receiver);
1541 } else {
1543 }
1544
1545 packet_ds->plr1 = player_index(plr1);
1546 packet_ds->plr2 = player_index(plr2);
1547 /* A unique id for each combination is calculated here. */
1548 packet_ds->diplstate_id = packet_ds->plr1 * MAX_NUM_PLAYER_SLOTS
1549 + packet_ds->plr2;
1550
1551 /* Send diplomatic status of the player to everyone they are in
1552 * contact with (embassy, remaining contact turns, the receiver). */
1554 || (receiver
1555 && player_diplstate_get(receiver, plr1)->contact_turns_left > 0)
1556 || (receiver && receiver == plr2)) {
1557 packet_ds->type = ds->type;
1558 packet_ds->turns_left = ds->turns_left;
1559 packet_ds->has_reason_to_cancel = ds->has_reason_to_cancel;
1560 packet_ds->contact_turns_left = ds->contact_turns_left;
1561 } else {
1562 packet_ds->type = DS_WAR;
1563 packet_ds->turns_left = 0;
1564 packet_ds->has_reason_to_cancel = 0;
1565 packet_ds->contact_turns_left = 0;
1566 }
1567}
1568
1569/**********************************************************************/
1573 struct player *receiver)
1574{
1575 if (S_S_RUNNING > server_state()) {
1576 return INFO_MINIMUM;
1577 }
1578 if (plr == receiver) {
1579 return INFO_FULL;
1580 }
1581 if (receiver && team_has_embassy(receiver->team, plr)) {
1582 return INFO_EMBASSY;
1583 }
1584 if (receiver && could_intel_with_player(receiver, plr)) {
1585 return INFO_MEETING;
1586 }
1587
1588 return INFO_MINIMUM;
1589}
1590
1591/**********************************************************************/
1595struct conn_list *player_reply_dest(struct player *pplayer)
1596{
1597 return (pplayer->current_conn ?
1598 pplayer->current_conn->self :
1599 pplayer->connections);
1600}
1601
1602/**********************************************************************/
1605static void call_first_contact(struct player *pplayer, struct player *aplayer)
1606{
1607 CALL_PLR_AI_FUNC(first_contact, pplayer, pplayer, aplayer);
1608}
1609
1610/**********************************************************************/
1620void server_player_init(struct player *pplayer, bool initmap,
1621 bool needs_team)
1622{
1623 player_status_reset(pplayer);
1624
1625 BV_CLR(pplayer->flags, PLRF_FIRST_CITY);
1627 BV_CLR_ALL(pplayer->server.debug);
1628
1629 pplayer->server.border_vision = FALSE;
1630
1631 player_map_free(pplayer);
1632 pplayer->server.private_map = nullptr;
1633
1634 if (initmap) {
1635 player_map_init(pplayer);
1636 }
1637 if (needs_team) {
1638 team_add_player(pplayer, nullptr);
1639 fc_assert(pplayer->team != nullptr);
1640 }
1641
1642 /* This must be done after team information is initialised
1643 * as it might be needed to determine max rate effects.
1644 * Sometimes this server_player_init() gets called twice
1645 * with only latter one having needs_team set. We don't
1646 * want to call player_limit_to_max_rates() at first time
1647 * when team is not yet set. It's callers responsibility
1648 * to always have one server_player_init() call with
1649 * needs_team TRUE. */
1650 if (needs_team) {
1652 }
1653
1654 adv_data_default(pplayer);
1655
1656 /* We don't push this in calc_civ_score(), or it will be reset
1657 * every turn. */
1658 pplayer->score.units_built = 0;
1659 pplayer->score.units_killed = 0;
1660 pplayer->score.units_lost = 0;
1661 pplayer->score.units_used = 0;
1662
1663 /* No delegation. */
1664 pplayer->server.delegate_to[0] = '\0';
1665 pplayer->server.orig_username[0] = '\0';
1666
1667 handicaps_init(pplayer);
1668}
1669
1670/**********************************************************************/
1675const struct rgbcolor *player_preferred_color(struct player *pplayer)
1676{
1677 if (pplayer->rgb) {
1678 return pplayer->rgb;
1679 } else if (playercolor_count() == 0) {
1680 /* If a ruleset isn't loaded, there are no colors to choose from. */
1681 return nullptr;
1683 if (pplayer->nation != NO_NATION_SELECTED) {
1684 return nation_color(nation_of_player(pplayer)); /* May be nullptr */
1685 } else {
1686 return nullptr; /* Don't know nation, hence don't know color */
1687 }
1688 } else {
1689 /* Modes indexing into game-defined player colors */
1690 int colorid;
1691
1692 switch (game.server.plrcolormode) {
1693 case PLRCOL_PLR_SET: /* Player color (set) */
1694 case PLRCOL_PLR_RANDOM: /* Player color (random) */
1695 /* These depend on other players and will be assigned at game start. */
1696 return nullptr;
1697 default:
1698 log_error("Invalid value for 'game.server.plrcolormode' (%d)!",
1700 fc__fallthrough; /* No break - using 'PLRCOL_PLR_ORDER' as fallback */
1701 case PLRCOL_PLR_ORDER: /* Player color (ordered) */
1703 break;
1704 case PLRCOL_TEAM_ORDER: /* Team color (ordered) */
1705 colorid = team_number(pplayer->team) % playercolor_count();
1706 break;
1707 }
1708
1709 return playercolor_get(colorid);
1710 }
1711}
1712
1713/**********************************************************************/
1718bool player_color_changeable(const struct player *pplayer, const char **reason)
1719{
1721 if (reason) {
1722 *reason = _("Can only set player color prior to game start if "
1723 "'plrcolormode' is PLR_SET.");
1724 }
1725 return FALSE;
1726 }
1727
1728 return TRUE;
1729}
1730
1731/**********************************************************************/
1737{
1740 int needed = player_count();
1741
1742 players_iterate(pplayer) {
1743 const struct rgbcolor *autocolor;
1744 /* Assign the deterministic colors. */
1745 if (!pplayer->rgb
1746 && (autocolor = player_preferred_color(pplayer))) {
1747 player_set_color(pplayer, autocolor);
1748 }
1749 if (pplayer->rgb) {
1750 /* One fewer random color needed. */
1751 needed--;
1752 /* Try to avoid clashes between explicit and random colors. */
1754 if (rgbcolors_are_equal(pplayer->rgb, prgbcolor)) {
1756 }
1758 }
1760
1761 if (needed == 0) {
1762 /* No random colors needed */
1764 return;
1765 }
1766
1768 /* Additionally, try to avoid color clashes with certain nations not
1769 * yet in play (barbarians). */
1770 allowed_nations_iterate(pnation) {
1771 const struct rgbcolor *ncol = nation_color(pnation);
1772 if (ncol && nation_barbarian_type(pnation) != NOT_A_BARBARIAN) {
1773 /* Don't use this color. */
1777 }
1779 }
1781 }
1782
1786
1787 if (needed > rgbcolor_list_size(spare_colors)) {
1788 log_verbose("Not enough unique colors for all players; there will be "
1789 "duplicates");
1790 /* Fallback: start again from full set of ruleset colors.
1791 * No longer attempt to avoid clashes with explicitly assigned colors. */
1794 }
1795 /* We may still not have enough, if there are more players than
1796 * ruleset-defined colors. If so, top up with duplicates. */
1797 if (needed > rgbcolor_list_size(spare_colors)) {
1799 /* Shuffle so that duplicates aren't biased to start of list */
1801 /* Duplication process avoids one color being hit lots of times */
1802 for (i = origsize; i < needed; i++) {
1805 }
1806 }
1807 /* Shuffle (including mixing any duplicates up) */
1809
1810 /* Finally, assign shuffled colors to players. */
1811 players_iterate(pplayer) {
1812 if (!pplayer->rgb) {
1815 }
1817
1819}
1820
1821/**********************************************************************/
1825void server_player_set_color(struct player *pplayer,
1826 const struct rgbcolor *prgbcolor)
1827{
1828 if (prgbcolor != nullptr) {
1829 player_set_color(pplayer, prgbcolor);
1830 } else {
1831 /* This can legitimately be nullptr in pregame. */
1833 rgbcolor_destroy(pplayer->rgb);
1834 pplayer->rgb = nullptr;
1835 }
1836 /* Update clients */
1837 send_player_info_c(pplayer, nullptr);
1838}
1839
1840/**********************************************************************/
1845const char *player_color_ftstr(struct player *pplayer)
1846{
1847 static char buf[64];
1848 char hex[16];
1849 const struct rgbcolor *prgbcolor;
1850
1851 fc_assert_ret_val(pplayer != nullptr, nullptr);
1852
1853 buf[0] = '\0';
1855 if (prgbcolor != nullptr
1856 && rgbcolor_to_hex(prgbcolor, hex, sizeof(hex))) {
1857 struct ft_color plrcolor = FT_COLOR("#000000", hex);
1858
1861 } else {
1862 cat_snprintf(buf, sizeof(buf), _("no color"));
1863 }
1864
1865 return buf;
1866}
1867
1868/**********************************************************************/
1872void give_midgame_initial_units(struct player *pplayer, struct tile *ptile)
1873{
1875 int i;
1876
1877 for (i = 0; i < sucount; i++) {
1878 if (game.server.start_units[i] == 'k') {
1879 /* Every player should have king */
1880 struct unit_type *utype = crole_to_unit_type('k', pplayer);
1881
1882 if (utype != nullptr) {
1883 create_unit(pplayer, ptile, utype, 0, 0, -1);
1884 }
1885 }
1886 }
1887}
1888
1889/**********************************************************************/
1896struct player *server_create_player(int player_id, const char *ai_tname,
1897 struct rgbcolor *prgbcolor,
1899{
1900 struct player_slot *pslot;
1901 struct player *pplayer;
1902
1903 pslot = player_slot_by_number(player_id);
1904 fc_assert(nullptr == pslot || !player_slot_is_used(pslot));
1905
1906 pplayer = player_new(pslot);
1907 if (nullptr == pplayer) {
1908 return nullptr;
1909 }
1910
1914 }
1915
1916 pplayer->ai = ai_type_by_name(ai_tname);
1917
1918 if (pplayer->ai == nullptr) {
1919 player_destroy(pplayer);
1920 return nullptr;
1921 }
1922
1923 adv_data_init(pplayer);
1924
1925 CALL_FUNC_EACH_AI(player_alloc, pplayer);
1926
1927 /* TODO: Do we really need this server_player_init() here? All our callers
1928 * will later make another server_player_init() call anyway, with boolean
1929 * parameters set to what they really need. */
1930 server_player_init(pplayer, FALSE, FALSE);
1931
1932 if (prgbcolor) {
1933 player_set_color(pplayer, prgbcolor);
1934 } /* Else caller must ensure a color is assigned if game has started */
1935
1936 return pplayer;
1937}
1938
1939/**********************************************************************/
1945void server_remove_player(struct player *pplayer)
1946{
1947 const struct player_slot *pslot;
1948
1949 fc_assert_ret(nullptr != pplayer);
1950
1951 /* Save player slot */
1952 pslot = pplayer->slot;
1953
1954 log_normal(_("Removing player %s."), player_name(pplayer));
1955
1956 notify_conn(pplayer->connections, nullptr, E_CONNECTION, ftc_server,
1957 _("You've been removed from the game!"));
1958
1960 _("%s has been removed from the game."),
1961 player_name(pplayer));
1962
1963 if (is_barbarian(pplayer)) {
1964 server.nbarbarians--;
1965 }
1966
1967 /* Don't use conn_list_iterate here because connection_detach() can be
1968 * recursive and free the next connection pointer. */
1969 while (conn_list_size(pplayer->connections) > 0) {
1971 }
1972
1974 /* Clear data saved in the other player structs. */
1976 BV_CLR(aplayer->real_embassy, player_index(pplayer));
1977 if (gives_shared_vision(aplayer, pplayer)) {
1978 remove_shared_vision(aplayer, pplayer);
1979 }
1980 /* Also remove vision provided for the other players */
1981 if (gives_shared_vision(pplayer, aplayer)) {
1982 remove_shared_vision(pplayer, aplayer);
1983 }
1985
1986 /* Remove citizens of this player from the cities of all other players. */
1987 /* FIXME: add a special case if the server quits - no need to run this for
1988 * each player in that case. */
1991 if (city_owner(pcity) != pplayer) {
1992 citizens nationality = citizens_nation_get(pcity, pplayer->slot);
1993
1994 if (nationality != 0) {
1995 /* Change nationality of the citizens to the nationality of the
1996 * city owner. */
1998 nationality);
2000 }
2001 }
2003
2005 }
2006
2007 /* AI type lost control of this player */
2008 if (is_ai(pplayer)) {
2009 CALL_PLR_AI_FUNC(lost_control, pplayer, pplayer);
2010 }
2011
2012 /* Clear all trade routes. This is needed for the other end not
2013 * to point to a city removed by player_clear() */
2014 city_list_iterate(pplayer->cities, pcity) {
2017 TRUE, TRUE);
2018
2019 FC_FREE(proute);
2020 FC_FREE(pback);
2023
2024 /* We have to clear all player data before the ai memory is freed because
2025 * some function may depend on it. */
2026 player_clear(pplayer, TRUE);
2027
2028 if (!map_is_empty()) {
2029 remove_player_from_maps(pplayer);
2030 }
2031 player_map_free(pplayer);
2032
2033 /* Destroy advisor and ai data. */
2034 CALL_FUNC_EACH_AI(player_free, pplayer);
2035
2036 handicaps_close(pplayer);
2037 ai_traits_close(pplayer);
2038 adv_data_close(pplayer);
2039 player_destroy(pplayer);
2040
2041 send_updated_vote_totals(nullptr);
2042 /* Must be called after the player was destroyed */
2043 send_player_remove_info_c(pslot, nullptr);
2044
2045 /* Recalculate borders. */
2047}
2048
2049/**********************************************************************/
2060{
2061 int maxrate, surplus;
2062 struct player_economic *economic;
2063
2064 /* AI players allowed to cheat */
2065 if (is_ai(pplayer) && !has_handicap(pplayer, H_RATES)) {
2066 return;
2067 }
2068
2069 economic = &(pplayer->economic);
2070
2071 maxrate = get_player_maxrate(pplayer);
2072
2073 surplus = 0;
2074 if (economic->luxury > maxrate) {
2075 surplus += economic->luxury - maxrate;
2076 economic->luxury = maxrate;
2077 }
2078 if (economic->tax > maxrate) {
2079 surplus += economic->tax - maxrate;
2080 economic->tax = maxrate;
2081 }
2082 if (economic->science > maxrate) {
2083 surplus += economic->science - maxrate;
2084 economic->science = maxrate;
2085 }
2086
2087 fc_assert(surplus % 10 == 0);
2088
2089 while (surplus > 0) {
2090 if (economic->science < maxrate) {
2091 economic->science += 10;
2092 } else if (economic->tax < maxrate) {
2093 economic->tax += 10;
2094 } else if (economic->luxury < maxrate) {
2095 economic->luxury += 10;
2096 } else {
2097 fc_assert_msg(FALSE, "Failed to distribute the surplus. "
2098 "maxrate = %d.", maxrate);
2099 }
2100 surplus -= 10;
2101 }
2102}
2103
2104/**********************************************************************/
2108static bool server_player_name_is_allowed(const struct connection *caller,
2109 const struct player *pplayer,
2110 const struct nation_type *pnation,
2111 const char *name, char *error_buf,
2112 size_t error_buf_len)
2113{
2114 /* An empty name is surely not allowed. */
2115 if (0 == strlen(name)) {
2116 fc_strlcpy(error_buf, _("Please choose a non-blank name."),
2118 return FALSE;
2119 }
2120
2121 /* Any name already taken is not allowed. */
2122 players_iterate(other_player) {
2123 if (other_player == pplayer) {
2124 /* We don't care if we're the one using the name/nation. */
2125 continue;
2126 } else if (nullptr != pnation && other_player->nation == pnation) {
2127 /* FIXME: currently cannot use nation_of_player(other_player) as the
2128 * nation debug code is buggy and doesn't test nation for nullptr. */
2129 fc_strlcpy(error_buf, _("That nation is already in use."),
2131 return FALSE;
2132 } else if (0 == fc_strcasecmp(player_name(other_player), name)) {
2134 _("Another player already has the name '%s'. Please "
2135 "choose another name."), name);
2136 return FALSE;
2137 }
2139
2140 if (nullptr == pnation) {
2141 /* FIXME: currently cannot use nation_of_player(other_player) as the
2142 * nation debug code is buggy and doesn't test nation for nullptr. */
2143 pnation = pplayer->nation;
2144 }
2145
2146 /* Any name from the default list is always allowed. */
2147 if (nullptr != pnation && nullptr != nation_leader_by_name(pnation, name)) {
2148 return TRUE;
2149 }
2150
2151 /* To prevent abuse, only players with HACK access (usually local
2152 * connections) can use non-ascii names. Otherwise players could use
2153 * confusing garbage names in multi-player games. */
2154 if (nullptr != caller
2155 && caller->access_level < ALLOW_HACK
2156 && !is_ascii_name(name)) {
2158 _("Please choose a name containing only ASCII characters."),
2160 return FALSE;
2161 }
2162
2163 return TRUE;
2164}
2165
2166/**********************************************************************/
2170bool server_player_set_name_full(const struct connection *caller,
2171 struct player *pplayer,
2172 const struct nation_type *pnation,
2173 const char *name,
2174 char *error_buf, size_t error_buf_len)
2175{
2176 char real_name[MAX_LEN_NAME];
2177 char buf[256];
2178 int i;
2179
2180 /* Always provide an error buffer. */
2181 if (nullptr == error_buf) {
2182 error_buf = buf;
2183 error_buf_len = sizeof(buf);
2184 }
2185 error_buf[0] = '\0';
2186
2187 if (nullptr != name) {
2188 /* Ensure this is a correct name. */
2192
2193 if (server_player_name_is_allowed(caller, pplayer, pnation, real_name,
2195 log_debug("Name of player nb %d set to \"%s\".",
2196 player_number(pplayer), real_name);
2197 fc_strlcpy(pplayer->name, real_name, sizeof(pplayer->name));
2198 return TRUE; /* Success! */
2199 } else {
2200 log_verbose("Failed to set the name of the player nb %d to \"%s\": %s",
2201 player_number(pplayer), real_name, error_buf);
2202 /* Fallthrough. */
2203 }
2204 }
2205
2206 if (nullptr != caller) {
2207 /* If we want to test, let's fail here. */
2208 fc_assert(nullptr != name);
2209 return FALSE;
2210 }
2211
2212 if (nullptr != name) {
2213 /* Try to append a number to 'real_name'. */
2214 char test[MAX_LEN_NAME];
2215
2216 for (i = 2; i <= player_slot_count(); i++) {
2217 fc_snprintf(test, sizeof(test), "%s%d", real_name, i);
2218 if (server_player_name_is_allowed(caller, pplayer, pnation,
2220 log_verbose("Name of player nb %d set to \"%s\" instead.",
2221 player_number(pplayer), test);
2222 fc_strlcpy(pplayer->name, test, sizeof(pplayer->name));
2223 return TRUE;
2224 } else {
2225 log_debug("Failed to set the name of the player nb %d to \"%s\": %s",
2226 player_number(pplayer), test, error_buf);
2227 }
2228 }
2229 }
2230
2231 /* Try a default name. */
2233 _("Player no. %d"), player_number(pplayer));
2234 if (server_player_name_is_allowed(caller, pplayer, pnation,
2236 log_verbose("Name of player nb %d set to \"%s\".",
2237 player_number(pplayer), real_name);
2238 fc_strlcpy(pplayer->name, real_name, sizeof(pplayer->name));
2239 return TRUE;
2240 } else {
2241 log_debug("Failed to set the name of the player nb %d to \"%s\": %s",
2242 player_number(pplayer), real_name, error_buf);
2243 }
2244
2245 /* Try a very default name... */
2246 for (i = 0; i < player_slot_count(); i++) {
2247 fc_snprintf(real_name, sizeof(real_name), _("Player no. %d"), i);
2248 if (server_player_name_is_allowed(caller, pplayer, pnation,
2250 log_verbose("Name of player nb %d to \"%s\".",
2251 player_number(pplayer), real_name);
2252 fc_strlcpy(pplayer->name, real_name, sizeof(pplayer->name));
2253 return TRUE;
2254 } else {
2255 log_debug("Failed to set the name of the player nb %d to \"%s\": %s",
2256 player_number(pplayer), real_name, error_buf);
2257 }
2258 }
2259
2260 /* This is really not normal... Maybe the size of 'real_name'
2261 * is not enough big, or a bug in server_player_name_is_allowed(). */
2262 fc_strlcpy(pplayer->name, _("A poorly-named player"),
2263 sizeof(pplayer->name));
2264 return FALSE; /* Let's say it's a failure. */
2265}
2266
2267/**********************************************************************/
2270void server_player_set_name(struct player *pplayer, const char *name)
2271{
2272#ifndef FREECIV_NDEBUG
2273 bool ret =
2274#endif
2275 server_player_set_name_full(nullptr, pplayer, nullptr, name, nullptr, 0);
2276
2277 fc_assert(ret);
2278}
2279
2280/**********************************************************************/
2286static enum diplstate_type
2288 const struct player *pplayer2)
2289{
2291 if (pplayer3 != pplayer1
2292 && pplayer3 != pplayer2
2295 return DS_PEACE;
2296 }
2298
2299 return DS_WAR;
2300}
2301
2302/**********************************************************************/
2306 struct tile *ptile)
2307{
2309
2310 if (pplayer1 == pplayer2
2311 || !pplayer1->is_alive
2312 || !pplayer2->is_alive) {
2313 return;
2314 }
2315
2318
2321 ds_plr1plr2->contact_turns_left = game.server.contactturns;
2322 ds_plr2plr1->contact_turns_left = game.server.contactturns;
2323 }
2324 if (ds_plr1plr2->type == DS_NO_CONTACT) {
2326 pplayer2);
2327
2329 ds_plr1plr2->first_contact_turn = game.info.turn;
2330 ds_plr2plr1->first_contact_turn = game.info.turn;
2332 _("You have made contact with the %s, ruled by %s."),
2336 _("You have made contact with the %s, ruled by %s."),
2339 send_player_all_c(pplayer1, pplayer2->connections);
2340 send_player_all_c(pplayer2, pplayer1->connections);
2341 send_player_all_c(pplayer1, pplayer1->connections);
2342 send_player_all_c(pplayer2, pplayer2->connections);
2343 if (is_ai(pplayer1)) {
2345 }
2346 if (is_ai(pplayer2)) {
2348 }
2349 return;
2350 } else {
2352 }
2354 || team_has_embassy(pplayer2->team, pplayer1)) {
2355 return; /* Avoid sending too much info over the network */
2356 }
2357 /* Send correct info about players to each other
2358 * before sending updated contact info to each player.
2359 * This makes sure that the client does not assume that
2360 * it already has contact provided info, when it actually
2361 * is only going to get it in the next packet. */
2362 send_player_info_c(pplayer1, pplayer2->connections);
2363 send_player_info_c(pplayer2, pplayer1->connections);
2364 send_player_all_c(pplayer1, pplayer1->connections);
2365 send_player_all_c(pplayer2, pplayer2->connections);
2366}
2367
2368/**********************************************************************/
2371void maybe_make_contact(struct tile *ptile, struct player *pplayer)
2372{
2373 square_iterate(&(wld.map), ptile, 1, tile1) {
2374 struct city *pcity = tile_city(tile1);
2375
2376 if (pcity) {
2377 make_contact(pplayer, city_owner(pcity), ptile);
2378 }
2381 continue; /* Flagless unit can't make contact */
2382 }
2383 make_contact(pplayer, unit_owner(punit), ptile);
2386}
2387
2388/**********************************************************************/
2392{
2393 /* shuffled_order is defined global */
2394 int n = player_slot_count();
2395 int i;
2396
2397 log_debug("shuffle_players: creating shuffled order");
2398
2399 for (i = 0; i < n; i++) {
2400 shuffled_order[i] = i;
2401 }
2402
2403 /* Randomize it */
2405
2406#ifdef FREECIV_DEBUG
2407 for (i = 0; i < n; i++) {
2408 log_debug("shuffled_order[%d] = %d", i, shuffled_order[i]);
2409 }
2410#endif /* FREECIV_DEBUG */
2411}
2412
2413/**********************************************************************/
2417{
2418 int i;
2419
2420 log_debug("set_shuffled_players: loading shuffled array %p",
2422
2423 for (i = 0; i < player_slot_count(); i++) {
2425 log_debug("shuffled_order[%d] = %d", i, shuffled_order[i]);
2426 }
2427}
2428
2429/**********************************************************************/
2435{
2436 struct player *pplayer;
2437
2438 pplayer = player_by_number(shuffled_order[i]);
2439 log_debug("shuffled_player(%d) = %d (%s)",
2440 i, shuffled_order[i], player_name(pplayer));
2441 return pplayer;
2442}
2443
2444/**********************************************************************/
2467 bool ignore_conflicts,
2468 bool needs_startpos,
2469 enum barbarian_type barb_type)
2470{
2471 enum {
2474 int match[nation_count()], pick, idx;
2476
2477 /* Values of nations_used:
2478 * UNAVAILABLE - nation is already used or is a special nation.
2479 * AVAILABLE - we can use this nation.
2480 * PREFERRED - we can use this nation and it is on the choices list.
2481 * UNWANTED - we can use this nation, but we really don't want to. */
2482 nations_iterate(pnation) {
2483 idx = nation_index(pnation);
2484
2485 if (!nation_is_in_current_set(pnation)
2486 || pnation->player
2488 && pnation->server.no_startpos)
2489 || (barb_type != nation_barbarian_type(pnation))
2490 || (barb_type == NOT_A_BARBARIAN && !is_nation_playable(pnation))) {
2491 /* Nation is unplayable or already used: don't consider it.
2492 * (If nations aren't currently restricted to those with start
2493 * positions, we do nothing special here, but generate_players() will
2494 * tend to prefer them.) */
2496 match[idx] = 0;
2497 continue;
2498 }
2499
2500 nations_used[idx] = AVAILABLE;
2501
2502 /* Determine which nations look good with nations already in the game,
2503 * or conflict with them. */
2504 match[idx] = 1;
2505 players_iterate(pplayer) {
2506 if (pplayer->nation != NO_NATION_SELECTED) {
2507 int x = nations_match(pnation, nation_of_player(pplayer),
2509 if (x < 0) {
2510 log_debug("Nations '%s' (nb %d) and '%s' (nb %d) are in conflict.",
2511 nation_rule_name(pnation), nation_number(pnation),
2514 nations_used[idx] = UNWANTED;
2515 match[idx] -= x * 100;
2516 break;
2517 } else {
2518 match[idx] += x * 100;
2519 }
2520 }
2522
2523 if (AVAILABLE == nations_used[idx]) {
2524 num_avail_nations += match[idx];
2525 }
2527
2528 /* Mark as preferred those nations which are on the choices list and
2529 * which are AVAILABLE, but no UNWANTED */
2530 if (nullptr != choices) {
2531 nation_list_iterate(choices, pnation) {
2532 idx = nation_index(pnation);
2533 if (nations_used[idx] == AVAILABLE) {
2534 num_pref_nations += match[idx];
2535 nations_used[idx] = PREFERRED;
2536 }
2538 }
2539
2540 if (0 < num_pref_nations || 0 < num_avail_nations) {
2541 if (0 < num_pref_nations) {
2542 /* Use a preferred nation only. */
2545 log_debug("Picking a preferred nation.");
2546 } else {
2547 /* Use any available nation. */
2551 log_debug("Picking an available nation.");
2552 }
2553
2554 nations_iterate(pnation) {
2555 idx = nation_index(pnation);
2556 if (nations_used[idx] == looking_for) {
2557 pick -= match[idx];
2558
2559 if (0 > pick) {
2560 return pnation;
2561 }
2562 }
2564 } else {
2565 /* No available nation: use unwanted nation... */
2568
2569 log_debug("Picking an unwanted nation.");
2570 nations_iterate(pnation) {
2571 idx = nation_index(pnation);
2572 if (UNWANTED == nations_used[idx]) {
2573 pick = -fc_rand(match[idx]);
2574 if (pick > less_worst_score) {
2575 less_worst_nation = pnation;
2577 }
2578 }
2580
2582 return less_worst_nation;
2583 }
2584 }
2585
2586 log_verbose("No nation found!");
2587
2588 return NO_NATION_SELECTED;
2589}
2590
2591/**********************************************************************/
2594static struct nation_set *current_nationset(void)
2595{
2597}
2598
2599/**********************************************************************/
2603bool nation_is_in_current_set(const struct nation_type *pnation)
2604{
2605 return nation_is_in_set(pnation, current_nationset());
2606}
2607
2608/**********************************************************************/
2613{
2614 server.playable_nations = 0;
2615 allowed_nations_iterate(pnation) {
2616 if (is_nation_playable(pnation)) {
2617 server.playable_nations++;
2618 }
2620}
2621
2622/**********************************************************************/
2627bool client_can_pick_nation(const struct nation_type *pnation)
2628{
2629 fc_assert_ret_val(pnation != nullptr, FALSE);
2630 return nation_is_in_current_set(pnation)
2631 && is_nation_playable(pnation)
2633 || !pnation->server.no_startpos);
2634}
2635
2636/**********************************************************************/
2640 bool nationset_change)
2641{
2642 struct packet_nation_availability packet;
2643
2644 packet.ncount = nation_count();
2646 nations_iterate(pnation) {
2647 packet.is_pickable[nation_index(pnation)] = client_can_pick_nation(pnation);
2649 lsend_packet_nation_availability(dest, &packet);
2650}
2651
2652/**********************************************************************/
2656 bool nationset_change)
2657{
2658 if (0 < player_info_frozen_level) {
2659 return; /* Discard, see comment for player_info_freeze(). */
2660 } else {
2662 }
2663}
2664
2665/**********************************************************************/
2673{
2674 int ncount = nation_set_count();
2675 int misfits[ncount];
2676
2677 memset(misfits, 0, sizeof(misfits));
2678
2680 players_iterate(pplayer) {
2681 if (pplayer->nation != NO_NATION_SELECTED
2682 && !nation_is_in_set(pplayer->nation, pset)) {
2684 }
2687
2689 /* Current set is OK. */
2690 return;
2691 }
2692
2693 /* Otherwise, pick the least bad set (requires unsetting fewest
2694 * players, possibly none). */
2695 {
2696 int i, least_misfits;
2697 const struct nation_set *best;
2698
2699 fc_assert(ncount > 0);
2700
2701 best = nation_set_by_number(0);
2703 for (i = 1; i < ncount && least_misfits != 0; i++) {
2704 if (best == nullptr || misfits[i] < least_misfits) {
2705 best = nation_set_by_number(i);
2707 }
2708 }
2709
2710 log_verbose("Current nationset \"%s\" doesn't fit all existing players.",
2712 log_verbose("Selected nationset \"%s\".", nation_set_rule_name(best));
2714 sizeof(game.server.nationset));
2716 /* No need to refresh clients, as we're assumed to be in the middle of
2717 * loading a savegame and will send new setting/availability later
2718 * along with everything else */
2719 }
2720
2721 /* The set we chose may not fit all the players; as a last resort,
2722 * unset nations (caller must then arrange new assignments). */
2723 players_iterate(pplayer) {
2724 if (pplayer->nation != NO_NATION_SELECTED
2725 && !nation_is_in_current_set(pplayer->nation)) {
2726 log_verbose("Nation %s of player %s not in nationset \"%s\", unsetting.",
2727 nation_plural_for_player(pplayer), player_name(pplayer),
2730 }
2732}
2733
2734/**********************************************************************/
2738{
2739 if (S_S_INITIAL != server_state()) {
2740 return;
2741 }
2742 players_iterate(pplayer) {
2743 if (pplayer->is_ready) {
2744 bool persistent = FALSE;
2745
2746 if (plrchange) {
2747 switch (game.info.persistent_ready)
2748 {
2750 persistent = FALSE;
2751 break;
2753 persistent = pplayer->is_connected;
2754 break;
2755 }
2756 }
2757
2758 if (!persistent) {
2759 pplayer->is_ready = FALSE;
2761 }
2762 }
2764}
2765
2766/**********************************************************************/
2772static struct player *split_player(struct player *pplayer)
2773{
2775 struct player *cplayer;
2776 struct nation_type *rebel_nation;
2777
2778 /* Make a new player, or not */
2779 cplayer = server_create_player(-1, ai_name(pplayer->ai),
2780 nullptr, FALSE);
2781 if (!cplayer) {
2782 return nullptr;
2783 }
2784
2785 /* While this sets player->economic according to max rates as known
2786 * at this point, we redo that later, so that MaxRates effect
2787 * requirements will be evaluated with more completely set up player
2788 * (e.g. correct government) */
2790
2791 /* Rebel will always be an AI player */
2792 rebel_nation = pick_a_nation(nation_of_player(pplayer)->server.civilwar_nations,
2795
2797 /* Find a color for the new player. */
2799
2800 /* Send information about the used player slot to all connections. */
2801 send_player_info_c(cplayer, nullptr);
2802
2803 sz_strlcpy(cplayer->username, _(ANON_USER_NAME));
2804 cplayer->unassigned_user = TRUE;
2805 cplayer->is_connected = FALSE;
2807 fc_assert(cplayer->revolution_finishes < 0);
2808 /* No capital for the split player. */
2810
2811 players_iterate(other_player) {
2812 struct player_diplstate *ds_co
2813 = player_diplstate_get(cplayer, other_player);
2814 struct player_diplstate *ds_oc
2815 = player_diplstate_get(other_player, cplayer);
2816
2817 if (get_player_bonus(other_player, EFT_NO_DIPLOMACY) > 0) {
2818 /* FIXME: What about No-contact war? */
2820 } else {
2822 }
2823
2824 ds_co->has_reason_to_cancel = 0;
2825 ds_co->turns_left = 0;
2826 ds_co->contact_turns_left = 0;
2827 ds_oc->has_reason_to_cancel = 0;
2828 ds_oc->turns_left = 0;
2829 ds_oc->contact_turns_left = 0;
2830
2831 /* Send so that other_player sees updated diplomatic info;
2832 * pplayer will be sent later anyway
2833 */
2834 if (other_player != pplayer) {
2835 send_player_all_c(other_player, other_player->connections);
2836 }
2838
2839 /* Split the resources */
2840 cplayer->economic.gold = pplayer->economic.gold;
2841 cplayer->economic.gold /= 2;
2842 pplayer->economic.gold -= cplayer->economic.gold;
2843
2844 /* Copy the research */
2846 old_research = research_get(pplayer);
2847
2848 new_research->bulbs_researched = 0;
2849 new_research->techs_researched = old_research->techs_researched;
2850 new_research->researching = old_research->researching;
2851 new_research->future_tech = old_research->future_tech;
2852 new_research->tech_goal = old_research->tech_goal;
2853
2857 new_research->inventions[i].bulbs_researched_saved
2858 = old_research->inventions[i].bulbs_researched_saved;
2859 }
2861 cplayer->phase_done = TRUE; /* Have other things to think
2862 about - paralysis */
2863 BV_CLR_ALL(cplayer->real_embassy); /* All embassies destroyed */
2865
2866 /* Do the AI */
2868 cplayer->ai_common.maxbuycost = pplayer->ai_common.maxbuycost;
2869 cplayer->ai_common.warmth = pplayer->ai_common.warmth;
2870 cplayer->ai_common.frost = pplayer->ai_common.frost;
2872
2873 /* Change the original player */
2875 pplayer->target_government = pplayer->government;
2877 pplayer->revolution_finishes = game.info.turn + 1;
2878 }
2879 old_research->bulbs_researched = 0;
2880 old_research->researching_saved = A_UNKNOWN;
2881 BV_CLR_ALL(pplayer->real_embassy); /* All embassies destroyed */
2882
2883 /* Give split player the embassies to their team mates back, if any */
2884 if (pplayer->team) {
2886 if (pplayer->team == pdest->team
2887 && pplayer != pdest) {
2888 establish_embassy(pplayer, pdest);
2889 }
2891 }
2893
2895
2896 /* Copy the maps */
2897
2899
2900 pplayer->server.border_vision = cplayer->server.border_vision;
2901
2902 /* Not sure if this is necessary, but might be a good idea
2903 * to avoid doing some ai calculations with bogus data. */
2905 CALL_PLR_AI_FUNC(phase_begin, cplayer, cplayer, TRUE);
2906 CALL_PLR_AI_FUNC(gained_control, cplayer, cplayer);
2907 CALL_PLR_AI_FUNC(split_by_civil_war, pplayer, pplayer, cplayer);
2908 CALL_PLR_AI_FUNC(created_by_civil_war, cplayer, pplayer, cplayer);
2909
2911
2912 return cplayer;
2913}
2914
2915/**********************************************************************/
2923bool civil_war_possible(struct player *pplayer, bool conquering_city,
2925{
2926 int n;
2927 const struct civ_map *nmap = &(wld.map);
2928
2930 return FALSE;
2931 }
2932
2933 n = city_list_size(pplayer->cities);
2934
2935 if (n - (conquering_city ? 1 : 0) < GAME_MIN_CIVILWARSIZE) {
2936 return FALSE;
2937 }
2940 && n >= game.server.civilwarsize;
2941 } else {
2942 return TRUE;
2943 }
2944}
2945
2946/**********************************************************************/
2971bool civil_war_triggered(struct player *pplayer)
2972{
2973 /* Get base probabilities */
2974 int dice = fc_rand(100); /* Throw the dice */
2975 int prob = get_player_bonus(pplayer, EFT_CIVIL_WAR_CHANCE);
2976
2977 /* Now compute the contribution of the cities. */
2978 city_list_iterate(pplayer->cities, pcity) {
2981
2982 log_verbose("Civil war chance for %s: prob %d, dice %d",
2983 player_name(pplayer), prob, dice);
2984
2985 return (dice < prob);
2986}
2987
2988/**********************************************************************/
3016struct player *civil_war(struct player *pplayer)
3017{
3018 int i, j;
3019 struct player *cplayer;
3020 struct city *capital;
3021 struct city_list *defector_candidates;
3022 size_t plr_count;
3023
3024 /* It is possible that this function gets called after pplayer
3025 * died. Player pointers are safe even after death. */
3026 if (!pplayer->is_alive) {
3027 return nullptr;
3028 }
3029
3031 if (plr_count >= MAX_NUM_PLAYERS) {
3032 /* No space to make additional player */
3033 log_normal(_("Could not throw %s into civil war - too many players"),
3034 nation_plural_for_player(pplayer));
3035 return nullptr;
3036 }
3037
3039 /* No space to make additional player */
3040 log_normal(_("Could not throw %s into civil war - maxplayers (%d) reached"),
3042 return nullptr;
3043 }
3044
3045 if (plr_count >= server.playable_nations) {
3046 /* No nation for additional player */
3047 log_normal(_("Could not throw %s into civil war - no available nations"),
3048 nation_plural_for_player(pplayer));
3049 return nullptr;
3050 }
3051
3052 /* It doesn't make sense to try to split an empire of 1 city.
3053 * This should have been enforced by civil_war_possible(). */
3054 fc_assert_ret_val(city_list_size(pplayer->cities) > 1, nullptr);
3055
3057 city_list_iterate(pplayer->cities, pcity) {
3058 bool gameloss_present = FALSE;
3059
3060 /* Capital (probably new capital) won't defect */
3061 if (is_capital(pcity)) {
3062 continue;
3063 }
3064
3065 /* City hosting victim's GameLoss unit won't defect */
3067 if (unit_owner(punit) == pplayer
3070 break;
3071 }
3073
3074 if (gameloss_present) {
3075 continue;
3076 }
3077
3080
3082 log_verbose(_("Could not throw %s into civil war - no available cities"),
3083 nation_plural_for_player(pplayer));
3085
3086 return nullptr;
3087 }
3088
3089 /* We're definitely going to create a new rebel player. */
3090
3091 cplayer = split_player(pplayer);
3092
3093 /* Before units, cities, so clients know name of new nation
3094 * (for debugging etc).
3095 */
3096 send_player_all_c(cplayer, nullptr);
3097 send_player_all_c(pplayer, nullptr);
3098
3099 /* Now split the empire */
3100
3101 log_verbose("%s civil war; created AI %s",
3104 notify_player(pplayer, nullptr, E_CIVIL_WAR, ftc_server,
3105 _("Your nation is thrust into civil war."));
3106
3107 notify_player(pplayer, nullptr, E_FIRST_CONTACT, ftc_server,
3108 /* TRANS: <leader> ... the Poles. */
3109 _("%s is the rebellious leader of the %s."),
3112
3113 j = city_list_size(defector_candidates); /* number left to process */
3114 /* Number to try to flip; ensure that at least one eligible city is
3115 * flipped */
3116 i = MAX(j/2, 1);
3118 fc_assert_action(!is_capital(pcity), continue);
3119 if (i >= j || (i > 0 && fc_rand(2) == 1)) {
3120 /* Transfer city and units supported by this city to the new owner.
3121 * We do NOT resolve stack conflicts here, but rather later.
3122 * Reason: if we have a transporter from one city which is carrying
3123 * a unit from another city, and both cities join the rebellion. If we
3124 * resolved stack conflicts for each city we would teleport the first
3125 * of the units we met since the other would have another owner. */
3127 log_verbose("%s declares allegiance to the %s.", city_name_get(pcity),
3130 /* TRANS: <city> ... the Poles. */
3131 _("%s declares allegiance to the %s."),
3134 script_server_signal_emit("city_transferred", pcity, pplayer,
3135 cplayer, "civil_war");
3136 }
3137 i--;
3138 }
3139 j--;
3141
3143
3145
3146 i = city_list_size(cplayer->cities);
3147 fc_assert(i > 0); /* Rebels should have got at least one city */
3148
3149 /* Choose a capital (random). */
3150 capital = city_list_get(cplayer->cities, fc_rand(i));
3153
3154 notify_player(nullptr, nullptr, E_CIVIL_WAR, ftc_server,
3155 /* TRANS: ... Danes ... Poles ... <7> cities. */
3156 PL_("Civil war partitions the %s;"
3157 " the %s now hold %d city.",
3158 "Civil war partitions the %s;"
3159 " the %s now hold %d cities.",
3160 i),
3161 nation_plural_for_player(pplayer),
3163 i);
3164
3165 return cplayer;
3166}
3167
3168/**********************************************************************/
3173 *chunk)
3174{
3176}
3177
3178/**********************************************************************/
3182{
3183 send_attribute_block(pplayer, pplayer->current_conn);
3184}
3185
3186/**********************************************************************/
3190 int turn)
3191{
3192 if (turn != game.info.turn) {
3193 /* If this happens then the player actually pressed turn-done on a
3194 * previous turn but we didn't receive it until now. The player
3195 * probably didn't actually mean to end their turn! */
3196 return;
3197 }
3198
3199 pplayer->phase_done = TRUE;
3200
3202
3203 send_player_all_c(pplayer, nullptr);
3204}
3205
3206/**********************************************************************/
3210{
3211 return server.nbarbarians;
3212}
3213
3214/**********************************************************************/
3218{
3219 return player_count() - server.nbarbarians;
3220}
3221
3222/**********************************************************************/
3226{
3227 BV_SET(plr->server.status, pstatus);
3228}
3229
3230/**********************************************************************/
3234{
3235 return BV_ISSET(plr->server.status, pstatus);
3236}
3237
3238/**********************************************************************/
3242{
3243 BV_CLR_ALL(plr->server.status);
3245}
3246
3247/**********************************************************************/
3250const char *player_delegation_get(const struct player *pplayer)
3251{
3252 if (pplayer == nullptr || strlen(pplayer->server.delegate_to) == 0) {
3253 /* No delegation if there is no player. */
3254 return nullptr;
3255 } else {
3256 return pplayer->server.delegate_to;
3257 }
3258}
3259
3260/**********************************************************************/
3263void player_delegation_set(struct player *pplayer, const char *username)
3264{
3265 fc_assert_ret(pplayer != nullptr);
3266
3267 if (username == nullptr || strlen(username) == 0) {
3268 pplayer->server.delegate_to[0] = '\0';
3269 } else {
3270 sz_strlcpy(pplayer->server.delegate_to, username);
3271 }
3272}
3273
3274/**********************************************************************/
3279bool player_delegation_active(const struct player *pplayer)
3280{
3281 return (pplayer && strlen(pplayer->server.orig_username) != 0);
3282}
3283
3284/**********************************************************************/
3288{
3289 if (game.info.is_new_game) {
3290 return;
3291 }
3292
3293 if (!pconn->observer
3294 && pconn->playing && player_delegation_get(pconn->playing) != nullptr) {
3295 notify_conn(pconn->self, nullptr, E_CONNECTION, ftc_server,
3296 /* TRANS: '/delegate cancel' is a server command and must not
3297 * be translated */
3298 _("User '%s' is currently allowed to take control of your "
3299 "player while you are away. Use '/delegate cancel' to "
3300 "revoke this access."),
3301 player_delegation_get(pconn->playing));
3302 }
3303
3304 {
3305 bool any_delegations = FALSE;
3306
3308 if (player_delegation_get(aplayer) != nullptr
3309 && strcmp(player_delegation_get(aplayer), pconn->username) == 0) {
3310 notify_conn(pconn->self, nullptr, E_CONNECTION, ftc_server,
3311 _("Control of player '%s' is delegated to you."),
3314 }
3316 if (any_delegations) {
3317 notify_conn(pconn->self, nullptr, E_CONNECTION, ftc_server,
3318 /* TRANS: '/delegate take' is a server command and must not
3319 * be translated; but <player> should be translated. */
3320 _("Use '/delegate take <player>' to take control of a "
3321 "delegated player."));
3322 }
3323 }
3324}
3325
3326/**********************************************************************/
3332{
3333 players_iterate(pplayer) {
3334 if (player_delegation_get(pplayer)
3335 && fc_strcasecmp(name, pplayer->server.orig_username) == 0) {
3336 return pplayer;
3337 }
3339
3340 return nullptr;
3341}
3342
3343/**********************************************************************/
3347{
3348 fc_assert_ret(game.server.plr_colors == nullptr);
3349
3351}
3352
3353/**********************************************************************/
3371
3372/**********************************************************************/
3381
3382/**********************************************************************/
3386{
3387 fc_assert_ret_val(game.server.plr_colors != nullptr, nullptr);
3388
3390}
3391
3392/**********************************************************************/
3396{
3397 fc_assert_ret_val(game.server.plr_colors != nullptr, -1);
3398
3400}
3401
3402/**********************************************************************/
3405void handle_player_multiplier(struct player *pplayer, int count,
3406 const int *multipliers)
3407{
3408 int rval;
3409 int i;
3410
3411 if (count != multiplier_count()) {
3412 log_error("Bad number of multipliers %d from client for %s",
3413 count, player_name(pplayer));
3414 return;
3415 }
3416
3417 for (i = 0; i < count; i++) {
3418 struct multiplier *pmul = multiplier_by_number(i);
3419
3420 if (multiplier_can_be_changed(pmul, pplayer)) {
3421 if (multipliers[i] < pmul->start || multipliers[i] > pmul->stop) {
3422 log_error("Multiplier value %d for %s out of range for %s",
3424 player_name(pplayer));
3425 } else {
3426 rval = (multipliers[i] - pmul->start) / pmul->step * pmul->step + pmul->start;
3427 if (rval != multipliers[i]) {
3428 log_error("Multiplier value %d between valid values for %s for %s",
3430 player_name(pplayer));
3431 } else {
3432 pplayer->multipliers[i].target = multipliers[i];
3433 }
3434 }
3435 }
3436 }
3437
3438 send_player_info_c(pplayer, nullptr);
3439}
3440
3441/**********************************************************************/
3444void player_set_to_ai_mode(struct player *pplayer, enum ai_level skill_level)
3445{
3446 set_as_ai(pplayer);
3447
3448 set_ai_level_directer(pplayer, skill_level);
3449 cancel_all_meetings(pplayer);
3450 CALL_PLR_AI_FUNC(gained_control, pplayer, pplayer);
3451 if (is_player_phase(pplayer, game.info.phase)) {
3452 CALL_PLR_AI_FUNC(restart_phase, pplayer, pplayer);
3453 }
3454
3455 if (S_S_RUNNING == server_state()) {
3456 /* In case this was last player who has not pressed turn done. */
3458 }
3459
3460 fc_assert(pplayer->ai_common.skill_level == skill_level);
3461}
3462
3463/**********************************************************************/
3467{
3468 set_as_human(pplayer);
3469
3470 if (pplayer->ai_common.skill_level == AI_LEVEL_AWAY) {
3472 }
3473
3474 CALL_PLR_AI_FUNC(lost_control, pplayer, pplayer);
3475
3476 /* Because AI "cheats" with government rates but humans shouldn't. */
3477 if (!game.info.is_new_game) {
3478 check_player_max_rates(pplayer);
3479 }
3480 cancel_all_meetings(pplayer);
3481}
3482
3483/**********************************************************************/
3487{
3488 char buf[200 + MAX_LEN_NAME];
3489
3490 /* gold_upkeep_style check currently redundant, but something we need
3491 * once homeless_gold_upkeep retired. */
3494 unit_list_iterate(pplayer->units, punit) {
3495 if (is_unit_homeless(punit)) {
3496 int gold = utype_upkeep_cost(unit_type_get(punit), pplayer, O_GOLD);
3497
3498 punit->upkeep[O_GOLD] = gold;
3499 punit->server.upkeep_paid[O_GOLD] = gold;
3500
3501 pplayer->economic.gold -= gold;
3502 }
3504 }
3505
3506 if (pplayer->economic.gold < 0) {
3507 switch (game.info.gold_upkeep_style) {
3508 case GOLD_UPKEEP_CITY:
3509 break;
3510 case GOLD_UPKEEP_MIXED:
3511 /* Nation pays for units. */
3513 break;
3514 case GOLD_UPKEEP_NATION:
3515 /* Nation pays for units and buildings. */
3517 break;
3518 }
3519 }
3520
3521 /* This test includes the cost of the units because
3522 * units are paid for in update_city_activity() or
3523 * player_balance_treasury_units(). */
3524 if (old_gold - (old_gold - pplayer->economic.gold) * 3 < 0) {
3525 notify_player(pplayer, nullptr, E_LOW_ON_FUNDS, ftc_server,
3526 _("WARNING, we're LOW on FUNDS %s."),
3527 ruler_title_for_player(pplayer, buf, sizeof(buf)));
3528 }
3529
3530#if 0
3531 /* Uncomment to unbalance the game, like in civ1 (CLG). */
3532 if (pplayer->got_tech && pplayer->research->researched > 0) {
3533 pplayer->research->researched = 0;
3534 }
3535#endif
3536
3537 if (pplayer->economic.infra_points < 0) {
3538 pplayer->economic.infra_points = 0;
3539 }
3540
3541 pplayer->history += nation_history_gain(pplayer);
3542
3544 /* Reduce the number of bulbs by the amount needed for tech upkeep and
3545 * check for finished research */
3546 update_bulbs(pplayer, -player_tech_upkeep(pplayer), TRUE, FALSE);
3547}
bool is_action_enabled_player(const struct civ_map *nmap, const action_id wanted_action, const struct player *actor_plr)
Definition actions.c:3482
void adv_data_close(struct player *pplayer)
Definition advdata.c:762
void adv_data_init(struct player *pplayer)
Definition advdata.c:706
bool adv_data_phase_init(struct player *pplayer, bool is_new_phase)
Definition advdata.c:270
void adv_data_default(struct player *pplayer)
Definition advdata.c:739
const char * ai_name(const struct ai_type *ai)
Definition ai.c:335
const char * ai_type_name_or_fallback(const char *orig_name)
Definition ai.c:346
struct ai_type * ai_type_by_name(const char *search)
Definition ai.c:290
#define CALL_FUNC_EACH_AI(_func,...)
Definition ai.h:387
@ INCIDENT_WAR
Definition ai.h:46
#define CALL_PLR_AI_FUNC(_func, _player,...)
Definition ai.h:377
void call_incident(enum incident_type type, enum casus_belli_range scope, const struct action *paction, struct player *violator, struct player *victim)
Definition aiiface.c:220
void ai_traits_close(struct player *pplayer)
Definition aitraits.c:59
#define n
Definition astring.c:77
struct player * create_barbarian_player(enum barbarian_type type)
Definition barbarian.c:97
#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
void citizens_nation_move(struct city *pcity, const struct player_slot *pslot_from, const struct player_slot *pslot_to, int move)
Definition citizens.c:130
citizens citizens_nation_get(const struct city *pcity, const struct player_slot *pslot)
Definition citizens.c:74
bool is_capital(const struct city *pcity)
Definition city.c:1579
const char * city_name_get(const struct city *pcity)
Definition city.c:1137
#define cities_iterate_end
Definition city.h:514
#define city_list_iterate_safe(citylist, _city)
Definition city.h:519
#define city_list_iterate(citylist, pcity)
Definition city.h:505
#define city_tile(_pcity_)
Definition city.h:561
#define cities_iterate(pcity)
Definition city.h:509
#define city_owner(_pcity_)
Definition city.h:560
#define city_list_iterate_end
Definition city.h:507
#define city_list_iterate_safe_end
Definition city.h:541
void city_map_update_empty(struct city *pcity, struct tile *ptile)
Definition citytools.c:3280
void city_build_free_buildings(struct city *pcity)
Definition citytools.c:1435
void sync_cities(void)
Definition citytools.c:3354
void city_map_update_all_cities_for_player(struct player *pplayer)
Definition citytools.c:3388
void remove_city(struct city *pcity)
Definition citytools.c:1713
struct trade_route * remove_trade_route(struct city *pc1, struct trade_route *proute, bool announce, bool source_gone)
Definition citytools.c:2946
bool transfer_city(struct player *ptaker, struct city *pcity, int kill_outside, bool transfer_unit_verbose, bool resolve_stack, bool raze, bool build_free)
Definition citytools.c:1077
void city_refresh_queue_add(struct city *pcity)
Definition cityturn.c:197
bool player_balance_treasury_units_and_buildings(struct player *pplayer)
Definition cityturn.c:3238
bool player_balance_treasury_units(struct player *pplayer)
Definition cityturn.c:3301
void city_refresh_for_player(struct player *pplayer)
Definition cityturn.c:182
void city_refresh_queue_processing(void)
Definition cityturn.c:213
char * incite_cost
Definition comments.c:76
void connection_detach(struct connection *pconn, bool remove_unused_player)
#define conn_list_iterate(connlist, pconn)
Definition connection.h:108
#define conn_list_iterate_end
Definition connection.h:110
int player_culture(const struct player *plr)
Definition culture.c:49
int nation_history_gain(const struct player *pplayer)
Definition culture.c:66
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
void set_ai_level_directer(struct player *pplayer, enum ai_level level)
Definition difficulty.c:39
void establish_embassy(struct player *pplayer, struct player *aplayer)
Definition diplhand.c:698
void reject_all_treaties(struct player *pplayer)
Definition diplhand.c:935
void set_diplstate_type(struct player_diplstate *state1, struct player_diplstate *state2, enum diplstate_type type)
Definition diplhand.c:122
void cancel_all_meetings(struct player *pplayer)
Definition diplhand.c:923
bool could_intel_with_player(const struct player *pplayer, const struct player *aplayer)
Definition diptreaty.c:84
int get_city_bonus(const struct city *pcity, enum effect_type effect_type)
Definition effects.c:842
int get_player_bonus(const struct player *pplayer, enum effect_type effect_type)
Definition effects.c:824
struct player * extra_owner(const struct tile *ptile)
Definition extras.c:1128
#define extra_type_by_cause_iterate_end
Definition extras.h:339
#define extra_type_by_cause_iterate(_cause, _extra)
Definition extras.h:333
int Tech_type_id
Definition fc_types.h:237
unsigned char citizens
Definition fc_types.h:248
int Impr_type_id
Definition fc_types.h:236
#define MAX_NUM_PLAYERS
Definition fc_types.h:36
revolen_type
Definition fc_types.h:990
@ REVOLEN_RANDOM
Definition fc_types.h:992
@ REVOLEN_RANDQUICK
Definition fc_types.h:994
@ REVOLEN_FIXED
Definition fc_types.h:991
@ REVOLEN_QUICKENING
Definition fc_types.h:993
int Government_type_id
Definition fc_types.h:241
#define MAX_NUM_PLAYER_SLOTS
Definition fc_types.h:32
#define MAX_LEN_NAME
Definition fc_types.h:67
@ O_GOLD
Definition fc_types.h:102
#define PL_(String1, String2, n)
Definition fcintl.h:71
#define _(String)
Definition fcintl.h:67
size_t featured_text_apply_tag(const char *text_source, char *featured_text, size_t featured_text_len, enum text_tag_type tag_type, ft_offset_t start_offset, ft_offset_t stop_offset,...)
const struct ft_color ftc_server
const char * city_link(const struct city *pcity)
const struct ft_color ftc_any
#define FT_OFFSET_UNSET
@ TTT_COLOR
#define FT_COLOR(fg, bg)
struct civ_game game
Definition game.c:61
bool is_player_phase(const struct player *pplayer, int phase)
Definition game.c:712
struct world wld
Definition game.c:62
#define GAME_DEFAULT_REVOLUTION_LENGTH
Definition game.h:744
#define GAME_MIN_CIVILWARSIZE
Definition game.h:497
#define any_web_conns()
Definition game.h:324
#define GAME_MAX_CIVILWARSIZE
Definition game.h:498
struct unit_type * crole_to_unit_type(char crole, struct player *pplayer)
Definition gamehand.c:120
const char * government_name_translation(const struct government *pgovern)
Definition government.c:143
bool untargeted_revolution_allowed(void)
Definition government.c:570
const char * ruler_title_for_player(const struct player *pplayer, char *buf, size_t buf_len)
Definition government.c:395
Government_type_id government_count(void)
Definition government.c:71
struct government * government_by_number(const Government_type_id gov)
Definition government.c:103
struct government * government_of_player(const struct player *pplayer)
Definition government.c:114
const char * government_name_for_player(const struct player *pplayer)
Definition government.c:154
bool can_change_to_government(struct player *pplayer, const struct government *gov)
Definition government.c:170
Government_type_id government_number(const struct government *pgovern)
Definition government.c:91
const char * government_rule_name(const struct government *pgovern)
Definition government.c:133
static GtkWidget * persistent
GType type
Definition repodlgs.c:1313
bool has_handicap(const struct player *pplayer, enum handicap_type htype)
Definition handicaps.c:66
void handicaps_init(struct player *pplayer)
Definition handicaps.c:29
void handicaps_close(struct player *pplayer)
Definition handicaps.c:42
@ H_REVOLUTION
Definition handicaps.h:30
@ H_RATES
Definition handicaps.h:23
struct impr_type * improvement_by_number(const Impr_type_id id)
bool wonder_visible_to_player(const struct impr_type *wonder, const struct player *pplayer, const struct player *owner, enum fc_tristate embassy)
#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 log_verbose(message,...)
Definition log.h:110
#define fc_assert(condition)
Definition log.h:177
#define fc_assert_ret_val(condition, val)
Definition log.h:195
#define fc_assert_action(condition, action)
Definition log.h:188
#define log_debug(message,...)
Definition log.h:116
#define log_normal(message,...)
Definition log.h:108
#define log_error(message,...)
Definition log.h:104
bool map_is_empty(void)
Definition map.c:148
#define square_iterate(nmap, center_tile, radius, tile_itr)
Definition map.h:397
#define square_iterate_end
Definition map.h:400
#define whole_map_iterate(_map, _tile)
Definition map.h:582
#define whole_map_iterate_end
Definition map.h:591
void player_map_init(struct player *pplayer)
Definition maphand.c:1226
void map_claim_base(struct tile *ptile, struct extra_type *pextra, struct player *powner, struct player *ploser)
Definition maphand.c:2356
void map_claim_ownership(struct tile *ptile, struct player *powner, struct tile *psource, bool claim_bases)
Definition maphand.c:2171
void map_know_and_see_all(struct player *pplayer)
Definition maphand.c:1201
void give_map_from_player_to_player(struct player *pfrom, struct player *pdest)
Definition maphand.c:382
void remove_shared_vision(struct player *pfrom, struct player *pto)
Definition maphand.c:1698
void player_map_free(struct player *pplayer)
Definition maphand.c:1242
void map_calculate_borders(void)
Definition maphand.c:2329
void remove_player_from_maps(struct player *pplayer)
Definition maphand.c:1263
bool give_distorted_map(struct player *pfrom, struct player *pto, int prob, bool reveal_cities)
Definition maphand.c:2652
#define FC_FREE(ptr)
Definition mem.h:41
#define fc_strdup(str)
Definition mem.h:43
enum mood_type player_mood(struct player *pplayer)
Definition mood.c:28
const char * multiplier_rule_name(const struct multiplier *pmul)
Multiplier_type_id multiplier_count(void)
Definition multipliers.c:88
bool multiplier_can_be_changed(struct multiplier *pmul, struct player *pplayer)
static struct multiplier multipliers[MAX_NUM_MULTIPLIERS]
Definition multipliers.c:23
struct multiplier * multiplier_by_number(Multiplier_type_id id)
Definition multipliers.c:57
Multiplier_type_id multiplier_index(const struct multiplier *pmul)
Definition multipliers.c:80
#define multipliers_iterate(_mul_)
Definition multipliers.h:61
#define multipliers_iterate_end
Definition multipliers.h:67
const char * nation_rule_name(const struct nation_type *pnation)
Definition nation.c:138
Nation_type_id nation_count(void)
Definition nation.c:507
Nation_type_id nation_number(const struct nation_type *pnation)
Definition nation.c:486
struct nation_leader * nation_leader_by_name(const struct nation_type *pnation, const char *name)
Definition nation.c:267
int nations_match(const struct nation_type *pnation1, const struct nation_type *pnation2, bool ignore_conflicts)
Definition nation.c:1206
const char * nation_adjective_for_player(const struct player *pplayer)
Definition nation.c:169
int nation_set_index(const struct nation_set *pset)
Definition nation.c:699
struct nation_type * nation_of_player(const struct player *pplayer)
Definition nation.c:444
bool is_nation_playable(const struct nation_type *nation)
Definition nation.c:200
const struct rgbcolor * nation_color(const struct nation_type *pnation)
Definition nation.c:682
bool nation_is_in_set(const struct nation_type *pnation, const struct nation_set *pset)
Definition nation.c:837
int nation_set_count(void)
Definition nation.c:691
struct nation_set * nation_set_by_number(int id)
Definition nation.c:762
struct nation_set * nation_set_by_setting_value(const char *setting)
Definition nation.c:859
Nation_type_id nation_index(const struct nation_type *pnation)
Definition nation.c:498
const char * nation_set_rule_name(const struct nation_set *pset)
Definition nation.c:807
enum barbarian_type nation_barbarian_type(const struct nation_type *nation)
Definition nation.c:211
const char * nation_plural_for_player(const struct player *pplayer)
Definition nation.c:178
struct government * init_government_of_nation(const struct nation_type *pnation)
Definition nation.c:659
#define nation_list_iterate(nationlist, pnation)
Definition nation.h:84
#define nation_sets_iterate_end
Definition nation.h:305
#define nation_sets_iterate(NAME_pset)
Definition nation.h:301
#define nations_iterate_end
Definition nation.h:336
#define nation_list_iterate_end
Definition nation.h:86
#define nations_iterate(NAME_pnation)
Definition nation.h:333
#define NATION_NONE
Definition nation.h:33
#define NO_NATION_SELECTED
Definition nation.h:30
void notify_player(const struct player *pplayer, const struct tile *ptile, enum event_type event, const struct ft_color color, const char *format,...)
Definition notify.c:291
void notify_conn(struct conn_list *dest, const struct tile *ptile, enum event_type event, const struct ft_color color, const char *format,...)
Definition notify.c:238
void generic_handle_player_attribute_chunk(struct player *pplayer, const struct packet_player_attribute_chunk *chunk)
Definition packets.c:697
void send_attribute_block(const struct player *pplayer, struct connection *pconn)
Definition packets.c:753
#define web_send_packet(packetname, pconn,...)
Definition packets.h:56
int dsend_packet_player_remove(struct connection *pc, int playerno)
int send_packet_player_diplstate(struct connection *pc, const struct packet_player_diplstate *packet)
int send_packet_player_info(struct connection *pc, const struct packet_player_info *packet)
void lsend_packet_nation_availability(struct conn_list *dest, const struct packet_nation_availability *packet)
bool player_slot_is_used(const struct player_slot *pslot)
Definition player.c:448
struct player * player_new(struct player_slot *pslot)
Definition player.c:493
struct player * player_by_number(const int player_id)
Definition player.c:849
bool players_on_same_team(const struct player *pplayer1, const struct player *pplayer2)
Definition player.c:1480
int player_count(void)
Definition player.c:817
enum diplstate_type cancel_pact_result(enum diplstate_type oldstate)
Definition player.c:68
int player_slot_count(void)
Definition player.c:418
struct player_slot * player_slot_by_number(int player_id)
Definition player.c:463
int player_get_expected_income(const struct player *pplayer)
Definition player.c:1286
int player_number(const struct player *pplayer)
Definition player.c:837
const char * player_name(const struct player *pplayer)
Definition player.c:895
void player_clear(struct player *pplayer, bool full)
Definition player.c:669
int player_slot_index(const struct player_slot *pslot)
Definition player.c:426
bool player_has_real_embassy(const struct player *pplayer, const struct player *pplayer2)
Definition player.c:240
bool team_has_embassy(const struct team *pteam, const struct player *tgt_player)
Definition player.c:220
void player_set_color(struct player *pplayer, const struct rgbcolor *prgbcolor)
Definition player.c:648
int player_index(const struct player *pplayer)
Definition player.c:829
bool player_set_nation(struct player *pplayer, struct nation_type *pnation)
Definition player.c:861
enum dipl_reason pplayer_can_cancel_treaty(const struct player *p1, const struct player *p2)
Definition player.c:98
struct player_diplstate * player_diplstate_get(const struct player *plr1, const struct player *plr2)
Definition player.c:324
bool pplayers_allied(const struct player *pplayer, const struct player *pplayer2)
Definition player.c:1409
bool gives_shared_tiles(const struct player *me, const struct player *them)
Definition player.c:1497
bool gives_shared_vision(const struct player *me, const struct player *them)
Definition player.c:1489
void player_destroy(struct player *pplayer)
Definition player.c:756
#define players_iterate_end
Definition player.h:542
dipl_reason
Definition player.h:192
@ DIPL_SENATE_BLOCKING
Definition player.h:193
@ DIPL_OK
Definition player.h:193
#define players_iterate(_pplayer)
Definition player.h:537
#define player_list_iterate(playerlist, pplayer)
Definition player.h:560
#define ANON_USER_NAME
Definition player.h:48
static bool is_barbarian(const struct player *pplayer)
Definition player.h:491
#define is_ai(plr)
Definition player.h:232
#define player_list_iterate_end
Definition player.h:562
#define set_as_human(plr)
Definition player.h:233
#define players_iterate_alive_end
Definition player.h:552
@ PLRCOL_PLR_RANDOM
Definition player.h:54
@ PLRCOL_PLR_SET
Definition player.h:55
@ PLRCOL_NATION_ORDER
Definition player.h:57
@ PLRCOL_TEAM_ORDER
Definition player.h:56
@ PLRCOL_PLR_ORDER
Definition player.h:53
#define set_as_ai(plr)
Definition player.h:234
#define is_human(plr)
Definition player.h:231
#define players_iterate_alive(_pplayer)
Definition player.h:547
void handle_player_phase_done(struct player *pplayer, int turn)
Definition plrhand.c:3189
void send_nation_availability(struct conn_list *dest, bool nationset_change)
Definition plrhand.c:2655
void handle_player_multiplier(struct player *pplayer, int count, const int *multipliers)
Definition plrhand.c:3405
void server_player_set_name(struct player *pplayer, const char *name)
Definition plrhand.c:2270
int barbarian_count(void)
Definition plrhand.c:3209
void send_player_all_c(struct player *src, struct conn_list *dest)
Definition plrhand.c:1131
static void send_player_remove_info_c(const struct player_slot *pslot, struct conn_list *dest)
Definition plrhand.c:1081
struct player * server_create_player(int player_id, const char *ai_tname, struct rgbcolor *prgbcolor, bool allow_ai_type_fallbacking)
Definition plrhand.c:1896
const struct rgbcolor * player_preferred_color(struct player *pplayer)
Definition plrhand.c:1675
void player_update_last_war_action(struct player *pplayer)
Definition plrhand.c:865
void handle_player_attribute_chunk(struct player *pplayer, const struct packet_player_attribute_chunk *chunk)
Definition plrhand.c:3171
void player_status_add(struct player *plr, enum player_status pstatus)
Definition plrhand.c:3225
int normal_player_count(void)
Definition plrhand.c:3217
static void send_player_info_c_real(struct player *src, struct conn_list *dest)
Definition plrhand.c:1168
static enum plr_info_level player_info_level(struct player *plr, struct player *receiver)
Definition plrhand.c:1572
static void package_player_diplstate(struct player *plr1, struct player *plr2, struct packet_player_diplstate *packet_ds, struct player *receiver, enum plr_info_level min_info_level)
Definition plrhand.c:1529
void player_set_under_human_control(struct player *pplayer)
Definition plrhand.c:3466
static void maybe_claim_base(struct tile *ptile, struct player *new_owner, struct player *old_owner)
Definition plrhand.c:823
void playercolor_free(void)
Definition plrhand.c:3356
static struct nation_set * current_nationset(void)
Definition plrhand.c:2594
void give_midgame_initial_units(struct player *pplayer, struct tile *ptile)
Definition plrhand.c:1872
static int get_player_maxrate(struct player *pplayer)
Definition plrhand.c:269
static void call_first_contact(struct player *pplayer, struct player *aplayer)
Definition plrhand.c:1605
void player_limit_to_max_rates(struct player *pplayer)
Definition plrhand.c:2059
bool civil_war_triggered(struct player *pplayer)
Definition plrhand.c:2971
void server_player_set_color(struct player *pplayer, const struct rgbcolor *prgbcolor)
Definition plrhand.c:1825
void player_set_to_ai_mode(struct player *pplayer, enum ai_level skill_level)
Definition plrhand.c:3444
bool server_player_set_name_full(const struct connection *caller, struct player *pplayer, const struct nation_type *pnation, const char *name, char *error_buf, size_t error_buf_len)
Definition plrhand.c:2170
bool player_delegation_active(const struct player *pplayer)
Definition plrhand.c:3279
void player_info_thaw(void)
Definition plrhand.c:1110
void player_info_freeze(void)
Definition plrhand.c:1101
struct player * player_by_user_delegated(const char *name)
Definition plrhand.c:3331
void maybe_make_contact(struct tile *ptile, struct player *pplayer)
Definition plrhand.c:2371
void handle_player_attribute_block(struct player *pplayer)
Definition plrhand.c:3181
static void send_nation_availability_real(struct conn_list *dest, bool nationset_change)
Definition plrhand.c:2639
struct nation_type * pick_a_nation(const struct nation_list *choices, bool ignore_conflicts, bool needs_startpos, enum barbarian_type barb_type)
Definition plrhand.c:2466
static enum diplstate_type get_default_diplstate(const struct player *pplayer1, const struct player *pplayer2)
Definition plrhand.c:2287
void playercolor_init(void)
Definition plrhand.c:3346
void check_player_max_rates(struct player *pplayer)
Definition plrhand.c:776
void kill_player(struct player *pplayer)
Definition plrhand.c:125
const char * player_color_ftstr(struct player *pplayer)
Definition plrhand.c:1845
void send_player_info_c(struct player *src, struct conn_list *dest)
Definition plrhand.c:1148
void set_shuffled_players(int *shuffled_players)
Definition plrhand.c:2416
struct player * civil_war(struct player *pplayer)
Definition plrhand.c:3016
static int shuffled_order[MAX_NUM_PLAYER_SLOTS]
Definition plrhand.c:114
void player_status_reset(struct player *plr)
Definition plrhand.c:3241
void send_delegation_info(const struct connection *pconn)
Definition plrhand.c:3287
void handle_player_change_government(struct player *pplayer, Government_type_id government)
Definition plrhand.c:565
void update_national_activities(struct player *pplayer, int old_gold)
Definition plrhand.c:3486
struct conn_list * player_reply_dest(struct player *pplayer)
Definition plrhand.c:1595
void update_players_after_alliance_breakup(struct player *pplayer, struct player *pplayer2, const struct unit_list *pplayer_seen_units, const struct unit_list *pplayer2_seen_units)
Definition plrhand.c:804
static int revolentype_length(enum revolen_type rltype, struct government *gov)
Definition plrhand.c:515
bool player_status_check(struct player *plr, enum player_status pstatus)
Definition plrhand.c:3233
bool civil_war_possible(struct player *pplayer, bool conquering_city, bool honour_server_option)
Definition plrhand.c:2923
struct rgbcolor * playercolor_get(int id)
Definition plrhand.c:3385
void player_delegation_set(struct player *pplayer, const char *username)
Definition plrhand.c:3263
static bool server_player_name_is_allowed(const struct connection *caller, const struct player *pplayer, const struct nation_type *pnation, const char *name, char *error_buf, size_t error_buf_len)
Definition plrhand.c:2108
int playercolor_count(void)
Definition plrhand.c:3395
void shuffle_players(void)
Definition plrhand.c:2391
static void package_player_info(struct player *plr, struct packet_player_info *packet, struct packet_web_player_info_addition *web_packet, struct player *receiver, enum plr_info_level min_info_level)
Definition plrhand.c:1326
void server_remove_player(struct player *pplayer)
Definition plrhand.c:1945
void government_change(struct player *pplayer, struct government *gov, bool revolution_finished)
Definition plrhand.c:336
void server_player_init(struct player *pplayer, bool initmap, bool needs_team)
Definition plrhand.c:1620
static void send_player_diplstate_c_real(struct player *src, struct conn_list *dest)
Definition plrhand.c:1230
void handle_diplomacy_cancel_pact(struct player *pplayer, int other_player_id, enum clause_type clause)
Definition plrhand.c:882
void make_contact(struct player *pplayer1, struct player *pplayer2, struct tile *ptile)
Definition plrhand.c:2305
void playercolor_add(struct rgbcolor *prgbcolor)
Definition plrhand.c:3375
void update_capital(struct player *pplayer)
Definition plrhand.c:731
void count_playable_nations(void)
Definition plrhand.c:2612
void handle_player_rates(struct player *pplayer, int tax, int luxury, int science)
Definition plrhand.c:285
bool player_color_changeable(const struct player *pplayer, const char **reason)
Definition plrhand.c:1718
void assign_player_colors(void)
Definition plrhand.c:1736
static void package_player_common(struct player *plr, struct packet_player_info *packet, struct packet_web_player_info_addition *web_packet)
Definition plrhand.c:1263
bool client_can_pick_nation(const struct nation_type *pnation)
Definition plrhand.c:2627
void send_player_diplstate_c(struct player *src, struct conn_list *dest)
Definition plrhand.c:1214
static struct player * split_player(struct player *pplayer)
Definition plrhand.c:2772
struct player * shuffled_player(int i)
Definition plrhand.c:2434
void player_loot_player(struct player *pvictor, struct player *pvictim)
Definition plrhand.c:410
const char * player_delegation_get(const struct player *pplayer)
Definition plrhand.c:3250
bool nation_is_in_current_set(const struct nation_type *pnation)
Definition plrhand.c:2603
void enter_war(struct player *pplayer, struct player *pplayer2)
Definition plrhand.c:848
static int player_info_frozen_level
Definition plrhand.c:117
int revolution_length(struct government *gov, struct player *plr)
Definition plrhand.c:549
void fit_nationset_to_players(void)
Definition plrhand.c:2672
void reset_all_start_commands(bool plrchange)
Definition plrhand.c:2737
void update_revolution(struct player *pplayer)
Definition plrhand.c:672
plr_info_level
Definition plrhand.h:25
@ INFO_MEETING
Definition plrhand.h:25
@ INFO_MINIMUM
Definition plrhand.h:25
@ INFO_EMBASSY
Definition plrhand.h:25
@ INFO_FULL
Definition plrhand.h:25
#define allowed_nations_iterate(pnation)
Definition plrhand.h:69
#define allowed_nations_iterate_end
Definition plrhand.h:73
#define fc_rand(_size)
Definition rand.h:56
enum tech_state research_invention_set(struct research *presearch, Tech_type_id tech, enum tech_state value)
Definition research.c:637
const char * research_advance_rule_name(const struct research *presearch, Tech_type_id tech)
Definition research.c:240
int player_tech_upkeep(const struct player *pplayer)
Definition research.c:1058
struct research * research_get(const struct player *pplayer)
Definition research.c:128
enum tech_state research_invention_state(const struct research *presearch, Tech_type_id tech)
Definition research.c:619
void research_update(struct research *presearch)
Definition research.c:501
void rgbcolor_destroy(struct rgbcolor *prgbcolor)
Definition rgbcolor.c:74
bool rgbcolors_are_equal(const struct rgbcolor *c1, const struct rgbcolor *c2)
Definition rgbcolor.c:62
bool rgbcolor_to_hex(const struct rgbcolor *prgbcolor, char *hex, size_t hex_len)
Definition rgbcolor.c:142
#define rgbcolor_list_iterate_end
Definition rgbcolor.h:45
#define rgbcolor_list_iterate(rgbcolorlist, prgbcolor)
Definition rgbcolor.h:43
void script_server_signal_emit(const char *signal_name,...)
void script_server_remove_exported_object(void *object)
void array_shuffle(int *array, int n)
Definition shared.c:2020
bool is_ascii_name(const char *name)
Definition shared.c:286
void remove_leading_trailing_spaces(char *s)
Definition shared.c:444
@ TRI_YES
Definition shared.h:46
@ TRI_NO
Definition shared.h:46
#define CLIP(lower, current, upper)
Definition shared.h:57
#define MIN(x, y)
Definition shared.h:55
#define FC_INFINITY
Definition shared.h:36
#define MAX(x, y)
Definition shared.h:54
void send_spaceship_info(struct player *src, struct conn_list *dest)
Definition spacerace.c:129
void spaceship_init(struct player_spaceship *ship)
Definition spaceship.c:96
#define DEFAULT_SPECIALIST
Definition specialist.h:43
struct sprite int x
Definition sprite_g.h:31
void player_nation_defaults(struct player *pplayer, struct nation_type *pnation, bool set_name)
Definition srv_main.c:2663
bool game_was_started(void)
Definition srv_main.c:356
void check_for_full_turn_done(void)
Definition srv_main.c:2298
enum server_states server_state(void)
Definition srv_main.c:340
void set_ai_level_direct(struct player *pplayer, enum ai_level level)
Definition stdinhand.c:2000
Definition city.h:317
enum capital_type capital
Definition city.h:325
int contactturns
Definition game.h:144
struct rgbcolor_list * plr_colors
Definition game.h:252
char start_units[MAX_LEN_STARTUNIT]
Definition game.h:196
enum plrcolor_mode plrcolormode
Definition game.h:135
struct conn_list * est_connections
Definition game.h:97
struct packet_game_info info
Definition game.h:89
struct packet_scenario_info scenario
Definition game.h:87
unsigned revealmap
Definition game.h:184
int civilwarsize
Definition game.h:142
bool savepalace
Definition game.h:194
char nationset[MAX_LEN_NAME]
Definition game.h:164
struct civ_game::@32::@36 server
int max_players
Definition game.h:163
int revolution_length
Definition game.h:185
struct government * government_during_revolution
Definition game.h:94
enum cmdlevel access_level
Definition connection.h:177
struct conn_list * self
Definition connection.h:163
int changed_to_times
Definition government.h:64
enum barbarian_type barb_type
Definition nation.h:110
bool no_startpos
Definition nation.h:148
struct nation_type::@54::@56 server
enum gameloss_style gameloss_style
enum gold_upkeep_style gold_upkeep_style
enum ai_level skill_level
enum revolen_type revolentype
enum persistent_ready persistent_ready
bool is_pickable[MAX_NUM_NATIONS]
enum ai_level ai_skill_level
int multiplier[MAX_NUM_MULTIPLIERS]
char username[MAX_LEN_NAME]
bv_plr_flags flags
enum mood_type mood
bv_player gives_shared_vision
int love[MAX_NUM_PLAYER_SLOTS]
Government_type_id target_government
int multiplier_target[MAX_NUM_MULTIPLIERS]
int multiplier_changed[MAX_NUM_MULTIPLIERS]
bv_player gives_shared_tiles
Nation_type_id nation
enum barbarian_type barbarian_type
char name[MAX_LEN_NAME]
Government_type_id government
bv_player real_embassy
int wonders[B_LAST]
enum ai_level skill_level
Definition player.h:116
enum barbarian_type barbarian_type
Definition player.h:122
int warmth
Definition player.h:121
int science_cost
Definition player.h:119
int love[MAX_NUM_PLAYER_SLOTS]
Definition player.h:124
int maxbuycost
Definition player.h:114
int frost
Definition player.h:121
char contact_turns_left
Definition player.h:204
enum diplstate_type type
Definition player.h:199
char has_reason_to_cancel
Definition player.h:203
int infra_points
Definition player.h:67
int units_killed
Definition player.h:105
int units_used
Definition player.h:108
int units_lost
Definition player.h:106
int units_built
Definition player.h:104
struct city_list * cities
Definition player.h:281
struct player_ai ai_common
Definition player.h:288
bv_plr_flags flags
Definition player.h:292
bv_pstatus status
Definition player.h:322
int primary_capital_id
Definition player.h:275
bool is_male
Definition player.h:257
int wonders[B_LAST]
Definition player.h:305
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_connected
Definition player.h:296
int revolution_finishes
Definition player.h:273
int nturns_idle
Definition player.h:265
struct government * government
Definition player.h:258
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
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
char delegate_to[MAX_LEN_NAME]
Definition player.h:339
struct player_spaceship spaceship
Definition player.h:286
char name[MAX_LEN_NAME]
Definition player.h:251
bv_player gives_shared_vision
Definition player.h:302
struct player_score score
Definition player.h:283
struct player_tile * private_map
Definition player.h:324
struct multiplier_value multipliers[MAX_NUM_MULTIPLIERS]
Definition player.h:314
bv_player really_gives_vision
Definition player.h:329
struct nation_type * nation
Definition player.h:260
struct nation_style * style
Definition player.h:279
bool border_vision
Definition player.h:327
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 history
Definition player.h:316
bv_debug debug
Definition player.h:332
char orig_username[MAX_LEN_NAME]
Definition player.h:347
int last_war_action
Definition player.h:270
struct rgbcolor * rgb
Definition player.h:312
bool unassigned_user
Definition player.h:253
Tech_type_id researching_saved
Definition research.h:62
int g
Definition rgbcolor.h:34
int b
Definition rgbcolor.h:34
int r
Definition rgbcolor.h:34
Definition tile.h:50
struct unit_list * units
Definition tile.h:58
struct player * extras_owner
Definition tile.h:63
int upkeep[O_LAST]
Definition unit.h:150
struct unit::@84::@87 server
struct tile * tile
Definition unit.h:142
int upkeep_paid[O_LAST]
Definition unit.h:259
struct civ_map map
struct music_style * player_music_style(struct player *plr)
Definition style.c:185
int music_style_number(const struct music_style *pms)
Definition style.c:161
int style_number(const struct nation_style *pstyle)
Definition style.c:68
int fc_snprintf(char *str, size_t n, const char *format,...)
Definition support.c:960
size_t fc_strlcpy(char *dest, const char *src, size_t n)
Definition support.c:777
int fc_strcasecmp(const char *str0, const char *str1)
Definition support.c:186
int cat_snprintf(char *str, size_t n, const char *format,...)
Definition support.c:986
char fc_toupper(char c)
Definition support.c:1262
#define sz_strlcpy(dest, src)
Definition support.h:195
#define TRUE
Definition support.h:46
#define FALSE
Definition support.h:47
#define fc__fallthrough
Definition support.h:119
int team_count(void)
Definition team.c:376
int team_number(const struct team *pteam)
Definition team.c:392
bool team_add_player(struct player *pplayer, struct team *pteam)
Definition team.c:468
const struct player_list * team_members(const struct team *pteam)
Definition team.c:457
#define advance_index_iterate_end
Definition tech.h:244
#define A_NONE
Definition tech.h:43
#define A_UNSET
Definition tech.h:48
#define A_UNKNOWN
Definition tech.h:49
#define advance_index_iterate(_start, _index)
Definition tech.h:240
Tech_type_id steal_a_tech(struct player *pplayer, struct player *victim, Tech_type_id preferred)
Definition techtools.c:1234
void send_research_info(const struct research *presearch, const struct conn_list *dest)
Definition techtools.c:293
void update_bulbs(struct player *pplayer, int bulbs, bool check_tech, bool free_bulbs)
Definition techtools.c:654
bool tile_has_claimable_base(const struct tile *ptile, const struct unit_type *punittype)
Definition tile.c:215
struct city * tile_city(const struct tile *ptile)
Definition tile.c:83
#define tile_owner(_tile)
Definition tile.h:97
#define trade_routes_iterate_safe_end
#define trade_routes_iterate_safe(c, proute)
#define unit_owner(_pu)
Definition unit.h:406
#define is_unit_homeless(_pu_)
Definition unit.h:405
#define unit_list_iterate(unitlist, punit)
Definition unitlist.h:31
#define unit_list_iterate_safe(unitlist, _unit)
Definition unitlist.h:39
#define unit_list_iterate_end
Definition unitlist.h:33
#define unit_list_iterate_safe_end
Definition unitlist.h:61
struct unit_list * get_units_seen_via_ally(const struct player *pplayer, const struct player *aplayer)
Definition unittools.c:1421
void remove_allied_visibility(struct player *pplayer, struct player *aplayer, const struct unit_list *seen_units)
Definition unittools.c:1456
void resolve_unit_stacks(struct player *pplayer, struct player *aplayer, bool verbose)
Definition unittools.c:1406
struct unit * create_unit(struct player *pplayer, struct tile *ptile, const struct unit_type *type, int veteran_level, int homecity_id, int moves_left)
Definition unittools.c:1610
void wipe_unit(struct unit *punit, enum unit_loss_reason reason, struct player *killer)
Definition unittools.c:2144
const struct unit_type * unit_type_get(const struct unit *punit)
Definition unittype.c:123
int utype_upkeep_cost(const struct unit_type *ut, struct player *pplayer, Output_type_id otype)
Definition unittype.c:132
bool unit_has_type_flag(const struct unit *punit, enum unit_type_flag_id flag)
Definition unittype.c:194
void send_updated_vote_totals(struct conn_list *dest)
Definition voting.c:866