Freeciv-3.2
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#define MAXIMUM_CLAIMED_OCEAN_SIZE (20)
63
64/* Suppress send_tile_info() during game_load() */
66
67static void player_tile_init(struct tile *ptile, struct player *pplayer);
68static void player_tile_free(struct tile *ptile, struct player *pplayer);
70 struct player *pdest,
71 struct tile *ptile);
72static void shared_vision_change_seen(struct player *pplayer,
73 struct tile *ptile,
74 const v_radius_t change,
75 bool can_reveal_tiles);
76static void map_change_seen(struct player *pplayer,
77 struct tile *ptile,
78 const v_radius_t change,
79 bool can_reveal_tiles);
80static void map_change_own_seen(struct player *pplayer,
81 struct tile *ptile,
82 const v_radius_t change);
83static inline int map_get_seen(const struct player *pplayer,
84 const struct tile *ptile,
85 enum vision_layer vlayer);
86static inline bool map_is_also_seen(const struct tile *ptile,
87 const struct player *pplayer,
88 enum vision_layer vlayer);
89
90static bool is_claimable_ocean(struct tile *ptile, struct tile *source,
91 struct player *pplayer);
92
93/**********************************************************************/
96static bool is_terrain_ecologically_wet(struct tile *ptile)
97{
98 return (is_terrain_class_near_tile(&(wld.map), ptile, TC_OCEAN)
99 || tile_has_river(ptile)
100 || count_river_near_tile(&(wld.map), ptile, NULL) > 0);
101}
102
103/**********************************************************************/
107{
110 _("Global warming has occurred!"));
112 _("Coastlines have been flooded and vast "
113 "ranges of grassland have become deserts."));
114}
115
116/**********************************************************************/
120{
123 _("Nuclear winter has occurred!"));
125 _("Wetlands have dried up and vast "
126 "ranges of grassland have become tundra."));
127}
128
129/**********************************************************************/
134{
135 int k = map_num_tiles();
136 bool used[k];
137 const struct civ_map *nmap = &(wld.map);
138
139 memset(used, 0, sizeof(used));
140
141 log_verbose("Climate change: %s (%d)",
142 warming ? "Global warming" : "Nuclear winter", effect);
143
144 while (effect > 0 && (k--) > 0) {
145 struct terrain *old, *candidates[2], *new;
146 struct tile *ptile;
147 int i;
148
149 do {
150 /* We want to transform a tile at most once due to a climate change. */
151 ptile = rand_map_pos(&(wld.map));
152 } while (used[tile_index(ptile)]);
153 used[tile_index(ptile)] = TRUE;
154
155 old = tile_terrain(ptile);
156 /* Prefer the transformation that's appropriate to the ambient moisture,
157 * but be prepared to fall back in exceptional circumstances */
158 {
159 struct terrain *wetter, *drier;
160
163 if (is_terrain_ecologically_wet(ptile)) {
164 candidates[0] = wetter;
165 candidates[1] = drier;
166 } else {
167 candidates[0] = drier;
168 candidates[1] = wetter;
169 }
170 }
171
172 /* If the preferred transformation is ruled out for some exceptional reason
173 * specific to this tile, fall back to the other, rather than letting this
174 * tile be immune to change. */
175 for (i = 0; i < 2; i++) {
176 new = candidates[i];
177
178 /* If the preferred transformation simply hasn't been specified
179 * for this terrain at all, don't fall back to the other. */
180 if (new == T_NONE) {
181 break;
182 }
183
184 if (tile_city(ptile) != NULL && terrain_has_flag(new, TER_NO_CITIES)) {
185 /* do not change to a terrain with the flag TER_NO_CITIES if the tile
186 * has a city */
187 continue;
188 }
189
190 /* Only change between water and land at coastlines, and between
191 * frozen and unfrozen at ice margin */
192 if (!terrain_surroundings_allow_change(nmap, ptile, new)) {
193 continue;
194 }
195
196 /* OK! */
197 break;
198 }
199 if (i == 2) {
200 /* Neither transformation was permitted. Give up. */
201 continue;
202 }
203
204 if (new != T_NONE && old != new) {
205 effect--;
206
207 /* Check terrain changing activities.
208 These would not be caught by the check if unit can continue activity
209 after the terrain change has taken place, as the activity itself is still
210 legal, but would be towards different terrain, and terrain types are not
211 activity targets (target is NULL) */
212 unit_list_iterate(ptile->units, punit) {
213 if (punit->activity_target == NULL) {
214 /* Target is always NULL for terrain changing activities. */
219 }
220 }
222
223 /* Really change the terrain. */
224 tile_change_terrain(ptile, new);
225 check_terrain_change(ptile, old);
227
229
230 } else if (old == new) {
231 /* This counts toward a climate change although nothing is changed. */
232 effect--;
233 }
234 }
235}
236
237/**********************************************************************/
241bool upgrade_city_extras(struct city *pcity, struct extra_type **gained)
242{
243 struct tile *ptile = pcity->tile;
244 struct player *pplayer = city_owner(pcity);
245 bool upgradet = FALSE;
246
247 extra_type_iterate(pextra) {
248 if (!tile_has_extra(ptile, pextra)) {
251 && player_can_build_extra(pextra, pplayer, ptile)
252 && !tile_has_conflicting_extra(ptile, pextra))) {
253 tile_add_extra(pcity->tile, pextra);
254 if (gained != NULL) {
255 if (upgradet) {
256 *gained = NULL;
257 } else {
258 *gained = pextra;
259 }
260 }
261 upgradet = TRUE;
262 }
263 }
265
266 return upgradet;
267}
268
269/**********************************************************************/
276void upgrade_all_city_extras(struct player *pplayer, bool discovery)
277{
278 int cities_upgradet = 0;
279 struct extra_type *upgradet = NULL;
280 bool multiple_types = FALSE;
281 int cities_total = city_list_size(pplayer->cities);
282 int percent;
283
285
286 city_list_iterate(pplayer->cities, pcity) {
287 struct extra_type *new_upgrade;
288
289 if (upgrade_city_extras(pcity, &new_upgrade)) {
290 update_tile_knowledge(pcity->tile);
292 if (new_upgrade == NULL) {
293 /* This single city alone had multiple types */
295 } else if (upgradet == NULL) {
296 /* First gained */
298 } else if (upgradet != new_upgrade) {
299 /* Different type from what another city got. */
301 }
302 }
304
305 if (cities_total > 0) {
307 } else {
308 percent = 0;
309 }
310
311 if (cities_upgradet > 0) {
312 if (discovery) {
313 if (percent >= 75) {
315 _("New hope sweeps like fire through the country as "
316 "the discovery of new infrastructure building technology "
317 "is announced."));
318 }
319 } else {
320 if (percent >= 75) {
322 _("The people are pleased to hear that your "
323 "scientists finally know about new infrastructure building "
324 "technology."));
325 }
326 }
327
328 if (multiple_types) {
330 _("Workers spontaneously gather and upgrade all "
331 "possible cities with better infrastructure."));
332 } else {
334 _("Workers spontaneously gather and upgrade all "
335 "possible cities with %s."), extra_name_translation(upgradet));
336 }
337 }
338
340}
341
342/**********************************************************************/
346{
347 return BV_ISSET(me->server.really_gives_vision, player_index(them));
348}
349
350/**********************************************************************/
353static void buffer_shared_vision(struct player *pplayer)
354{
356 if (really_gives_vision(pplayer, pplayer2)) {
358 conn_list_do_buffer(pplayer2->connections);
359 }
363}
364
365/**********************************************************************/
368static void unbuffer_shared_vision(struct player *pplayer)
369{
371 if (really_gives_vision(pplayer, pplayer2)) {
372 conn_list_do_unbuffer(pplayer2->connections);
374 }
378}
379
380/**********************************************************************/
396
397/**********************************************************************/
414
415/**********************************************************************/
419 struct player *pfrom, struct player *pdest)
420{
421 struct tile *pcenter = city_tile(pcity);
422 const struct civ_map *nmap = &(wld.map);
423
425
429
432 sync_cities();
433}
434
435/**********************************************************************/
445{
446 int tiles_sent;
447
448 if (!dest) {
449 dest = game.est_connections;
450 }
451
452 /* send whole map piece by piece to each player to balance the load
453 of the send buffers better */
454 tiles_sent = 0;
456
457 whole_map_iterate(&(wld.map), ptile) {
458 tiles_sent++;
459 if ((tiles_sent % wld.map.xsize) == 0) {
463 }
464
465 send_tile_info(dest, ptile, FALSE);
467
470}
471
472/**********************************************************************/
476{
478
480 return formerly;
481}
482
483/**********************************************************************/
491void send_tile_info(struct conn_list *dest, struct tile *ptile,
492 bool send_unknown)
493{
494 struct packet_tile_info info;
495 const struct player *owner;
496 const struct player *eowner;
497
498 if (dest == NULL) {
499 CALL_FUNC_EACH_AI(tile_info, ptile);
500 }
501
503 return;
504 }
505
506 if (!dest) {
507 dest = game.est_connections;
508 }
509
510 info.tile = tile_index(ptile);
511
512 if (ptile->spec_sprite) {
513 sz_strlcpy(info.spec_sprite, ptile->spec_sprite);
514 } else {
515 info.spec_sprite[0] = '\0';
516 }
517
518 conn_list_iterate(dest, pconn) {
519 struct player *pplayer = pconn->playing;
520 bool known;
521
522 if (NULL == pplayer && !pconn->observer) {
523 continue;
524 }
525
526 if (pplayer != NULL) {
527 known = map_is_known(ptile, pplayer);
528 }
529
530 if (pplayer == NULL || (known && map_is_also_seen(ptile, pplayer, V_MAIN))) {
531 struct extra_type *resource;
532
533 info.known = TILE_KNOWN_SEEN;
534 info.continent = tile_continent(ptile);
535 owner = tile_owner(ptile);
536 eowner = extra_owner(ptile);
538 info.extras_owner = (eowner ? player_number(eowner) : MAP_TILE_OWNER_NULL);
539 info.worked = (NULL != tile_worked(ptile))
540 ? tile_worked(ptile)->id
542
543 info.terrain = (NULL != tile_terrain(ptile))
545 : terrain_count();
546
547 resource = tile_resource(ptile);
548 if (resource != NULL
549 && (pplayer == NULL
550 || player_knows_extra_exist(pplayer, resource, ptile))) {
552 } else {
554 }
555
556 info.placing = (NULL != ptile->placing)
557 ? extra_number(ptile->placing)
558 : -1;
559 info.place_turn = (NULL != ptile->placing)
560 ? game.info.turn + ptile->infra_turns
561 : 0;
562
563 if (pplayer != NULL) {
564 dbv_to_bv(info.extras.vec, &(map_get_player_tile(ptile, pplayer)->extras));
565 } else {
566 info.extras = ptile->extras;
567 }
568
569 if (ptile->label != NULL) {
570 /* Always leave final '\0' in place */
571 strncpy(info.label, ptile->label, sizeof(info.label) - 1);
572 } else {
573 info.label[0] = '\0';
574 }
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
612 } else if (send_unknown) {
613 info.known = TILE_UNKNOWN;
614 info.continent = 0;
618
619 info.terrain = terrain_count();
621 info.placing = -1;
622 info.place_turn = 0;
623
624 BV_CLR_ALL(info.extras);
625
626 info.label[0] = '\0';
627
629 }
630 }
632}
633
634/**********************************************************************/
640static bool unit_is_on_layer(const struct unit *punit,
641 enum vision_layer vlayer)
642{
643 return unit_type_get(punit)->vlayer == vlayer;
644}
645
646/**********************************************************************/
649void send_map_info(struct conn_list *dest)
650{
651 struct packet_map_info minfo;
652
654 minfo.ysize = wld.map.ysize;
655 minfo.topology_id = wld.map.topology_id;
656 minfo.wrap_id = wld.map.wrap_id;
657 minfo.north_latitude = wld.map.north_latitude;
658 minfo.south_latitude = wld.map.south_latitude;
659
661}
662
663/**********************************************************************/
667static void shared_vision_change_seen(struct player *pplayer,
668 struct tile *ptile,
669 const v_radius_t change,
670 bool can_reveal_tiles)
671{
672 map_change_own_seen(pplayer, ptile, change);
673 map_change_seen(pplayer, ptile, change, can_reveal_tiles);
674
676 if (really_gives_vision(pplayer, pplayer2)) {
677 map_change_seen(pplayer2, ptile, change, can_reveal_tiles);
678 }
680}
681
682/**********************************************************************/
685void map_vision_update(struct player *pplayer, struct tile *ptile,
688 bool can_reveal_tiles)
689{
690 v_radius_t change;
691 int max_radius;
692
696 return;
697 }
698
699 /* Determines 'max_radius' value. */
700 max_radius = 0;
702 if (max_radius < old_radius_sq[v]) {
704 }
705 if (max_radius < new_radius_sq[v]) {
707 }
709
710#ifdef FREECIV_DEBUG
711 log_debug("Updating vision at (%d, %d) in a radius of %d.",
712 TILE_XY(ptile), max_radius);
714 log_debug(" vision layer %d is changing from %d to %d.",
715 v, old_radius_sq[v], new_radius_sq[v]);
717#endif /* FREECIV_DEBUG */
718
719 buffer_shared_vision(pplayer);
720 circle_dxyr_iterate(&(wld.map), ptile, max_radius, tile1, dx, dy, dr) {
722 if (dr > old_radius_sq[v] && dr <= new_radius_sq[v]) {
723 change[v] = 1;
724 } else if (dr > new_radius_sq[v] && dr <= old_radius_sq[v]) {
725 change[v] = -1;
726 } else {
727 change[v] = 0;
728 }
730 shared_vision_change_seen(pplayer, tile1, change, can_reveal_tiles);
732 unbuffer_shared_vision(pplayer);
733}
734
735/**********************************************************************/
740void map_set_border_vision(struct player *pplayer,
741 const bool is_enabled)
742{
743 const v_radius_t radius_sq = V_RADIUS(is_enabled ? 1 : -1, 0, 0);
744
745 if (pplayer->server.border_vision == is_enabled) {
746 /* No change. Changing the seen count beyond what already exists would
747 * be a bug. */
748 return;
749 }
750
751 /* Set the new border seer value. */
753
754 whole_map_iterate(&(wld.map), ptile) {
755 if (pplayer == ptile->owner) {
756 /* The tile is within the player's borders. */
757 shared_vision_change_seen(pplayer, ptile, radius_sq, TRUE);
758 }
760}
761
762/**********************************************************************/
768void map_show_tile(struct player *src_player, struct tile *ptile)
769{
770 log_debug("Showing %i,%i to %s", TILE_XY(ptile), player_name(src_player));
771
772#ifndef FREECIV_NDEBUG
773 static int recurse = 0;
774
775 fc_assert(recurse == 0);
776
777 recurse++;
778#endif /* !FREECIV_NDEBUG */
779
780 players_iterate(pplayer) {
781 if (pplayer == src_player || really_gives_vision(src_player, pplayer)) {
782 struct city *pcity;
783
784 if (!map_is_known_and_seen(ptile, pplayer, V_MAIN)) {
785 map_set_known(ptile, pplayer);
786
787 /* As the tile may be fogged send_tile_info won't always do this for us */
788 update_player_tile_knowledge(pplayer, ptile);
789 update_player_tile_last_seen(pplayer, ptile);
790
791 send_tile_info(pplayer->connections, ptile, FALSE);
792
793 /* Remove old cities that exist no more */
794 reality_check_city(pplayer, ptile);
795
796 if ((pcity = tile_city(ptile))) {
797 /* As the tile may be fogged send_city_info won't do this for us */
798 update_dumb_city(pplayer, pcity);
799 send_city_info(pplayer, pcity);
800 }
801
803 if (0 < map_get_seen(pplayer, ptile, v)) {
804 unit_list_iterate(ptile->units, punit) {
805 if (unit_is_on_layer(punit, v)) {
806 send_unit_info(pplayer->connections, punit);
807 }
809 }
811 }
812 }
814
815#ifndef FREECIV_NDEBUG
816 recurse--;
817#endif
818}
819
820/**********************************************************************/
825void map_hide_tile(struct player *src_player, struct tile *ptile)
826{
827 log_debug("Hiding %d,%d to %s", TILE_XY(ptile), player_name(src_player));
828
829#ifndef FREECIV_NDEBUG
830 static int recurse = 0;
831
832 fc_assert(recurse == 0);
833
834 recurse++;
835#endif /* !FREECIV_NDEBUG */
836
837 players_iterate(pplayer) {
838 if (pplayer == src_player || really_gives_vision(src_player, pplayer)) {
839 if (map_is_known(ptile, pplayer)) {
840 if (0 < map_get_seen(pplayer, ptile, V_MAIN)) {
841 update_player_tile_last_seen(pplayer, ptile);
842 }
843
844 /* Remove city. */
845 remove_dumb_city(pplayer, ptile);
846
847 /* Remove units. */
849 if (0 < map_get_seen(pplayer, ptile, v)) {
850 unit_list_iterate(ptile->units, punit) {
851 if (unit_is_on_layer(punit, v)) {
853 }
855 }
857 }
858
859 map_clear_known(ptile, pplayer);
860
861 send_tile_info(pplayer->connections, ptile, TRUE);
862 }
864
865#ifndef FREECIV_NDEBUG
866 recurse--;
867#endif
868}
869
870/**********************************************************************/
874void map_show_circle(struct player *pplayer, struct tile *ptile, int radius_sq)
875{
876 buffer_shared_vision(pplayer);
877
878 circle_iterate(&(wld.map), ptile, radius_sq, tile1) {
879 map_show_tile(pplayer, tile1);
881
882 unbuffer_shared_vision(pplayer);
883}
884
885/**********************************************************************/
889void map_show_all(struct player *pplayer)
890{
891 buffer_shared_vision(pplayer);
892
893 whole_map_iterate(&(wld.map), ptile) {
894 map_show_tile(pplayer, ptile);
896
897 unbuffer_shared_vision(pplayer);
898}
899
900/**********************************************************************/
904bool map_is_known(const struct tile *ptile, const struct player *pplayer)
905{
906 if (pplayer->tile_known.vec == NULL) {
907 /* Player map not initialized yet */
908 return FALSE;
909 }
910
911 return dbv_isset(&pplayer->tile_known, tile_index(ptile));
912}
913
914/**********************************************************************/
919static inline bool map_is_also_seen(const struct tile *ptile,
920 const struct player *pplayer,
921 enum vision_layer vlayer)
922{
923 return map_get_seen(pplayer, ptile, vlayer) > 0;
924}
925
926/**********************************************************************/
930bool map_is_known_and_seen(const struct tile *ptile,
931 const struct player *pplayer,
932 enum vision_layer vlayer)
933{
934 return map_is_known(ptile, pplayer) && map_is_also_seen(ptile, pplayer, vlayer);
935}
936
937/**********************************************************************/
944static inline int map_get_seen(const struct player *pplayer,
945 const struct tile *ptile,
946 enum vision_layer vlayer)
947{
948 return map_get_player_tile(ptile, pplayer)->seen_count[vlayer];
949}
950
951/**********************************************************************/
957void map_change_seen(struct player *pplayer,
958 struct tile *ptile,
959 const v_radius_t change,
960 bool can_reveal_tiles)
961{
962 struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
963 bool revealing_tile = FALSE;
964
965#ifdef FREECIV_DEBUG
966 log_debug("%s() for player %s (nb %d) at (%d, %d).",
967 __FUNCTION__, player_name(pplayer), player_number(pplayer),
968 TILE_XY(ptile));
970 log_debug(" vision layer %d is changing from %d to %d.",
971 v, plrtile->seen_count[v], plrtile->seen_count[v] + change[v]);
973#endif /* FREECIV_DEBUG */
974
975 /* Removes units out of vision. First, check invisible layers because
976 * we must remove all units before fog of war because clients expect
977 * the tile is empty when it is fogged. */
978 if (0 > change[V_INVIS]
979 && plrtile->seen_count[V_INVIS] == -change[V_INVIS]) {
980 log_debug("(%d, %d): hiding invisible units to player %s (nb %d).",
981 TILE_XY(ptile), player_name(pplayer), player_number(pplayer));
982
983 unit_list_iterate(ptile->units, punit) {
985 && can_player_see_unit(pplayer, punit)
986 && (plrtile->seen_count[V_MAIN] + change[V_MAIN] <= 0
987 || !pplayers_allied(pplayer, unit_owner(punit)))) {
988 /* Allied units on seen tiles (V_MAIN) are always seen.
989 * That's how can_player_see_unit_at() works. */
991 }
993 }
994 if (0 > change[V_SUBSURFACE]
995 && plrtile->seen_count[V_SUBSURFACE] == -change[V_SUBSURFACE]) {
996 log_debug("(%d, %d): hiding subsurface units to player %s (nb %d).",
997 TILE_XY(ptile), player_name(pplayer), player_number(pplayer));
998
999 unit_list_iterate(ptile->units, punit) {
1001 && can_player_see_unit(pplayer, punit)) {
1002 unit_goes_out_of_sight(pplayer, punit);
1003 }
1005 }
1006
1007 if (0 > change[V_MAIN]
1008 && plrtile->seen_count[V_MAIN] == -change[V_MAIN]) {
1009 log_debug("(%d, %d): hiding visible units to player %s (nb %d).",
1010 TILE_XY(ptile), player_name(pplayer), player_number(pplayer));
1011
1012 unit_list_iterate(ptile->units, punit) {
1014 && can_player_see_unit(pplayer, punit)) {
1015 unit_goes_out_of_sight(pplayer, punit);
1016 }
1018 }
1019
1021 /* Avoid underflow. */
1022 fc_assert(0 <= change[v] || -change[v] <= plrtile->seen_count[v]);
1023 plrtile->seen_count[v] += change[v];
1025
1026 /* V_MAIN vision ranges must always be more than invisible ranges
1027 * (see comment in common/vision.h), so we assume that the V_MAIN
1028 * seen count cannot be inferior to V_INVIS or V_SUBSURFACE seen count.
1029 * Moreover, when the fog of war is disabled, V_MAIN has an extra
1030 * seen count point. */
1031 fc_assert(plrtile->seen_count[V_INVIS] + !game.info.fogofwar
1032 <= plrtile->seen_count[V_MAIN]);
1034 <= plrtile->seen_count[V_MAIN]);
1035
1036 if (!map_is_known(ptile, pplayer)) {
1037 if (0 < plrtile->seen_count[V_MAIN] && can_reveal_tiles) {
1038 log_debug("(%d, %d): revealing tile to player %s (nb %d).",
1039 TILE_XY(ptile), player_name(pplayer),
1040 player_number(pplayer));
1041
1042 map_set_known(ptile, pplayer);
1044 } else {
1045 return;
1046 }
1047 }
1048
1049 /* Fog the tile. */
1050 if (0 > change[V_MAIN] && 0 == plrtile->seen_count[V_MAIN]) {
1051 struct city *pcity;
1052
1053 log_debug("(%d, %d): fogging tile for player %s (nb %d).",
1054 TILE_XY(ptile), player_name(pplayer), player_number(pplayer));
1055
1056 pcity = ptile->worked;
1057
1058 if (pcity != NULL && city_owner(pcity) == pplayer) {
1059 city_map_update_empty(pcity, ptile);
1061 if (pcity->server.needs_arrange == CNA_NOT) {
1063 }
1064 }
1065
1066 update_player_tile_last_seen(pplayer, ptile);
1068 plrtile->owner = tile_owner(ptile);
1069 }
1070 plrtile->extras_owner = extra_owner(ptile);
1071 send_tile_info(pplayer->connections, ptile, FALSE);
1072 }
1073
1074 if ((revealing_tile && 0 < plrtile->seen_count[V_MAIN])
1075 || (0 < change[V_MAIN]
1076 /* plrtile->seen_count[V_MAIN] Always set to 1
1077 * when the fog of war is disabled. */
1078 && (change[V_MAIN] + !game.info.fogofwar
1079 == (plrtile->seen_count[V_MAIN])))) {
1080 struct city *pcity;
1081
1082 log_debug("(%d, %d): unfogging tile for player %s (nb %d).",
1083 TILE_XY(ptile), player_name(pplayer), player_number(pplayer));
1084
1085 /* Send info about the tile itself.
1086 * It has to be sent first because the client needs correct
1087 * continent number before it can handle following packets
1088 */
1089 update_player_tile_knowledge(pplayer, ptile);
1090 send_tile_info(pplayer->connections, ptile, FALSE);
1091
1092 /* Discover units. */
1093 unit_list_iterate(ptile->units, punit) {
1094 /* Be sure not to revive dead unit on client when it's not yet
1095 * removed from the tile. This could happen when "unit_lost" lua script
1096 * somehow causes tile of the dead unit to unfog again. */
1098 && !punit->server.dying) {
1099 send_unit_info(pplayer->connections, punit);
1100 }
1102
1103 /* Discover cities. */
1104 reality_check_city(pplayer, ptile);
1105
1106 if (NULL != (pcity = tile_city(ptile))) {
1107 send_city_info(pplayer, pcity);
1108 }
1109 }
1110
1111 if ((revealing_tile && 0 < plrtile->seen_count[V_INVIS])
1112 || (0 < change[V_INVIS]
1113 && change[V_INVIS] == plrtile->seen_count[V_INVIS])) {
1114 log_debug("(%d, %d): revealing invisible units to player %s (nb %d).",
1115 TILE_XY(ptile), player_name(pplayer),
1116 player_number(pplayer));
1117 /* Discover units. */
1118 unit_list_iterate(ptile->units, punit) {
1120 send_unit_info(pplayer->connections, punit);
1121 }
1123 }
1124 if ((revealing_tile && 0 < plrtile->seen_count[V_SUBSURFACE])
1125 || (0 < change[V_SUBSURFACE]
1126 && change[V_SUBSURFACE] == plrtile->seen_count[V_SUBSURFACE])) {
1127 log_debug("(%d, %d): revealing subsurface units to player %s (nb %d).",
1128 TILE_XY(ptile), player_name(pplayer),
1129 player_number(pplayer));
1130 /* Discover units. */
1131 unit_list_iterate(ptile->units, punit) {
1133 send_unit_info(pplayer->connections, punit);
1134 }
1136 }
1137}
1138
1139/**********************************************************************/
1146static inline int player_tile_own_seen(const struct player_tile *plrtile,
1147 enum vision_layer vlayer)
1148{
1149 return plrtile->own_seen[vlayer];
1150}
1151
1152/**********************************************************************/
1155static void map_change_own_seen(struct player *pplayer,
1156 struct tile *ptile,
1157 const v_radius_t change)
1158{
1159 struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
1160
1162 plrtile->own_seen[v] += change[v];
1164}
1165
1166/**********************************************************************/
1170 struct vision_site *new_site)
1171{
1172 if (ptile->site == new_site) {
1173 /* Do nothing. */
1174 return;
1175 }
1176
1177 if (ptile->site != NULL) {
1178 /* Releasing old site from tile */
1179 vision_site_destroy(ptile->site);
1180 }
1181
1182 ptile->site = new_site;
1183}
1184
1185/**********************************************************************/
1188void map_set_known(struct tile *ptile, struct player *pplayer)
1189{
1190 dbv_set(&pplayer->tile_known, tile_index(ptile));
1191}
1192
1193/**********************************************************************/
1196void map_clear_known(struct tile *ptile, struct player *pplayer)
1197{
1198 dbv_clr(&pplayer->tile_known, tile_index(ptile));
1199}
1200
1201/**********************************************************************/
1206void map_know_and_see_all(struct player *pplayer)
1207{
1208 const v_radius_t radius_sq = V_RADIUS(1, 1, 1);
1209
1210 buffer_shared_vision(pplayer);
1211 whole_map_iterate(&(wld.map), ptile) {
1212 map_change_seen(pplayer, ptile, radius_sq, TRUE);
1214 unbuffer_shared_vision(pplayer);
1215}
1216
1217/**********************************************************************/
1221{
1222 players_iterate(pplayer) {
1223 map_know_and_see_all(pplayer);
1225}
1226
1227/**********************************************************************/
1231void player_map_init(struct player *pplayer)
1232{
1233 pplayer->server.private_map
1234 = fc_realloc(pplayer->server.private_map,
1235 MAP_INDEX_SIZE * sizeof(*pplayer->server.private_map));
1236
1237 whole_map_iterate(&(wld.map), ptile) {
1238 player_tile_init(ptile, pplayer);
1240
1242}
1243
1244/**********************************************************************/
1247void player_map_free(struct player *pplayer)
1248{
1249 if (!pplayer->server.private_map) {
1250 return;
1251 }
1252
1253 whole_map_iterate(&(wld.map), ptile) {
1254 player_tile_free(ptile, pplayer);
1256
1257 free(pplayer->server.private_map);
1258 pplayer->server.private_map = NULL;
1259
1260 dbv_free(&pplayer->tile_known);
1261}
1262
1263/**********************************************************************/
1268void remove_player_from_maps(struct player *pplayer)
1269{
1270 /* only after removing borders! */
1272 whole_map_iterate(&(wld.map), ptile) {
1273 /* Clear all players' knowledge about the removed player, and free
1274 * data structures (including those in removed player's player map). */
1275 bool reality_changed = FALSE;
1276
1278 struct player_tile *aplrtile;
1279 bool changed = FALSE;
1280
1281 if (!aplayer->server.private_map) {
1282 continue;
1283 }
1285
1286 /* Free vision sites (cities) for removed and other players */
1287 if (aplrtile && aplrtile->site
1288 && vision_site_owner(aplrtile->site) == pplayer) {
1290 changed = TRUE;
1291 }
1292
1293 /* Remove references to player from others' maps */
1294 if (aplrtile->owner == pplayer) {
1295 aplrtile->owner = NULL;
1296 changed = TRUE;
1297 }
1298 if (aplrtile->extras_owner == pplayer) {
1299 aplrtile->extras_owner = NULL;
1300 changed = TRUE;
1301 }
1302
1303 /* Must ensure references to dying player are gone from clients
1304 * before player is destroyed */
1305 if (changed) {
1306 /* This will use player tile if fogged */
1307 send_tile_info(pplayer->connections, ptile, FALSE);
1308 }
1310
1311 /* Clear removed player's knowledge */
1312 if (pplayer->tile_known.vec) {
1313 map_clear_known(ptile, pplayer);
1314 }
1315
1316 /* Free all claimed tiles. */
1317 if (tile_owner(ptile) == pplayer) {
1318 tile_set_owner(ptile, NULL, NULL);
1320 }
1321 if (extra_owner(ptile) == pplayer) {
1322 ptile->extras_owner = NULL;
1324 }
1325
1326 if (reality_changed) {
1327 /* Update anyone who can see the tile (e.g. global observers) */
1328 send_tile_info(NULL, ptile, FALSE);
1329 }
1332}
1333
1334/**********************************************************************/
1338static void player_tile_init(struct tile *ptile, struct player *pplayer)
1339{
1340 struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
1341
1342 plrtile->terrain = T_UNKNOWN;
1343 plrtile->resource = NULL;
1344 plrtile->owner = NULL;
1345 plrtile->extras_owner = NULL;
1346 plrtile->site = NULL;
1347 dbv_init(&(plrtile->extras), extra_count());
1349 plrtile->last_updated = game.info.turn;
1350 } else {
1351 plrtile->last_updated = game.info.year;
1352 }
1353
1354 plrtile->seen_count[V_MAIN] = !game.server.fogofwar_old;
1355 plrtile->seen_count[V_INVIS] = 0;
1356 plrtile->seen_count[V_SUBSURFACE] = 0;
1357 memcpy(plrtile->own_seen, plrtile->seen_count, sizeof(v_radius_t));
1358}
1359
1360/**********************************************************************/
1363static void player_tile_free(struct tile *ptile, struct player *pplayer)
1364{
1365 struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
1366
1367 if (plrtile->site != NULL) {
1369 }
1370
1371 dbv_free(&(plrtile->extras));
1372}
1373
1374/**********************************************************************/
1377struct vision_site *map_get_player_city(const struct tile *ptile,
1378 const struct player *pplayer)
1379{
1380 struct vision_site *psite = map_get_player_site(ptile, pplayer);
1381
1382 fc_assert_ret_val(psite == NULL || psite->location == ptile, NULL);
1383
1384 return psite;
1385}
1386
1387/**********************************************************************/
1392struct player_tile *map_get_player_tile(const struct tile *ptile,
1393 const struct player *pplayer)
1394{
1396
1397 return pplayer->server.private_map + tile_index(ptile);
1398}
1399
1400/**********************************************************************/
1408bool update_player_tile_knowledge(struct player *pplayer, struct tile *ptile)
1409{
1410 struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
1411
1412 if (plrtile->terrain != ptile->terrain
1413 || !bv_match_dbv(&(plrtile->extras), ptile->extras.vec)
1414 || plrtile->resource != ptile->resource
1415 || plrtile->owner != tile_owner(ptile)
1416 || plrtile->extras_owner != extra_owner(ptile)) {
1417 plrtile->terrain = ptile->terrain;
1418 extra_type_iterate(pextra) {
1419 if (player_knows_extra_exist(pplayer, pextra, ptile)) {
1420 dbv_set(&(plrtile->extras), extra_number(pextra));
1421 } else {
1422 dbv_clr(&(plrtile->extras), extra_number(pextra));
1423 }
1425 if (ptile->resource != NULL
1426 && player_knows_extra_exist(pplayer, ptile->resource, ptile)) {
1427 plrtile->resource = ptile->resource;
1428 } else {
1430 }
1431 plrtile->owner = tile_owner(ptile);
1432 plrtile->extras_owner = extra_owner(ptile);
1433
1434 return TRUE;
1435 }
1436
1437 return FALSE;
1438}
1439
1440/**********************************************************************/
1449void update_tile_knowledge(struct tile *ptile)
1450{
1451 if (server_state() == S_S_INITIAL) {
1452 return;
1453 }
1454
1455 /* Players */
1456 players_iterate(pplayer) {
1457 if (map_is_known_and_seen(ptile, pplayer, V_MAIN)) {
1458 if (update_player_tile_knowledge(pplayer, ptile)) {
1459 send_tile_info(pplayer->connections, ptile, FALSE);
1460 }
1461 }
1463
1464 /* Global observers */
1466 struct player *pplayer = pconn->playing;
1467
1468 if (NULL == pplayer && pconn->observer) {
1469 send_tile_info(pconn->self, ptile, FALSE);
1470 }
1472}
1473
1474/**********************************************************************/
1478 struct tile *ptile)
1479{
1481 map_get_player_tile(ptile, pplayer)->last_updated = game.info.turn;
1482 } else {
1483 map_get_player_tile(ptile, pplayer)->last_updated = game.info.year;
1484 }
1485}
1486
1487/**********************************************************************/
1496 struct player *pdest,
1497 struct tile *ptile)
1498{
1499 if (!map_is_known_and_seen(ptile, pdest, V_MAIN)) {
1500 /* I can just hear people scream as they try to comprehend this if :).
1501 * Let me try in words:
1502 * 1) if the tile is seen by pfrom the info is sent to pdest
1503 * OR
1504 * 2) if the tile is known by pfrom AND (they have more recent info
1505 * OR it is not known by pdest)
1506 */
1508 || (map_is_known(ptile, pfrom)
1509 && (((map_get_player_tile(ptile, pfrom)->last_updated
1510 > map_get_player_tile(ptile, pdest)->last_updated))
1511 || !map_is_known(ptile, pdest)))) {
1512 struct player_tile *from_tile, *dest_tile;
1513
1515 dest_tile = map_get_player_tile(ptile, pdest);
1516 /* Update and send tile knowledge */
1517 map_set_known(ptile, pdest);
1518 dest_tile->terrain = from_tile->terrain;
1519 dbv_copy(&(dest_tile->extras), &(from_tile->extras));
1520 dest_tile->resource = from_tile->resource;
1521 dest_tile->owner = from_tile->owner;
1522 dest_tile->extras_owner = from_tile->extras_owner;
1523 dest_tile->last_updated = from_tile->last_updated;
1524 send_tile_info(pdest->connections, ptile, FALSE);
1525
1526 /* Update and send city knowledge */
1527 /* Remove outdated cities */
1528 if (dest_tile->site) {
1529 if (!from_tile->site) {
1530 /* As the city was gone on the newer from_tile
1531 it will be removed by this function */
1532 reality_check_city(pdest, ptile);
1533 } else { /* We have a dest_city. update */
1534 if (from_tile->site->identity
1535 != dest_tile->site->identity) {
1536 /* As the city was gone on the newer from_tile
1537 it will be removed by this function */
1538 reality_check_city(pdest, ptile);
1539 }
1540 }
1541 }
1542
1543 /* Set and send new city info */
1544 if (from_tile->site) {
1545 if (!dest_tile->site) {
1546 /* We cannot assign new vision site with change_playertile_site(),
1547 * since location is not yet set up for new site */
1548 dest_tile->site = vision_site_copy(from_tile->site);
1549 }
1550 /* Note that we don't care if receiver knows vision source city
1551 * or not. */
1552 send_city_info_at_tile(pdest, pdest->connections, NULL, ptile);
1553 }
1554
1556
1557 return TRUE;
1558 }
1559 }
1560
1561 return FALSE;
1562}
1563
1564/**********************************************************************/
1578
1579/**********************************************************************/
1589 struct player *pdest,
1590 struct tile *ptile)
1591{
1593
1597 }
1599
1600 return updt;
1601}
1602
1603/**********************************************************************/
1609{
1610 int added;
1611
1612 players_iterate(pplayer) {
1613 pplayer->server.really_gives_vision = pplayer->gives_shared_vision;
1615
1616 /* In words: This terminates when it has run a round without adding
1617 a dependency. One loop only propagates dependencies one level deep,
1618 which is why we keep doing it as long as changes occur. */
1619 do {
1620 added = 0;
1621 players_iterate(pplayer) {
1623 if (really_gives_vision(pplayer, pplayer2)
1624 && pplayer != pplayer2) {
1627 && !really_gives_vision(pplayer, pplayer3)
1628 && pplayer != pplayer3) {
1629 BV_SET(pplayer->server.really_gives_vision, player_index(pplayer3));
1630 added++;
1631 }
1633 }
1636 } while (added > 0);
1637}
1638
1639/**********************************************************************/
1643{
1645
1646 if (pfrom == pto) {
1647 return;
1648 }
1649
1651 log_error("Trying to give shared vision from %s to %s, "
1652 "but that vision is already given!",
1654 return;
1655 }
1656
1657 players_iterate(pplayer) {
1658 save_vision[player_index(pplayer)] = pplayer->server.really_gives_vision;
1660
1661 BV_SET(pfrom->gives_shared_vision, player_index(pto));
1663 log_debug("giving shared vision from %s to %s",
1665
1666 players_iterate(pplayer) {
1667 buffer_shared_vision(pplayer);
1669 if (really_gives_vision(pplayer, pplayer2)
1670 && !BV_ISSET(save_vision[player_index(pplayer)],
1672 log_debug("really giving shared vision from %s to %s",
1673 player_name(pplayer), player_name(pplayer2));
1674 whole_map_iterate(&(wld.map), ptile) {
1675 const struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
1676 const v_radius_t change =
1680
1681 if (0 < change[V_MAIN] || 0 < change[V_INVIS]) {
1682 map_change_seen(pplayer2, ptile, change,
1683 map_is_known(ptile, pplayer));
1684 }
1686
1687 /* Squares that are not seen, but which pfrom may have more recent
1688 knowledge of */
1690 }
1692 unbuffer_shared_vision(pplayer);
1694
1695 if (S_S_RUNNING == server_state()) {
1697 }
1698}
1699
1700/**********************************************************************/
1704{
1706
1708 if (!gives_shared_vision(pfrom, pto)) {
1709 log_error("Tried removing the shared vision from %s to %s, "
1710 "but it did not exist in the first place!",
1712 return;
1713 }
1714
1715 players_iterate(pplayer) {
1716 save_vision[player_index(pplayer)] = pplayer->server.really_gives_vision;
1718
1719 log_debug("removing shared vision from %s to %s",
1721
1722 BV_CLR(pfrom->gives_shared_vision, player_index(pto));
1724
1725 players_iterate(pplayer) {
1726 buffer_shared_vision(pplayer);
1728 if (!really_gives_vision(pplayer, pplayer2)
1729 && BV_ISSET(save_vision[player_index(pplayer)],
1731 log_debug("really removing shared vision from %s to %s",
1732 player_name(pplayer), player_name(pplayer2));
1733 whole_map_iterate(&(wld.map), ptile) {
1734 const struct player_tile *plrtile = map_get_player_tile(ptile, pplayer);
1735 const v_radius_t change =
1739
1740 if (0 > change[V_MAIN] || 0 > change[V_INVIS]) {
1741 map_change_seen(pplayer2, ptile, change, FALSE);
1742 }
1744 }
1746 unbuffer_shared_vision(pplayer);
1748
1749 if (S_S_RUNNING == server_state()) {
1751 }
1752}
1753
1754/**********************************************************************/
1758{
1759 const v_radius_t radius_sq = V_RADIUS(-1, 0, 0);
1760
1762
1763 buffer_shared_vision(pplayer);
1764 whole_map_iterate(&(wld.map), ptile) {
1765 map_change_seen(pplayer, ptile, radius_sq, FALSE);
1767 unbuffer_shared_vision(pplayer);
1768}
1769
1770/**********************************************************************/
1774{
1775 players_iterate(pplayer) {
1776 enable_fog_of_war_player(pplayer);
1778}
1779
1780/**********************************************************************/
1784{
1785 const v_radius_t radius_sq = V_RADIUS(1, 0, 0);
1786
1788
1789 buffer_shared_vision(pplayer);
1790 whole_map_iterate(&(wld.map), ptile) {
1791 map_change_seen(pplayer, ptile, radius_sq, FALSE);
1793 unbuffer_shared_vision(pplayer);
1794}
1795
1796/**********************************************************************/
1800{
1801 players_iterate(pplayer) {
1804}
1805
1806/**********************************************************************/
1815static void ocean_to_land_fix_rivers(struct tile *ptile)
1816{
1817 cardinal_adjc_iterate(&(wld.map), ptile, tile1) {
1818 bool ocean_near = FALSE;
1819
1821 if (is_ocean_tile(tile2))
1822 ocean_near = TRUE;
1824
1825 if (!ocean_near) {
1826 /* If ruleset has several river types defined, this
1827 * may cause same tile to contain more than one river. */
1831 tile_add_extra(ptile, priver);
1832 }
1834 }
1836}
1837
1838/**********************************************************************/
1842 struct tile *from)
1843{
1844 bool unit_alive = TRUE;
1845
1846 /* Look for a nearby safe tile */
1847 adjc_iterate(&(wld.map), from, ptile2) {
1851 log_verbose("Moved %s %s due to changing terrain at (%d,%d).",
1856 _("Moved your %s due to changing terrain."),
1857 unit_link(punit));
1858
1859 /* TODO: should a unit be able to bounce to a transport like is
1860 * done below? What if the unit can't legally enter the transport,
1861 * say because the transport is Unreachable and the unit doesn't
1862 * have it in its embarks field or because "Transport Embark"
1863 * isn't enabled? Kept like it was to preserve the old rules for
1864 * now. -- Sveinung */
1869 }
1870 break;
1871 }
1873
1874 if (unit_alive && unit_tile(punit) == from) {
1875 /* If we get here we could not move punit. */
1876
1877 /* Try to bounce transported units. */
1879 struct unit_list *pcargo_units;
1880
1885 }
1886 }
1887}
1888
1889/**********************************************************************/
1895static void check_units_single_tile(struct tile *ptile)
1896{
1897 const struct civ_map *nmap = &(wld.map);
1898
1900 int id = punit->id;
1901
1902 /* Top-level transports only. Each handle their own cargo */
1904 && !can_unit_exist_at_tile(nmap, punit, ptile)) {
1906
1907 if (unit_is_alive(id) && unit_tile(punit) == ptile) {
1908 log_verbose("Disbanded %s %s due to changing terrain "
1909 "at (%d, %d).",
1911 unit_rule_name(punit), TILE_XY(ptile));
1914 _("Disbanded your %s due to changing terrain."),
1917 }
1918 }
1920}
1921
1922/**********************************************************************/
1930{
1931 const struct civ_map *nmap = &(wld.map);
1932
1933 /* Check this tile for direct effect on its units */
1935 /* We have to check adjacent tiles too, in case units in cities are now
1936 * illegal (e.g., boat in a city that has become landlocked),
1937 * and in case of CoastStrict units losing their adjacent coast. */
1938 adjc_iterate(nmap, ptile, ptile2) {
1941}
1942
1943/**********************************************************************/
1948 const struct terrain *newter)
1949{
1951
1952 if (!oldter || !newter) {
1953 return FALSE;
1954 }
1955
1958
1959 return (old_is_ocean && !new_is_ocean)
1960 || (!old_is_ocean && new_is_ocean);
1961}
1962
1963/**********************************************************************/
1966void terrain_changed(struct tile *ptile)
1967{
1968 struct city *pcity = tile_city(ptile);
1969
1970 if (pcity != NULL) {
1971 /* Tile is city center and new terrain may support better extras. */
1972 upgrade_city_extras(pcity, NULL);
1973 }
1974
1976}
1977
1978/**********************************************************************/
1986 struct terrain *oldter,
1987 bool extend_rivers)
1988{
1989 if (is_ocean(oldter) && !is_ocean_tile(ptile)) {
1990 if (extend_rivers) {
1992 }
1994 }
1995
1996 terrain_changed(ptile);
1997}
1998
1999/**********************************************************************/
2005void check_terrain_change(struct tile *ptile, struct terrain *oldter)
2006{
2007 struct terrain *newter = tile_terrain(ptile);
2008 struct tile *claimer;
2009 bool cont_reassigned = FALSE;
2010
2011 /* Check if new terrain is a freshwater terrain next to non-freshwater.
2012 * In that case, the new terrain is *changed*. */
2014 bool nonfresh = FALSE;
2015
2016 adjc_iterate(&(wld.map), ptile, atile) {
2019 nonfresh = TRUE;
2020 break;
2021 }
2023 if (nonfresh) {
2024 /* Need to pick a new, non-freshwater ocean type for this tile.
2025 * We don't want e.g. Deep Ocean to be propagated to this tile
2026 * and then to a whole lake by the flooding below, so we pick
2027 * the shallowest non-fresh oceanic type.
2028 * Prefer terrain that matches the frozenness of the target. */
2031 }
2032 }
2033
2037
2038 phase_players_iterate(pplayer) {
2039 if (is_adv_data_phase_open(pplayer)) {
2040 /* Player is using continent numbers that they would assume to remain accurate.
2041 * Force refresh:
2042 * 1) Close the phase, so that it can be opened
2043 * 2) Open the phase, recalculating
2044 */
2045 adv_data_phase_done(pplayer);
2046 adv_data_phase_init(pplayer, FALSE);
2047 }
2049 }
2050
2052
2053 /* Check for saltwater filling freshwater lake */
2056 adjc_iterate(&(wld.map), ptile, atile) {
2058 struct terrain *aold = tile_terrain(atile);
2059
2062 TER_FROZEN)));
2063
2064 /* Recursive, but as lakes are of limited size, this
2065 * won't recurse so much as to cause stack problems. */
2068 }
2070 }
2071
2072 if (cont_reassigned) {
2074 }
2075
2076 claimer = tile_claimer(ptile);
2077 if (claimer != NULL) {
2078 /* Make sure map_claim_border() conditions are still satisfied */
2079 if (is_ocean_tile(ptile)) {
2080 /* Only certain water tiles are claimable */
2081 if (!is_claimable_ocean(ptile, claimer, tile_owner(ptile))) {
2082 map_clear_border(ptile);
2083 }
2084 } else {
2085 /* Only land tiles on the same island as the border source
2086 * are claimable */
2087 if (tile_continent(ptile) != tile_continent(claimer)) {
2088 map_clear_border(ptile);
2089 }
2090 }
2091 }
2092
2093 sanity_check_tile(ptile);
2094}
2095
2096/**********************************************************************/
2107static bool is_claimable_ocean(struct tile *ptile, struct tile *source,
2108 struct player *pplayer)
2109{
2110 Continent_id cont = tile_continent(ptile);
2112 int ocean_tiles;
2113 bool other_continent;
2114
2116 && get_lake_surrounders(cont) == source_cont) {
2117 return TRUE;
2118 }
2119
2120 if (ptile == source) {
2121 /* Source itself is always claimable. */
2122 return TRUE;
2123 }
2124
2127 return TRUE;
2128 }
2129
2130 ocean_tiles = 0;
2132 adjc_iterate(&(wld.map), ptile, adj_tile) {
2134 if (adj_tile == source) {
2135 /* Water next to border source is always claimable */
2136 return TRUE;
2137 }
2138 if (adj_cont == cont) {
2139 ocean_tiles++;
2140 } else if (adj_cont != source_cont) {
2141 /* This water is adjacent to a continent different from the one
2142 * the border source is on */
2144 }
2146 if (!other_continent && ocean_tiles <= 2) {
2147 return TRUE;
2148 } else {
2149 return FALSE;
2150 }
2151}
2152
2153/**********************************************************************/
2156static void map_unit_homecity_enqueue(struct tile *ptile)
2157{
2158 unit_list_iterate(ptile->units, punit) {
2160
2161 if (NULL == phome) {
2162 continue;
2163 }
2164
2167}
2168
2169/**********************************************************************/
2172static void map_claim_border_ownership(struct tile *ptile,
2173 struct player *powner,
2174 struct tile *psource)
2175{
2176 struct player *ploser = tile_owner(ptile);
2177
2178 if ((ploser != powner && ploser != NULL)
2181 || ploser->server.border_vision)) {
2182 const v_radius_t radius_sq = V_RADIUS(-1, 0, 0);
2183
2184 shared_vision_change_seen(ploser, ptile, radius_sq, FALSE);
2185 }
2186
2187 if (powner != NULL
2190 || powner->server.border_vision)) {
2191 const v_radius_t radius_sq = V_RADIUS(1, 0, 0);
2192
2193 shared_vision_change_seen(powner, ptile, radius_sq, TRUE);
2194 }
2195
2196 tile_set_owner(ptile, powner, psource);
2197
2198 /* Needed only when foggedborders enabled, but we do it unconditionally
2199 * in case foggedborders ever gets enabled later. Better to have correct
2200 * information in player map just in case. */
2201 update_tile_knowledge(ptile);
2202
2203 if (ploser != powner) {
2206 }
2207
2208 if (!city_map_update_tile_frozen(ptile)) {
2209 send_tile_info(NULL, ptile, FALSE);
2210 }
2211 }
2212}
2213
2214/**********************************************************************/
2217void map_claim_ownership(struct tile *ptile, struct player *powner,
2218 struct tile *psource, bool claim_bases)
2219{
2220 map_claim_border_ownership(ptile, powner, psource);
2221
2222 if (claim_bases) {
2223 tile_claim_bases(ptile, powner);
2224 }
2225}
2226
2227/**********************************************************************/
2230void tile_claim_bases(struct tile *ptile, struct player *powner)
2231{
2232 struct player *base_loser = extra_owner(ptile);
2233
2234 /* This MUST be before potentially recursive call to map_claim_base(),
2235 * so that the recursive call will get new owner == base_loser and
2236 * abort recursion. */
2237 ptile->extras_owner = powner;
2238
2240 map_claim_base(ptile, pextra, powner, base_loser);
2242}
2243
2244/**********************************************************************/
2247void map_clear_border(struct tile *ptile)
2248{
2249 int radius_sq = tile_border_source_radius_sq(ptile);
2250
2251 circle_dxyr_iterate(&(wld.map), ptile, radius_sq, dtile, dx, dy, dr) {
2252 struct tile *claimer = tile_claimer(dtile);
2253
2254 if (claimer == ptile) {
2256 }
2258}
2259
2260/**********************************************************************/
2264void map_update_border(struct tile *ptile, struct player *owner,
2266{
2268 /* No change */
2269 return;
2270 }
2271
2273 return;
2274 }
2275
2278 } else {
2279 circle_dxyr_iterate(&(wld.map), ptile, old_radius_sq, dtile, dx, dy, dr) {
2280 if (dr > new_radius_sq) {
2281 struct tile *claimer = tile_claimer(dtile);
2282
2283 if (claimer == ptile) {
2285 }
2286 }
2288 }
2289}
2290
2291/**********************************************************************/
2296void map_claim_border(struct tile *ptile, struct player *owner,
2297 int radius_sq)
2298{
2300 return;
2301 }
2302
2303 if (owner == NULL) {
2304 /* Clear the border instead of claiming. Code below this block
2305 * cannot handle NULL owner. */
2306 map_clear_border(ptile);
2307
2308 return;
2309 }
2310
2311 if (radius_sq < 0) {
2312 radius_sq = tile_border_source_radius_sq(ptile);
2313 }
2314
2315 circle_dxyr_iterate(&(wld.map), ptile, radius_sq, dtile, dx, dy, dr) {
2316 struct tile *dclaimer = tile_claimer(dtile);
2317
2318 if (dclaimer == ptile) {
2319 /* Already claimed by the ptile */
2320 continue;
2321 }
2322
2323 if (dr != 0 && is_border_source(dtile)) {
2324 /* Do not claim border sources other than self */
2325 /* Note that this is extremely important at the moment for
2326 * base claiming to work correctly in case there's two
2327 * fortresses near each other. There could be infinite
2328 * recursion in them claiming each other. */
2329 continue;
2330 }
2331
2333 continue;
2334 }
2335
2336 /* Always claim source itself (distance, dr, to it 0) */
2337 if (dr != 0 && NULL != dclaimer && dclaimer != ptile) {
2338 struct city *ccity = tile_city(dclaimer);
2340
2341 if (ccity != NULL) {
2342 /* Previously claimed by city */
2343 int city_x, city_y;
2344
2346
2350 /* Tile is within region permanently claimed by city */
2351 continue;
2352 }
2353 }
2354
2357
2358 if (strength_new <= strength_old) {
2359 /* Stronger shall prevail,
2360 * in case of equal strength older shall prevail */
2361 continue;
2362 }
2363 }
2364
2365 if (is_ocean_tile(dtile)) {
2366 /* Only certain water tiles are claimable */
2367 if (is_claimable_ocean(dtile, ptile, owner)) {
2368 map_claim_ownership(dtile, owner, ptile, dr == 0);
2369 }
2370 } else {
2371 /* Only land tiles on the same island as the border source
2372 * are claimable */
2373 if (tile_continent(dtile) == tile_continent(ptile)) {
2374 map_claim_ownership(dtile, owner, ptile, dr == 0);
2375 }
2376 }
2378}
2379
2380/**********************************************************************/
2384{
2386 return;
2387 }
2388
2389 if (wld.map.tiles == NULL) {
2390 /* Map not yet initialized */
2391 return;
2392 }
2393
2394 log_verbose("map_calculate_borders()");
2395
2396 whole_map_iterate(&(wld.map), ptile) {
2397 if (is_border_source(ptile)) {
2398 map_claim_border(ptile, ptile->owner, -1);
2399 }
2401
2402 log_verbose("map_calculate_borders() workers");
2405}
2406
2407/**********************************************************************/
2410void map_claim_base(struct tile *ptile, struct extra_type *pextra,
2411 struct player *powner, struct player *ploser)
2412{
2413 struct base_type *pbase;
2415 int units_num = 0;
2416 int ul_size;
2417
2418 if (!tile_has_extra(ptile, pextra)) {
2419 return;
2420 }
2421
2422 if (pextra->eus != EUS_NORMAL) {
2423 ul_size = unit_list_size(ptile->units);
2424 } else {
2425 ul_size = 0;
2426 }
2427
2428 int stored_units[ul_size + 1];
2429
2430 if (ul_size > 0) {
2431 int i;
2432
2434
2435 unit_list_iterate(ptile->units, aunit) {
2436 stored_units[units_num++] = aunit->id;
2438
2440
2441 for (i = 0; i < units_num; i++) {
2443
2448 }
2450 }
2451 }
2452
2453 pbase = extra_base_get(pextra);
2454
2456
2457 /* Transfer base provided vision to new owner */
2458 if (powner != NULL) {
2459 const v_radius_t old_radius_sq = V_RADIUS(-1, -1, -1);
2460 const v_radius_t new_radius_sq = V_RADIUS(pbase->vision_main_sq,
2461 pbase->vision_invis_sq,
2462 pbase->vision_subs_sq);
2463
2466 }
2467
2468 if (ploser != NULL) {
2469 const v_radius_t old_radius_sq = V_RADIUS(pbase->vision_main_sq,
2470 pbase->vision_invis_sq,
2471 pbase->vision_subs_sq);
2472 const v_radius_t new_radius_sq = V_RADIUS(-1, -1, -1);
2473
2476 }
2477
2479 && territory_claiming_base(pbase) && powner != ploser) {
2480 /* Clear borders from old owner. New owner may not know all those
2481 * tiles and thus does not claim them when borders mode is less
2482 * than EXPAND. */
2483 if (ploser != NULL) {
2484 /* Set this particular tile owner by NULL so in recursion
2485 * both loser and owner will be NULL. */
2486 map_claim_border_ownership(ptile, NULL, ptile);
2487 map_clear_border(ptile);
2488 }
2489
2490 /* We here first claim this tile ownership -> now on extra_owner()
2491 * will return new owner. Then we claim border, which will recursively
2492 * lead to this tile and base being claimed. But at that point
2493 * ploser == powner and above check will abort the recursion. */
2494 if (powner != NULL) {
2495 map_claim_border_ownership(ptile, powner, ptile);
2496 map_claim_border(ptile, powner, -1);
2497 }
2500 }
2501
2502 if (units_num > 0) {
2503 int i;
2504
2505 for (i = 0; i < units_num; i++) {
2507
2511 send_unit_info(aplayer->connections, aunit);
2512 }
2513 } else {
2516 }
2517 }
2519 }
2520
2522 }
2523}
2524
2525/**********************************************************************/
2531void vision_change_sight(struct vision *vision, const v_radius_t radius_sq)
2532{
2534 radius_sq, vision->can_reveal_tiles);
2535 memcpy(vision->radius_sq, radius_sq, sizeof(v_radius_t));
2536}
2537
2538/**********************************************************************/
2544{
2545 const v_radius_t vision_radius_sq = V_RADIUS(-1, -1, -1);
2546
2547 vision_change_sight(vision, vision_radius_sq);
2548
2549 /* Owner of some city might have lost vision of a tile previously worked */
2550 players_iterate(pplayer) {
2551 city_list_iterate(pplayer->cities, pcity) {
2552 /* We are not interested about CNA_BROADCAST_PENDING, as the vision loss has
2553 * not set it, and whatever set it should take care of it. */
2554 if (pcity->server.needs_arrange == CNA_NORMAL) {
2555 city_refresh(pcity);
2556 auto_arrange_workers(pcity);
2557 pcity->server.needs_arrange = CNA_NOT;
2558 }
2561}
2562
2563/**********************************************************************/
2566void create_extra(struct tile *ptile, struct extra_type *pextra,
2567 struct player *pplayer)
2568{
2569 bool extras_removed = FALSE;
2570
2572 if (tile_has_extra(ptile, old_extra)
2573 && !can_extras_coexist(old_extra, pextra)) {
2574 destroy_extra(ptile, old_extra);
2576 }
2578
2579 if (pextra->eus != EUS_NORMAL) {
2580 unit_list_iterate(ptile->units, aunit) {
2583 if (!pplayers_allied(pplayer, aplayer)
2586 }
2588 }
2590 }
2591
2592 tile_add_extra(ptile, pextra);
2593
2594 /* Watchtower might become effective. */
2596
2597 if (pextra->data.base != NULL) {
2598 /* Claim bases on tile */
2599 if (pplayer) {
2600 struct player *old_owner = extra_owner(ptile);
2601
2602 /* Created base from NULL -> pplayer */
2603 map_claim_base(ptile, pextra, pplayer, NULL);
2604
2605 if (old_owner != pplayer) {
2606 /* Existing bases from old_owner -> pplayer */
2608 if (oldbase != pextra) {
2609 map_claim_base(ptile, oldbase, pplayer, old_owner);
2610 }
2612
2613 ptile->extras_owner = pplayer;
2614 }
2615 } else {
2616 /* Player who already owns bases on tile claims new base */
2617 map_claim_base(ptile, pextra, extra_owner(ptile), NULL);
2618 }
2619 }
2620
2621 if (extras_removed) {
2622 /* Maybe conflicting extra that was removed was the only thing
2623 * making tile native to some unit. */
2625 }
2626}
2627
2628/**********************************************************************/
2631void destroy_extra(struct tile *ptile, struct extra_type *pextra)
2632{
2634 bool real = tile_map_check(&(wld.map), ptile);
2635
2636 /* Remember what players were able to see the base. */
2637 if (real) {
2639 players_iterate(pplayer) {
2640 if (map_is_known_and_seen(ptile, pplayer, V_MAIN)) {
2641 BV_SET(base_seen, player_index(pplayer));
2642 }
2644 }
2645
2646 if (real && is_extra_caused_by(pextra, EC_BASE)) {
2647 struct base_type *pbase = extra_base_get(pextra);
2648 struct player *owner = extra_owner(ptile);
2649
2651 map_clear_border(ptile);
2652 }
2653
2654 if (NULL != owner
2655 && (0 <= pbase->vision_main_sq || 0 <= pbase->vision_invis_sq)) {
2656 /* Base provides vision, but no borders. */
2658 V_RADIUS(0 <= pbase->vision_main_sq ? pbase->vision_main_sq : -1,
2659 0 <= pbase->vision_invis_sq ? pbase->vision_invis_sq : -1,
2660 0 <= pbase->vision_subs_sq ? pbase->vision_subs_sq : -1);
2661 const v_radius_t new_radius_sq = V_RADIUS(-1, -1, -1);
2662
2665 }
2666 }
2667
2668 tile_remove_extra(ptile, pextra);
2669
2670 if (real) {
2671 /* Remove base from vision of players which were able to see the base. */
2672 players_iterate(pplayer) {
2673 if (BV_ISSET(base_seen, player_index(pplayer))
2674 && update_player_tile_knowledge(pplayer, ptile)) {
2675 send_tile_info(pplayer->connections, ptile, FALSE);
2676 }
2678
2679 if (pextra->eus != EUS_NORMAL) {
2680 struct player *eowner = extra_owner(ptile);
2681
2682 unit_list_iterate(ptile->units, aunit) {
2686 && !pplayers_allied(aplayer, eowner)) {
2687 send_unit_info(aplayer->connections, aunit);
2688 }
2690 }
2692 }
2693 }
2694}
2695
2696/**********************************************************************/
2707 int prob, bool reveal_cities)
2708{
2709 bool updt = FALSE;
2710
2712
2713 whole_map_iterate(&(wld.map), ptile) {
2714 if (fc_rand(100) < prob) {
2716 } else if (reveal_cities && NULL != tile_city(ptile)) {
2718 }
2720
2722
2723 return updt;
2724}
2725
2726/**********************************************************************/
2735{
2736 struct city *pcity = ptile->worked;
2737
2738 /* Check the unit activities. */
2740
2741 if (pcity != NULL && !is_free_worked(pcity, ptile)
2742 && get_city_tile_output_bonus(pcity, ptile, NULL, EFT_TILE_WORKABLE) <= 0) {
2743 city_map_update_empty(pcity, ptile);
2745
2746 if (refresh_city) {
2747 auto_arrange_workers(pcity);
2748 send_city_info(NULL, pcity);
2749 }
2750 }
2751}
bool is_adv_data_phase_open(struct player *pplayer)
Definition advdata.c:248
bool adv_data_phase_init(struct player *pplayer, bool is_new_phase)
Definition advdata.c:268
void adv_data_phase_done(struct player *pplayer)
Definition advdata.c:570
#define CALL_FUNC_EACH_AI(_func,...)
Definition ai.h:387
bool territory_claiming_base(const struct base_type *pbase)
Definition base.c:158
bool bv_match_dbv(const struct dbv *match, const unsigned char *src)
Definition bitvector.c:205
void dbv_init(struct dbv *pdbv, int bits)
Definition bitvector.c:50
void dbv_set(struct dbv *pdbv, int bit)
Definition bitvector.c:144
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:222
void dbv_free(struct dbv *pdbv)
Definition bitvector.c:95
void dbv_clr(struct dbv *pdbv, int bit)
Definition bitvector.c:167
void dbv_to_bv(unsigned char *dest, const struct dbv *src)
Definition bitvector.c:235
#define BV_CLR_ALL(bv)
Definition bitvector.h:95
#define BV_SET(bv, bit)
Definition bitvector.h:81
#define BV_ISSET(bv, bit)
Definition bitvector.h:78
#define BV_CLR(bv, bit)
Definition bitvector.h:86
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:3615
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:770
@ CNA_NOT
Definition city.h:306
@ CNA_NORMAL
Definition city.h:307
#define city_list_iterate(citylist, pcity)
Definition city.h:508
#define city_tile(_pcity_)
Definition city.h:564
#define city_owner(_pcity_)
Definition city.h:563
#define city_list_iterate_end
Definition city.h:510
#define city_tile_iterate(_nmap, _radius_sq, _city_tile, _tile)
Definition city.h:230
#define city_tile_iterate_end
Definition city.h:238
void city_map_update_empty(struct city *pcity, struct tile *ptile)
Definition citytools.c:3275
void send_city_info(struct player *dest, struct city *pcity)
Definition citytools.c:2363
bool update_dumb_city(struct player *pplayer, struct city *pcity)
Definition citytools.c:2776
void sync_cities(void)
Definition citytools.c:3349
bool city_map_update_tile_frozen(struct tile *ptile)
Definition citytools.c:3332
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:3402
void send_city_info_at_tile(struct player *pviewer, struct conn_list *dest, struct city *pcity, struct tile *ptile)
Definition citytools.c:2415
void city_thaw_workers_queue(void)
Definition citytools.c:198
void reality_check_city(struct player *pplayer, struct tile *ptile)
Definition citytools.c:2847
void auto_arrange_workers(struct city *pcity)
Definition cityturn.c:367
void city_refresh_queue_add(struct city *pcity)
Definition cityturn.c:198
bool city_refresh(struct city *pcity)
Definition cityturn.c:159
void city_refresh_queue_processing(void)
Definition cityturn.c:214
char * incite_cost
Definition comments.c:75
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
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:916
struct player * extra_owner(const struct tile *ptile)
Definition extras.c:1114
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:861
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:852
bool can_extras_coexist(const struct extra_type *pextra1, const struct extra_type *pextra2)
Definition extras.c:1003
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:1149
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:1290
#define MAX_EXTRA_TYPES
Definition fc_types.h:50
signed short Continent_id
Definition fc_types.h:372
@ BORDERS_DISABLED
Definition fc_types.h:1037
@ BORDERS_SEE_INSIDE
Definition fc_types.h:1039
@ BORDERS_EXPAND
Definition fc_types.h:1040
#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:62
struct world wld
Definition game.c:63
struct unit * game_unit_by_number(int id)
Definition game.c:116
struct city * game_city_by_number(int id)
Definition game.c:107
struct city * owner
Definition citydlg.c:226
static GtkWidget * source
Definition gotodlg.c:58
#define fc_assert_ret(condition)
Definition log.h:191
#define log_verbose(message,...)
Definition log.h:109
#define fc_assert(condition)
Definition log.h:176
#define fc_assert_ret_val(condition, val)
Definition log.h:194
#define log_debug(message,...)
Definition log.h:115
#define log_error(message,...)
Definition log.h:103
int map_num_tiles(void)
Definition map.c:1023
struct tile * rand_map_pos(const struct civ_map *nmap)
Definition map.c:1097
int map_vector_to_sq_distance(int dx, int dy)
Definition map.c:614
bool terrain_surroundings_allow_change(const struct civ_map *nmap, const struct tile *ptile, const struct terrain *pterrain)
Definition map.c:751
void map_distance_vector(int *dx, int *dy, const struct tile *tile0, const struct tile *tile1)
Definition map.c:1082
#define adjc_iterate_end
Definition map.h:433
#define MAP_INDEX_SIZE
Definition map.h:137
#define circle_dxyr_iterate(nmap, center_tile, sq_radius, _tile, dx, dy, dr)
Definition map.h:409
#define cardinal_adjc_iterate_end
Definition map.h:459
#define adjc_iterate(nmap, center_tile, itr_tile)
Definition map.h:428
#define circle_dxyr_iterate_end
Definition map.h:420
#define cardinal_adjc_iterate(nmap, center_tile, itr_tile)
Definition map.h:455
#define circle_iterate(nmap, center_tile, sq_radius, tile_itr)
Definition map.h:401
#define whole_map_iterate(_map, _tile)
Definition map.h:545
#define MAP_TILE_OWNER_NULL
Definition map.h:602
#define whole_map_iterate_end
Definition map.h:554
#define circle_iterate_end
Definition map.h:404
void assign_continent_numbers(void)
int get_ocean_size(Continent_id id)
struct terrain * most_shallow_ocean(bool frozen)
int get_lake_surrounders(Continent_id cont)
void player_map_init(struct player *pplayer)
Definition maphand.c:1231
static void terrain_change_bounce_single_unit(struct unit *punit, struct tile *from)
Definition maphand.c:1841
void update_player_tile_last_seen(struct player *pplayer, struct tile *ptile)
Definition maphand.c:1477
static void shared_vision_change_seen(struct player *pplayer, struct tile *ptile, const v_radius_t change, bool can_reveal_tiles)
Definition maphand.c:667
void vision_clear_sight(struct vision *vision)
Definition maphand.c:2543
void map_claim_base(struct tile *ptile, struct extra_type *pextra, struct player *powner, struct player *ploser)
Definition maphand.c:2410
void map_set_border_vision(struct player *pplayer, const bool is_enabled)
Definition maphand.c:740
void map_claim_ownership(struct tile *ptile, struct player *powner, struct tile *psource, bool claim_bases)
Definition maphand.c:2217
static int player_tile_own_seen(const struct player_tile *plrtile, enum vision_layer vlayer)
Definition maphand.c:1146
bool map_is_known(const struct tile *ptile, const struct player *pplayer)
Definition maphand.c:904
static bool map_is_also_seen(const struct tile *ptile, const struct player *pplayer, enum vision_layer vlayer)
Definition maphand.c:919
void send_map_info(struct conn_list *dest)
Definition maphand.c:649
static bool really_give_tile_info_from_player_to_player(struct player *pfrom, struct player *pdest, struct tile *ptile)
Definition maphand.c:1495
bool send_tile_suppression(bool now)
Definition maphand.c:475
void destroy_extra(struct tile *ptile, struct extra_type *pextra)
Definition maphand.c:2631
static void check_units_single_tile(struct tile *ptile)
Definition maphand.c:1895
static void really_give_map_from_player_to_player(struct player *pfrom, struct player *pdest)
Definition maphand.c:1568
void disable_fog_of_war(void)
Definition maphand.c:1799
bool really_gives_vision(struct player *me, struct player *them)
Definition maphand.c:345
static bool unit_is_on_layer(const struct unit *punit, enum vision_layer vlayer)
Definition maphand.c:640
void map_know_and_see_all(struct player *pplayer)
Definition maphand.c:1206
static void map_change_own_seen(struct player *pplayer, struct tile *ptile, const v_radius_t change)
Definition maphand.c:1155
void show_map_to_all(void)
Definition maphand.c:1220
void send_tile_info(struct conn_list *dest, struct tile *ptile, bool send_unknown)
Definition maphand.c:491
bool update_player_tile_knowledge(struct player *pplayer, struct tile *ptile)
Definition maphand.c:1408
static int map_get_seen(const struct player *pplayer, const struct tile *ptile, enum vision_layer vlayer)
Definition maphand.c:944
static void ocean_to_land_fix_rivers(struct tile *ptile)
Definition maphand.c:1815
void give_map_from_player_to_player(struct player *pfrom, struct player *pdest)
Definition maphand.c:384
void send_all_known_tiles(struct conn_list *dest)
Definition maphand.c:444
void bounce_units_on_terrain_change(struct tile *ptile)
Definition maphand.c:1929
void give_seamap_from_player_to_player(struct player *pfrom, struct player *pdest)
Definition maphand.c:400
void remove_shared_vision(struct player *pfrom, struct player *pto)
Definition maphand.c:1703
bool need_to_reassign_continents(const struct terrain *oldter, const struct terrain *newter)
Definition maphand.c:1947
static bool is_claimable_ocean(struct tile *ptile, struct tile *source, struct player *pplayer)
Definition maphand.c:2107
struct vision_site * map_get_player_city(const struct tile *ptile, const struct player *pplayer)
Definition maphand.c:1377
static bool is_terrain_ecologically_wet(struct tile *ptile)
Definition maphand.c:96
void tile_claim_bases(struct tile *ptile, struct player *powner)
Definition maphand.c:2230
void disable_fog_of_war_player(struct player *pplayer)
Definition maphand.c:1783
void climate_change(bool warming, int effect)
Definition maphand.c:133
void enable_fog_of_war(void)
Definition maphand.c:1773
static bool send_tile_suppressed
Definition maphand.c:65
static void create_vision_dependencies(void)
Definition maphand.c:1608
void upgrade_all_city_extras(struct player *pplayer, bool discovery)
Definition maphand.c:276
void create_extra(struct tile *ptile, struct extra_type *pextra, struct player *pplayer)
Definition maphand.c:2566
void map_update_border(struct tile *ptile, struct player *owner, int old_radius_sq, int new_radius_sq)
Definition maphand.c:2264
void map_set_known(struct tile *ptile, struct player *pplayer)
Definition maphand.c:1188
void map_show_all(struct player *pplayer)
Definition maphand.c:889
static void map_unit_homecity_enqueue(struct tile *ptile)
Definition maphand.c:2156
static void map_change_seen(struct player *pplayer, struct tile *ptile, const v_radius_t change, bool can_reveal_tiles)
Definition maphand.c:957
void map_show_tile(struct player *src_player, struct tile *ptile)
Definition maphand.c:768
void give_citymap_from_player_to_player(struct city *pcity, struct player *pfrom, struct player *pdest)
Definition maphand.c:418
void nuclear_winter(int effect)
Definition maphand.c:119
void tile_change_side_effects(struct tile *ptile, bool refresh_city)
Definition maphand.c:2734
static void player_tile_init(struct tile *ptile, struct player *pplayer)
Definition maphand.c:1338
void terrain_changed(struct tile *ptile)
Definition maphand.c:1966
void player_map_free(struct player *pplayer)
Definition maphand.c:1247
static void unbuffer_shared_vision(struct player *pplayer)
Definition maphand.c:368
static void map_claim_border_ownership(struct tile *ptile, struct player *powner, struct tile *psource)
Definition maphand.c:2172
bool map_is_known_and_seen(const struct tile *ptile, const struct player *pplayer, enum vision_layer vlayer)
Definition maphand.c:930
void change_playertile_site(struct player_tile *ptile, struct vision_site *new_site)
Definition maphand.c:1169
void map_calculate_borders(void)
Definition maphand.c:2383
void fix_tile_on_terrain_change(struct tile *ptile, struct terrain *oldter, bool extend_rivers)
Definition maphand.c:1985
void enable_fog_of_war_player(struct player *pplayer)
Definition maphand.c:1757
void map_show_circle(struct player *pplayer, struct tile *ptile, int radius_sq)
Definition maphand.c:874
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:685
void map_claim_border(struct tile *ptile, struct player *owner, int radius_sq)
Definition maphand.c:2296
void update_tile_knowledge(struct tile *ptile)
Definition maphand.c:1449
void remove_player_from_maps(struct player *pplayer)
Definition maphand.c:1268
void give_shared_vision(struct player *pfrom, struct player *pto)
Definition maphand.c:1642
void check_terrain_change(struct tile *ptile, struct terrain *oldter)
Definition maphand.c:2005
bool give_distorted_map(struct player *pfrom, struct player *pto, int prob, bool reveal_cities)
Definition maphand.c:2706
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:353
static bool give_tile_info_from_player_to_player(struct player *pfrom, struct player *pdest, struct tile *ptile)
Definition maphand.c:1588
void global_warming(int effect)
Definition maphand.c:106
bool upgrade_city_extras(struct city *pcity, struct extra_type **gained)
Definition maphand.c:241
void map_clear_border(struct tile *ptile)
Definition maphand.c:2247
void map_clear_known(struct tile *ptile, struct player *pplayer)
Definition maphand.c:1196
static void player_tile_free(struct tile *ptile, struct player *pplayer)
Definition maphand.c:1363
#define MAXIMUM_CLAIMED_OCEAN_SIZE
Definition maphand.c:62
struct player_tile * map_get_player_tile(const struct tile *ptile, const struct player *pplayer)
Definition maphand.c:1392
void vision_change_sight(struct vision *vision, const v_radius_t radius_sq)
Definition maphand.c:2531
#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:351
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 num_known_tech_with_flag(const struct player *pplayer, enum tech_flag_id flag)
Definition player.c:1273
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:1405
bool gives_shared_vision(const struct player *me, const struct player *them)
Definition player.c:1485
#define players_iterate_end
Definition player.h:537
#define players_iterate(_pplayer)
Definition player.h:532
void send_player_info_c(struct player *src, struct conn_list *dest)
Definition plrhand.c:1146
#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:410
int count_river_near_tile(struct civ_map *nmap, const struct tile *ptile, const struct extra_type *priver)
Definition road.c:334
#define sanity_check_tile(x)
Definition sanitycheck.h:42
void flush_packets(void)
Definition sernet.c:381
#define DEFAULT_SPECIALIST
Definition specialist.h:43
enum server_states server_state(void)
Definition srv_main.c:333
Definition city.h:320
enum city_needs_arrange needs_arrange
Definition city.h:441
citizens specialists[SP_MAX]
Definition city.h:336
struct tile * tile
Definition city.h:322
struct city::@17::@19 server
bool last_updated_year
Definition game.h:240
bool vision_reveal_tiles
Definition game.h:204
bool fogofwar_old
Definition game.h:238
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:151
struct civ_game::@31::@35 server
struct tile * tiles
Definition map_types.h:83
int xsize
Definition map_types.h:78
int ysize
Definition map_types.h:78
int north_latitude
Definition map_types.h:79
int south_latitude
Definition map_types.h:80
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::@25 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
Definition packets_gen.h:99
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:279
struct dbv tile_known
Definition player.h:308
struct conn_list * connections
Definition player.h:296
struct player_tile * private_map
Definition player.h:322
bool border_vision
Definition player.h:325
struct player::@70::@72 server
struct terrain * cooler_wetter_result
Definition terrain.h:241
struct terrain * cooler_drier_result
Definition terrain.h:241
struct terrain * warmer_wetter_result
Definition terrain.h:240
struct terrain * warmer_drier_result
Definition terrain.h:240
Definition tile.h:50
char * spec_sprite
Definition tile.h:66
char * label
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:569
Definition unit.h:137
enum unit_activity activity
Definition unit.h:156
int id
Definition unit.h:144
struct unit::@81::@84 server
struct extra_type * activity_target
Definition unit.h:163
int homecity
Definition unit.h:145
bool dying
Definition unit.h:249
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: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:57
#define is_ocean(pterrain)
Definition terrain.h:301
#define is_ocean_tile(ptile)
Definition terrain.h:303
#define T_NONE
Definition terrain.h:56
#define terrain_has_flag(terr, flag)
Definition terrain.h:283
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:1065
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:100
#define tile_index(_pt_)
Definition tile.h:88
#define tile_worked(_tile)
Definition tile.h:118
#define tile_resource(_tile)
Definition tile.h:102
@ 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:114
#define TILE_XY(ptile)
Definition tile.h:43
#define tile_continent(_tile)
Definition tile.h:92
#define tile_has_extra(ptile, pextra)
Definition tile.h:151
#define tile_owner(_tile)
Definition tile.h:96
int get_transporter_occupancy(const struct unit *ptrans)
Definition unit.c:1791
bool unit_is_alive(int id)
Definition unit.c:2261
bool unit_transported(const struct unit *pcargo)
Definition unit.c:2433
struct unit_list * unit_transport_cargo(const struct unit *ptrans)
Definition unit.c:2459
#define unit_tile(_pu)
Definition unit.h:396
#define unit_owner(_pu)
Definition unit.h:395
static bool is_non_allied_unit_tile(const struct tile *ptile, const struct player *pplayer)
Definition unit.h:431
bool unit_activity_handling(struct unit *punit, enum unit_activity new_activity)
Definition unithand.c:6471
#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:2710
void send_unit_info(struct conn_list *dest, struct unit *punit)
Definition unittools.c:2723
void unit_activities_cancel(struct unit *punit)
Definition unittools.c:797
void wipe_unit(struct unit *punit, enum unit_loss_reason reason, struct player *killer)
Definition unittools.c:2132
void unit_activities_cancel_all_illegal_area(const struct tile *ptile)
Definition unittools.c:842
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:3919
void unit_list_refresh_vision(struct unit_list *punitlist)
Definition unittools.c:4857
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:1587
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