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

On Wed, 16 May 2007, William Allen Simpson wrote:
> One of the nuisances (compared to the commercial games) is the
> limited vision radius of the city itself.

Here is a patch for this issue. Please test it and let me know what you 
all think about it. It removes the special casing for city vision, that 
makes city (unlike units) give vision that does not explore the unknown.

There is also a second patch that you can use for testing larger city 
vision range. Combined with the above patch, it should give interesting 
results.

   - Per
Index: server/citytools.c
===================================================================
--- server/citytools.c  (revision 12955)
+++ server/citytools.c  (working copy)
@@ -792,7 +792,7 @@
 
   give_citymap_from_player_to_player(pcity, pgiver, ptaker);
   old_vision = pcity->server.vision;
-  pcity->server.vision = vision_new(ptaker, pcity->tile, FALSE);
+  pcity->server.vision = vision_new(ptaker, pcity->tile);
   vision_layer_iterate(v) {
     vision_change_sight(pcity->server.vision, v,
                        vision_get_sight(old_vision, v));
@@ -976,7 +976,7 @@
   }
 
   /* Before arranging workers to show unknown land */
-  pcity->server.vision = vision_new(pplayer, ptile, FALSE);
+  pcity->server.vision = vision_new(pplayer, ptile);
   city_refresh_vision(pcity);
 
   tile_set_city(ptile, pcity);
Index: server/maphand.c
===================================================================
--- server/maphand.c    (revision 12955)
+++ server/maphand.c    (working copy)
@@ -567,7 +567,6 @@
   function multiple times.
 ****************************************************************************/
 static void map_unfog_tile(struct player *pplayer, struct tile *ptile,
-                          bool can_reveal_tiles,
                           enum vision_layer vlayer)
 {
   /* Increase seen count. */
@@ -579,8 +578,7 @@
     if (pplayer2 == pplayer || really_gives_vision(pplayer, pplayer2)) {
       bool known = map_is_known(ptile, pplayer2);
 
-      if ((!known && can_reveal_tiles)
-         || (known && map_get_seen(ptile, pplayer2, vlayer) == 1)) {
+      if (!known || (known && map_get_seen(ptile, pplayer2, vlayer) == 1)) {
        really_unfog_tile(pplayer2, ptile, vlayer);
       }
     }
@@ -668,7 +666,6 @@
 **************************************************************************/
 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)
 {
   if (old_radius_sq != new_radius_sq) {
@@ -680,7 +677,7 @@
     buffer_shared_vision(pplayer);
     circle_dxyr_iterate(ptile, max_radius, tile1, dx, dy, dr) {
       if (dr > old_radius_sq && dr <= new_radius_sq) {
-       map_unfog_tile(pplayer, tile1, can_reveal_tiles, vlayer);
+       map_unfog_tile(pplayer, tile1, vlayer);
       } else if (dr > new_radius_sq && dr <= old_radius_sq) {
        map_fog_tile(pplayer, tile1, vlayer);
       }
@@ -897,7 +894,7 @@
 
   whole_map_iterate(ptile) {
     vision_layer_iterate(v) {
-      map_unfog_tile(pplayer, ptile, TRUE, v);
+      map_unfog_tile(pplayer, ptile, v);
     } vision_layer_iterate_end;
   } whole_map_iterate_end;
 
@@ -1303,7 +1300,7 @@
 {
   buffer_shared_vision(pplayer);
   whole_map_iterate(ptile) {
-    map_unfog_tile(pplayer, ptile, FALSE, V_MAIN);
+    map_unfog_tile(pplayer, ptile, V_MAIN);
   } whole_map_iterate_end;
   unbuffer_shared_vision(pplayer);
 }
@@ -1700,7 +1697,6 @@
   /* These values cannot be changed after initialization. */
   struct player *player;
   struct tile *tile;
-  bool can_reveal_tiles;
 
   /* The radius of the vision source. */
   int radius_sq[V_COUNT];
@@ -1711,14 +1707,12 @@
 
   See documentation in maphand.h.
 ****************************************************************************/
-struct vision *vision_new(struct player *pplayer, struct tile *ptile,
-                         bool can_reveal_tiles)
+struct vision *vision_new(struct player *pplayer, struct tile *ptile)
 {
   struct vision *vision = fc_malloc(sizeof(*vision));
 
   vision->player = pplayer;
   vision->tile = ptile;
-  vision->can_reveal_tiles = can_reveal_tiles;
   vision_layer_iterate(v) {
     vision->radius_sq[v] = -1;
   } vision_layer_iterate_end;
@@ -1746,8 +1740,7 @@
                         int radius_sq)
 {
   map_refog_circle(vision->player, vision->tile,
-                  vision->radius_sq[vlayer], radius_sq,
-                  vision->can_reveal_tiles, vlayer);
+                  vision->radius_sq[vlayer], radius_sq, vlayer);
   vision->radius_sq[vlayer] = radius_sq;
 
   assert(vision->radius_sq[V_MAIN] >= vision->radius_sq[V_INVIS]);
Index: server/maphand.h
===================================================================
--- server/maphand.h    (revision 12955)
+++ server/maphand.h    (working copy)
@@ -120,11 +120,6 @@
   only rarely be necessary since all fogging and unfogging operations
   are taken care of internally.
 
-  The can_reveal_tiles parameter controls whether the vision source can
-  discover new (unknown) tiles or simply maintain vision on already-known
-  tiles.  Currently cities should pass FALSE for this since they cannot
-  discover new tiles.
-
   ***** IMPORTANT *****
   To change any of the parameters given to vision_new - that is, to change
   the vision source's position (tile) or owner - you must create a new
@@ -151,8 +146,7 @@
   a unit or city between players, etc.
 ****************************************************************************/
 struct vision;
-struct vision *vision_new(struct player *pplayer, struct tile *ptile,
-                         bool can_reveal_tiles);
+struct vision *vision_new(struct player *pplayer, struct tile *ptile);
 int vision_get_sight(const struct vision *vision, enum vision_layer vlayer);
 void vision_change_sight(struct vision *vision, enum vision_layer vlayer,
                         int radius_sq);
Index: server/unittools.c
===================================================================
--- server/unittools.c  (revision 12955)
+++ server/unittools.c  (working copy)
@@ -1373,7 +1373,7 @@
     send_city_info(pplayer, pcity);
   }
 
-  punit->server.vision = vision_new(pplayer, ptile, TRUE);
+  punit->server.vision = vision_new(pplayer, ptile);
   unit_refresh_vision(punit);
 
   send_unit_info(NULL, punit);
@@ -2763,7 +2763,7 @@
     unit_list_iterate(cargo_units, pcargo) {
       struct vision *old_vision = pcargo->server.vision;
 
-      pcargo->server.vision = vision_new(pcargo->owner, pdesttile, TRUE);
+      pcargo->server.vision = vision_new(pcargo->owner, pdesttile);
       vision_layer_iterate(v) {
        vision_change_sight(pcargo->server.vision, v,
                            get_unit_vision_at(pcargo, pdesttile, v));
@@ -2794,7 +2794,7 @@
      move */
 
   /* Enhance vision if unit steps into a fortress */
-  punit->server.vision = vision_new(punit->owner, pdesttile, TRUE);
+  punit->server.vision = vision_new(punit->owner, pdesttile);
   vision_layer_iterate(v) {
     vision_change_sight(punit->server.vision, v,
                        get_unit_vision_at(punit, pdesttile, v));
Index: server/unithand.c
===================================================================
--- server/unithand.c   (revision 12955)
+++ server/unithand.c   (working copy)
@@ -289,7 +289,7 @@
     unit_list_prepend(new_owner->units, punit);
     punit->owner = new_owner;
 
-    punit->server.vision = vision_new(new_owner, punit->tile, TRUE);
+    punit->server.vision = vision_new(new_owner, punit->tile);
     unit_refresh_vision(punit);
   }
 
Index: server/savegame.c
===================================================================
--- server/savegame.c   (revision 12955)
+++ server/savegame.c   (working copy)
@@ -1860,7 +1860,7 @@
     }
 
     /* allocate the unit's contribution to fog of war */
-    punit->server.vision = vision_new(punit->owner, punit->tile, TRUE);
+    punit->server.vision = vision_new(punit->owner, punit->tile);
     unit_refresh_vision(punit);
     /* NOTE: There used to be some map_set_known calls here.  These were
      * unneeded since unfogging the tile when the unit sees it will
@@ -2426,7 +2426,7 @@
     }
     
     /* adding the cities contribution to fog-of-war */
-    pcity->server.vision = vision_new(pcity->owner, pcity->tile, FALSE);
+    pcity->server.vision = vision_new(pcity->owner, pcity->tile);
     city_refresh_vision(pcity);
 
     pcity->units_supported = unit_list_new();
Index: data/default/effects.ruleset
===================================================================
--- data/default/effects.ruleset        (revision 12955)
+++ data/default/effects.ruleset        (working copy)
@@ -95,7 +95,7 @@
 ; Base vision range - radius of vision is sqrt(5) = 2.24
 [effect_city_vision]
 name    = "City_Vision_Radius_Sq"
-value   = 5
+value   = 15
 
 
 ; Nuclear power gives +1 moves to sea units
_______________________________________________
Freeciv-dev mailing list
Freeciv-dev@gna.org
https://mail.gna.org/listinfo/freeciv-dev

Reply via email to