Author: sveinung
Date: Wed Dec 16 05:03:45 2015
New Revision: 31011

URL: http://svn.gna.org/viewcvs/freeciv?rev=31011&view=rev
Log:
Trade route partner city size is known

The owner of a city can see the city externals (like size) of its trade
partners. The meta knowledge for the Building requirement type was aware of
this. The meta knowledge for the MinSize requirement type wasn't.

Centralize checking if city externals are visible in the new function
mke_can_see_city_externals(). Make it aware that a trade route reveals the
city externals to a trade partner even if the city tile aren't known and
seen. Use it for both the Building and the MinSize requirement types.

See bug #24178

Modified:
    branches/S2_6/common/metaknowledge.c
    branches/S2_6/common/metaknowledge.h

Modified: branches/S2_6/common/metaknowledge.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_6/common/metaknowledge.c?rev=31011&r1=31010&r2=31011&view=diff
==============================================================================
--- branches/S2_6/common/metaknowledge.c        (original)
+++ branches/S2_6/common/metaknowledge.c        Wed Dec 16 05:03:45 2015
@@ -301,8 +301,7 @@
   }
 
   if (req->source.kind == VUT_MINSIZE && target_city != NULL) {
-    if (is_tile_seen(pow_player, city_tile(target_city))
-        || city_owner(target_city) == pow_player) {
+    if (mke_can_see_city_externals(pow_player, target_city)) {
       return TRUE;
     }
   }
@@ -385,26 +384,17 @@
     case REQ_RANGE_CITY:
     case REQ_RANGE_LOCAL:
       if (can_player_see_city_internals(pow_player, target_city)) {
-        /* Anyone that can see city internals (like the owner) */
-        return TRUE;
-      }
-
-      /* Can't see invisible improvements in foreign cities. */
-      if (!is_improvement_visible(req->source.value.building)) {
-        return FALSE;
-      }
-
-      /* Can see visible improvements in seen cities. */
-      if (is_tile_seen(pow_player, city_tile(target_city))) {
-        return TRUE;
-      }
-
-      /* Can see visible improvements in cities traded with. */
-      trade_routes_iterate(target_city, trade_city) {
-        if (city_owner(trade_city) == pow_player) {
-          return TRUE;
-        }
-      } trade_routes_iterate_end;
+        /* Anyone that can see city internals (like the owner) known all
+         * its improvements. */
+        return TRUE;
+      }
+
+      if (is_improvement_visible(req->source.value.building)
+          && mke_can_see_city_externals(pow_player, target_city)) {
+        /* Can see visible improvements when the outside of the city is
+         * seen. */
+        return TRUE;
+      }
 
       /* No way to know if a city has an improvement */
       return FALSE;
@@ -611,3 +601,35 @@
   return pow_player == target_player
       || player_has_embassy(pow_player, target_player);
 }
+
+/**************************************************************************
+  Returns TRUE iff pow_player can see externally visible features of
+  target_city.
+
+  Those are visible to its owner, to players that currently sees its city
+  tile and to players that has it as a trade partner.
+**************************************************************************/
+bool mke_can_see_city_externals(const struct player *pow_player,
+                                const struct city *target_city) {
+  fc_assert_ret_val(target_city, FALSE);
+  fc_assert_ret_val(pow_player, FALSE);
+
+  if (can_player_see_city_internals(pow_player, target_city)) {
+    /* City internals includes city externals. */
+    return TRUE;
+  }
+
+  if (is_tile_seen(pow_player, city_tile(target_city))) {
+    /* The tile is being observed. */
+    return TRUE;
+  }
+
+  trade_routes_iterate(target_city, trade_city) {
+    if (city_owner(trade_city) == pow_player) {
+      /* Revealed because of the trade route. */
+      return TRUE;
+    }
+  } trade_routes_iterate_end;
+
+  return FALSE;
+}

Modified: branches/S2_6/common/metaknowledge.h
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_6/common/metaknowledge.h?rev=31011&r1=31010&r2=31011&view=diff
==============================================================================
--- branches/S2_6/common/metaknowledge.h        (original)
+++ branches/S2_6/common/metaknowledge.h        Wed Dec 16 05:03:45 2015
@@ -52,6 +52,9 @@
 bool can_see_techs_of_target(const struct player *pow_player,
                              const struct player *target_player);
 
+bool mke_can_see_city_externals(const struct player *pow_player,
+                                const struct city *target_city);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */


_______________________________________________
Freeciv-commits mailing list
Freeciv-commits@gna.org
https://mail.gna.org/listinfo/freeciv-commits

Reply via email to