Author: cazfi
Date: Tue Feb 16 15:11:01 2016
New Revision: 31940

URL: http://svn.gna.org/viewcvs/freeciv?rev=31940&view=rev
Log:
Added requirement type "Good"

See bug #6888

Modified:
    trunk/ai/default/daieffects.c
    trunk/client/helpdata.c
    trunk/common/fc_types.h
    trunk/common/requirements.c
    trunk/common/traderoutes.c
    trunk/common/traderoutes.h
    trunk/doc/README.effects
    trunk/fc_version
    trunk/server/cityturn.c
    trunk/server/rssanity.c

Modified: trunk/ai/default/daieffects.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/ai/default/daieffects.c?rev=31940&r1=31939&r2=31940&view=diff
==============================================================================
--- trunk/ai/default/daieffects.c       (original)
+++ trunk/ai/default/daieffects.c       Tue Feb 16 15:11:01 2016
@@ -733,7 +733,7 @@
   case VUT_MINVETERAN:
   case VUT_MINHP:
   case VUT_ACTION:
-  case VUT_RESERVED_1:
+  case VUT_GOOD:
   case VUT_COUNT:
     /* No sensible implementation possible with data available. */
     break;

Modified: trunk/client/helpdata.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/client/helpdata.c?rev=31940&r1=31939&r2=31940&view=diff
==============================================================================
--- trunk/client/helpdata.c     (original)
+++ trunk/client/helpdata.c     Tue Feb 16 15:11:01 2016
@@ -382,7 +382,6 @@
 
   switch (preq->source.kind) {
   case VUT_NONE:
-  case VUT_RESERVED_1:
     return FALSE;
 
   case VUT_ADVANCE:
@@ -1151,6 +1150,32 @@
     }
     break;
 
+  case VUT_GOOD:
+    switch (preq->range) {
+    case REQ_RANGE_CITY:
+      if (preq->present) {
+        cat_snprintf(buf, bufsz, Q_("?good:Requires import of %s .\n"),
+                     goods_name_translation(preq->source.value.good));
+      } else {
+        cat_snprintf(buf, bufsz, Q_("?goods:Prevented by import of %s.\n"),
+                     goods_name_translation(preq->source.value.good));
+      }
+      return TRUE;
+    case REQ_RANGE_LOCAL:
+    case REQ_RANGE_CADJACENT:
+    case REQ_RANGE_ADJACENT:
+    case REQ_RANGE_TRADEROUTE:
+    case REQ_RANGE_CONTINENT:
+    case REQ_RANGE_PLAYER:
+    case REQ_RANGE_TEAM:
+    case REQ_RANGE_ALLIANCE:
+    case REQ_RANGE_WORLD:
+    case REQ_RANGE_COUNT:
+      /* Not supported. */
+      break;
+    }
+    break;
+
   case VUT_TERRAIN:
     switch (preq->range) {
     case REQ_RANGE_LOCAL:

Modified: trunk/common/fc_types.h
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/common/fc_types.h?rev=31940&r1=31939&r2=31940&view=diff
==============================================================================
--- trunk/common/fc_types.h     (original)
+++ trunk/common/fc_types.h     Tue Feb 16 15:11:01 2016
@@ -358,6 +358,7 @@
   struct nation_group *nationgroup;
   struct nation_style *style;
   struct action *action;
+  struct goods_type *good;
 
   enum ai_level ai_level;
   enum citytile_type citytile;
@@ -431,8 +432,8 @@
 /* Target tile is used by city. */
 #define SPECENUM_VALUE17 VUT_CITYTILE
 #define SPECENUM_VALUE17NAME "CityTile"
-#define SPECENUM_VALUE18 VUT_RESERVED_1
-#define SPECENUM_VALUE18NAME "_Reserved_"
+#define SPECENUM_VALUE18 VUT_GOOD
+#define SPECENUM_VALUE18NAME "Good"
 #define SPECENUM_VALUE19 VUT_TERRFLAG
 #define SPECENUM_VALUE19NAME "TerrainFlag"
 #define SPECENUM_VALUE20 VUT_NATIONALITY

Modified: trunk/common/requirements.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/common/requirements.c?rev=31940&r1=31939&r2=31940&view=diff
==============================================================================
--- trunk/common/requirements.c (original)
+++ trunk/common/requirements.c Tue Feb 16 15:11:01 2016
@@ -118,6 +118,12 @@
       return source;
     }
     break;
+  case VUT_GOOD:
+    source.value.good = goods_by_rule_name(value);
+    if (source.value.good != NULL) {
+      return source;
+    }
+    break;
   case VUT_TERRAIN:
     source.value.terrain = terrain_by_rule_name(value);
     if (source.value.terrain != T_UNKNOWN) {
@@ -297,7 +303,6 @@
       return source;
     }
     break;
-  case VUT_RESERVED_1:
   case VUT_COUNT:
     break;
   }
@@ -320,7 +325,6 @@
   source.kind = kind;
 
   switch (source.kind) {
-  case VUT_RESERVED_1:
   case VUT_NONE:
     /* Avoid compiler warning about unitialized source.value */
     source.value.advance = NULL;
@@ -364,6 +368,9 @@
     return source;
   case VUT_EXTRA:
     source.value.extra = extra_by_number(value);
+    return source;
+  case VUT_GOOD:
+    source.value.good = goods_by_number(value);
     return source;
   case VUT_TERRAIN:
     source.value.terrain = terrain_by_number(value);
@@ -509,7 +516,6 @@
 {
   switch (source->kind) {
   case VUT_NONE:
-  case VUT_RESERVED_1:
     return 0;
   case VUT_ADVANCE:
     return advance_number(source->value.advance);
@@ -527,6 +533,8 @@
     return source->value.impr_genus;
   case VUT_EXTRA:
     return extra_number(source->value.extra);
+  case VUT_GOOD:
+    return goods_number(source->value.good);
   case VUT_TERRAIN:
     return terrain_number(source->value.terrain);
   case VUT_TERRFLAG:
@@ -640,11 +648,11 @@
     switch (req.source.kind) {
     case VUT_NONE:
     case VUT_COUNT:
-    case VUT_RESERVED_1:
       break;
     case VUT_IMPROVEMENT:
     case VUT_IMPR_GENUS:
     case VUT_EXTRA:
+    case VUT_GOOD:
     case VUT_TERRAIN:
     case VUT_TERRFLAG:
     case VUT_UTYPE:
@@ -698,7 +706,7 @@
   /* These checks match what combinations are supported inside
    * is_req_active(). However, it's only possible to do basic checks,
    * not anything that might depend on the rest of the ruleset which
-   * might not have been lodaed yet. */
+   * might not have been loaded yet. */
   switch (req.source.kind) {
   case VUT_TERRAIN:
   case VUT_EXTRA:
@@ -725,6 +733,7 @@
     break;
   case VUT_MINSIZE:
   case VUT_NATIONALITY:
+  case VUT_GOOD:
     invalid = (req.range != REQ_RANGE_CITY
                && req.range != REQ_RANGE_TRADEROUTE);
     break;
@@ -793,7 +802,6 @@
      * So we allow anything here, and do a proper check once ruleset
      * loading is complete, in sanity_check_req_individual(). */
   case VUT_NONE:
-  case VUT_RESERVED_1:
     invalid = FALSE;
     break;
   case VUT_COUNT:
@@ -841,6 +849,7 @@
     case VUT_BASEFLAG:
     case VUT_ROADFLAG:
     case VUT_EXTRA:
+    case VUT_GOOD:
     case VUT_TECHFLAG:
     case VUT_ACHIEVEMENT:
     case VUT_NATIONGROUP:
@@ -853,7 +862,6 @@
       break;
     case VUT_NONE:
     case VUT_COUNT:
-    case VUT_RESERVED_1:
       break;
     }
     if (invalid) {
@@ -1616,6 +1624,39 @@
 }
 
 /****************************************************************************
+  Is there a source goods type within range of the target?
+****************************************************************************/
+static enum fc_tristate is_goods_type_in_range(const struct tile *target_tile,
+                                               const struct city *target_city,
+                                               enum req_range range, bool 
survives,
+                                               struct goods_type *pgood)
+{
+  switch (range) {
+  case REQ_RANGE_LOCAL:
+  case REQ_RANGE_CITY:
+    /* The requirement is filled if the tile has extra of requested type. */
+    if (!target_city) {
+      return TRI_MAYBE;
+    }
+    return BOOL_TO_TRISTATE(city_receives_goods(target_city, pgood));
+  case REQ_RANGE_CADJACENT:
+  case REQ_RANGE_ADJACENT:
+  case REQ_RANGE_TRADEROUTE:
+  case REQ_RANGE_CONTINENT:
+  case REQ_RANGE_PLAYER:
+  case REQ_RANGE_TEAM:
+  case REQ_RANGE_ALLIANCE:
+  case REQ_RANGE_WORLD:
+  case REQ_RANGE_COUNT:
+    break;
+  }
+
+  fc_assert_msg(FALSE, "Invalid range %d.", range);
+
+  return TRI_MAYBE;
+}
+
+/****************************************************************************
   Is there a source tile within range of the target?
 ****************************************************************************/
 static enum fc_tristate is_terrain_in_range(const struct tile *target_tile,
@@ -2567,6 +2608,11 @@
                                   req->range, req->survives,
                                   req->source.value.extra);
     break;
+  case VUT_GOOD:
+    eval = is_goods_type_in_range(target_tile, target_city,
+                                  req->range, req->survives,
+                                  req->source.value.good);
+    break;
   case VUT_TERRAIN:
     eval = is_terrain_in_range(target_tile, target_city,
                                req->range, req->survives,
@@ -2801,7 +2847,6 @@
     }
     break;
   case VUT_COUNT:
-  case VUT_RESERVED_1:
     log_error("is_req_active(): invalid source kind %d.", req->source.kind);
     return FALSE;
   }
@@ -2908,6 +2953,7 @@
     return FALSE;
   case VUT_TERRAIN:
   case VUT_EXTRA:
+  case VUT_GOOD:
   case VUT_TERRAINCLASS:
   case VUT_TERRFLAG:
   case VUT_TERRAINALTER:
@@ -2921,7 +2967,6 @@
     /* Once year is reached, it does not change again */
     return req->source.value.minyear > game.info.year;
   case VUT_COUNT:
-  case VUT_RESERVED_1:
     break;
   }
   fc_assert_msg(FALSE, "Invalid source kind %d.", req->source.kind);
@@ -2956,7 +3001,6 @@
   }
   switch (psource1->kind) {
   case VUT_NONE:
-  case VUT_RESERVED_1:
     return TRUE;
   case VUT_ADVANCE:
     return psource1->value.advance == psource2->value.advance;
@@ -2974,6 +3018,8 @@
     return psource1->value.impr_genus == psource2->value.impr_genus;
   case VUT_EXTRA:
     return psource1->value.extra == psource2->value.extra;
+  case VUT_GOOD:
+    return psource1->value.good == psource2->value.good;
   case VUT_TERRAIN:
     return psource1->value.terrain == psource2->value.terrain;
   case VUT_TERRFLAG:
@@ -3078,6 +3124,8 @@
     return impr_genus_id_name(psource->value.impr_genus);
   case VUT_EXTRA:
     return extra_rule_name(psource->value.extra);
+  case VUT_GOOD:
+    return goods_rule_name(psource->value.good);
   case VUT_TERRAIN:
     return terrain_rule_name(psource->value.terrain);
   case VUT_TERRFLAG:
@@ -3148,7 +3196,6 @@
   case VUT_TERRAINALTER:
     return terrain_alteration_name(psource->value.terrainalter);
   case VUT_COUNT:
-  case VUT_RESERVED_1:
     break;
   }
 
@@ -3204,6 +3251,9 @@
     return buf;
   case VUT_EXTRA:
     fc_strlcat(buf, extra_name_translation(psource->value.extra), bufsz);
+    return buf;
+  case VUT_GOOD:
+    fc_strlcat(buf, goods_name_translation(psource->value.good), bufsz);
     return buf;
   case VUT_TERRAIN:
     fc_strlcat(buf, terrain_name_translation(psource->value.terrain), bufsz);
@@ -3367,7 +3417,6 @@
     fc_strlcat(buf, _("City center"), bufsz);
     return buf;
   case VUT_COUNT:
-  case VUT_RESERVED_1:
     break;
   }
 

Modified: trunk/common/traderoutes.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/common/traderoutes.c?rev=31940&r1=31939&r2=31940&view=diff
==============================================================================
--- trunk/common/traderoutes.c  (original)
+++ trunk/common/traderoutes.c  Tue Feb 16 15:11:01 2016
@@ -509,6 +509,22 @@
 }
 
 /****************************************************************************
+  Does city receive goods
+****************************************************************************/
+bool city_receives_goods(const struct city *pcity,
+                         const struct goods_type *pgood)
+{
+  trade_routes_iterate(pcity, proute) {
+    if (proute->goods == pgood
+        && (proute->dir == RDIR_TO || proute->dir == RDIR_BIDIRECTIONAL)) {
+      return TRUE;
+    }
+  } trade_routes_iterate_end;
+
+  return FALSE;
+}
+
+/****************************************************************************
   Return goods type for the new traderoute between given cities.
 ****************************************************************************/
 struct goods_type *goods_for_new_route(struct city *src, struct city *dest)

Modified: trunk/common/traderoutes.h
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/common/traderoutes.h?rev=31940&r1=31939&r2=31940&view=diff
==============================================================================
--- trunk/common/traderoutes.h  (original)
+++ trunk/common/traderoutes.h  Tue Feb 16 15:11:01 2016
@@ -174,6 +174,8 @@
 
 bool goods_can_be_provided(struct city *pcity, struct goods_type *pgood);
 struct goods_type *goods_for_new_route(struct city *src, struct city *dest);
+bool city_receives_goods(const struct city *pcity,
+                         const struct goods_type *pgood);
 
 #define goods_type_iterate(_p)                                \
 {                                                             \

Modified: trunk/doc/README.effects
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/doc/README.effects?rev=31940&r1=31939&r2=31940&view=diff
==============================================================================
--- trunk/doc/README.effects    (original)
+++ trunk/doc/README.effects    Tue Feb 16 15:11:01 2016
@@ -55,6 +55,7 @@
 BaseFlag:      Local, Adjacent, CAdjacent, Traderoute, City
 RoadFlag:      Local, Adjacent, CAdjacent, Traderoute, City
 Terrain:       Local, Adjacent, CAdjacent, Traderoute, City
+Good:                                                  City
 UnitType:      Local
 UnitFlag:      Local
 UnitClass:     Local

Modified: trunk/fc_version
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/fc_version?rev=31940&r1=31939&r2=31940&view=diff
==============================================================================
--- trunk/fc_version    (original)
+++ trunk/fc_version    Tue Feb 16 15:11:01 2016
@@ -55,7 +55,7 @@
 #   - 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-3.0-2016.Feb.14"
+NETWORK_CAPSTRING_MANDATORY="+Freeciv.Devel-3.0-2016.Feb.16"
 NETWORK_CAPSTRING_OPTIONAL=""
 
 FREECIV_DISTRIBUTOR=""

Modified: trunk/server/cityturn.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/cityturn.c?rev=31940&r1=31939&r2=31940&view=diff
==============================================================================
--- trunk/server/cityturn.c     (original)
+++ trunk/server/cityturn.c     Tue Feb 16 15:11:01 2016
@@ -1375,6 +1375,33 @@
                                           API_TYPE_BUILDING_TYPE, ptarget,
                                           API_TYPE_CITY, pcity,
                                           API_TYPE_STRING, "have_extra");
+              }
+             break;
+            case VUT_GOOD:
+              if (preq->present) {
+                notify_player(pplayer, city_tile(pcity),
+                              E_CITY_CANTBUILD, ftc_server,
+                              Q_("?extra:%s can't build %s from the worklist; "
+                                 "%s is required. Postponing..."),
+                              city_link(pcity),
+                              city_improvement_name_translation(pcity, 
ptarget),
+                              goods_name_translation(preq->source.value.good));
+                script_server_signal_emit("building_cant_be_built", 3,
+                                          API_TYPE_BUILDING_TYPE, ptarget,
+                                          API_TYPE_CITY, pcity,
+                                          API_TYPE_STRING, "need_good");
+              } else {
+                notify_player(pplayer, city_tile(pcity),
+                              E_CITY_CANTBUILD, ftc_server,
+                              Q_("?extra:%s can't build %s from the worklist; "
+                                 "%s is prohibited. Postponing..."),
+                              city_link(pcity),
+                              city_improvement_name_translation(pcity, 
ptarget),
+                              goods_name_translation(preq->source.value.good));
+                script_server_signal_emit("building_cant_be_built", 3,
+                                          API_TYPE_BUILDING_TYPE, ptarget,
+                                          API_TYPE_CITY, pcity,
+                                          API_TYPE_STRING, "have_good");
               }
              break;
            case VUT_TERRAIN:
@@ -1848,7 +1875,6 @@
                 success = FALSE;
               }
               break;
-            case VUT_RESERVED_1:
             case VUT_NONE:
             case VUT_COUNT:
               fc_assert_ret_val_msg(FALSE, TRUE,

Modified: trunk/server/rssanity.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/rssanity.c?rev=31940&r1=31939&r2=31940&view=diff
==============================================================================
--- trunk/server/rssanity.c     (original)
+++ trunk/server/rssanity.c     Tue Feb 16 15:11:01 2016
@@ -242,11 +242,11 @@
      case VUT_NATIONGROUP:
        /* Nations can be in multiple groups. */
      case VUT_NONE:
-     case VUT_RESERVED_1:
      case VUT_ADVANCE:
      case VUT_TECHFLAG:
      case VUT_IMPROVEMENT:
      case VUT_UNITSTATE:
+     case VUT_GOOD:
        /* Can check different properties. */
      case VUT_UTFLAG:
      case VUT_UCFLAG:


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

Reply via email to