<URL: http://bugs.freeciv.org/Ticket/Display.html?id=40636 >

This patch adds vision range property to bases. Vision is given to
player who owns the tile where base is.

Applies on top of #40635


 - ML

diff -Nurd -X.diff_ignore freeciv/common/base.h freeciv/common/base.h
--- freeciv/common/base.h       2009-01-07 18:39:50.000000000 +0200
+++ freeciv/common/base.h       2009-01-07 18:42:38.000000000 +0200
@@ -48,6 +48,7 @@
   int build_time;
   int defense_bonus;
   int border_sq;
+  int vision_sq;
 
   bv_unit_classes native_to;
   bv_base_flags flags;
diff -Nurd -X.diff_ignore freeciv/common/packets.def freeciv/common/packets.def
--- freeciv/common/packets.def  2009-01-07 18:39:50.000000000 +0200
+++ freeciv/common/packets.def  2009-01-07 18:59:19.000000000 +0200
@@ -430,7 +430,7 @@
   UINT8 forced_science;
   UINT8 forced_luxury;
   UINT8 forced_gold;
-  BOOL city_reveal_tiles;
+  BOOL vision_reveal_tiles;
   UINT8 min_city_center_output[O_MAX];
   UINT8 min_dist_bw_cities;
   UINT8 init_vis_radius_sq;
@@ -1317,7 +1317,9 @@
   BASE_GUI gui_type;
   BV_UNIT_CLASSES native_to;
   UINT8 build_time;
+  UINT8 defense_bonus;
   UINT8 border_sq;
+  UINT8 vision_sq;
   BV_BASE_FLAGS flags;
 end
 
diff -Nurd -X.diff_ignore freeciv/server/citytools.c freeciv/server/citytools.c
--- freeciv/server/citytools.c  2009-01-07 18:39:50.000000000 +0200
+++ freeciv/server/citytools.c  2009-01-07 19:05:33.000000000 +0200
@@ -874,7 +874,7 @@
   old_vision = pcity->server.vision;
   new_vision = vision_new(ptaker, pcenter);
   pcity->server.vision = new_vision;
-  vision_reveal_tiles(new_vision, game.info.city_reveal_tiles);
+  vision_reveal_tiles(new_vision, game.info.vision_reveal_tiles);
   vision_layer_iterate(v) {
     vision_change_sight(new_vision, v,
                        vision_get_sight(old_vision, v));
@@ -1084,7 +1084,7 @@
 
   /* Before arranging workers to show unknown land */
   pcity->server.vision = vision_new(pplayer, ptile);
-  vision_reveal_tiles(pcity->server.vision, game.info.city_reveal_tiles);
+  vision_reveal_tiles(pcity->server.vision, game.info.vision_reveal_tiles);
   city_refresh_vision(pcity);
   city_list_prepend(pplayer->cities, pcity);
 
diff -Nurd -X.diff_ignore freeciv/server/maphand.c freeciv/server/maphand.c
--- freeciv/server/maphand.c    2009-01-07 18:39:50.000000000 +0200
+++ freeciv/server/maphand.c    2009-01-07 19:00:00.000000000 +0200
@@ -603,12 +603,12 @@
 }
 
 /**************************************************************************
-There doesn't have to be a city.
+  There doesn't have to be a city.
 **************************************************************************/
-static void map_refog_circle(struct player *pplayer, struct tile *ptile,
-                            int old_radius_sq, int new_radius_sq,
-                            bool can_reveal_tiles,
-                            enum vision_layer vlayer)
+void map_refog_circle(struct player *pplayer, struct tile *ptile,
+                      int old_radius_sq, int new_radius_sq,
+                      bool can_reveal_tiles,
+                      enum vision_layer vlayer)
 {
   if (old_radius_sq != new_radius_sq) {
     int max_radius = MAX(old_radius_sq, new_radius_sq);
@@ -1547,6 +1547,23 @@
     }
   }
 
+  if (ploser != powner) {
+    base_type_iterate(pbase) {
+      if (tile_has_base(ptile, pbase)
+          && pbase->vision_sq >= 0) {
+        /* Transfer base provided vision to new owner */
+        if (powner) {
+          map_refog_circle(powner, ptile, -1, pbase->vision_sq,
+                           game.info.vision_reveal_tiles, V_MAIN);
+        }
+        if (ploser) {
+          map_refog_circle(ploser, ptile, pbase->vision_sq, -1,
+                           game.info.vision_reveal_tiles, V_MAIN);
+        }
+      }
+    } base_type_iterate_end;
+  }
+
   tile_set_owner(ptile, powner, psource);
 
   if (ploser != powner) {
diff -Nurd -X.diff_ignore freeciv/server/maphand.h freeciv/server/maphand.h
--- freeciv/server/maphand.h    2009-01-07 18:39:50.000000000 +0200
+++ freeciv/server/maphand.h    2009-01-07 18:56:22.000000000 +0200
@@ -61,6 +61,10 @@
 void map_show_tile(struct player *pplayer, struct tile *ptile);
 void map_show_circle(struct player *pplayer,
                     struct tile *ptile, int radius_sq);
+void map_refog_circle(struct player *pplayer, struct tile *ptile,
+                      int old_radius_sq, int new_radius_sq,
+                      bool can_reveal_tiles,
+                      enum vision_layer vlayer);
 void map_show_all(struct player *pplayer);
 
 bool map_is_known_and_seen(const struct tile *ptile, struct player *pplayer,
diff -Nurd -X.diff_ignore freeciv/server/ruleset.c freeciv/server/ruleset.c
--- freeciv/server/ruleset.c    2009-01-07 18:39:50.000000000 +0200
+++ freeciv/server/ruleset.c    2009-01-07 18:58:59.000000000 +0200
@@ -2017,6 +2017,8 @@
     pbase->build_time = secfile_lookup_int(file, "%s.build_time", section);
     pbase->border_sq  = secfile_lookup_int_default(file, -1, "%s.border_sq",
                                                    section);
+    pbase->vision_sq  = secfile_lookup_int_default(file, -1, "%s.vision_sq",
+                                                   section);
     pbase->defense_bonus  = secfile_lookup_int_default(file, 0,
                                                        "%s.defense_bonus",
                                                        section);
@@ -2842,7 +2844,7 @@
   }
 
   /* civ1 & 2 didn't reveal tiles */
-  game.info.city_reveal_tiles =
+  game.info.vision_reveal_tiles =
     secfile_lookup_bool_default(file, FALSE, "parameters.vision_reveal_tiles");
 
   /* City Styles ... */
@@ -3440,7 +3442,9 @@
 
     packet.gui_type = b->gui_type;
     packet.build_time = b->build_time;
+    packet.defense_bonus = b->defense_bonus;
     packet.border_sq = b->border_sq;
+    packet.vision_sq = b->vision_sq;
 
     packet.flags = b->flags;
 
diff -Nurd -X.diff_ignore freeciv/server/savegame.c freeciv/server/savegame.c
--- freeciv/server/savegame.c   2009-01-07 18:39:50.000000000 +0200
+++ freeciv/server/savegame.c   2009-01-07 19:06:37.000000000 +0200
@@ -2833,7 +2833,7 @@
 
     /* adding the city contribution to fog-of-war */
     pcity->server.vision = vision_new(plr, pcenter);
-    vision_reveal_tiles(pcity->server.vision, game.info.city_reveal_tiles);
+    vision_reveal_tiles(pcity->server.vision, game.info.vision_reveal_tiles);
     city_refresh_vision(pcity);
 
     city_list_append(plr->cities, pcity);
diff -Nurd -X.diff_ignore freeciv/server/unittools.c freeciv/server/unittools.c
--- freeciv/server/unittools.c  2009-01-07 18:39:50.000000000 +0200
+++ freeciv/server/unittools.c  2009-01-07 19:00:28.000000000 +0200
@@ -730,8 +730,17 @@
        if (what != S_LAST) {
           if (what == S_PILLAGE_BASE) {
             if (territory_claiming_base(first_base)) {
+              /* Clearing borders will take care of the vision providing
+               * bases as well. */
               map_clear_border(ptile);
               map_claim_ownership(ptile, NULL, NULL);
+            } else if (first_base->vision_sq >= 0) {
+              /* Base provides vision, but no borders. */
+              struct player *owner = tile_owner(ptile);
+              if (owner) {
+                map_refog_circle(owner, ptile, first_base->vision_sq, -1,
+                                 game.info.vision_reveal_tiles, V_MAIN);
+              }
             }
             tile_remove_base(ptile, first_base);
           } else {
@@ -802,6 +811,13 @@
           if (territory_claiming_base(old_base)) {
             map_clear_border(ptile);
             map_claim_ownership(ptile, NULL, NULL);
+          } else if (old_base->vision_sq >= 0) {
+              /* Base provides vision, but no borders. */
+              struct player *owner = tile_owner(ptile);
+              if (owner) {
+                map_refog_circle(owner, ptile, old_base->vision_sq, -1,
+                                 game.info.vision_reveal_tiles, V_MAIN);
+              }
           }
           tile_remove_base(ptile, old_base);
         }
@@ -819,6 +835,12 @@
         map_claim_border(ptile, unit_owner(punit));
         city_thaw_workers_queue();
         city_refresh_queue_processing();
+      } else if (new_base->vision_sq > 0) {
+        struct player *owner = tile_owner(ptile);
+        if (owner) {
+          map_refog_circle(owner, ptile, -1, new_base->vision_sq,
+                           game.info.vision_reveal_tiles, V_MAIN);
+        }
       }
 
       unit_activity_done = TRUE;
diff -Nurd -X.diff_ignore freeciv/version.in freeciv/version.in
--- freeciv/version.in  2009-01-07 18:39:50.000000000 +0200
+++ freeciv/version.in  2009-01-07 18:41:09.000000000 +0200
@@ -23,5 +23,5 @@
 #   - Avoid adding a new mandatory capability to the development branch for
 #     as long as possible.  We want to maintain network compatibility with
 #     the stable branch for as long as possible.
-NETWORK_CAPSTRING_MANDATORY="+Freeciv.Devel.2009.Jan.07-2"
+NETWORK_CAPSTRING_MANDATORY="+Freeciv.Devel.2009.Jan.07-3"
 NETWORK_CAPSTRING_OPTIONAL=""
_______________________________________________
Freeciv-dev mailing list
Freeciv-dev@gna.org
https://mail.gna.org/listinfo/freeciv-dev

Reply via email to