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 log_debug("Showing %i,%i to %s", TILE_XY(ptile), player_name(src_player));
776
777#ifndef FREECIV_NDEBUG
778 static int recurse = 0;
779
780 fc_assert(recurse == 0);
781
782 recurse++;
783#endif /* !FREECIV_NDEBUG */
784
785 players_iterate(pplayer) {
786 if (pplayer == src_player || really_gives_vision(src_player, pplayer)) {
787 struct city *pcity;
788
789 if (!map_is_known_and_seen(ptile, pplayer, V_MAIN)) {
790 map_set_known(ptile, pplayer);
791
792 /* As the tile may be fogged send_tile_info won't always do this for us */
793 update_player_tile_knowledge(pplayer, ptile);
794 update_player_tile_last_seen(pplayer, ptile);
795
796 send_tile_info(pplayer->connections, ptile, FALSE);
797
798 /* Remove old cities that exist no more */
799 reality_check_city(pplayer, ptile);
800
801 if ((pcity = tile_city(ptile))) {
802 /* As the tile may be fogged send_city_info won't do this for us */
803 update_dumb_city(pplayer, pcity);
804 send_city_info(pplayer, pcity);
805 }
806
808 if (0 < map_get_seen(pplayer, ptile, v)) {
809 unit_list_iterate(ptile->units, punit) {
810 if (unit_is_on_layer(punit, v)) {
811 send_unit_info(pplayer->connections, punit);
812 }
814 }
816 }
817 }
819
820#ifndef FREECIV_NDEBUG
821 recurse--;
822#endif
823}
824
825/**********************************************************************/
830void map_hide_tile(struct player *src_player, struct tile *ptile)
831{
832 log_debug("Hiding %d,%d to %s", TILE_XY(ptile), player_name(src_player));
833
834#ifndef FREECIV_NDEBUG
835 static int recurse = 0;
836
837 fc_assert(recurse == 0);
838
839 recurse++;
840#endif /* !FREECIV_NDEBUG */
841
842 players_iterate(pplayer) {
843 if (pplayer == src_player || really_gives_vision(src_player, pplayer)) {
844 if (map_is_known(ptile, pplayer)) {
845 if (0 < map_get_seen(pplayer, ptile, V_MAIN)) {
846 update_player_tile_last_seen(pplayer, ptile);
847 }
848
849 /* Remove city. */
850 remove_dumb_city(pplayer, ptile);
851
852 /* Remove units. */
854 if (0 < map_get_seen(pplayer, ptile, v)) {
855 unit_list_iterate(ptile->units, punit) {
856 if (unit_is_on_layer(punit, v)) {
858 }
860 }
862 }
863
864 map_clear_known(ptile, pplayer);
865
866 send_tile_info(pplayer->connections, ptile, TRUE);
867 }
869
870#ifndef FREECIV_NDEBUG
871 recurse--;
872#endif
873}
874
875/**********************************************************************/
879void map_show_circle(struct player *pplayer, struct tile *ptile, int radius_sq)
880{
881 buffer_shared_vision(pplayer);
882
883 circle_iterate(&(wld.map), ptile, radius_sq, tile1) {
884 map_show_tile(pplayer, tile1);
886
887 unbuffer_shared_vision(pplayer);
888}
889
890/**********************************************************************/
894void map_show_all(struct player *pplayer)
895{
896 buffer_shared_vision(pplayer);
897
898 whole_map_iterate(&(wld.map), ptile) {
899 map_show_tile(pplayer, ptile);
901
902 unbuffer_shared_vision(pplayer);
903}
904
905/**********************************************************************/
909bool map_is_known(const struct tile *ptile, const struct player *pplayer)
910{
911 if (pplayer->tile_known.vec == NULL) {
912 /* Player map not initialized yet */
913 return FALSE;
914 }
915
916 return dbv_isset(&pplayer->tile_known, tile_index(ptile));
917}
918
919/**********************************************************************/
924static inline bool map_is_also_seen(const struct tile *ptile,
925 const struct player *pplayer,
926 enum vision_layer vlayer)
927{
928 return map_get_seen(pplayer, ptile, vlayer) > 0;
929}
930
931/**********************************************************************/
935bool map_is_known_and_seen(const struct tile *ptile,
936 const struct player *pplayer,
937 enum vision_layer vlayer)
938{
939 return map_is_known(ptile, pplayer) && map_is_also_seen(ptile, pplayer, vlayer);
940}
941
942/**********************************************************************/
949static inline int map_get_seen(const struct player *pplayer,
950 const struct tile *ptile,
951 enum vision_layer vlayer)
952{
953 return map_get_player_tile(ptile, pplayer)->seen_count[vlayer];
954}
955
956/**********************************************************************/
962void map_change_seen(struct player *pplayer,
963 struct tile *ptile,
964 const v_radius_t change,
965 bool can_reveal_tiles)
966{
967 struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
968 bool revealing_tile = FALSE;
969
970#ifdef FREECIV_DEBUG
971 log_debug("%s() for player %s (nb %d) at (%d, %d).",
972 __FUNCTION__, player_name(pplayer), player_number(pplayer),
973 TILE_XY(ptile));
975 log_debug(" vision layer %d is changing from %d to %d.",
976 v, plrtile->seen_count[v], plrtile->seen_count[v] + change[v]);
978#endif /* FREECIV_DEBUG */
979
980 /* Removes units out of vision. First, check invisible layers because
981 * we must remove all units before fog of war because clients expect
982 * the tile is empty when it is fogged. */
983 if (0 > change[V_INVIS]
984 && plrtile->seen_count[V_INVIS] == -change[V_INVIS]) {
985 log_debug("(%d, %d): hiding invisible units to player %s (nb %d).",
986 TILE_XY(ptile), player_name(pplayer), player_number(pplayer));
987
988 unit_list_iterate(ptile->units, punit) {
990 && can_player_see_unit(pplayer, punit)
991 && (plrtile->seen_count[V_MAIN] + change[V_MAIN] <= 0
992 || !pplayers_allied(pplayer, unit_owner(punit)))) {
993 /* Allied units on seen tiles (V_MAIN) are always seen.
994 * That's how can_player_see_unit_at() works. */
996 }
998 }
999 if (0 > change[V_SUBSURFACE]
1000 && plrtile->seen_count[V_SUBSURFACE] == -change[V_SUBSURFACE]) {
1001 log_debug("(%d, %d): hiding subsurface units to player %s (nb %d).",
1002 TILE_XY(ptile), player_name(pplayer), player_number(pplayer));
1003
1004 unit_list_iterate(ptile->units, punit) {
1006 && can_player_see_unit(pplayer, punit)) {
1007 unit_goes_out_of_sight(pplayer, punit);
1008 }
1010 }
1011
1012 if (0 > change[V_MAIN]
1013 && plrtile->seen_count[V_MAIN] == -change[V_MAIN]) {
1014 log_debug("(%d, %d): hiding visible units to player %s (nb %d).",
1015 TILE_XY(ptile), player_name(pplayer), player_number(pplayer));
1016
1017 unit_list_iterate(ptile->units, punit) {
1019 && can_player_see_unit(pplayer, punit)) {
1020 unit_goes_out_of_sight(pplayer, punit);
1021 }
1023 }
1024
1026 /* Avoid underflow. */
1027 fc_assert(0 <= change[v] || -change[v] <= plrtile->seen_count[v]);
1028 plrtile->seen_count[v] += change[v];
1030
1031 /* V_MAIN vision ranges must always be more than invisible ranges
1032 * (see comment in common/vision.h), so we assume that the V_MAIN
1033 * seen count cannot be inferior to V_INVIS or V_SUBSURFACE seen count.
1034 * Moreover, when the fog of war is disabled, V_MAIN has an extra
1035 * seen count point. */
1036 fc_assert(plrtile->seen_count[V_INVIS] + !game.info.fogofwar
1037 <= plrtile->seen_count[V_MAIN]);
1039 <= plrtile->seen_count[V_MAIN]);
1040
1041 if (!map_is_known(ptile, pplayer)) {
1042 if (0 < plrtile->seen_count[V_MAIN] && can_reveal_tiles) {
1043 log_debug("(%d, %d): revealing tile to player %s (nb %d).",
1044 TILE_XY(ptile), player_name(pplayer),
1045 player_number(pplayer));
1046
1047 map_set_known(ptile, pplayer);
1049 } else {
1050 return;
1051 }
1052 }
1053
1054 /* Fog the tile. */
1055 if (0 > change[V_MAIN] && 0 == plrtile->seen_count[V_MAIN]) {
1056 struct city *pcity;
1057
1058 log_debug("(%d, %d): fogging tile for player %s (nb %d).",
1059 TILE_XY(ptile), player_name(pplayer), player_number(pplayer));
1060
1061 pcity = ptile->worked;
1062
1063 if (pcity != NULL && city_owner(pcity) == pplayer) {
1065 pcity->specialists[DEFAULT_SPECIALIST]++;
1066 if (pcity->server.needs_arrange == CNA_NOT) {
1067 pcity->server.needs_arrange = CNA_NORMAL;
1068 }
1069 }
1070
1071 update_player_tile_last_seen(pplayer, ptile);
1073 plrtile->owner = tile_owner(ptile);
1074 }
1075 plrtile->extras_owner = extra_owner(ptile);
1076 send_tile_info(pplayer->connections, ptile, FALSE);
1077 }
1078
1079 if ((revealing_tile && 0 < plrtile->seen_count[V_MAIN])
1080 || (0 < change[V_MAIN]
1081 /* plrtile->seen_count[V_MAIN] Always set to 1
1082 * when the fog of war is disabled. */
1083 && (change[V_MAIN] + !game.info.fogofwar
1084 == (plrtile->seen_count[V_MAIN])))) {
1085 struct city *pcity;
1086
1087 log_debug("(%d, %d): unfogging tile for player %s (nb %d).",
1088 TILE_XY(ptile), player_name(pplayer), player_number(pplayer));
1089
1090 /* Send info about the tile itself.
1091 * It has to be sent first because the client needs correct
1092 * continent number before it can handle following packets
1093 */
1094 update_player_tile_knowledge(pplayer, ptile);
1095 send_tile_info(pplayer->connections, ptile, FALSE);
1096
1097 /* Discover units. */
1098 unit_list_iterate(ptile->units, punit) {
1099 /* Be sure not to revive dead unit on client when it's not yet
1100 * removed from the tile. This could happen when "unit_lost" lua script
1101 * somehow causes tile of the dead unit to unfog again. */
1103 && !punit->server.dying) {
1104 send_unit_info(pplayer->connections, punit);
1105 }
1107
1108 /* Discover cities. */
1109 reality_check_city(pplayer, ptile);
1110
1111 if (NULL != (pcity = tile_city(ptile))) {
1112 send_city_info(pplayer, pcity);
1113 }
1114 }
1115
1116 if ((revealing_tile && 0 < plrtile->seen_count[V_INVIS])
1117 || (0 < change[V_INVIS]
1118 && change[V_INVIS] == plrtile->seen_count[V_INVIS])) {
1119 log_debug("(%d, %d): revealing invisible units to player %s (nb %d).",
1120 TILE_XY(ptile), player_name(pplayer),
1121 player_number(pplayer));
1122 /* Discover units. */
1123 unit_list_iterate(ptile->units, punit) {
1125 send_unit_info(pplayer->connections, punit);
1126 }
1128 }
1129 if ((revealing_tile && 0 < plrtile->seen_count[V_SUBSURFACE])
1130 || (0 < change[V_SUBSURFACE]
1131 && change[V_SUBSURFACE] == plrtile->seen_count[V_SUBSURFACE])) {
1132 log_debug("(%d, %d): revealing subsurface units to player %s (nb %d).",
1133 TILE_XY(ptile), player_name(pplayer),
1134 player_number(pplayer));
1135 /* Discover units. */
1136 unit_list_iterate(ptile->units, punit) {
1138 send_unit_info(pplayer->connections, punit);
1139 }
1141 }
1142}
1143
1144/**********************************************************************/
1151static inline int player_tile_own_seen(const struct player_tile *plrtile,
1152 enum vision_layer vlayer)
1153{
1154 return plrtile->own_seen[vlayer];
1155}
1156
1157/**********************************************************************/
1160static void map_change_own_seen(struct player *pplayer,
1161 struct tile *ptile,
1162 const v_radius_t change)
1163{
1164 struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
1165
1167 plrtile->own_seen[v] += change[v];
1169}
1170
1171/**********************************************************************/
1175 struct vision_site *new_site)
1176{
1177 if (ptile->site == new_site) {
1178 /* Do nothing. */
1179 return;
1180 }
1181
1182 if (ptile->site != NULL) {
1183 /* Releasing old site from tile */
1184 vision_site_destroy(ptile->site);
1185 }
1186
1187 ptile->site = new_site;
1188}
1189
1190/**********************************************************************/
1193void map_set_known(struct tile *ptile, struct player *pplayer)
1194{
1195 dbv_set(&pplayer->tile_known, tile_index(ptile));
1196}
1197
1198/**********************************************************************/
1201void map_clear_known(struct tile *ptile, struct player *pplayer)
1202{
1203 dbv_clr(&pplayer->tile_known, tile_index(ptile));
1204}
1205
1206/**********************************************************************/
1211void map_know_and_see_all(struct player *pplayer)
1212{
1213 const v_radius_t radius_sq = V_RADIUS(1, 1, 1);
1214
1215 buffer_shared_vision(pplayer);
1216 whole_map_iterate(&(wld.map), ptile) {
1217 map_change_seen(pplayer, ptile, radius_sq, TRUE);
1219 unbuffer_shared_vision(pplayer);
1220}
1221
1222/**********************************************************************/
1226{
1227 players_iterate(pplayer) {
1228 map_know_and_see_all(pplayer);
1230}
1231
1232/**********************************************************************/
1236void player_map_init(struct player *pplayer)
1237{
1238 pplayer->server.private_map
1239 = fc_realloc(pplayer->server.private_map,
1240 MAP_INDEX_SIZE * sizeof(*pplayer->server.private_map));
1241
1242 whole_map_iterate(&(wld.map), ptile) {
1243 player_tile_init(ptile, pplayer);
1245
1247}
1248
1249/**********************************************************************/
1252void player_map_free(struct player *pplayer)
1253{
1254 if (!pplayer->server.private_map) {
1255 return;
1256 }
1257
1258 whole_map_iterate(&(wld.map), ptile) {
1259 player_tile_free(ptile, pplayer);
1261
1262 free(pplayer->server.private_map);
1263 pplayer->server.private_map = NULL;
1264
1265 dbv_free(&pplayer->tile_known);
1266}
1267
1268/**********************************************************************/
1273void remove_player_from_maps(struct player *pplayer)
1274{
1275 /* only after removing borders! */
1277 whole_map_iterate(&(wld.map), ptile) {
1278 /* Clear all players' knowledge about the removed player, and free
1279 * data structures (including those in removed player's player map). */
1280 bool reality_changed = FALSE;
1281
1283 struct player_tile *aplrtile;
1284 bool changed = FALSE;
1285
1286 if (!aplayer->server.private_map) {
1287 continue;
1288 }
1290
1291 /* Free vision sites (cities) for removed and other players */
1292 if (aplrtile && aplrtile->site
1293 && vision_site_owner(aplrtile->site) == pplayer) {
1295 changed = TRUE;
1296 }
1297
1298 /* Remove references to player from others' maps */
1299 if (aplrtile->owner == pplayer) {
1300 aplrtile->owner = NULL;
1301 changed = TRUE;
1302 }
1303 if (aplrtile->extras_owner == pplayer) {
1304 aplrtile->extras_owner = NULL;
1305 changed = TRUE;
1306 }
1307
1308 /* Must ensure references to dying player are gone from clients
1309 * before player is destroyed */
1310 if (changed) {
1311 /* This will use player tile if fogged */
1312 send_tile_info(pplayer->connections, ptile, FALSE);
1313 }
1315
1316 /* Clear removed player's knowledge */
1317 if (pplayer->tile_known.vec) {
1318 map_clear_known(ptile, pplayer);
1319 }
1320
1321 /* Free all claimed tiles. */
1322 if (tile_owner(ptile) == pplayer) {
1323 tile_set_owner(ptile, NULL, NULL);
1325 }
1326 if (extra_owner(ptile) == pplayer) {
1327 ptile->extras_owner = NULL;
1329 }
1330
1331 if (reality_changed) {
1332 /* Update anyone who can see the tile (e.g. global observers) */
1333 send_tile_info(NULL, ptile, FALSE);
1334 }
1337}
1338
1339/**********************************************************************/
1343static void player_tile_init(struct tile *ptile, struct player *pplayer)
1344{
1345 struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
1346
1347 plrtile->terrain = T_UNKNOWN;
1348 plrtile->resource = NULL;
1349 plrtile->owner = NULL;
1350 plrtile->extras_owner = NULL;
1351 plrtile->site = NULL;
1352 dbv_init(&(plrtile->extras), extra_count());
1354 plrtile->last_updated = game.info.turn;
1355 } else {
1356 plrtile->last_updated = game.info.year;
1357 }
1358
1359 plrtile->seen_count[V_MAIN] = !game.server.fogofwar_old;
1360 plrtile->seen_count[V_INVIS] = 0;
1361 plrtile->seen_count[V_SUBSURFACE] = 0;
1362 memcpy(plrtile->own_seen, plrtile->seen_count, sizeof(v_radius_t));
1363}
1364
1365/**********************************************************************/
1368static void player_tile_free(struct tile *ptile, struct player *pplayer)
1369{
1370 struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
1371
1372 if (plrtile->site != NULL) {
1374 }
1375
1376 dbv_free(&(plrtile->extras));
1377}
1378
1379/**********************************************************************/
1382struct vision_site *map_get_player_city(const struct tile *ptile,
1383 const struct player *pplayer)
1384{
1385 struct vision_site *psite = map_get_player_site(ptile, pplayer);
1386
1387 fc_assert_ret_val(psite == NULL || psite->location == ptile, NULL);
1388
1389 return psite;
1390}
1391
1392/**********************************************************************/
1397struct player_tile *map_get_player_tile(const struct tile *ptile,
1398 const struct player *pplayer)
1399{
1401
1402 return pplayer->server.private_map + tile_index(ptile);
1403}
1404
1405/**********************************************************************/
1413bool update_player_tile_knowledge(struct player *pplayer, struct tile *ptile)
1414{
1415 struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
1416
1417 if (plrtile->terrain != ptile->terrain
1418 || !bv_match_dbv(&(plrtile->extras), ptile->extras.vec)
1419 || plrtile->resource != ptile->resource
1420 || plrtile->owner != tile_owner(ptile)
1421 || plrtile->extras_owner != extra_owner(ptile)) {
1422 plrtile->terrain = ptile->terrain;
1423 extra_type_iterate(pextra) {
1424 if (player_knows_extra_exist(pplayer, pextra, ptile)) {
1425 dbv_set(&(plrtile->extras), extra_number(pextra));
1426 } else {
1427 dbv_clr(&(plrtile->extras), extra_number(pextra));
1428 }
1430 if (ptile->resource != NULL
1431 && player_knows_extra_exist(pplayer, ptile->resource, ptile)) {
1432 plrtile->resource = ptile->resource;
1433 } else {
1435 }
1436 plrtile->owner = tile_owner(ptile);
1437 plrtile->extras_owner = extra_owner(ptile);
1438
1439 return TRUE;
1440 }
1441
1442 return FALSE;
1443}
1444
1445/**********************************************************************/
1454void update_tile_knowledge(struct tile *ptile)
1455{
1456 if (server_state() == S_S_INITIAL) {
1457 return;
1458 }
1459
1460 /* Players */
1461 players_iterate(pplayer) {
1462 if (map_is_known_and_seen(ptile, pplayer, V_MAIN)) {
1463 if (update_player_tile_knowledge(pplayer, ptile)) {
1464 send_tile_info(pplayer->connections, ptile, FALSE);
1465 }
1466 }
1468
1469 /* Global observers */
1471 struct player *pplayer = pconn->playing;
1472
1473 if (NULL == pplayer && pconn->observer) {
1474 send_tile_info(pconn->self, ptile, FALSE);
1475 }
1477}
1478
1479/**********************************************************************/
1483 struct tile *ptile)
1484{
1486 map_get_player_tile(ptile, pplayer)->last_updated = game.info.turn;
1487 } else {
1488 map_get_player_tile(ptile, pplayer)->last_updated = game.info.year;
1489 }
1490}
1491
1492/**********************************************************************/
1501 struct player *pdest,
1502 struct tile *ptile)
1503{
1504 if (!map_is_known_and_seen(ptile, pdest, V_MAIN)) {
1505 /* I can just hear people scream as they try to comprehend this if :).
1506 * Let me try in words:
1507 * 1) if the tile is seen by pfrom the info is sent to pdest
1508 * OR
1509 * 2) if the tile is known by pfrom AND (they have more recent info
1510 * OR it is not known by pdest)
1511 */
1513 || (map_is_known(ptile, pfrom)
1514 && (((map_get_player_tile(ptile, pfrom)->last_updated
1515 > map_get_player_tile(ptile, pdest)->last_updated))
1516 || !map_is_known(ptile, pdest)))) {
1517 struct player_tile *from_tile, *dest_tile;
1518
1520 dest_tile = map_get_player_tile(ptile, pdest);
1521 /* Update and send tile knowledge */
1522 map_set_known(ptile, pdest);
1523 dest_tile->terrain = from_tile->terrain;
1524 dbv_copy(&(dest_tile->extras), &(from_tile->extras));
1525 dest_tile->resource = from_tile->resource;
1526 dest_tile->owner = from_tile->owner;
1527 dest_tile->extras_owner = from_tile->extras_owner;
1528 dest_tile->last_updated = from_tile->last_updated;
1529 send_tile_info(pdest->connections, ptile, FALSE);
1530
1531 /* Update and send city knowledge */
1532 /* Remove outdated cities */
1533 if (dest_tile->site) {
1534 if (!from_tile->site) {
1535 /* As the city was gone on the newer from_tile
1536 it will be removed by this function */
1537 reality_check_city(pdest, ptile);
1538 } else { /* We have a dest_city. update */
1539 if (from_tile->site->identity
1540 != dest_tile->site->identity) {
1541 /* As the city was gone on the newer from_tile
1542 it will be removed by this function */
1543 reality_check_city(pdest, ptile);
1544 }
1545 }
1546 }
1547
1548 /* Set and send new city info */
1549 if (from_tile->site) {
1550 if (!dest_tile->site) {
1551 /* We cannot assign new vision site with change_playertile_site(),
1552 * since location is not yet set up for new site */
1553 dest_tile->site = vision_site_copy(from_tile->site);
1554 }
1555 /* Note that we don't care if receiver knows vision source city
1556 * or not. */
1557 send_city_info_at_tile(pdest, pdest->connections, NULL, ptile);
1558 }
1559
1561
1562 return TRUE;
1563 }
1564 }
1565
1566 return FALSE;
1567}
1568
1569/**********************************************************************/
1583
1584/**********************************************************************/
1594 struct player *pdest,
1595 struct tile *ptile)
1596{
1598
1602 }
1604
1605 return updt;
1606}
1607
1608/**********************************************************************/
1614{
1615 int added;
1616
1617 players_iterate(pplayer) {
1618 pplayer->server.really_gives_vision = pplayer->gives_shared_vision;
1620
1621 /* In words: This terminates when it has run a round without adding
1622 a dependency. One loop only propagates dependencies one level deep,
1623 which is why we keep doing it as long as changes occur. */
1624 do {
1625 added = 0;
1626 players_iterate(pplayer) {
1628 if (really_gives_vision(pplayer, pplayer2)
1629 && pplayer != pplayer2) {
1632 && !really_gives_vision(pplayer, pplayer3)
1633 && pplayer != pplayer3) {
1634 BV_SET(pplayer->server.really_gives_vision, player_index(pplayer3));
1635 added++;
1636 }
1638 }
1641 } while (added > 0);
1642}
1643
1644/**********************************************************************/
1648{
1650
1651 if (pfrom == pto) {
1652 return;
1653 }
1654
1656 log_error("Trying to give shared vision from %s to %s, "
1657 "but that vision is already given!",
1659 return;
1660 }
1661
1662 players_iterate(pplayer) {
1663 save_vision[player_index(pplayer)] = pplayer->server.really_gives_vision;
1665
1666 BV_SET(pfrom->gives_shared_vision, player_index(pto));
1668 log_debug("giving shared vision from %s to %s",
1670
1671 players_iterate(pplayer) {
1672 buffer_shared_vision(pplayer);
1674 if (really_gives_vision(pplayer, pplayer2)
1675 && !BV_ISSET(save_vision[player_index(pplayer)],
1677 log_debug("really giving shared vision from %s to %s",
1678 player_name(pplayer), player_name(pplayer2));
1679 whole_map_iterate(&(wld.map), ptile) {
1680 const struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
1681 const v_radius_t change =
1685
1686 if (0 < change[V_MAIN] || 0 < change[V_INVIS]) {
1687 map_change_seen(pplayer2, ptile, change,
1688 map_is_known(ptile, pplayer));
1689 }
1691
1692 /* Squares that are not seen, but which pfrom may have more recent
1693 knowledge of */
1695 }
1697 unbuffer_shared_vision(pplayer);
1699
1700 if (S_S_RUNNING == server_state()) {
1702 }
1703}
1704
1705/**********************************************************************/
1709{
1711
1713 if (!gives_shared_vision(pfrom, pto)) {
1714 log_error("Tried removing the shared vision from %s to %s, "
1715 "but it did not exist in the first place!",
1717 return;
1718 }
1719
1720 players_iterate(pplayer) {
1721 save_vision[player_index(pplayer)] = pplayer->server.really_gives_vision;
1723
1724 log_debug("removing shared vision from %s to %s",
1726
1727 BV_CLR(pfrom->gives_shared_vision, player_index(pto));
1729
1730 players_iterate(pplayer) {
1731 buffer_shared_vision(pplayer);
1733 if (!really_gives_vision(pplayer, pplayer2)
1734 && BV_ISSET(save_vision[player_index(pplayer)],
1736 log_debug("really removing shared vision from %s to %s",
1737 player_name(pplayer), player_name(pplayer2));
1738 whole_map_iterate(&(wld.map), ptile) {
1739 const struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
1740 const v_radius_t change =
1744
1745 if (0 > change[V_MAIN] || 0 > change[V_INVIS]) {
1746 map_change_seen(pplayer2, ptile, change, FALSE);
1747 }
1749 }
1751 unbuffer_shared_vision(pplayer);
1753
1754 if (S_S_RUNNING == server_state()) {
1756 }
1757}
1758
1759/**********************************************************************/
1763{
1764 const v_radius_t radius_sq = V_RADIUS(-1, 0, 0);
1765
1767
1768 buffer_shared_vision(pplayer);
1769 whole_map_iterate(&(wld.map), ptile) {
1770 map_change_seen(pplayer, ptile, radius_sq, FALSE);
1772 unbuffer_shared_vision(pplayer);
1773}
1774
1775/**********************************************************************/
1779{
1780 players_iterate(pplayer) {
1781 enable_fog_of_war_player(pplayer);
1783}
1784
1785/**********************************************************************/
1789{
1790 const v_radius_t radius_sq = V_RADIUS(1, 0, 0);
1791
1793
1794 buffer_shared_vision(pplayer);
1795 whole_map_iterate(&(wld.map), ptile) {
1796 map_change_seen(pplayer, ptile, radius_sq, FALSE);
1798 unbuffer_shared_vision(pplayer);
1799}
1800
1801/**********************************************************************/
1805{
1806 players_iterate(pplayer) {
1809}
1810
1811/**********************************************************************/
1820static void ocean_to_land_fix_rivers(struct tile *ptile)
1821{
1822 cardinal_adjc_iterate(&(wld.map), ptile, tile1) {
1823 bool ocean_near = FALSE;
1824
1826 if (is_ocean_tile(tile2))
1827 ocean_near = TRUE;
1829
1830 if (!ocean_near) {
1831 /* If ruleset has several river types defined, this
1832 * may cause same tile to contain more than one river. */
1836 tile_add_extra(ptile, priver);
1837 }
1839 }
1841}
1842
1843/**********************************************************************/
1847 struct tile *from)
1848{
1849 bool unit_alive = TRUE;
1850 struct player *owner = unit_owner(punit);
1851
1852 /* Look for a nearby safe tile */
1853 adjc_iterate(&(wld.map), from, ptile2) {
1858 log_verbose("Moved %s %s due to changing terrain at (%d,%d).",
1863 _("Moved your %s due to changing terrain."),
1864 unit_link(punit));
1865
1866 /* TODO: should a unit be able to bounce to a transport like is
1867 * done below? What if the unit can't legally enter the transport,
1868 * say because the transport is Unreachable and the unit doesn't
1869 * have it in its embarks field or because "Transport Embark"
1870 * isn't enabled? Kept like it was to preserve the old rules for
1871 * now. -- Sveinung */
1876 }
1877 break;
1878 }
1880
1881 if (unit_alive && unit_tile(punit) == from) {
1882 /* If we get here we could not move punit. */
1883
1884 /* Try to bounce transported units. */
1886 struct unit_list *pcargo_units;
1887
1892 }
1893 }
1894}
1895
1896/**********************************************************************/
1902static void check_units_single_tile(struct tile *ptile)
1903{
1904 const struct civ_map *nmap = &(wld.map);
1905
1907 int id = punit->id;
1908
1909 /* Top-level transports only. Each handle their own cargo */
1911 && !can_unit_exist_at_tile(nmap, punit, ptile)) {
1913
1914 if (unit_is_alive(id) && unit_tile(punit) == ptile) {
1915 log_verbose("Disbanded %s %s due to changing terrain "
1916 "at (%d, %d).",
1918 unit_rule_name(punit), TILE_XY(ptile));
1921 _("Disbanded your %s due to changing terrain."),
1924 }
1925 }
1927}
1928
1929/**********************************************************************/
1937{
1938 const struct civ_map *nmap = &(wld.map);
1939
1940 /* Check this tile for direct effect on its units */
1942 /* We have to check adjacent tiles too, in case units in cities are now
1943 * illegal (e.g., boat in a city that has become landlocked),
1944 * and in case of CoastStrict units losing their adjacent coast. */
1945 adjc_iterate(nmap, ptile, ptile2) {
1948}
1949
1950/**********************************************************************/
1955 const struct terrain *newter)
1956{
1958
1959 if (!oldter || !newter) {
1960 return FALSE;
1961 }
1962
1965
1966 return (old_is_ocean && !new_is_ocean)
1967 || (!old_is_ocean && new_is_ocean);
1968}
1969
1970/**********************************************************************/
1973void terrain_changed(struct tile *ptile)
1974{
1975 struct city *pcity = tile_city(ptile);
1976
1977 if (pcity != NULL) {
1978 /* Tile is city center and new terrain may support better extras. */
1980 }
1981
1983}
1984
1985/**********************************************************************/
1993 struct terrain *oldter,
1994 bool extend_rivers)
1995{
1996 if (is_ocean(oldter) && !is_ocean_tile(ptile)) {
1997 if (extend_rivers) {
1999 }
2001 }
2002
2003 terrain_changed(ptile);
2004}
2005
2006/**********************************************************************/
2012void check_terrain_change(struct tile *ptile, struct terrain *oldter)
2013{
2014 struct terrain *newter = tile_terrain(ptile);
2015 struct tile *claimer;
2016 bool cont_reassigned = FALSE;
2017
2018 /* Check if new terrain is a freshwater terrain next to non-freshwater.
2019 * In that case, the new terrain is *changed*. */
2021 bool nonfresh = FALSE;
2022
2023 adjc_iterate(&(wld.map), ptile, atile) {
2026 nonfresh = TRUE;
2027 break;
2028 }
2030 if (nonfresh) {
2031 /* Need to pick a new, non-freshwater ocean type for this tile.
2032 * We don't want e.g. Deep Ocean to be propagated to this tile
2033 * and then to a whole lake by the flooding below, so we pick
2034 * the shallowest non-fresh oceanic type.
2035 * Prefer terrain that matches the frozenness of the target. */
2038 }
2039 }
2040
2044
2045 phase_players_iterate(pplayer) {
2046 if (is_adv_data_phase_open(pplayer)) {
2047 /* Player is using continent numbers that they would assume to remain accurate.
2048 * Force refresh:
2049 * 1) Close the phase, so that it can be opened
2050 * 2) Open the phase, recalculating
2051 */
2052 adv_data_phase_done(pplayer);
2053 adv_data_phase_init(pplayer, FALSE);
2054 }
2056 }
2057
2059
2060 /* Check for saltwater filling freshwater lake */
2063 adjc_iterate(&(wld.map), ptile, atile) {
2065 struct terrain *aold = tile_terrain(atile);
2066
2069 TER_FROZEN)));
2070
2071 /* Recursive, but as lakes are of limited size, this
2072 * won't recurse so much as to cause stack problems. */
2075 }
2077 }
2078
2079 if (cont_reassigned) {
2081 }
2082
2083 claimer = tile_claimer(ptile);
2084 if (claimer != NULL) {
2085 /* Make sure map_claim_border() conditions are still satisfied */
2086 if (!is_tile_claimable(ptile, claimer, tile_owner(ptile))) {
2087 map_clear_border(ptile);
2088 }
2089 }
2090
2091 sanity_check_tile(ptile);
2092}
2093
2094/**********************************************************************/
2098static bool is_tile_claimable(struct tile *ptile, struct tile *source,
2099 struct player *pplayer)
2100{
2101 if (ptile == source) {
2102 /* Source itself is always claimable. */
2103 return TRUE;
2104 }
2105
2106 return 0 < get_target_bonus_effects(nullptr,
2107 &(const struct req_context) {
2108 .tile = ptile,
2109 .player = pplayer,
2110 },
2111 &(const struct req_context) {
2112 .tile = source,
2113 },
2115}
2116
2117/**********************************************************************/
2120static void map_unit_homecity_enqueue(struct tile *ptile)
2121{
2122 unit_list_iterate(ptile->units, punit) {
2124
2125 if (NULL == phome) {
2126 continue;
2127 }
2128
2131}
2132
2133/**********************************************************************/
2136static void map_claim_border_ownership(struct tile *ptile,
2137 struct player *powner,
2138 struct tile *psource)
2139{
2140 struct player *ploser = tile_owner(ptile);
2141
2142 if ((ploser != powner && ploser != NULL)
2145 || ploser->server.border_vision)) {
2146 const v_radius_t radius_sq = V_RADIUS(-1, 0, 0);
2147
2148 shared_vision_change_seen(ploser, ptile, radius_sq, FALSE);
2149 }
2150
2151 if (powner != NULL
2154 || powner->server.border_vision)) {
2155 const v_radius_t radius_sq = V_RADIUS(1, 0, 0);
2156
2157 shared_vision_change_seen(powner, ptile, radius_sq, TRUE);
2158 }
2159
2160 tile_set_owner(ptile, powner, psource);
2161
2162 /* Needed only when foggedborders enabled, but we do it unconditionally
2163 * in case foggedborders ever gets enabled later. Better to have correct
2164 * information in player map just in case. */
2165 update_tile_knowledge(ptile);
2166
2167 if (ploser != powner) {
2170 }
2171
2172 if (!city_map_update_tile_frozen(ptile)) {
2173 send_tile_info(NULL, ptile, FALSE);
2174 }
2175 }
2176}
2177
2178/**********************************************************************/
2181void map_claim_ownership(struct tile *ptile, struct player *powner,
2182 struct tile *psource, bool claim_bases)
2183{
2184 map_claim_border_ownership(ptile, powner, psource);
2185
2186 if (claim_bases) {
2187 tile_claim_bases(ptile, powner);
2188 }
2189}
2190
2191/**********************************************************************/
2194void tile_claim_bases(struct tile *ptile, struct player *powner)
2195{
2196 struct player *base_loser = extra_owner(ptile);
2197
2198 /* This MUST be before potentially recursive call to map_claim_base(),
2199 * so that the recursive call will get new owner == base_loser and
2200 * abort recursion. */
2201 ptile->extras_owner = powner;
2202
2204 map_claim_base(ptile, pextra, powner, base_loser);
2206}
2207
2208/**********************************************************************/
2211void map_clear_border(struct tile *ptile)
2212{
2213 int radius_sq = tile_border_source_radius_sq(ptile);
2214
2215 circle_dxyr_iterate(&(wld.map), ptile, radius_sq, dtile, dx, dy, dr) {
2216 struct tile *claimer = tile_claimer(dtile);
2217
2218 if (claimer == ptile) {
2220 }
2222}
2223
2224/**********************************************************************/
2228void map_update_border(struct tile *ptile, struct player *owner,
2230{
2232 /* No change */
2233 return;
2234 }
2235
2237 return;
2238 }
2239
2242 } else {
2243 circle_dxyr_iterate(&(wld.map), ptile, old_radius_sq, dtile, dx, dy, dr) {
2244 if (dr > new_radius_sq) {
2245 struct tile *claimer = tile_claimer(dtile);
2246
2247 if (claimer == ptile) {
2249 }
2250 }
2252 }
2253}
2254
2255/**********************************************************************/
2260void map_claim_border(struct tile *ptile, struct player *owner,
2261 int radius_sq)
2262{
2264 return;
2265 }
2266
2267 if (owner == NULL) {
2268 /* Clear the border instead of claiming. Code below this block
2269 * cannot handle NULL owner. */
2270 map_clear_border(ptile);
2271
2272 return;
2273 }
2274
2275 if (radius_sq < 0) {
2276 radius_sq = tile_border_source_radius_sq(ptile);
2277 }
2278
2279 circle_dxyr_iterate(&(wld.map), ptile, radius_sq, dtile, dx, dy, dr) {
2280 struct tile *dclaimer = tile_claimer(dtile);
2281
2282 if (dclaimer == ptile) {
2283 /* Already claimed by the ptile */
2284 continue;
2285 }
2286
2287 if (dr != 0 && is_border_source(dtile)) {
2288 /* Do not claim border sources other than self */
2289 /* Note that this is extremely important at the moment for
2290 * base claiming to work correctly in case there's two
2291 * fortresses near each other. There could be infinite
2292 * recursion in them claiming each other. */
2293 continue;
2294 }
2295
2297 continue;
2298 }
2299
2300 /* Always claim source itself (distance, dr, to it 0) */
2301 if (dr != 0 && NULL != dclaimer && dclaimer != ptile) {
2302 struct city *ccity = tile_city(dclaimer);
2304
2305 if (ccity != NULL) {
2306 /* Previously claimed by city */
2307 int city_x, city_y;
2308
2310
2314 /* Tile is within region permanently claimed by city */
2315 continue;
2316 }
2317 }
2318
2321
2322 if (strength_new <= strength_old) {
2323 /* Stronger shall prevail,
2324 * in case of equal strength older shall prevail */
2325 continue;
2326 }
2327 }
2328
2329 /* Only certain tiles are claimable */
2330 if (is_tile_claimable(dtile, ptile, owner)) {
2331 map_claim_ownership(dtile, owner, ptile, dr == 0);
2332 }
2334}
2335
2336/**********************************************************************/
2340{
2342 return;
2343 }
2344
2345 if (wld.map.tiles == NULL) {
2346 /* Map not yet initialized */
2347 return;
2348 }
2349
2350 log_verbose("map_calculate_borders()");
2351
2352 whole_map_iterate(&(wld.map), ptile) {
2353 if (is_border_source(ptile)) {
2354 map_claim_border(ptile, ptile->owner, -1);
2355 }
2357
2358 log_verbose("map_calculate_borders() workers");
2361}
2362
2363/**********************************************************************/
2366void map_claim_base(struct tile *ptile, struct extra_type *pextra,
2367 struct player *powner, struct player *ploser)
2368{
2369 struct base_type *pbase;
2371 int units_num = 0;
2372 int ul_size;
2373
2374 if (!tile_has_extra(ptile, pextra)) {
2375 return;
2376 }
2377
2378 if (pextra->eus != EUS_NORMAL) {
2379 ul_size = unit_list_size(ptile->units);
2380 } else {
2381 ul_size = 0;
2382 }
2383
2384 int stored_units[ul_size + 1];
2385
2386 if (ul_size > 0) {
2387 int i;
2388
2390
2391 unit_list_iterate(ptile->units, aunit) {
2392 stored_units[units_num++] = aunit->id;
2394
2396
2397 for (i = 0; i < units_num; i++) {
2399
2404 }
2406 }
2407 }
2408
2409 pbase = extra_base_get(pextra);
2410
2412
2413 /* Transfer base provided vision to new owner */
2414 if (powner != NULL) {
2415 const v_radius_t old_radius_sq = V_RADIUS(-1, -1, -1);
2416 const v_radius_t new_radius_sq = V_RADIUS(pbase->vision_main_sq,
2417 pbase->vision_invis_sq,
2418 pbase->vision_subs_sq);
2419
2422 }
2423
2424 if (ploser != NULL) {
2425 const v_radius_t old_radius_sq = V_RADIUS(pbase->vision_main_sq,
2426 pbase->vision_invis_sq,
2427 pbase->vision_subs_sq);
2428 const v_radius_t new_radius_sq = V_RADIUS(-1, -1, -1);
2429
2432 }
2433
2435 && territory_claiming_base(pbase) && powner != ploser) {
2436 /* Clear borders from old owner. New owner may not know all those
2437 * tiles and thus does not claim them when borders mode is less
2438 * than EXPAND. */
2439 if (ploser != NULL) {
2440 /* Set this particular tile owner by NULL so in recursion
2441 * both loser and owner will be NULL. */
2442 map_claim_border_ownership(ptile, NULL, ptile);
2443 map_clear_border(ptile);
2444 }
2445
2446 /* We here first claim this tile ownership -> now on extra_owner()
2447 * will return new owner. Then we claim border, which will recursively
2448 * lead to this tile and base being claimed. But at that point
2449 * ploser == powner and above check will abort the recursion. */
2450 if (powner != NULL) {
2451 map_claim_border_ownership(ptile, powner, ptile);
2452 map_claim_border(ptile, powner, -1);
2453 }
2456 }
2457
2458 if (units_num > 0) {
2459 int i;
2460
2461 for (i = 0; i < units_num; i++) {
2463
2467 send_unit_info(aplayer->connections, aunit);
2468 }
2469 } else {
2472 }
2473 }
2475 }
2476
2478 }
2479}
2480
2481/**********************************************************************/
2487void vision_change_sight(struct vision *vision, const v_radius_t radius_sq)
2488{
2490 radius_sq, vision->can_reveal_tiles);
2491 memcpy(vision->radius_sq, radius_sq, sizeof(v_radius_t));
2492}
2493
2494/**********************************************************************/
2500{
2501 const v_radius_t vision_radius_sq = V_RADIUS(-1, -1, -1);
2502
2503 vision_change_sight(vision, vision_radius_sq);
2504
2505 /* Owner of some city might have lost vision of a tile previously worked */
2506 players_iterate(pplayer) {
2507 city_list_iterate(pplayer->cities, pcity) {
2508 /* We are not interested about CNA_BROADCAST_PENDING, as the vision loss has
2509 * not set it, and whatever set it should take care of it. */
2510 if (pcity->server.needs_arrange == CNA_NORMAL) {
2513 pcity->server.needs_arrange = CNA_NOT;
2514 }
2517}
2518
2519/**********************************************************************/
2522void create_extra(struct tile *ptile, struct extra_type *pextra,
2523 struct player *pplayer)
2524{
2525 bool extras_removed = FALSE;
2526
2528 if (tile_has_extra(ptile, old_extra)
2529 && !can_extras_coexist(old_extra, pextra)) {
2530 destroy_extra(ptile, old_extra);
2532 }
2534
2535 if (pextra->eus != EUS_NORMAL) {
2536 unit_list_iterate(ptile->units, aunit) {
2539 if (!pplayers_allied(pplayer, aplayer)
2542 }
2544 }
2546 }
2547
2548 tile_add_extra(ptile, pextra);
2549
2550 /* Watchtower might become effective. */
2552
2553 if (pextra->data.base != NULL) {
2554 /* Claim bases on tile */
2555 if (pplayer) {
2556 struct player *old_owner = extra_owner(ptile);
2557
2558 /* Created base from NULL -> pplayer */
2559 map_claim_base(ptile, pextra, pplayer, NULL);
2560
2561 if (old_owner != pplayer) {
2562 /* Existing bases from old_owner -> pplayer */
2564 if (oldbase != pextra) {
2565 map_claim_base(ptile, oldbase, pplayer, old_owner);
2566 }
2568
2569 ptile->extras_owner = pplayer;
2570 }
2571 } else {
2572 /* Player who already owns bases on tile claims new base */
2573 map_claim_base(ptile, pextra, extra_owner(ptile), NULL);
2574 }
2575 }
2576
2577 if (extras_removed) {
2578 /* Maybe conflicting extra that was removed was the only thing
2579 * making tile native to some unit. */
2581 }
2582}
2583
2584/**********************************************************************/
2587void destroy_extra(struct tile *ptile, struct extra_type *pextra)
2588{
2590 bool real = tile_map_check(&(wld.map), ptile);
2591
2592 /* Remember what players were able to see the base. */
2593 if (real) {
2595 players_iterate(pplayer) {
2596 if (map_is_known_and_seen(ptile, pplayer, V_MAIN)) {
2597 BV_SET(base_seen, player_index(pplayer));
2598 }
2600 }
2601
2602 if (real && is_extra_caused_by(pextra, EC_BASE)) {
2603 struct base_type *pbase = extra_base_get(pextra);
2604 struct player *owner = extra_owner(ptile);
2605
2607 map_clear_border(ptile);
2608 }
2609
2610 if (NULL != owner
2611 && (0 <= pbase->vision_main_sq || 0 <= pbase->vision_invis_sq)) {
2612 /* Base provides vision, but no borders. */
2614 V_RADIUS(0 <= pbase->vision_main_sq ? pbase->vision_main_sq : -1,
2615 0 <= pbase->vision_invis_sq ? pbase->vision_invis_sq : -1,
2616 0 <= pbase->vision_subs_sq ? pbase->vision_subs_sq : -1);
2617 const v_radius_t new_radius_sq = V_RADIUS(-1, -1, -1);
2618
2621 }
2622 }
2623
2624 tile_remove_extra(ptile, pextra);
2625
2626 if (real) {
2627 /* Remove base from vision of players which were able to see the base. */
2628 players_iterate(pplayer) {
2629 if (BV_ISSET(base_seen, player_index(pplayer))
2630 && update_player_tile_knowledge(pplayer, ptile)) {
2631 send_tile_info(pplayer->connections, ptile, FALSE);
2632 }
2634
2635 if (pextra->eus != EUS_NORMAL) {
2636 struct player *eowner = extra_owner(ptile);
2637
2638 unit_list_iterate(ptile->units, aunit) {
2642 && !pplayers_allied(aplayer, eowner)) {
2643 send_unit_info(aplayer->connections, aunit);
2644 }
2646 }
2648 }
2649 }
2650}
2651
2652/**********************************************************************/
2663 int prob, bool reveal_cities)
2664{
2665 bool updt = FALSE;
2666
2668
2669 whole_map_iterate(&(wld.map), ptile) {
2670 if (fc_rand(100) < prob) {
2672 } else if (reveal_cities && NULL != tile_city(ptile)) {
2674 }
2676
2678
2679 return updt;
2680}
2681
2682/**********************************************************************/
2691{
2692 struct city *pcity = ptile->worked;
2693
2694 /* Check the unit activities. */
2696
2697 if (pcity != NULL && !is_free_worked(pcity, ptile)
2700 pcity->specialists[DEFAULT_SPECIALIST]++;
2701
2702 if (refresh_city) {
2705 }
2706 }
2707}
#define ACTION_NONE
Definition actions.h:59
bool is_adv_data_phase_open(struct player *pplayer)
Definition advdata.c:250
bool adv_data_phase_init(struct player *pplayer, bool is_new_phase)
Definition advdata.c:270
void adv_data_phase_done(struct player *pplayer)
Definition advdata.c:573
#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:3640
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:3284
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:2783
void sync_cities(void)
Definition citytools.c:3358
bool city_map_update_tile_frozen(struct tile *ptile)
Definition citytools.c:3341
void remove_dumb_city(struct player *pplayer, struct tile *ptile)
Definition citytools.c:2875
void city_landlocked_sell_coastal_improvements(struct tile *ptile)
Definition citytools.c:3411
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:2854
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:73
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:77
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:998
#define MAX_EXTRA_TYPES
Definition fc_types.h:50
@ BORDERS_DISABLED
Definition fc_types.h:744
@ BORDERS_SEE_INSIDE
Definition fc_types.h:746
@ BORDERS_EXPAND
Definition fc_types.h:747
#define IDENTITY_NUMBER_ZERO
Definition fc_types.h:93
#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:1161
struct tile * rand_map_pos(const struct civ_map *nmap)
Definition map.c:1237
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:796
void map_distance_vector(int *dx, int *dy, const struct tile *tile0, const struct tile *tile1)
Definition map.c:1222
#define adjc_iterate_end
Definition map.h:439
#define circle_dxyr_iterate(nmap, center_tile, sq_radius, _tile, dx, dy, dr)
Definition map.h:415
#define cardinal_adjc_iterate_end
Definition map.h:465
#define adjc_iterate(nmap, center_tile, itr_tile)
Definition map.h:434
#define circle_dxyr_iterate_end
Definition map.h:426
#define cardinal_adjc_iterate(nmap, center_tile, itr_tile)
Definition map.h:461
#define circle_iterate(nmap, center_tile, sq_radius, tile_itr)
Definition map.h:407
#define whole_map_iterate(_map, _tile)
Definition map.h:582
#define MAP_TILE_OWNER_NULL
Definition map.h:639
#define whole_map_iterate_end
Definition map.h:591
#define circle_iterate_end
Definition map.h:410
void assign_continent_numbers(void)
struct terrain * most_shallow_ocean(bool frozen)
void player_map_init(struct player *pplayer)
Definition maphand.c:1236
static void terrain_change_bounce_single_unit(struct unit *punit, struct tile *from)
Definition maphand.c:1846
void update_player_tile_last_seen(struct player *pplayer, struct tile *ptile)
Definition maphand.c:1482
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:2499
void map_claim_base(struct tile *ptile, struct extra_type *pextra, struct player *powner, struct player *ploser)
Definition maphand.c:2366
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:2181
static int player_tile_own_seen(const struct player_tile *plrtile, enum vision_layer vlayer)
Definition maphand.c:1151
bool map_is_known(const struct tile *ptile, const struct player *pplayer)
Definition maphand.c:909
static bool map_is_also_seen(const struct tile *ptile, const struct player *pplayer, enum vision_layer vlayer)
Definition maphand.c:924
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:1500
static bool is_tile_claimable(struct tile *ptile, struct tile *source, struct player *pplayer)
Definition maphand.c:2098
bool send_tile_suppression(bool now)
Definition maphand.c:473
void destroy_extra(struct tile *ptile, struct extra_type *pextra)
Definition maphand.c:2587
static void check_units_single_tile(struct tile *ptile)
Definition maphand.c:1902
static void really_give_map_from_player_to_player(struct player *pfrom, struct player *pdest)
Definition maphand.c:1573
void disable_fog_of_war(void)
Definition maphand.c:1804
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:1211
static void map_change_own_seen(struct player *pplayer, struct tile *ptile, const v_radius_t change)
Definition maphand.c:1160
void show_map_to_all(void)
Definition maphand.c:1225
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:1413
static int map_get_seen(const struct player *pplayer, const struct tile *ptile, enum vision_layer vlayer)
Definition maphand.c:949
static void ocean_to_land_fix_rivers(struct tile *ptile)
Definition maphand.c:1820
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:1936
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:1708
bool need_to_reassign_continents(const struct terrain *oldter, const struct terrain *newter)
Definition maphand.c:1954
struct vision_site * map_get_player_city(const struct tile *ptile, const struct player *pplayer)
Definition maphand.c:1382
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:2194
void disable_fog_of_war_player(struct player *pplayer)
Definition maphand.c:1788
void climate_change(bool warming, int effect)
Definition maphand.c:131
void enable_fog_of_war(void)
Definition maphand.c:1778
static bool send_tile_suppressed
Definition maphand.c:63
static void create_vision_dependencies(void)
Definition maphand.c:1613
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:2522
void map_update_border(struct tile *ptile, struct player *owner, int old_radius_sq, int new_radius_sq)
Definition maphand.c:2228
void map_set_known(struct tile *ptile, struct player *pplayer)
Definition maphand.c:1193
void map_show_all(struct player *pplayer)
Definition maphand.c:894
static void map_unit_homecity_enqueue(struct tile *ptile)
Definition maphand.c:2120
static void map_change_seen(struct player *pplayer, struct tile *ptile, const v_radius_t change, bool can_reveal_tiles)
Definition maphand.c:962
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:2690
static void player_tile_init(struct tile *ptile, struct player *pplayer)
Definition maphand.c:1343
void terrain_changed(struct tile *ptile)
Definition maphand.c:1973
void player_map_free(struct player *pplayer)
Definition maphand.c:1252
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:2136
bool map_is_known_and_seen(const struct tile *ptile, const struct player *pplayer, enum vision_layer vlayer)
Definition maphand.c:935
void change_playertile_site(struct player_tile *ptile, struct vision_site *new_site)
Definition maphand.c:1174
void map_calculate_borders(void)
Definition maphand.c:2339
void fix_tile_on_terrain_change(struct tile *ptile, struct terrain *oldter, bool extend_rivers)
Definition maphand.c:1992
void enable_fog_of_war_player(struct player *pplayer)
Definition maphand.c:1762
void map_show_circle(struct player *pplayer, struct tile *ptile, int radius_sq)
Definition maphand.c:879
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:2260
void update_tile_knowledge(struct tile *ptile)
Definition maphand.c:1454
void remove_player_from_maps(struct player *pplayer)
Definition maphand.c:1273
void give_shared_vision(struct player *pfrom, struct player *pto)
Definition maphand.c:1647
void check_terrain_change(struct tile *ptile, struct terrain *oldter)
Definition maphand.c:2012
bool give_distorted_map(struct player *pfrom, struct player *pto, int prob, bool reveal_cities)
Definition maphand.c:2662
void map_hide_tile(struct player *src_player, struct tile *ptile)
Definition maphand.c:830
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:1593
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:2211
void map_clear_known(struct tile *ptile, struct player *pplayer)
Definition maphand.c:1201
static void player_tile_free(struct tile *ptile, struct player *pplayer)
Definition maphand.c:1368
struct player_tile * map_get_player_tile(const struct tile *ptile, const struct player *pplayer)
Definition maphand.c:1397
void vision_change_sight(struct vision *vision, const v_radius_t radius_sq)
Definition maphand.c:2487
#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:350
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:340
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:135
struct terrain * cooler_drier_result
Definition terrain.h:135
struct terrain * warmer_wetter_result
Definition terrain.h:134
struct terrain * warmer_drier_result
Definition terrain.h:134
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:574
Definition unit.h:139
enum unit_activity activity
Definition unit.h:158
int id
Definition unit.h:146
struct unit::@84::@87 server
struct tile * tile
Definition unit.h:141
struct extra_type * activity_target
Definition unit.h:166
int homecity
Definition unit.h:147
bool dying
Definition unit.h:252
int identity
Definition vision.h:114
struct tile * tile
Definition vision.h:87
bool can_reveal_tiles
Definition vision.h:88
v_radius_t radius_sq
Definition vision.h:91
struct player * player
Definition vision.h:86
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:611
Terrain_type_id terrain_count(void)
Definition terrain.c:117
Terrain_type_id terrain_number(const struct terrain *pterrain)
Definition terrain.c:146
#define T_UNKNOWN
Definition terrain.h:62
#define is_ocean(pterrain)
Definition terrain.h:195
#define is_ocean_tile(ptile)
Definition terrain.h:197
#define T_NONE
Definition terrain.h:61
#define terrain_has_flag(terr, flag)
Definition terrain.h:177
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:119
#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:115
#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:152
#define tile_owner(_tile)
Definition tile.h:97
int get_transporter_occupancy(const struct unit *ptrans)
Definition unit.c:1846
bool unit_is_alive(int id)
Definition unit.c:2316
bool unit_transported(const struct unit *pcargo)
Definition unit.c:2528
struct unit_list * unit_transport_cargo(const struct unit *ptrans)
Definition unit.c:2554
#define unit_tile(_pu)
Definition unit.h:406
#define unit_owner(_pu)
Definition unit.h:405
static bool is_non_allied_unit_tile(const struct tile *ptile, const struct player *pplayer, bool everyone_non_allied)
Definition unit.h:442
bool unit_activity_handling(struct unit *punit, enum unit_activity new_activity, enum gen_action trigger_action)
Definition unithand.c:6667
#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:2869
void send_unit_info(struct conn_list *dest, struct unit *punit)
Definition unittools.c:2882
void unit_activities_cancel(struct unit *punit)
Definition unittools.c:801
void wipe_unit(struct unit *punit, enum unit_loss_reason reason, struct player *killer)
Definition unittools.c:2144
void unit_activities_cancel_all_illegal_area(const struct tile *ptile)
Definition unittools.c:846
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:4083
void unit_list_refresh_vision(struct unit_list *punitlist)
Definition unittools.c:5032
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:1591
bool unit_has_type_flag(const struct unit *punit, enum unit_type_flag_id flag)
Definition unittype.c:194
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:95
#define vision_layer_iterate(v)
Definition vision.h:76
#define vision_site_owner(v)
Definition vision.h:128
short int v_radius_t[V_COUNT]
Definition vision.h:82
#define vision_layer_iterate_end
Definition vision.h:79
#define MAP_NATIVE_WIDTH
#define MAP_INDEX_SIZE
#define MAP_NATIVE_HEIGHT