Freeciv-3.3
Loading...
Searching...
No Matches
maphand.c
Go to the documentation of this file.
1/***********************************************************************
2 Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 2, or (at your option)
6 any later version.
7
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12***********************************************************************/
13
14#ifdef HAVE_CONFIG_H
15#include <fc_config.h>
16#endif
17
18/* utility */
19#include "bitvector.h"
20#include "fcintl.h"
21#include "log.h"
22#include "mem.h"
23#include "rand.h"
24#include "support.h"
25
26/* common */
27#include "ai.h"
28#include "base.h"
29#include "borders.h"
30#include "events.h"
31#include "game.h"
32#include "map.h"
33#include "movement.h"
34#include "nation.h"
35#include "packets.h"
36#include "player.h"
37#include "road.h"
38#include "specialist.h"
39#include "unit.h"
40#include "unitlist.h"
41#include "vision.h"
42
43/* server */
44#include "citytools.h"
45#include "cityturn.h"
46#include "notify.h"
47#include "plrhand.h"
48#include "sanitycheck.h"
49#include "sernet.h"
50#include "srv_main.h"
51#include "unithand.h"
52#include "unittools.h"
53
54/* server/advisors */
55#include "advdata.h"
56
57/* server/generator */
58#include "mapgen_utils.h"
59
60#include "maphand.h"
61
62/* Suppress send_tile_info() during game_load() */
64
65static void player_tile_init(struct tile *ptile, struct player *pplayer);
66static void player_tile_free(struct tile *ptile, struct player *pplayer);
68 struct player *pdest,
69 struct tile *ptile);
70static void shared_vision_change_seen(struct player *pplayer,
71 struct tile *ptile,
72 const v_radius_t change,
73 bool can_reveal_tiles);
74static void map_change_seen(struct player *pplayer,
75 struct tile *ptile,
76 const v_radius_t change,
77 bool can_reveal_tiles);
78static void map_change_own_seen(struct player *pplayer,
79 struct tile *ptile,
80 const v_radius_t change);
81static inline int map_get_seen(const struct player *pplayer,
82 const struct tile *ptile,
83 enum vision_layer vlayer);
84static inline bool map_is_also_seen(const struct tile *ptile,
85 const struct player *pplayer,
86 enum vision_layer vlayer);
87
88static bool is_tile_claimable(struct tile *ptile, struct tile *source,
89 struct player *pplayer);
90
91/**********************************************************************/
94static bool is_terrain_ecologically_wet(struct tile *ptile)
95{
96 return (is_terrain_class_near_tile(&(wld.map), ptile, TC_OCEAN)
97 || tile_has_river(ptile)
98 || count_river_near_tile(&(wld.map), ptile, NULL) > 0);
99}
100
101/**********************************************************************/
105{
108 _("Global warming has occurred!"));
110 _("Coastlines have been flooded and vast "
111 "ranges of grassland have become deserts."));
112}
113
114/**********************************************************************/
118{
121 _("Nuclear winter has occurred!"));
123 _("Wetlands have dried up and vast "
124 "ranges of grassland have become tundra."));
125}
126
127/**********************************************************************/
132{
133 int k = map_num_tiles();
134 bool used[k];
135 const struct civ_map *nmap = &(wld.map);
136
137 memset(used, 0, sizeof(used));
138
139 log_verbose("Climate change: %s (%d)",
140 warming ? "Global warming" : "Nuclear winter", effect);
141
142 while (effect > 0 && (k--) > 0) {
143 struct terrain *old, *candidates[2], *new;
144 struct tile *ptile;
145 int i;
146
147 do {
148 /* We want to transform a tile at most once due to a climate change. */
149 ptile = rand_map_pos(&(wld.map));
150 } while (used[tile_index(ptile)]);
151 used[tile_index(ptile)] = TRUE;
152
153 old = tile_terrain(ptile);
154 /* Prefer the transformation that's appropriate to the ambient moisture,
155 * but be prepared to fall back in exceptional circumstances */
156 {
157 struct terrain *wetter, *drier;
158
161 if (is_terrain_ecologically_wet(ptile)) {
162 candidates[0] = wetter;
163 candidates[1] = drier;
164 } else {
165 candidates[0] = drier;
166 candidates[1] = wetter;
167 }
168 }
169
170 /* If the preferred transformation is ruled out for some exceptional reason
171 * specific to this tile, fall back to the other, rather than letting this
172 * tile be immune to change. */
173 for (i = 0; i < 2; i++) {
174 new = candidates[i];
175
176 /* If the preferred transformation simply hasn't been specified
177 * for this terrain at all, don't fall back to the other. */
178 if (new == T_NONE) {
179 break;
180 }
181
182 if (tile_city(ptile) != NULL && terrain_has_flag(new, TER_NO_CITIES)) {
183 /* do not change to a terrain with the flag TER_NO_CITIES if the tile
184 * has a city */
185 continue;
186 }
187
188 /* Only change between water and land at coastlines, and between
189 * frozen and unfrozen at ice margin */
190 if (!terrain_surroundings_allow_change(nmap, ptile, new)) {
191 continue;
192 }
193
194 /* OK! */
195 break;
196 }
197 if (i == 2) {
198 /* Neither transformation was permitted. Give up. */
199 continue;
200 }
201
202 if (new != T_NONE && old != new) {
203 effect--;
204
205 /* Check terrain changing activities.
206 These would not be caught by the check if unit can continue activity
207 after the terrain change has taken place, as the activity itself is still
208 legal, but would be towards different terrain, and terrain types are not
209 activity targets (target is NULL) */
210 unit_list_iterate(ptile->units, punit) {
211 if (punit->activity_target == NULL) {
212 /* Target is always NULL for terrain changing activities. */
217 }
218 }
220
221 /* Really change the terrain. */
222 tile_change_terrain(ptile, new);
225
227
228 } else if (old == new) {
229 /* This counts toward a climate change although nothing is changed. */
230 effect--;
231 }
232 }
233}
234
235/**********************************************************************/
239bool upgrade_city_extras(struct city *pcity, struct extra_type **gained)
240{
241 struct tile *ptile = pcity->tile;
242 struct player *pplayer = city_owner(pcity);
243 bool upgradet = FALSE;
244
245 extra_type_iterate(pextra) {
246 if (!tile_has_extra(ptile, pextra)) {
249 && player_can_build_extra(pextra, pplayer, ptile)
250 && !tile_has_conflicting_extra(ptile, pextra))) {
251 tile_add_extra(pcity->tile, pextra);
252 if (gained != NULL) {
253 if (upgradet) {
254 *gained = NULL;
255 } else {
256 *gained = pextra;
257 }
258 }
259 upgradet = TRUE;
260 }
261 }
263
264 return upgradet;
265}
266
267/**********************************************************************/
274void upgrade_all_city_extras(struct player *pplayer, bool discovery)
275{
276 int cities_upgradet = 0;
277 struct extra_type *upgradet = NULL;
278 bool multiple_types = FALSE;
279 int cities_total = city_list_size(pplayer->cities);
280 int percent;
281
283
284 city_list_iterate(pplayer->cities, pcity) {
285 struct extra_type *new_upgrade;
286
290 if (new_upgrade == NULL) {
291 /* This single city alone had multiple types */
293 } else if (upgradet == NULL) {
294 /* First gained */
296 } else if (upgradet != new_upgrade) {
297 /* Different type from what another city got. */
299 }
300 }
302
303 if (cities_total > 0) {
305 } else {
306 percent = 0;
307 }
308
309 if (cities_upgradet > 0) {
310 if (discovery) {
311 if (percent >= 75) {
313 _("New hope sweeps like fire through the country as "
314 "the discovery of new infrastructure building technology "
315 "is announced."));
316 }
317 } else {
318 if (percent >= 75) {
320 _("The people are pleased to hear that your "
321 "scientists finally know about new infrastructure building "
322 "technology."));
323 }
324 }
325
326 if (multiple_types) {
328 _("Workers spontaneously gather and upgrade all "
329 "possible cities with better infrastructure."));
330 } else {
332 _("Workers spontaneously gather and upgrade all "
333 "possible cities with %s."), extra_name_translation(upgradet));
334 }
335 }
336
338}
339
340/**********************************************************************/
344{
345 return BV_ISSET(me->server.really_gives_vision, player_index(them));
346}
347
348/**********************************************************************/
351static void buffer_shared_vision(struct player *pplayer)
352{
354 if (really_gives_vision(pplayer, pplayer2)) {
356 conn_list_do_buffer(pplayer2->connections);
357 }
361}
362
363/**********************************************************************/
366static void unbuffer_shared_vision(struct player *pplayer)
367{
369 if (really_gives_vision(pplayer, pplayer2)) {
370 conn_list_do_unbuffer(pplayer2->connections);
372 }
376}
377
378/**********************************************************************/
394
395/**********************************************************************/
412
413/**********************************************************************/
432
433/**********************************************************************/
443{
444 int tiles_sent;
445
446 if (!dest) {
447 dest = game.est_connections;
448 }
449
450 /* Send whole map piece by piece to each player to balance the load
451 of the send buffers better */
452 tiles_sent = 0;
454
455 whole_map_iterate(&(wld.map), ptile) {
456 tiles_sent++;
457 if ((tiles_sent % MAP_NATIVE_WIDTH) == 0) {
461 }
462
463 send_tile_info(dest, ptile, FALSE);
465
468}
469
470/**********************************************************************/
474{
476
478 return formerly;
479}
480
481/**********************************************************************/
489void send_tile_info(struct conn_list *dest, struct tile *ptile,
490 bool send_unknown)
491{
492 struct packet_tile_info info;
493 const struct player *owner;
494 const struct player *eowner;
495
496 if (dest == NULL) {
497 CALL_FUNC_EACH_AI(tile_info, ptile);
498 }
499
501 return;
502 }
503
504 if (!dest) {
505 dest = game.est_connections;
506 }
507
508 info.tile = tile_index(ptile);
509
510 if (ptile->spec_sprite) {
511 sz_strlcpy(info.spec_sprite, ptile->spec_sprite);
512 } else {
513 info.spec_sprite[0] = '\0';
514 }
515
516 conn_list_iterate(dest, pconn) {
517 struct player *pplayer = pconn->playing;
518 bool known;
519
520 if (NULL == pplayer && !pconn->observer) {
521 continue;
522 }
523
524 if (pplayer != NULL) {
525 known = map_is_known(ptile, pplayer);
526 }
527
528 if (pplayer == NULL || (known && map_is_also_seen(ptile, pplayer, V_MAIN))) {
529 struct extra_type *resource;
530
531 info.known = TILE_KNOWN_SEEN;
532 info.continent = tile_continent(ptile);
533 owner = tile_owner(ptile);
534 eowner = extra_owner(ptile);
536 info.extras_owner = (eowner ? player_number(eowner) : MAP_TILE_OWNER_NULL);
537 info.worked = (NULL != tile_worked(ptile))
538 ? tile_worked(ptile)->id
540
541 info.terrain = (NULL != tile_terrain(ptile))
543 : terrain_count();
544
545 resource = tile_resource(ptile);
546 if (resource != NULL
547 && (pplayer == NULL
548 || player_knows_extra_exist(pplayer, resource, ptile))) {
550 } else {
552 }
553
554 info.placing = (NULL != ptile->placing)
555 ? extra_number(ptile->placing)
556 : -1;
557 info.place_turn = (NULL != ptile->placing)
558 ? game.info.turn + ptile->infra_turns
559 : 0;
560
561 if (pplayer != NULL) {
562 dbv_to_bv(info.extras.vec, &(map_get_player_tile(ptile, pplayer)->extras));
563 } else {
564 info.extras = ptile->extras;
565 }
566
567 if (ptile->label != NULL) {
568 /* Always leave final '\0' in place */
569 strncpy(info.label, ptile->label, sizeof(info.label) - 1);
570 } else {
571 info.label[0] = '\0';
572 }
573
574 info.altitude = ptile->altitude;
575
577 } else if (pplayer != NULL && known) {
578 struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
580
582 info.continent = tile_continent(ptile);
584 ? plrtile->owner
585 : tile_owner(ptile));
586 eowner = plrtile->extras_owner;
588 info.extras_owner = (eowner ? player_number(eowner) : MAP_TILE_OWNER_NULL);
589 info.worked = (NULL != psite)
590 ? psite->identity
592
593 info.terrain = (NULL != plrtile->terrain)
594 ? terrain_number(plrtile->terrain)
595 : terrain_count();
596 info.resource = (NULL != plrtile->resource)
597 ? extra_number(plrtile->resource)
599 info.placing = -1;
600 info.place_turn = 0;
601
602 dbv_to_bv(info.extras.vec, &(plrtile->extras));
603
604 /* Labels never change, so they are not subject to fog of war */
605 if (ptile->label != NULL) {
606 sz_strlcpy(info.label, ptile->label);
607 } else {
608 info.label[0] = '\0';
609 }
610
611 info.altitude = ptile->altitude;
612
614 } else if (send_unknown) {
615 info.known = TILE_UNKNOWN;
616 info.continent = 0;
620
621 info.terrain = terrain_count();
623 info.placing = -1;
624 info.place_turn = 0;
625
626 BV_CLR_ALL(info.extras);
627
628 info.label[0] = '\0';
629
630 info.altitude = 0;
631
633 }
634 }
636}
637
638/**********************************************************************/
644static bool unit_is_on_layer(const struct unit *punit,
645 enum vision_layer vlayer)
646{
647 return unit_type_get(punit)->vlayer == vlayer;
648}
649
650/**********************************************************************/
653void send_map_info(struct conn_list *dest)
654{
655 struct packet_map_info minfo;
656
658 minfo.ysize = MAP_NATIVE_HEIGHT;
659 minfo.topology_id = wld.map.topology_id;
660 minfo.wrap_id = wld.map.wrap_id;
661 minfo.north_latitude = wld.map.north_latitude;
662 minfo.south_latitude = wld.map.south_latitude;
663 minfo.altitude_info = wld.map.altitude_info;
664
666}
667
668/**********************************************************************/
672static void shared_vision_change_seen(struct player *pplayer,
673 struct tile *ptile,
674 const v_radius_t change,
675 bool can_reveal_tiles)
676{
677 map_change_own_seen(pplayer, ptile, change);
678 map_change_seen(pplayer, ptile, change, can_reveal_tiles);
679
681 if (really_gives_vision(pplayer, pplayer2)) {
682 map_change_seen(pplayer2, ptile, change, can_reveal_tiles);
683 }
685}
686
687/**********************************************************************/
690void map_vision_update(struct player *pplayer, struct tile *ptile,
693 bool can_reveal_tiles)
694{
695 v_radius_t change;
696 int max_radius;
697
701 return;
702 }
703
704 /* Determines 'max_radius' value. */
705 max_radius = 0;
707 if (max_radius < old_radius_sq[v]) {
709 }
710 if (max_radius < new_radius_sq[v]) {
712 }
714
715#ifdef FREECIV_DEBUG
716 log_debug("Updating vision at (%d, %d) in a radius of %d.",
717 TILE_XY(ptile), max_radius);
719 log_debug(" vision layer %d is changing from %d to %d.",
720 v, old_radius_sq[v], new_radius_sq[v]);
722#endif /* FREECIV_DEBUG */
723
724 buffer_shared_vision(pplayer);
725 circle_dxyr_iterate(&(wld.map), ptile, max_radius, tile1, dx, dy, dr) {
727 if (dr > old_radius_sq[v] && dr <= new_radius_sq[v]) {
728 change[v] = 1;
729 } else if (dr > new_radius_sq[v] && dr <= old_radius_sq[v]) {
730 change[v] = -1;
731 } else {
732 change[v] = 0;
733 }
735 shared_vision_change_seen(pplayer, tile1, change, can_reveal_tiles);
737 unbuffer_shared_vision(pplayer);
738}
739
740/**********************************************************************/
745void map_set_border_vision(struct player *pplayer,
746 const bool is_enabled)
747{
748 const v_radius_t radius_sq = V_RADIUS(is_enabled ? 1 : -1, 0, 0);
749
750 if (pplayer->server.border_vision == is_enabled) {
751 /* No change. Changing the seen count beyond what already exists would
752 * be a bug. */
753 return;
754 }
755
756 /* Set the new border seer value. */
758
759 whole_map_iterate(&(wld.map), ptile) {
760 if (pplayer == ptile->owner) {
761 /* The tile is within the player's borders. */
762 shared_vision_change_seen(pplayer, ptile, radius_sq, TRUE);
763 }
765}
766
767/**********************************************************************/
773void map_show_tile(struct player *src_player, struct tile *ptile)
774{
775 static int recurse = 0;
776
777 log_debug("Showing %i,%i to %s", TILE_XY(ptile), player_name(src_player));
778
779 fc_assert(recurse == 0);
780 recurse++;
781
782 players_iterate(pplayer) {
783 if (pplayer == src_player || really_gives_vision(src_player, pplayer)) {
784 struct city *pcity;
785
786 if (!map_is_known_and_seen(ptile, pplayer, V_MAIN)) {
787 map_set_known(ptile, pplayer);
788
789 /* As the tile may be fogged send_tile_info won't always do this for us */
790 update_player_tile_knowledge(pplayer, ptile);
791 update_player_tile_last_seen(pplayer, ptile);
792
793 send_tile_info(pplayer->connections, ptile, FALSE);
794
795 /* Remove old cities that exist no more */
796 reality_check_city(pplayer, ptile);
797
798 if ((pcity = tile_city(ptile))) {
799 /* As the tile may be fogged send_city_info won't do this for us */
800 update_dumb_city(pplayer, pcity);
801 send_city_info(pplayer, pcity);
802 }
803
805 if (0 < map_get_seen(pplayer, ptile, v)) {
806 unit_list_iterate(ptile->units, punit) {
807 if (unit_is_on_layer(punit, v)) {
808 send_unit_info(pplayer->connections, punit);
809 }
811 }
813 }
814 }
816
817 recurse--;
818}
819
820/**********************************************************************/
825void map_hide_tile(struct player *src_player, struct tile *ptile)
826{
827 static int recurse = 0;
828
829 log_debug("Hiding %d,%d to %s", TILE_XY(ptile), player_name(src_player));
830
831 fc_assert(recurse == 0);
832 recurse++;
833
834 players_iterate(pplayer) {
835 if (pplayer == src_player || really_gives_vision(src_player, pplayer)) {
836 if (map_is_known(ptile, pplayer)) {
837 if (0 < map_get_seen(pplayer, ptile, V_MAIN)) {
838 update_player_tile_last_seen(pplayer, ptile);
839 }
840
841 /* Remove city. */
842 remove_dumb_city(pplayer, ptile);
843
844 /* Remove units. */
846 if (0 < map_get_seen(pplayer, ptile, v)) {
847 unit_list_iterate(ptile->units, punit) {
848 if (unit_is_on_layer(punit, v)) {
850 }
852 }
854 }
855
856 map_clear_known(ptile, pplayer);
857
858 send_tile_info(pplayer->connections, ptile, TRUE);
859 }
861
862 recurse--;
863}
864
865/**********************************************************************/
869void map_show_circle(struct player *pplayer, struct tile *ptile, int radius_sq)
870{
871 buffer_shared_vision(pplayer);
872
873 circle_iterate(&(wld.map), ptile, radius_sq, tile1) {
874 map_show_tile(pplayer, tile1);
876
877 unbuffer_shared_vision(pplayer);
878}
879
880/**********************************************************************/
884void map_show_all(struct player *pplayer)
885{
886 buffer_shared_vision(pplayer);
887
888 whole_map_iterate(&(wld.map), ptile) {
889 map_show_tile(pplayer, ptile);
891
892 unbuffer_shared_vision(pplayer);
893}
894
895/**********************************************************************/
899bool map_is_known(const struct tile *ptile, const struct player *pplayer)
900{
901 if (pplayer->tile_known.vec == NULL) {
902 /* Player map not initialized yet */
903 return FALSE;
904 }
905
906 return dbv_isset(&pplayer->tile_known, tile_index(ptile));
907}
908
909/**********************************************************************/
914static inline bool map_is_also_seen(const struct tile *ptile,
915 const struct player *pplayer,
916 enum vision_layer vlayer)
917{
918 return map_get_seen(pplayer, ptile, vlayer) > 0;
919}
920
921/**********************************************************************/
925bool map_is_known_and_seen(const struct tile *ptile,
926 const struct player *pplayer,
927 enum vision_layer vlayer)
928{
929 return map_is_known(ptile, pplayer) && map_is_also_seen(ptile, pplayer, vlayer);
930}
931
932/**********************************************************************/
939static inline int map_get_seen(const struct player *pplayer,
940 const struct tile *ptile,
941 enum vision_layer vlayer)
942{
943 return map_get_player_tile(ptile, pplayer)->seen_count[vlayer];
944}
945
946/**********************************************************************/
952void map_change_seen(struct player *pplayer,
953 struct tile *ptile,
954 const v_radius_t change,
955 bool can_reveal_tiles)
956{
957 struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
958 bool revealing_tile = FALSE;
959
960#ifdef FREECIV_DEBUG
961 log_debug("%s() for player %s (nb %d) at (%d, %d).",
962 __FUNCTION__, player_name(pplayer), player_number(pplayer),
963 TILE_XY(ptile));
965 log_debug(" vision layer %d is changing from %d to %d.",
966 v, plrtile->seen_count[v], plrtile->seen_count[v] + change[v]);
968#endif /* FREECIV_DEBUG */
969
970 /* Removes units out of vision. First, check invisible layers because
971 * we must remove all units before fog of war because clients expect
972 * the tile is empty when it is fogged. */
973 if (0 > change[V_INVIS]
974 && plrtile->seen_count[V_INVIS] == -change[V_INVIS]) {
975 log_debug("(%d, %d): hiding invisible units to player %s (nb %d).",
976 TILE_XY(ptile), player_name(pplayer), player_number(pplayer));
977
978 unit_list_iterate(ptile->units, punit) {
980 && can_player_see_unit(pplayer, punit)
981 && (plrtile->seen_count[V_MAIN] + change[V_MAIN] <= 0
982 || !pplayers_allied(pplayer, unit_owner(punit)))) {
983 /* Allied units on seen tiles (V_MAIN) are always seen.
984 * That's how can_player_see_unit_at() works. */
986 }
988 }
989 if (0 > change[V_SUBSURFACE]
990 && plrtile->seen_count[V_SUBSURFACE] == -change[V_SUBSURFACE]) {
991 log_debug("(%d, %d): hiding subsurface units to player %s (nb %d).",
992 TILE_XY(ptile), player_name(pplayer), player_number(pplayer));
993
994 unit_list_iterate(ptile->units, punit) {
996 && can_player_see_unit(pplayer, punit)) {
998 }
1000 }
1001
1002 if (0 > change[V_MAIN]
1003 && plrtile->seen_count[V_MAIN] == -change[V_MAIN]) {
1004 log_debug("(%d, %d): hiding visible units to player %s (nb %d).",
1005 TILE_XY(ptile), player_name(pplayer), player_number(pplayer));
1006
1007 unit_list_iterate(ptile->units, punit) {
1009 && can_player_see_unit(pplayer, punit)) {
1010 unit_goes_out_of_sight(pplayer, punit);
1011 }
1013 }
1014
1016 /* Avoid underflow. */
1017 fc_assert(0 <= change[v] || -change[v] <= plrtile->seen_count[v]);
1018 plrtile->seen_count[v] += change[v];
1020
1021 /* V_MAIN vision ranges must always be more than invisible ranges
1022 * (see comment in common/vision.h), so we assume that the V_MAIN
1023 * seen count cannot be inferior to V_INVIS or V_SUBSURFACE seen count.
1024 * Moreover, when the fog of war is disabled, V_MAIN has an extra
1025 * seen count point. */
1026 fc_assert(plrtile->seen_count[V_INVIS] + !game.info.fogofwar
1027 <= plrtile->seen_count[V_MAIN]);
1029 <= plrtile->seen_count[V_MAIN]);
1030
1031 if (!map_is_known(ptile, pplayer)) {
1032 if (0 < plrtile->seen_count[V_MAIN] && can_reveal_tiles) {
1033 log_debug("(%d, %d): revealing tile to player %s (nb %d).",
1034 TILE_XY(ptile), player_name(pplayer),
1035 player_number(pplayer));
1036
1037 map_set_known(ptile, pplayer);
1039 } else {
1040 return;
1041 }
1042 }
1043
1044 /* Fog the tile. */
1045 if (0 > change[V_MAIN] && 0 == plrtile->seen_count[V_MAIN]) {
1046 struct city *pcity;
1047
1048 log_debug("(%d, %d): fogging tile for player %s (nb %d).",
1049 TILE_XY(ptile), player_name(pplayer), player_number(pplayer));
1050
1051 pcity = ptile->worked;
1052
1053 if (pcity != NULL && city_owner(pcity) == pplayer) {
1055 pcity->specialists[DEFAULT_SPECIALIST]++;
1056 if (pcity->server.needs_arrange == CNA_NOT) {
1057 pcity->server.needs_arrange = CNA_NORMAL;
1058 }
1059 }
1060
1061 update_player_tile_last_seen(pplayer, ptile);
1063 plrtile->owner = tile_owner(ptile);
1064 }
1065 plrtile->extras_owner = extra_owner(ptile);
1066 send_tile_info(pplayer->connections, ptile, FALSE);
1067 }
1068
1069 if ((revealing_tile && 0 < plrtile->seen_count[V_MAIN])
1070 || (0 < change[V_MAIN]
1071 /* plrtile->seen_count[V_MAIN] Always set to 1
1072 * when the fog of war is disabled. */
1073 && (change[V_MAIN] + !game.info.fogofwar
1074 == (plrtile->seen_count[V_MAIN])))) {
1075 struct city *pcity;
1076
1077 log_debug("(%d, %d): unfogging tile for player %s (nb %d).",
1078 TILE_XY(ptile), player_name(pplayer), player_number(pplayer));
1079
1080 /* Send info about the tile itself.
1081 * It has to be sent first because the client needs correct
1082 * continent number before it can handle following packets
1083 */
1084 update_player_tile_knowledge(pplayer, ptile);
1085 send_tile_info(pplayer->connections, ptile, FALSE);
1086
1087 /* Discover units. */
1088 unit_list_iterate(ptile->units, punit) {
1089 /* Be sure not to revive dead unit on client when it's not yet
1090 * removed from the tile. This could happen when "unit_lost" lua script
1091 * somehow causes tile of the dead unit to unfog again. */
1093 && !punit->server.dying) {
1094 send_unit_info(pplayer->connections, punit);
1095 }
1097
1098 /* Discover cities. */
1099 reality_check_city(pplayer, ptile);
1100
1101 if (NULL != (pcity = tile_city(ptile))) {
1102 send_city_info(pplayer, pcity);
1103 }
1104 }
1105
1106 if ((revealing_tile && 0 < plrtile->seen_count[V_INVIS])
1107 || (0 < change[V_INVIS]
1108 && change[V_INVIS] == plrtile->seen_count[V_INVIS])) {
1109 log_debug("(%d, %d): revealing invisible units to player %s (nb %d).",
1110 TILE_XY(ptile), player_name(pplayer),
1111 player_number(pplayer));
1112 /* Discover units. */
1113 unit_list_iterate(ptile->units, punit) {
1115 send_unit_info(pplayer->connections, punit);
1116 }
1118 }
1119 if ((revealing_tile && 0 < plrtile->seen_count[V_SUBSURFACE])
1120 || (0 < change[V_SUBSURFACE]
1121 && change[V_SUBSURFACE] == plrtile->seen_count[V_SUBSURFACE])) {
1122 log_debug("(%d, %d): revealing subsurface units to player %s (nb %d).",
1123 TILE_XY(ptile), player_name(pplayer),
1124 player_number(pplayer));
1125 /* Discover units. */
1126 unit_list_iterate(ptile->units, punit) {
1128 send_unit_info(pplayer->connections, punit);
1129 }
1131 }
1132}
1133
1134/**********************************************************************/
1141static inline int player_tile_own_seen(const struct player_tile *plrtile,
1142 enum vision_layer vlayer)
1143{
1144 return plrtile->own_seen[vlayer];
1145}
1146
1147/**********************************************************************/
1150static void map_change_own_seen(struct player *pplayer,
1151 struct tile *ptile,
1152 const v_radius_t change)
1153{
1154 struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
1155
1157 plrtile->own_seen[v] += change[v];
1159}
1160
1161/**********************************************************************/
1165 struct vision_site *new_site)
1166{
1167 if (ptile->site == new_site) {
1168 /* Do nothing. */
1169 return;
1170 }
1171
1172 if (ptile->site != NULL) {
1173 /* Releasing old site from tile */
1174 vision_site_destroy(ptile->site);
1175 }
1176
1177 ptile->site = new_site;
1178}
1179
1180/**********************************************************************/
1183void map_set_known(struct tile *ptile, struct player *pplayer)
1184{
1185 dbv_set(&pplayer->tile_known, tile_index(ptile));
1186}
1187
1188/**********************************************************************/
1191void map_clear_known(struct tile *ptile, struct player *pplayer)
1192{
1193 dbv_clr(&pplayer->tile_known, tile_index(ptile));
1194}
1195
1196/**********************************************************************/
1201void map_know_and_see_all(struct player *pplayer)
1202{
1203 const v_radius_t radius_sq = V_RADIUS(1, 1, 1);
1204
1205 buffer_shared_vision(pplayer);
1206 whole_map_iterate(&(wld.map), ptile) {
1207 map_change_seen(pplayer, ptile, radius_sq, TRUE);
1209 unbuffer_shared_vision(pplayer);
1210}
1211
1212/**********************************************************************/
1216{
1217 players_iterate(pplayer) {
1218 map_know_and_see_all(pplayer);
1220}
1221
1222/**********************************************************************/
1226void player_map_init(struct player *pplayer)
1227{
1228 pplayer->server.private_map
1229 = fc_realloc(pplayer->server.private_map,
1230 MAP_INDEX_SIZE * sizeof(*pplayer->server.private_map));
1231
1232 whole_map_iterate(&(wld.map), ptile) {
1233 player_tile_init(ptile, pplayer);
1235
1237}
1238
1239/**********************************************************************/
1242void player_map_free(struct player *pplayer)
1243{
1244 if (!pplayer->server.private_map) {
1245 return;
1246 }
1247
1248 whole_map_iterate(&(wld.map), ptile) {
1249 player_tile_free(ptile, pplayer);
1251
1252 free(pplayer->server.private_map);
1253 pplayer->server.private_map = NULL;
1254
1255 dbv_free(&pplayer->tile_known);
1256}
1257
1258/**********************************************************************/
1263void remove_player_from_maps(struct player *pplayer)
1264{
1265 /* only after removing borders! */
1267 whole_map_iterate(&(wld.map), ptile) {
1268 /* Clear all players' knowledge about the removed player, and free
1269 * data structures (including those in removed player's player map). */
1270 bool reality_changed = FALSE;
1271
1273 struct player_tile *aplrtile;
1274 bool changed = FALSE;
1275
1276 if (!aplayer->server.private_map) {
1277 continue;
1278 }
1280
1281 /* Free vision sites (cities) for removed and other players */
1282 if (aplrtile && aplrtile->site
1283 && vision_site_owner(aplrtile->site) == pplayer) {
1285 changed = TRUE;
1286 }
1287
1288 /* Remove references to player from others' maps */
1289 if (aplrtile->owner == pplayer) {
1290 aplrtile->owner = NULL;
1291 changed = TRUE;
1292 }
1293 if (aplrtile->extras_owner == pplayer) {
1294 aplrtile->extras_owner = NULL;
1295 changed = TRUE;
1296 }
1297
1298 /* Must ensure references to dying player are gone from clients
1299 * before player is destroyed */
1300 if (changed) {
1301 /* This will use player tile if fogged */
1302 send_tile_info(pplayer->connections, ptile, FALSE);
1303 }
1305
1306 /* Clear removed player's knowledge */
1307 if (pplayer->tile_known.vec) {
1308 map_clear_known(ptile, pplayer);
1309 }
1310
1311 /* Free all claimed tiles. */
1312 if (tile_owner(ptile) == pplayer) {
1313 tile_set_owner(ptile, NULL, NULL);
1315 }
1316 if (extra_owner(ptile) == pplayer) {
1317 ptile->extras_owner = NULL;
1319 }
1320
1321 if (reality_changed) {
1322 /* Update anyone who can see the tile (e.g. global observers) */
1323 send_tile_info(NULL, ptile, FALSE);
1324 }
1327}
1328
1329/**********************************************************************/
1333static void player_tile_init(struct tile *ptile, struct player *pplayer)
1334{
1335 struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
1336
1337 plrtile->terrain = T_UNKNOWN;
1338 plrtile->resource = NULL;
1339 plrtile->owner = NULL;
1340 plrtile->extras_owner = NULL;
1341 plrtile->site = NULL;
1342 dbv_init(&(plrtile->extras), extra_count());
1344 plrtile->last_updated = game.info.turn;
1345 } else {
1346 plrtile->last_updated = game.info.year;
1347 }
1348
1349 plrtile->seen_count[V_MAIN] = !game.server.fogofwar_old;
1350 plrtile->seen_count[V_INVIS] = 0;
1351 plrtile->seen_count[V_SUBSURFACE] = 0;
1352 memcpy(plrtile->own_seen, plrtile->seen_count, sizeof(v_radius_t));
1353}
1354
1355/**********************************************************************/
1358static void player_tile_free(struct tile *ptile, struct player *pplayer)
1359{
1360 struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
1361
1362 if (plrtile->site != NULL) {
1364 }
1365
1366 dbv_free(&(plrtile->extras));
1367}
1368
1369/**********************************************************************/
1372struct vision_site *map_get_player_city(const struct tile *ptile,
1373 const struct player *pplayer)
1374{
1375 struct vision_site *psite = map_get_player_site(ptile, pplayer);
1376
1377 fc_assert_ret_val(psite == NULL || psite->location == ptile, NULL);
1378
1379 return psite;
1380}
1381
1382/**********************************************************************/
1387struct player_tile *map_get_player_tile(const struct tile *ptile,
1388 const struct player *pplayer)
1389{
1391
1392 return pplayer->server.private_map + tile_index(ptile);
1393}
1394
1395/**********************************************************************/
1403bool update_player_tile_knowledge(struct player *pplayer, struct tile *ptile)
1404{
1405 struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
1406
1407 if (plrtile->terrain != ptile->terrain
1408 || !bv_match_dbv(&(plrtile->extras), ptile->extras.vec)
1409 || plrtile->resource != ptile->resource
1410 || plrtile->owner != tile_owner(ptile)
1411 || plrtile->extras_owner != extra_owner(ptile)) {
1412 plrtile->terrain = ptile->terrain;
1413 extra_type_iterate(pextra) {
1414 if (player_knows_extra_exist(pplayer, pextra, ptile)) {
1415 dbv_set(&(plrtile->extras), extra_number(pextra));
1416 } else {
1417 dbv_clr(&(plrtile->extras), extra_number(pextra));
1418 }
1420 if (ptile->resource != NULL
1421 && player_knows_extra_exist(pplayer, ptile->resource, ptile)) {
1422 plrtile->resource = ptile->resource;
1423 } else {
1425 }
1426 plrtile->owner = tile_owner(ptile);
1427 plrtile->extras_owner = extra_owner(ptile);
1428
1429 return TRUE;
1430 }
1431
1432 return FALSE;
1433}
1434
1435/**********************************************************************/
1444void update_tile_knowledge(struct tile *ptile)
1445{
1446 if (server_state() == S_S_INITIAL) {
1447 return;
1448 }
1449
1450 /* Players */
1451 players_iterate(pplayer) {
1452 if (map_is_known_and_seen(ptile, pplayer, V_MAIN)) {
1453 if (update_player_tile_knowledge(pplayer, ptile)) {
1454 send_tile_info(pplayer->connections, ptile, FALSE);
1455 }
1456 }
1458
1459 /* Global observers */
1461 struct player *pplayer = pconn->playing;
1462
1463 if (NULL == pplayer && pconn->observer) {
1464 send_tile_info(pconn->self, ptile, FALSE);
1465 }
1467}
1468
1469/**********************************************************************/
1473 struct tile *ptile)
1474{
1476 map_get_player_tile(ptile, pplayer)->last_updated = game.info.turn;
1477 } else {
1478 map_get_player_tile(ptile, pplayer)->last_updated = game.info.year;
1479 }
1480}
1481
1482/**********************************************************************/
1491 struct player *pdest,
1492 struct tile *ptile)
1493{
1494 if (!map_is_known_and_seen(ptile, pdest, V_MAIN)) {
1495 /* I can just hear people scream as they try to comprehend this if :).
1496 * Let me try in words:
1497 * 1) if the tile is seen by pfrom the info is sent to pdest
1498 * OR
1499 * 2) if the tile is known by pfrom AND (they have more recent info
1500 * OR it is not known by pdest)
1501 */
1503 || (map_is_known(ptile, pfrom)
1504 && (((map_get_player_tile(ptile, pfrom)->last_updated
1505 > map_get_player_tile(ptile, pdest)->last_updated))
1506 || !map_is_known(ptile, pdest)))) {
1507 struct player_tile *from_tile, *dest_tile;
1508
1510 dest_tile = map_get_player_tile(ptile, pdest);
1511 /* Update and send tile knowledge */
1512 map_set_known(ptile, pdest);
1513 dest_tile->terrain = from_tile->terrain;
1514 dbv_copy(&(dest_tile->extras), &(from_tile->extras));
1515 dest_tile->resource = from_tile->resource;
1516 dest_tile->owner = from_tile->owner;
1517 dest_tile->extras_owner = from_tile->extras_owner;
1518 dest_tile->last_updated = from_tile->last_updated;
1519 send_tile_info(pdest->connections, ptile, FALSE);
1520
1521 /* Update and send city knowledge */
1522 /* Remove outdated cities */
1523 if (dest_tile->site) {
1524 if (!from_tile->site) {
1525 /* As the city was gone on the newer from_tile
1526 it will be removed by this function */
1527 reality_check_city(pdest, ptile);
1528 } else { /* We have a dest_city. update */
1529 if (from_tile->site->identity
1530 != dest_tile->site->identity) {
1531 /* As the city was gone on the newer from_tile
1532 it will be removed by this function */
1533 reality_check_city(pdest, ptile);
1534 }
1535 }
1536 }
1537
1538 /* Set and send new city info */
1539 if (from_tile->site) {
1540 if (!dest_tile->site) {
1541 /* We cannot assign new vision site with change_playertile_site(),
1542 * since location is not yet set up for new site */
1543 dest_tile->site = vision_site_copy(from_tile->site);
1544 }
1545 /* Note that we don't care if receiver knows vision source city
1546 * or not. */
1547 send_city_info_at_tile(pdest, pdest->connections, NULL, ptile);
1548 }
1549
1551
1552 return TRUE;
1553 }
1554 }
1555
1556 return FALSE;
1557}
1558
1559/**********************************************************************/
1573
1574/**********************************************************************/
1584 struct player *pdest,
1585 struct tile *ptile)
1586{
1588
1592 }
1594
1595 return updt;
1596}
1597
1598/**********************************************************************/
1604{
1605 int added;
1606
1607 players_iterate(pplayer) {
1608 pplayer->server.really_gives_vision = pplayer->gives_shared_vision;
1610
1611 /* In words: This terminates when it has run a round without adding
1612 a dependency. One loop only propagates dependencies one level deep,
1613 which is why we keep doing it as long as changes occur. */
1614 do {
1615 added = 0;
1616 players_iterate(pplayer) {
1618 if (really_gives_vision(pplayer, pplayer2)
1619 && pplayer != pplayer2) {
1622 && !really_gives_vision(pplayer, pplayer3)
1623 && pplayer != pplayer3) {
1624 BV_SET(pplayer->server.really_gives_vision, player_index(pplayer3));
1625 added++;
1626 }
1628 }
1631 } while (added > 0);
1632}
1633
1634/**********************************************************************/
1638{
1640
1641 if (pfrom == pto) {
1642 return;
1643 }
1644
1646 log_error("Trying to give shared vision from %s to %s, "
1647 "but that vision is already given!",
1649 return;
1650 }
1651
1652 players_iterate(pplayer) {
1653 save_vision[player_index(pplayer)] = pplayer->server.really_gives_vision;
1655
1656 BV_SET(pfrom->gives_shared_vision, player_index(pto));
1658 log_debug("giving shared vision from %s to %s",
1660
1661 players_iterate(pplayer) {
1662 buffer_shared_vision(pplayer);
1664 if (really_gives_vision(pplayer, pplayer2)
1665 && !BV_ISSET(save_vision[player_index(pplayer)],
1667 log_debug("really giving shared vision from %s to %s",
1668 player_name(pplayer), player_name(pplayer2));
1669 whole_map_iterate(&(wld.map), ptile) {
1670 const struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
1671 const v_radius_t change =
1675
1676 if (0 < change[V_MAIN] || 0 < change[V_INVIS]) {
1677 map_change_seen(pplayer2, ptile, change,
1678 map_is_known(ptile, pplayer));
1679 }
1681
1682 /* Squares that are not seen, but which pfrom may have more recent
1683 knowledge of */
1685 }
1687 unbuffer_shared_vision(pplayer);
1689
1690 if (S_S_RUNNING == server_state()) {
1692 }
1693}
1694
1695/**********************************************************************/
1699{
1701
1703 if (!gives_shared_vision(pfrom, pto)) {
1704 log_error("Tried removing the shared vision from %s to %s, "
1705 "but it did not exist in the first place!",
1707 return;
1708 }
1709
1710 players_iterate(pplayer) {
1711 save_vision[player_index(pplayer)] = pplayer->server.really_gives_vision;
1713
1714 log_debug("removing shared vision from %s to %s",
1716
1717 BV_CLR(pfrom->gives_shared_vision, player_index(pto));
1719
1720 players_iterate(pplayer) {
1721 buffer_shared_vision(pplayer);
1723 if (!really_gives_vision(pplayer, pplayer2)
1724 && BV_ISSET(save_vision[player_index(pplayer)],
1726 log_debug("really removing shared vision from %s to %s",
1727 player_name(pplayer), player_name(pplayer2));
1728 whole_map_iterate(&(wld.map), ptile) {
1729 const struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
1730 const v_radius_t change =
1734
1735 if (0 > change[V_MAIN] || 0 > change[V_INVIS]) {
1736 map_change_seen(pplayer2, ptile, change, FALSE);
1737 }
1739 }
1741 unbuffer_shared_vision(pplayer);
1743
1744 if (S_S_RUNNING == server_state()) {
1746 }
1747}
1748
1749/**********************************************************************/
1753{
1754 const v_radius_t radius_sq = V_RADIUS(-1, 0, 0);
1755
1757
1758 buffer_shared_vision(pplayer);
1759 whole_map_iterate(&(wld.map), ptile) {
1760 map_change_seen(pplayer, ptile, radius_sq, FALSE);
1762 unbuffer_shared_vision(pplayer);
1763}
1764
1765/**********************************************************************/
1769{
1770 players_iterate(pplayer) {
1771 enable_fog_of_war_player(pplayer);
1773}
1774
1775/**********************************************************************/
1779{
1780 const v_radius_t radius_sq = V_RADIUS(1, 0, 0);
1781
1783
1784 buffer_shared_vision(pplayer);
1785 whole_map_iterate(&(wld.map), ptile) {
1786 map_change_seen(pplayer, ptile, radius_sq, FALSE);
1788 unbuffer_shared_vision(pplayer);
1789}
1790
1791/**********************************************************************/
1795{
1796 players_iterate(pplayer) {
1799}
1800
1801/**********************************************************************/
1810static void ocean_to_land_fix_rivers(struct tile *ptile)
1811{
1812 cardinal_adjc_iterate(&(wld.map), ptile, tile1) {
1813 bool ocean_near = FALSE;
1814
1816 if (is_ocean_tile(tile2))
1817 ocean_near = TRUE;
1819
1820 if (!ocean_near) {
1821 /* If ruleset has several river types defined, this
1822 * may cause same tile to contain more than one river. */
1826 tile_add_extra(ptile, priver);
1827 }
1829 }
1831}
1832
1833/**********************************************************************/
1837 struct tile *from)
1838{
1839 bool unit_alive = TRUE;
1840 struct player *owner = unit_owner(punit);
1841
1842 /* Look for a nearby safe tile */
1843 adjc_iterate(&(wld.map), from, ptile2) {
1848 log_verbose("Moved %s %s due to changing terrain at (%d,%d).",
1853 _("Moved your %s due to changing terrain."),
1854 unit_link(punit));
1855
1856 /* TODO: should a unit be able to bounce to a transport like is
1857 * done below? What if the unit can't legally enter the transport,
1858 * say because the transport is Unreachable and the unit doesn't
1859 * have it in its embarks field or because "Transport Embark"
1860 * isn't enabled? Kept like it was to preserve the old rules for
1861 * now. -- Sveinung */
1866 }
1867 break;
1868 }
1870
1871 if (unit_alive && unit_tile(punit) == from) {
1872 /* If we get here we could not move punit. */
1873
1874 /* Try to bounce transported units. */
1876 struct unit_list *pcargo_units;
1877
1882 }
1883 }
1884}
1885
1886/**********************************************************************/
1892static void check_units_single_tile(struct tile *ptile)
1893{
1894 const struct civ_map *nmap = &(wld.map);
1895
1897 int id = punit->id;
1898
1899 /* Top-level transports only. Each handle their own cargo */
1901 && !can_unit_exist_at_tile(nmap, punit, ptile)) {
1903
1904 if (unit_is_alive(id) && unit_tile(punit) == ptile) {
1905 log_verbose("Disbanded %s %s due to changing terrain "
1906 "at (%d, %d).",
1908 unit_rule_name(punit), TILE_XY(ptile));
1911 _("Disbanded your %s due to changing terrain."),
1914 }
1915 }
1917}
1918
1919/**********************************************************************/
1927{
1928 const struct civ_map *nmap = &(wld.map);
1929
1930 /* Check this tile for direct effect on its units */
1932 /* We have to check adjacent tiles too, in case units in cities are now
1933 * illegal (e.g., boat in a city that has become landlocked),
1934 * and in case of CoastStrict units losing their adjacent coast. */
1935 adjc_iterate(nmap, ptile, ptile2) {
1938}
1939
1940/**********************************************************************/
1945 const struct terrain *newter)
1946{
1948
1949 if (!oldter || !newter) {
1950 return FALSE;
1951 }
1952
1955
1956 return (old_is_ocean && !new_is_ocean)
1957 || (!old_is_ocean && new_is_ocean);
1958}
1959
1960/**********************************************************************/
1963void terrain_changed(struct tile *ptile)
1964{
1965 struct city *pcity = tile_city(ptile);
1966
1967 if (pcity != NULL) {
1968 /* Tile is city center and new terrain may support better extras. */
1970 }
1971
1973}
1974
1975/**********************************************************************/
1983 struct terrain *oldter,
1984 bool extend_rivers)
1985{
1986 if (is_ocean(oldter) && !is_ocean_tile(ptile)) {
1987 if (extend_rivers) {
1989 }
1991 }
1992
1993 terrain_changed(ptile);
1994}
1995
1996/**********************************************************************/
2002void check_terrain_change(struct tile *ptile, struct terrain *oldter)
2003{
2004 struct terrain *newter = tile_terrain(ptile);
2005 struct tile *claimer;
2006 bool cont_reassigned = FALSE;
2007
2008 /* Check if new terrain is a freshwater terrain next to non-freshwater.
2009 * In that case, the new terrain is *changed*. */
2011 bool nonfresh = FALSE;
2012
2013 adjc_iterate(&(wld.map), ptile, atile) {
2016 nonfresh = TRUE;
2017 break;
2018 }
2020 if (nonfresh) {
2021 /* Need to pick a new, non-freshwater ocean type for this tile.
2022 * We don't want e.g. Deep Ocean to be propagated to this tile
2023 * and then to a whole lake by the flooding below, so we pick
2024 * the shallowest non-fresh oceanic type.
2025 * Prefer terrain that matches the frozenness of the target. */
2028 }
2029 }
2030
2034
2035 phase_players_iterate(pplayer) {
2036 if (is_adv_data_phase_open(pplayer)) {
2037 /* Player is using continent numbers that they would assume to remain accurate.
2038 * Force refresh:
2039 * 1) Close the phase, so that it can be opened
2040 * 2) Open the phase, recalculating
2041 */
2042 adv_data_phase_done(pplayer);
2043 adv_data_phase_init(pplayer, FALSE);
2044 }
2046 }
2047
2049
2050 /* Check for saltwater filling freshwater lake */
2053 adjc_iterate(&(wld.map), ptile, atile) {
2055 struct terrain *aold = tile_terrain(atile);
2056
2059 TER_FROZEN)));
2060
2061 /* Recursive, but as lakes are of limited size, this
2062 * won't recurse so much as to cause stack problems. */
2065 }
2067 }
2068
2069 if (cont_reassigned) {
2071 }
2072
2073 claimer = tile_claimer(ptile);
2074 if (claimer != NULL) {
2075 /* Make sure map_claim_border() conditions are still satisfied */
2076 if (!is_tile_claimable(ptile, claimer, tile_owner(ptile))) {
2077 map_clear_border(ptile);
2078 }
2079 }
2080
2081 sanity_check_tile(ptile);
2082}
2083
2084/**********************************************************************/
2088static bool is_tile_claimable(struct tile *ptile, struct tile *source,
2089 struct player *pplayer)
2090{
2091 if (ptile == source) {
2092 /* Source itself is always claimable. */
2093 return TRUE;
2094 }
2095
2096 return 0 < get_target_bonus_effects(nullptr,
2097 &(const struct req_context) {
2098 .tile = ptile,
2099 .player = pplayer,
2100 },
2101 &(const struct req_context) {
2102 .tile = source,
2103 },
2105}
2106
2107/**********************************************************************/
2110static void map_unit_homecity_enqueue(struct tile *ptile)
2111{
2112 unit_list_iterate(ptile->units, punit) {
2114
2115 if (NULL == phome) {
2116 continue;
2117 }
2118
2121}
2122
2123/**********************************************************************/
2126static void map_claim_border_ownership(struct tile *ptile,
2127 struct player *powner,
2128 struct tile *psource)
2129{
2130 struct player *ploser = tile_owner(ptile);
2131
2132 if ((ploser != powner && ploser != NULL)
2135 || ploser->server.border_vision)) {
2136 const v_radius_t radius_sq = V_RADIUS(-1, 0, 0);
2137
2138 shared_vision_change_seen(ploser, ptile, radius_sq, FALSE);
2139 }
2140
2141 if (powner != NULL
2144 || powner->server.border_vision)) {
2145 const v_radius_t radius_sq = V_RADIUS(1, 0, 0);
2146
2147 shared_vision_change_seen(powner, ptile, radius_sq, TRUE);
2148 }
2149
2150 tile_set_owner(ptile, powner, psource);
2151
2152 /* Needed only when foggedborders enabled, but we do it unconditionally
2153 * in case foggedborders ever gets enabled later. Better to have correct
2154 * information in player map just in case. */
2155 update_tile_knowledge(ptile);
2156
2157 if (ploser != powner) {
2160 }
2161
2162 if (!city_map_update_tile_frozen(ptile)) {
2163 send_tile_info(NULL, ptile, FALSE);
2164 }
2165 }
2166}
2167
2168/**********************************************************************/
2171void map_claim_ownership(struct tile *ptile, struct player *powner,
2172 struct tile *psource, bool claim_bases)
2173{
2174 map_claim_border_ownership(ptile, powner, psource);
2175
2176 if (claim_bases) {
2177 tile_claim_bases(ptile, powner);
2178 }
2179}
2180
2181/**********************************************************************/
2184void tile_claim_bases(struct tile *ptile, struct player *powner)
2185{
2186 struct player *base_loser = extra_owner(ptile);
2187
2188 /* This MUST be before potentially recursive call to map_claim_base(),
2189 * so that the recursive call will get new owner == base_loser and
2190 * abort recursion. */
2191 ptile->extras_owner = powner;
2192
2194 map_claim_base(ptile, pextra, powner, base_loser);
2196}
2197
2198/**********************************************************************/
2201void map_clear_border(struct tile *ptile)
2202{
2203 int radius_sq = tile_border_source_radius_sq(ptile);
2204
2205 circle_dxyr_iterate(&(wld.map), ptile, radius_sq, dtile, dx, dy, dr) {
2206 struct tile *claimer = tile_claimer(dtile);
2207
2208 if (claimer == ptile) {
2210 }
2212}
2213
2214/**********************************************************************/
2218void map_update_border(struct tile *ptile, struct player *owner,
2220{
2222 /* No change */
2223 return;
2224 }
2225
2227 return;
2228 }
2229
2232 } else {
2233 circle_dxyr_iterate(&(wld.map), ptile, old_radius_sq, dtile, dx, dy, dr) {
2234 if (dr > new_radius_sq) {
2235 struct tile *claimer = tile_claimer(dtile);
2236
2237 if (claimer == ptile) {
2239 }
2240 }
2242 }
2243}
2244
2245/**********************************************************************/
2250void map_claim_border(struct tile *ptile, struct player *owner,
2251 int radius_sq)
2252{
2254 return;
2255 }
2256
2257 if (owner == NULL) {
2258 /* Clear the border instead of claiming. Code below this block
2259 * cannot handle NULL owner. */
2260 map_clear_border(ptile);
2261
2262 return;
2263 }
2264
2265 if (radius_sq < 0) {
2266 radius_sq = tile_border_source_radius_sq(ptile);
2267 }
2268
2269 circle_dxyr_iterate(&(wld.map), ptile, radius_sq, dtile, dx, dy, dr) {
2270 struct tile *dclaimer = tile_claimer(dtile);
2271
2272 if (dclaimer == ptile) {
2273 /* Already claimed by the ptile */
2274 continue;
2275 }
2276
2277 if (dr != 0 && is_border_source(dtile)) {
2278 /* Do not claim border sources other than self */
2279 /* Note that this is extremely important at the moment for
2280 * base claiming to work correctly in case there's two
2281 * fortresses near each other. There could be infinite
2282 * recursion in them claiming each other. */
2283 continue;
2284 }
2285
2287 continue;
2288 }
2289
2290 /* Always claim source itself (distance, dr, to it 0) */
2291 if (dr != 0 && NULL != dclaimer && dclaimer != ptile) {
2292 struct city *ccity = tile_city(dclaimer);
2294
2295 if (ccity != NULL) {
2296 /* Previously claimed by city */
2297 int city_x, city_y;
2298
2300
2304 /* Tile is within region permanently claimed by city */
2305 continue;
2306 }
2307 }
2308
2311
2312 if (strength_new <= strength_old) {
2313 /* Stronger shall prevail,
2314 * in case of equal strength older shall prevail */
2315 continue;
2316 }
2317 }
2318
2319 /* Only certain tiles are claimable */
2320 if (is_tile_claimable(dtile, ptile, owner)) {
2321 map_claim_ownership(dtile, owner, ptile, dr == 0);
2322 }
2324}
2325
2326/**********************************************************************/
2330{
2332 return;
2333 }
2334
2335 if (wld.map.tiles == NULL) {
2336 /* Map not yet initialized */
2337 return;
2338 }
2339
2340 log_verbose("map_calculate_borders()");
2341
2342 whole_map_iterate(&(wld.map), ptile) {
2343 if (is_border_source(ptile)) {
2344 map_claim_border(ptile, ptile->owner, -1);
2345 }
2347
2348 log_verbose("map_calculate_borders() workers");
2351}
2352
2353/**********************************************************************/
2356void map_claim_base(struct tile *ptile, struct extra_type *pextra,
2357 struct player *powner, struct player *ploser)
2358{
2359 struct base_type *pbase;
2361 int units_num = 0;
2362 int ul_size;
2363
2364 if (!tile_has_extra(ptile, pextra)) {
2365 return;
2366 }
2367
2368 if (pextra->eus != EUS_NORMAL) {
2369 ul_size = unit_list_size(ptile->units);
2370 } else {
2371 ul_size = 0;
2372 }
2373
2374 int stored_units[ul_size + 1];
2375
2376 if (ul_size > 0) {
2377 int i;
2378
2380
2381 unit_list_iterate(ptile->units, aunit) {
2382 stored_units[units_num++] = aunit->id;
2384
2386
2387 for (i = 0; i < units_num; i++) {
2389
2394 }
2396 }
2397 }
2398
2399 pbase = extra_base_get(pextra);
2400
2402
2403 /* Transfer base provided vision to new owner */
2404 if (powner != NULL) {
2405 const v_radius_t old_radius_sq = V_RADIUS(-1, -1, -1);
2406 const v_radius_t new_radius_sq = V_RADIUS(pbase->vision_main_sq,
2407 pbase->vision_invis_sq,
2408 pbase->vision_subs_sq);
2409
2412 }
2413
2414 if (ploser != NULL) {
2415 const v_radius_t old_radius_sq = V_RADIUS(pbase->vision_main_sq,
2416 pbase->vision_invis_sq,
2417 pbase->vision_subs_sq);
2418 const v_radius_t new_radius_sq = V_RADIUS(-1, -1, -1);
2419
2422 }
2423
2425 && territory_claiming_base(pbase) && powner != ploser) {
2426 /* Clear borders from old owner. New owner may not know all those
2427 * tiles and thus does not claim them when borders mode is less
2428 * than EXPAND. */
2429 if (ploser != NULL) {
2430 /* Set this particular tile owner by NULL so in recursion
2431 * both loser and owner will be NULL. */
2432 map_claim_border_ownership(ptile, NULL, ptile);
2433 map_clear_border(ptile);
2434 }
2435
2436 /* We here first claim this tile ownership -> now on extra_owner()
2437 * will return new owner. Then we claim border, which will recursively
2438 * lead to this tile and base being claimed. But at that point
2439 * ploser == powner and above check will abort the recursion. */
2440 if (powner != NULL) {
2441 map_claim_border_ownership(ptile, powner, ptile);
2442 map_claim_border(ptile, powner, -1);
2443 }
2446 }
2447
2448 if (units_num > 0) {
2449 int i;
2450
2451 for (i = 0; i < units_num; i++) {
2453
2457 send_unit_info(aplayer->connections, aunit);
2458 }
2459 } else {
2462 }
2463 }
2465 }
2466
2468 }
2469}
2470
2471/**********************************************************************/
2477void vision_change_sight(struct vision *vision, const v_radius_t radius_sq)
2478{
2480 radius_sq, vision->can_reveal_tiles);
2481 memcpy(vision->radius_sq, radius_sq, sizeof(v_radius_t));
2482}
2483
2484/**********************************************************************/
2490{
2491 const v_radius_t vision_radius_sq = V_RADIUS(-1, -1, -1);
2492
2493 vision_change_sight(vision, vision_radius_sq);
2494
2495 /* Owner of some city might have lost vision of a tile previously worked */
2496 players_iterate(pplayer) {
2497 city_list_iterate(pplayer->cities, pcity) {
2498 /* We are not interested about CNA_BROADCAST_PENDING, as the vision loss has
2499 * not set it, and whatever set it should take care of it. */
2500 if (pcity->server.needs_arrange == CNA_NORMAL) {
2503 pcity->server.needs_arrange = CNA_NOT;
2504 }
2507}
2508
2509/**********************************************************************/
2512void create_extra(struct tile *ptile, struct extra_type *pextra,
2513 struct player *pplayer)
2514{
2515 bool extras_removed = FALSE;
2516
2518 if (tile_has_extra(ptile, old_extra)
2519 && !can_extras_coexist(old_extra, pextra)) {
2520 destroy_extra(ptile, old_extra);
2522 }
2524
2525 if (pextra->eus != EUS_NORMAL) {
2526 unit_list_iterate(ptile->units, aunit) {
2529 if (!pplayers_allied(pplayer, aplayer)
2532 }
2534 }
2536 }
2537
2538 tile_add_extra(ptile, pextra);
2539
2540 /* Watchtower might become effective. */
2542
2543 if (pextra->data.base != NULL) {
2544 /* Claim bases on tile */
2545 if (pplayer) {
2546 struct player *old_owner = extra_owner(ptile);
2547
2548 /* Created base from NULL -> pplayer */
2549 map_claim_base(ptile, pextra, pplayer, NULL);
2550
2551 if (old_owner != pplayer) {
2552 /* Existing bases from old_owner -> pplayer */
2554 if (oldbase != pextra) {
2555 map_claim_base(ptile, oldbase, pplayer, old_owner);
2556 }
2558
2559 ptile->extras_owner = pplayer;
2560 }
2561 } else {
2562 /* Player who already owns bases on tile claims new base */
2563 map_claim_base(ptile, pextra, extra_owner(ptile), NULL);
2564 }
2565 }
2566
2567 if (extras_removed) {
2568 /* Maybe conflicting extra that was removed was the only thing
2569 * making tile native to some unit. */
2571 }
2572}
2573
2574/**********************************************************************/
2577void destroy_extra(struct tile *ptile, struct extra_type *pextra)
2578{
2580 bool real = tile_map_check(&(wld.map), ptile);
2581
2582 /* Remember what players were able to see the base. */
2583 if (real) {
2585 players_iterate(pplayer) {
2586 if (map_is_known_and_seen(ptile, pplayer, V_MAIN)) {
2587 BV_SET(base_seen, player_index(pplayer));
2588 }
2590 }
2591
2592 if (real && is_extra_caused_by(pextra, EC_BASE)) {
2593 struct base_type *pbase = extra_base_get(pextra);
2594 struct player *owner = extra_owner(ptile);
2595
2597 map_clear_border(ptile);
2598 }
2599
2600 if (NULL != owner
2601 && (0 <= pbase->vision_main_sq || 0 <= pbase->vision_invis_sq)) {
2602 /* Base provides vision, but no borders. */
2604 V_RADIUS(0 <= pbase->vision_main_sq ? pbase->vision_main_sq : -1,
2605 0 <= pbase->vision_invis_sq ? pbase->vision_invis_sq : -1,
2606 0 <= pbase->vision_subs_sq ? pbase->vision_subs_sq : -1);
2607 const v_radius_t new_radius_sq = V_RADIUS(-1, -1, -1);
2608
2611 }
2612 }
2613
2614 tile_remove_extra(ptile, pextra);
2615
2616 if (real) {
2617 /* Remove base from vision of players which were able to see the base. */
2618 players_iterate(pplayer) {
2619 if (BV_ISSET(base_seen, player_index(pplayer))
2620 && update_player_tile_knowledge(pplayer, ptile)) {
2621 send_tile_info(pplayer->connections, ptile, FALSE);
2622 }
2624
2625 if (pextra->eus != EUS_NORMAL) {
2626 struct player *eowner = extra_owner(ptile);
2627
2628 unit_list_iterate(ptile->units, aunit) {
2632 && !pplayers_allied(aplayer, eowner)) {
2633 send_unit_info(aplayer->connections, aunit);
2634 }
2636 }
2638 }
2639 }
2640}
2641
2642/**********************************************************************/
2653 int prob, bool reveal_cities)
2654{
2655 bool updt = FALSE;
2656
2658
2659 whole_map_iterate(&(wld.map), ptile) {
2660 if (fc_rand(100) < prob) {
2662 } else if (reveal_cities && NULL != tile_city(ptile)) {
2664 }
2666
2668
2669 return updt;
2670}
2671
2672/**********************************************************************/
2681{
2682 struct city *pcity = ptile->worked;
2683
2684 /* Check the unit activities. */
2686
2687 if (pcity != NULL && !is_free_worked(pcity, ptile)
2690 pcity->specialists[DEFAULT_SPECIALIST]++;
2691
2692 if (refresh_city) {
2695 }
2696 }
2697}
#define ACTION_NONE
Definition actions.h:55
bool is_adv_data_phase_open(struct player *pplayer)
Definition advdata.c:243
bool adv_data_phase_init(struct player *pplayer, bool is_new_phase)
Definition advdata.c:263
void adv_data_phase_done(struct player *pplayer)
Definition advdata.c:566
#define CALL_FUNC_EACH_AI(_func,...)
Definition ai.h:387
bool territory_claiming_base(const struct base_type *pbase)
Definition base.c:162
bool bv_match_dbv(const struct dbv *match, const unsigned char *src)
Definition bitvector.c:197
void dbv_init(struct dbv *pdbv, int bits)
Definition bitvector.c:50
void dbv_set(struct dbv *pdbv, int bit)
Definition bitvector.c:142
bool dbv_isset(const struct dbv *pdbv, int bit)
Definition bitvector.c:120
void dbv_copy(struct dbv *dest, const struct dbv *src)
Definition bitvector.c:214
void dbv_free(struct dbv *pdbv)
Definition bitvector.c:95
void dbv_clr(struct dbv *pdbv, int bit)
Definition bitvector.c:163
void dbv_to_bv(unsigned char *dest, const struct dbv *src)
Definition bitvector.c:227
#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
int tile_border_source_radius_sq(struct tile *ptile)
Definition borders.c:33
bool is_border_source(struct tile *ptile)
Definition borders.c:116
int tile_border_strength(struct tile *ptile, struct tile *source)
Definition borders.c:101
bool is_free_worked(const struct city *pcity, const struct tile *ptile)
Definition city.c:3626
int city_map_radius_sq_get(const struct city *pcity)
Definition city.c:137
static bool is_non_allied_city_tile(const struct tile *ptile, const struct player *pplayer)
Definition city.h:767
@ CNA_NOT
Definition city.h:303
@ CNA_NORMAL
Definition city.h:304
#define city_list_iterate(citylist, pcity)
Definition city.h:505
#define city_tile(_pcity_)
Definition city.h:561
#define city_owner(_pcity_)
Definition city.h:560
#define city_list_iterate_end
Definition city.h:507
#define city_tile_iterate(_nmap, _radius_sq, _city_tile, _tile)
Definition city.h:227
#define city_tile_iterate_end
Definition city.h:235
void city_map_update_empty(struct city *pcity, struct tile *ptile)
Definition citytools.c:3277
void send_city_info(struct player *dest, struct city *pcity)
Definition citytools.c:2368
bool update_dumb_city(struct player *pplayer, struct city *pcity)
Definition citytools.c:2776
void sync_cities(void)
Definition citytools.c:3351
bool city_map_update_tile_frozen(struct tile *ptile)
Definition citytools.c:3334
void remove_dumb_city(struct player *pplayer, struct tile *ptile)
Definition citytools.c:2868
void city_landlocked_sell_coastal_improvements(struct tile *ptile)
Definition citytools.c:3404
void send_city_info_at_tile(struct player *pviewer, struct conn_list *dest, struct city *pcity, struct tile *ptile)
Definition citytools.c:2420
void city_thaw_workers_queue(void)
Definition citytools.c:197
void reality_check_city(struct player *pplayer, struct tile *ptile)
Definition citytools.c:2847
void auto_arrange_workers(struct city *pcity)
Definition cityturn.c:366
void city_refresh_queue_add(struct city *pcity)
Definition cityturn.c:197
bool city_refresh(struct city *pcity)
Definition cityturn.c:158
void city_refresh_queue_processing(void)
Definition cityturn.c:213
char * incite_cost
Definition comments.c:76
void conn_list_do_unbuffer(struct conn_list *dest)
Definition connection.c:366
void conn_list_compression_thaw(const struct conn_list *pconn_list)
Definition connection.c:732
void conn_list_do_buffer(struct conn_list *dest)
Definition connection.c:356
void conn_list_compression_freeze(const struct conn_list *pconn_list)
Definition connection.c:720
#define conn_list_iterate(connlist, pconn)
Definition connection.h:108
#define conn_list_iterate_end
Definition connection.h:110
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
int get_city_tile_output_bonus(const struct city *pcity, const struct tile *ptile, const struct output_type *poutput, enum effect_type effect_type)
Definition effects.c:912
int get_target_bonus_effects(struct effect_list *plist, const struct req_context *context, const struct req_context *other_context, enum effect_type effect_type)
Definition effects.c:744
struct player * extra_owner(const struct tile *ptile)
Definition extras.c:1128
int extra_number(const struct extra_type *pextra)
Definition extras.c:161
bool extra_has_flag(const struct extra_type *pextra, enum extra_flag_id flag)
Definition extras.c:875
bool player_can_build_extra(const struct extra_type *pextra, const struct player *pplayer, const struct tile *ptile)
Definition extras.c:468
static struct extra_type extras[MAX_EXTRA_TYPES]
Definition extras.c:31
bool is_native_extra_to_utype(const struct extra_type *pextra, const struct unit_type *punittype)
Definition extras.c:866
bool can_extras_coexist(const struct extra_type *pextra1, const struct extra_type *pextra2)
Definition extras.c:1017
int extra_count(void)
Definition extras.c:153
bool player_knows_extra_exist(const struct player *pplayer, const struct extra_type *pextra, const struct tile *ptile)
Definition extras.c:1167
const char * extra_name_translation(const struct extra_type *pextra)
Definition extras.c:194
#define extra_type_iterate(_p)
Definition extras.h:315
#define extra_type_iterate_end
Definition extras.h:321
#define is_extra_caused_by(e, c)
Definition extras.h:203
#define extra_base_get(_e_)
Definition extras.h:190
#define extra_road_get(_e_)
Definition extras.h:191
#define extra_type_by_cause_iterate_end
Definition extras.h:339
#define extra_type_by_cause_iterate(_cause, _extra)
Definition extras.h:333
@ HB_DISABLED
Definition fc_types.h:999
#define MAX_EXTRA_TYPES
Definition fc_types.h:50
@ BORDERS_DISABLED
Definition fc_types.h:745
@ BORDERS_SEE_INSIDE
Definition fc_types.h:747
@ BORDERS_EXPAND
Definition fc_types.h:748
#define IDENTITY_NUMBER_ZERO
Definition fc_types.h:92
#define _(String)
Definition fcintl.h:67
const struct ft_color ftc_server
const char * unit_link(const struct unit *punit)
const char * unit_tile_link(const struct unit *punit)
struct civ_game game
Definition game.c:61
struct world wld
Definition game.c:62
struct unit * game_unit_by_number(int id)
Definition game.c:115
struct city * game_city_by_number(int id)
Definition game.c:106
struct city * owner
Definition citydlg.c:226
static GtkWidget * source
Definition gotodlg.c:58
#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 log_debug(message,...)
Definition log.h:116
#define log_error(message,...)
Definition log.h:104
int map_num_tiles(void)
Definition map.c:1152
struct tile * rand_map_pos(const struct civ_map *nmap)
Definition map.c:1228
int map_vector_to_sq_distance(int dx, int dy)
Definition map.c:659
bool terrain_surroundings_allow_change(const struct civ_map *nmap, const struct tile *ptile, const struct terrain *pterrain)
Definition map.c:787
void map_distance_vector(int *dx, int *dy, const struct tile *tile0, const struct tile *tile1)
Definition map.c:1213
#define adjc_iterate_end
Definition map.h:430
#define circle_dxyr_iterate(nmap, center_tile, sq_radius, _tile, dx, dy, dr)
Definition map.h:406
#define cardinal_adjc_iterate_end
Definition map.h:456
#define adjc_iterate(nmap, center_tile, itr_tile)
Definition map.h:425
#define circle_dxyr_iterate_end
Definition map.h:417
#define cardinal_adjc_iterate(nmap, center_tile, itr_tile)
Definition map.h:452
#define circle_iterate(nmap, center_tile, sq_radius, tile_itr)
Definition map.h:398
#define whole_map_iterate(_map, _tile)
Definition map.h:573
#define MAP_TILE_OWNER_NULL
Definition map.h:630
#define whole_map_iterate_end
Definition map.h:582
#define circle_iterate_end
Definition map.h:401
void assign_continent_numbers(void)
struct terrain * most_shallow_ocean(bool frozen)
void player_map_init(struct player *pplayer)
Definition maphand.c:1226
static void terrain_change_bounce_single_unit(struct unit *punit, struct tile *from)
Definition maphand.c:1836
void update_player_tile_last_seen(struct player *pplayer, struct tile *ptile)
Definition maphand.c:1472
static void shared_vision_change_seen(struct player *pplayer, struct tile *ptile, const v_radius_t change, bool can_reveal_tiles)
Definition maphand.c:672
void vision_clear_sight(struct vision *vision)
Definition maphand.c:2489
void map_claim_base(struct tile *ptile, struct extra_type *pextra, struct player *powner, struct player *ploser)
Definition maphand.c:2356
void map_set_border_vision(struct player *pplayer, const bool is_enabled)
Definition maphand.c:745
void map_claim_ownership(struct tile *ptile, struct player *powner, struct tile *psource, bool claim_bases)
Definition maphand.c:2171
static int player_tile_own_seen(const struct player_tile *plrtile, enum vision_layer vlayer)
Definition maphand.c:1141
bool map_is_known(const struct tile *ptile, const struct player *pplayer)
Definition maphand.c:899
static bool map_is_also_seen(const struct tile *ptile, const struct player *pplayer, enum vision_layer vlayer)
Definition maphand.c:914
void send_map_info(struct conn_list *dest)
Definition maphand.c:653
static bool really_give_tile_info_from_player_to_player(struct player *pfrom, struct player *pdest, struct tile *ptile)
Definition maphand.c:1490
static bool is_tile_claimable(struct tile *ptile, struct tile *source, struct player *pplayer)
Definition maphand.c:2088
bool send_tile_suppression(bool now)
Definition maphand.c:473
void destroy_extra(struct tile *ptile, struct extra_type *pextra)
Definition maphand.c:2577
static void check_units_single_tile(struct tile *ptile)
Definition maphand.c:1892
static void really_give_map_from_player_to_player(struct player *pfrom, struct player *pdest)
Definition maphand.c:1563
void disable_fog_of_war(void)
Definition maphand.c:1794
bool really_gives_vision(struct player *me, struct player *them)
Definition maphand.c:343
static bool unit_is_on_layer(const struct unit *punit, enum vision_layer vlayer)
Definition maphand.c:644
void map_know_and_see_all(struct player *pplayer)
Definition maphand.c:1201
static void map_change_own_seen(struct player *pplayer, struct tile *ptile, const v_radius_t change)
Definition maphand.c:1150
void show_map_to_all(void)
Definition maphand.c:1215
void send_tile_info(struct conn_list *dest, struct tile *ptile, bool send_unknown)
Definition maphand.c:489
bool update_player_tile_knowledge(struct player *pplayer, struct tile *ptile)
Definition maphand.c:1403
static int map_get_seen(const struct player *pplayer, const struct tile *ptile, enum vision_layer vlayer)
Definition maphand.c:939
static void ocean_to_land_fix_rivers(struct tile *ptile)
Definition maphand.c:1810
void give_map_from_player_to_player(struct player *pfrom, struct player *pdest)
Definition maphand.c:382
void send_all_known_tiles(struct conn_list *dest)
Definition maphand.c:442
void bounce_units_on_terrain_change(struct tile *ptile)
Definition maphand.c:1926
void give_seamap_from_player_to_player(struct player *pfrom, struct player *pdest)
Definition maphand.c:398
void remove_shared_vision(struct player *pfrom, struct player *pto)
Definition maphand.c:1698
bool need_to_reassign_continents(const struct terrain *oldter, const struct terrain *newter)
Definition maphand.c:1944
struct vision_site * map_get_player_city(const struct tile *ptile, const struct player *pplayer)
Definition maphand.c:1372
static bool is_terrain_ecologically_wet(struct tile *ptile)
Definition maphand.c:94
void tile_claim_bases(struct tile *ptile, struct player *powner)
Definition maphand.c:2184
void disable_fog_of_war_player(struct player *pplayer)
Definition maphand.c:1778
void climate_change(bool warming, int effect)
Definition maphand.c:131
void enable_fog_of_war(void)
Definition maphand.c:1768
static bool send_tile_suppressed
Definition maphand.c:63
static void create_vision_dependencies(void)
Definition maphand.c:1603
void upgrade_all_city_extras(struct player *pplayer, bool discovery)
Definition maphand.c:274
void create_extra(struct tile *ptile, struct extra_type *pextra, struct player *pplayer)
Definition maphand.c:2512
void map_update_border(struct tile *ptile, struct player *owner, int old_radius_sq, int new_radius_sq)
Definition maphand.c:2218
void map_set_known(struct tile *ptile, struct player *pplayer)
Definition maphand.c:1183
void map_show_all(struct player *pplayer)
Definition maphand.c:884
static void map_unit_homecity_enqueue(struct tile *ptile)
Definition maphand.c:2110
static void map_change_seen(struct player *pplayer, struct tile *ptile, const v_radius_t change, bool can_reveal_tiles)
Definition maphand.c:952
void map_show_tile(struct player *src_player, struct tile *ptile)
Definition maphand.c:773
void give_citymap_from_player_to_player(struct city *pcity, struct player *pfrom, struct player *pdest)
Definition maphand.c:416
void nuclear_winter(int effect)
Definition maphand.c:117
void tile_change_side_effects(struct tile *ptile, bool refresh_city)
Definition maphand.c:2680
static void player_tile_init(struct tile *ptile, struct player *pplayer)
Definition maphand.c:1333
void terrain_changed(struct tile *ptile)
Definition maphand.c:1963
void player_map_free(struct player *pplayer)
Definition maphand.c:1242
static void unbuffer_shared_vision(struct player *pplayer)
Definition maphand.c:366
static void map_claim_border_ownership(struct tile *ptile, struct player *powner, struct tile *psource)
Definition maphand.c:2126
bool map_is_known_and_seen(const struct tile *ptile, const struct player *pplayer, enum vision_layer vlayer)
Definition maphand.c:925
void change_playertile_site(struct player_tile *ptile, struct vision_site *new_site)
Definition maphand.c:1164
void map_calculate_borders(void)
Definition maphand.c:2329
void fix_tile_on_terrain_change(struct tile *ptile, struct terrain *oldter, bool extend_rivers)
Definition maphand.c:1982
void enable_fog_of_war_player(struct player *pplayer)
Definition maphand.c:1752
void map_show_circle(struct player *pplayer, struct tile *ptile, int radius_sq)
Definition maphand.c:869
void map_vision_update(struct player *pplayer, struct tile *ptile, const v_radius_t old_radius_sq, const v_radius_t new_radius_sq, bool can_reveal_tiles)
Definition maphand.c:690
void map_claim_border(struct tile *ptile, struct player *owner, int radius_sq)
Definition maphand.c:2250
void update_tile_knowledge(struct tile *ptile)
Definition maphand.c:1444
void remove_player_from_maps(struct player *pplayer)
Definition maphand.c:1263
void give_shared_vision(struct player *pfrom, struct player *pto)
Definition maphand.c:1637
void check_terrain_change(struct tile *ptile, struct terrain *oldter)
Definition maphand.c:2002
bool give_distorted_map(struct player *pfrom, struct player *pto, int prob, bool reveal_cities)
Definition maphand.c:2652
void map_hide_tile(struct player *src_player, struct tile *ptile)
Definition maphand.c:825
static void buffer_shared_vision(struct player *pplayer)
Definition maphand.c:351
static bool give_tile_info_from_player_to_player(struct player *pfrom, struct player *pdest, struct tile *ptile)
Definition maphand.c:1583
void global_warming(int effect)
Definition maphand.c:104
bool upgrade_city_extras(struct city *pcity, struct extra_type **gained)
Definition maphand.c:239
void map_clear_border(struct tile *ptile)
Definition maphand.c:2201
void map_clear_known(struct tile *ptile, struct player *pplayer)
Definition maphand.c:1191
static void player_tile_free(struct tile *ptile, struct player *pplayer)
Definition maphand.c:1358
struct player_tile * map_get_player_tile(const struct tile *ptile, const struct player *pplayer)
Definition maphand.c:1387
void vision_change_sight(struct vision *vision, const v_radius_t radius_sq)
Definition maphand.c:2477
#define map_get_player_site(_ptile_, _pplayer_)
Definition maphand.h:93
#define map_get_playermap_site(_plrtile_)
Definition maphand.h:92
#define fc_realloc(ptr, sz)
Definition mem.h:36
#define fc_malloc(sz)
Definition mem.h:34
bool can_unit_exist_at_tile(const struct civ_map *nmap, const struct unit *punit, const struct tile *ptile)
Definition movement.c:318
const char * nation_rule_name(const struct nation_type *pnation)
Definition nation.c:138
struct nation_type * nation_of_unit(const struct unit *punit)
Definition nation.c:463
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 dlsend_packet_edit_fogofwar_state(struct conn_list *dest, bool enabled)
void lsend_packet_map_info(struct conn_list *dest, const struct packet_map_info *packet)
int send_packet_tile_info(struct connection *pc, const struct packet_tile_info *packet)
int player_slot_count(void)
Definition player.c:418
int player_number(const struct player *pplayer)
Definition player.c:837
const char * player_name(const struct player *pplayer)
Definition player.c:895
bool can_player_see_unit(const struct player *pplayer, const struct unit *punit)
Definition player.c:1104
int player_index(const struct player *pplayer)
Definition player.c:829
bool pplayers_allied(const struct player *pplayer, const struct player *pplayer2)
Definition player.c:1409
bool gives_shared_vision(const struct player *me, const struct player *them)
Definition player.c:1489
#define players_iterate_end
Definition player.h:542
#define players_iterate(_pplayer)
Definition player.h:537
void send_player_info_c(struct player *src, struct conn_list *dest)
Definition plrhand.c:1148
#define phase_players_iterate(pplayer)
Definition plrhand.h:113
#define phase_players_iterate_end
Definition plrhand.h:118
#define fc_rand(_size)
Definition rand.h:56
bool road_has_flag(const struct road_type *proad, enum road_flag_id flag)
Definition road.c:416
int count_river_near_tile(struct civ_map *nmap, const struct tile *ptile, const struct extra_type *priver)
Definition road.c:340
#define sanity_check_tile(x)
Definition sanitycheck.h:42
void flush_packets(void)
Definition sernet.c:376
#define DEFAULT_SPECIALIST
Definition specialist.h:43
enum server_states server_state(void)
Definition srv_main.c:338
Definition city.h:317
bool last_updated_year
Definition game.h:243
bool vision_reveal_tiles
Definition game.h:207
bool fogofwar_old
Definition game.h:241
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
bool foggedborders
Definition game.h:154
struct civ_game::@32::@36 server
struct tile * tiles
Definition map_types.h:95
int north_latitude
Definition map_types.h:80
int south_latitude
Definition map_types.h:81
bool altitude_info
Definition map_types.h:74
int topology_id
Definition map_types.h:72
int wrap_id
Definition map_types.h:73
unsigned char * vec
Definition bitvector.h:34
struct resource_type * resource
Definition extras.h:156
struct extra_type::@26 data
enum extra_unit_seen_type eus
Definition extras.h:128
struct base_type * base
Definition extras.h:154
enum borders_mode borders
enum happyborders_type happyborders
int border_city_permanent_radius_sq
Resource_type_id resource
enum known_type known
char label[MAX_LEN_MAP_LABEL]
Continent_id continent
Terrain_type_id terrain
char spec_sprite[MAX_LEN_NAME]
struct player * extras_owner
Definition maphand.h:35
v_radius_t seen_count
Definition maphand.h:43
struct vision_site * site
Definition maphand.h:31
struct terrain * terrain
Definition maphand.h:33
struct dbv extras
Definition maphand.h:36
short last_updated
Definition maphand.h:44
struct player * owner
Definition maphand.h:34
struct extra_type * resource
Definition maphand.h:32
struct city_list * cities
Definition player.h:281
struct dbv tile_known
Definition player.h:310
struct conn_list * connections
Definition player.h:298
struct player::@73::@75 server
struct player_tile * private_map
Definition player.h:324
bool border_vision
Definition player.h:327
struct terrain * cooler_wetter_result
Definition terrain.h:134
struct terrain * cooler_drier_result
Definition terrain.h:134
struct terrain * warmer_wetter_result
Definition terrain.h:133
struct terrain * warmer_drier_result
Definition terrain.h:133
Definition tile.h:50
char * spec_sprite
Definition tile.h:67
char * label
Definition tile.h:66
int altitude
Definition tile.h:65
bv_extras extras
Definition tile.h:55
struct extra_type * resource
Definition tile.h:56
struct unit_list * units
Definition tile.h:58
struct player * extras_owner
Definition tile.h:63
struct terrain * terrain
Definition tile.h:57
int infra_turns
Definition tile.h:62
struct extra_type * placing
Definition tile.h:61
struct city * worked
Definition tile.h:59
struct tile * claimer
Definition tile.h:64
enum vision_layer vlayer
Definition unittype.h:576
Definition unit.h:140
enum unit_activity activity
Definition unit.h:159
int id
Definition unit.h:147
struct unit::@84::@87 server
struct tile * tile
Definition unit.h:142
struct extra_type * activity_target
Definition unit.h:167
int homecity
Definition unit.h:148
bool dying
Definition unit.h:253
int identity
Definition vision.h:115
struct tile * tile
Definition vision.h:88
bool can_reveal_tiles
Definition vision.h:89
v_radius_t radius_sq
Definition vision.h:92
struct player * player
Definition vision.h:87
struct civ_map map
#define sz_strlcpy(dest, src)
Definition support.h:195
#define TRUE
Definition support.h:46
#define FALSE
Definition support.h:47
bool is_terrain_class_near_tile(const struct civ_map *nmap, const struct tile *ptile, enum terrain_class tclass)
Definition terrain.c:612
Terrain_type_id terrain_count(void)
Definition terrain.c:118
Terrain_type_id terrain_number(const struct terrain *pterrain)
Definition terrain.c:147
#define T_UNKNOWN
Definition terrain.h:62
#define is_ocean(pterrain)
Definition terrain.h:194
#define is_ocean_tile(ptile)
Definition terrain.h:196
#define T_NONE
Definition terrain.h:61
#define terrain_has_flag(terr, flag)
Definition terrain.h:176
void tile_add_extra(struct tile *ptile, const struct extra_type *pextra)
Definition tile.c:955
bool tile_has_river(const struct tile *ptile)
Definition tile.c:852
bool tile_map_check(struct civ_map *nmap, struct tile *vtile)
Definition tile.c:1067
void tile_remove_extra(struct tile *ptile, const struct extra_type *pextra)
Definition tile.c:965
void tile_change_terrain(struct tile *ptile, struct terrain *pterrain)
Definition tile.c:496
bool tile_has_conflicting_extra(const struct tile *ptile, const struct extra_type *pextra)
Definition tile.c:901
void tile_set_owner(struct tile *ptile, struct player *pplayer, struct tile *claimer)
Definition tile.c:69
struct city * tile_city(const struct tile *ptile)
Definition tile.c:83
#define tile_claimer(_tile)
Definition tile.h:101
#define tile_index(_pt_)
Definition tile.h:89
#define tile_worked(_tile)
Definition tile.h:115
#define tile_resource(_tile)
Definition tile.h:103
@ TILE_KNOWN_UNSEEN
Definition tile.h:37
@ TILE_UNKNOWN
Definition tile.h:36
@ TILE_KNOWN_SEEN
Definition tile.h:38
#define tile_terrain(_tile)
Definition tile.h:111
#define TILE_XY(ptile)
Definition tile.h:43
#define tile_continent(_tile)
Definition tile.h:93
#define tile_has_extra(ptile, pextra)
Definition tile.h:148
#define tile_owner(_tile)
Definition tile.h:97
int get_transporter_occupancy(const struct unit *ptrans)
Definition unit.c:1820
bool unit_is_alive(int id)
Definition unit.c:2290
bool unit_transported(const struct unit *pcargo)
Definition unit.c:2502
struct unit_list * unit_transport_cargo(const struct unit *ptrans)
Definition unit.c:2528
#define unit_tile(_pu)
Definition unit.h:404
#define unit_owner(_pu)
Definition unit.h:403
static bool is_non_allied_unit_tile(const struct tile *ptile, const struct player *pplayer, bool everyone_non_allied)
Definition unit.h:440
bool unit_activity_handling(struct unit *punit, enum unit_activity new_activity, enum gen_action trigger_action)
Definition unithand.c:6663
#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
void unit_goes_out_of_sight(struct player *pplayer, struct unit *punit)
Definition unittools.c:2864
void send_unit_info(struct conn_list *dest, struct unit *punit)
Definition unittools.c:2877
void unit_activities_cancel(struct unit *punit)
Definition unittools.c:800
void wipe_unit(struct unit *punit, enum unit_loss_reason reason, struct player *killer)
Definition unittools.c:2139
void unit_activities_cancel_all_illegal_area(const struct tile *ptile)
Definition unittools.c:845
bool unit_move(struct unit *punit, struct tile *pdesttile, int move_cost, struct unit *embark_to, bool find_embark_target, bool conquer_city_allowed, bool conquer_extras_allowed, bool enter_hut, bool frighten_hut)
Definition unittools.c:4078
void unit_list_refresh_vision(struct unit_list *punitlist)
Definition unittools.c:5021
const struct unit_type * unit_type_get(const struct unit *punit)
Definition unittype.c:123
const char * unit_rule_name(const struct unit *punit)
Definition unittype.c:1593
bool unit_has_type_flag(const struct unit *punit, enum unit_type_flag_id flag)
Definition unittype.c:196
struct vision_site * vision_site_copy(const struct vision_site *psite)
Definition vision.c:150
void vision_site_destroy(struct vision_site *psite)
Definition vision.c:74
#define V_RADIUS(main_sq, invis_sq, subs_sq)
Definition vision.h:96
#define vision_layer_iterate(v)
Definition vision.h:77
#define vision_site_owner(v)
Definition vision.h:129
short int v_radius_t[V_COUNT]
Definition vision.h:83
#define vision_layer_iterate_end
Definition vision.h:80
#define MAP_NATIVE_WIDTH
#define MAP_INDEX_SIZE
#define MAP_NATIVE_HEIGHT