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