Author: cazfi
Date: Sun Oct 25 09:06:23 2015
New Revision: 30206

URL: http://svn.gna.org/viewcvs/freeciv?rev=30206&view=rev
Log:
Added requirement type MinTechs

See patch #6460

Modified:
    trunk/ai/default/daieffects.c
    trunk/client/helpdata.c
    trunk/common/fc_types.h
    trunk/common/game.c
    trunk/common/packets.def
    trunk/common/requirements.c
    trunk/common/research.c
    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=30206&r1=30205&r2=30206&view=diff
==============================================================================
--- trunk/ai/default/daieffects.c       (original)
+++ trunk/ai/default/daieffects.c       Sun Oct 25 09:06:23 2015
@@ -704,6 +704,7 @@
   case VUT_TECHFLAG:
   case VUT_ACHIEVEMENT:
   case VUT_MINCULTURE:
+  case VUT_MINTECHS:
     /* No way to remove once present. */
     return preq->present;
 

Modified: trunk/client/helpdata.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/client/helpdata.c?rev=30206&r1=30205&r2=30206&view=diff
==============================================================================
--- trunk/client/helpdata.c     (original)
+++ trunk/client/helpdata.c     Sun Oct 25 09:06:23 2015
@@ -2566,6 +2566,44 @@
     }
     return TRUE;
 
+  case VUT_MINTECHS:
+    switch (preq->range) {
+    case REQ_RANGE_WORLD:
+      if (preq->present) {
+        cat_snprintf(buf, bufsz,
+                     _("Requires %d techs to be known in the world.\n"),
+                     preq->source.value.min_techs);
+      } else {
+        cat_snprintf(buf, bufsz,
+                     _("Prevented when %d techs are known in the world.\n"),
+                     preq->source.value.min_techs);
+      }
+      return TRUE;
+    case REQ_RANGE_PLAYER:
+      if (preq->present) {
+        cat_snprintf(buf, bufsz,
+                     _("Requires player to knoe %d techs.\n"),
+                     preq->source.value.min_techs);
+      } else {
+        cat_snprintf(buf, bufsz,
+                     _("Prevented when player knows %d techs.\n"),
+                     preq->source.value.min_techs);
+      }
+      return TRUE;
+    case REQ_RANGE_LOCAL:
+    case REQ_RANGE_CADJACENT:
+    case REQ_RANGE_ADJACENT:
+    case REQ_RANGE_CITY:
+    case REQ_RANGE_TRADEROUTE:
+    case REQ_RANGE_CONTINENT:
+    case REQ_RANGE_TEAM:
+    case REQ_RANGE_ALLIANCE:
+    case REQ_RANGE_COUNT:
+      /* Not supported. */
+      break;
+    }
+    break;
+
   case VUT_TERRAINALTER:
     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=30206&r1=30205&r2=30206&view=diff
==============================================================================
--- trunk/common/fc_types.h     (original)
+++ trunk/common/fc_types.h     Sun Oct 25 09:06:23 2015
@@ -381,6 +381,7 @@
   int minveteran;
   int min_hit_points;
   int age;
+  int min_techs;
 
   enum topo_flag topo_property;
 } universals_u;
@@ -471,6 +472,8 @@
 #define SPECENUM_VALUE37NAME "BuildingGenus"
 #define SPECENUM_VALUE38 VUT_ACTION
 #define SPECENUM_VALUE38NAME "Action"
+#define SPECENUM_VALUE39 VUT_MINTECHS
+#define SPECENUM_VALUE39NAME "MinTechs"
 /* Keep this last. */
 #define SPECENUM_COUNT VUT_COUNT
 #include "specenum_gen.h"

Modified: trunk/common/game.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/common/game.c?rev=30206&r1=30205&r2=30206&view=diff
==============================================================================
--- trunk/common/game.c (original)
+++ trunk/common/game.c Sun Oct 25 09:06:23 2015
@@ -290,6 +290,7 @@
   game.info.fogofwar         = GAME_DEFAULT_FOGOFWAR;
   game.info.foodbox          = GAME_DEFAULT_FOODBOX;
   game.info.fulltradesize    = GAME_DEFAULT_FULLTRADESIZE;
+  game.info.global_advance_count = 0;
   for (i = 0; i < A_LAST; i++) {
     /* game.num_tech_types = 0 here */
     game.info.global_advances[i] = FALSE;

Modified: trunk/common/packets.def
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/common/packets.def?rev=30206&r1=30205&r2=30206&view=diff
==============================================================================
--- trunk/common/packets.def    (original)
+++ trunk/common/packets.def    Sun Oct 25 09:06:23 2015
@@ -464,6 +464,7 @@
   UINT8 forced_science;
   UINT8 fulltradesize;
   /* True if at least one civilization has researched a tech */
+  UINT16 global_advance_count;
   BOOL global_advances[A_LAST]; diff
   BOOL global_warming;
   UINT32 globalwarming;

Modified: trunk/common/requirements.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/common/requirements.c?rev=30206&r1=30205&r2=30206&view=diff
==============================================================================
--- trunk/common/requirements.c (original)
+++ trunk/common/requirements.c Sun Oct 25 09:06:23 2015
@@ -216,6 +216,11 @@
       return source;
     }
     break;
+  case VUT_MINTECHS:
+    source.value.min_techs = atoi(value);
+    if (source.value.min_techs > 0) {
+      return source;
+    }
   case VUT_ACTION:
     source.value.action = action_by_rule_name(value);
     if (source.value.action != NULL) {
@@ -435,6 +440,9 @@
     return source;
   case VUT_AGE:
     source.value.age = value;
+    return source;
+  case VUT_MINTECHS:
+    source.value.min_techs = value;
     return source;
   case VUT_ACTION:
     source.value.action = action_by_number(value);
@@ -560,6 +568,8 @@
     return source->value.min_hit_points;
   case VUT_AGE:
     return source->value.age;
+  case VUT_MINTECHS:
+    return source->value.min_techs;
   case VUT_ACTION:
     return action_number(source->value.action);
   case VUT_OTYPE:
@@ -686,6 +696,7 @@
       break;
     case VUT_MINYEAR:
     case VUT_TOPO:
+    case VUT_MINTECHS:
       req.range = REQ_RANGE_WORLD;
       break;
     }
@@ -716,6 +727,7 @@
   case VUT_ADVANCE:
   case VUT_TECHFLAG:
   case VUT_ACHIEVEMENT:
+  case VUT_MINTECHS:
     invalid = (req.range < REQ_RANGE_PLAYER);
     break;
   case VUT_GOVERNMENT:
@@ -847,6 +859,7 @@
     case VUT_STYLE:
     case VUT_DIPLREL:
     case VUT_MAXTILEUNITS:
+    case VUT_MINTECHS:
       /* Most requirements don't support 'survives'. */
       invalid = survives;
       break;
@@ -2767,6 +2780,24 @@
     default:
       eval = TRI_MAYBE;
       break;
+    }
+    break;
+  case VUT_MINTECHS:
+    switch (req->range) {
+    case REQ_RANGE_WORLD:
+      /* "None" does not count */
+      eval = ((game.info.global_advance_count - 1) >= 
req->source.value.min_techs);
+      break;
+    case REQ_RANGE_PLAYER:
+      if (target_player == NULL) {
+        eval = TRI_MAYBE;
+      } else {
+        /* "None" does not count */
+        eval = ((research_get(target_player)->techs_researched - 1) >= 
req->source.value.min_techs);
+      }
+      break;
+    default:
+      eval = TRI_MAYBE;
     }
     break;
   case VUT_ACTION:
@@ -2950,6 +2981,7 @@
   case VUT_IMPR_GENUS:
   case VUT_MINSIZE:
   case VUT_MINCULTURE:
+  case VUT_MINTECHS:
   case VUT_NATIONALITY:
   case VUT_DIPLREL:
   case VUT_MAXTILEUNITS:
@@ -3063,6 +3095,8 @@
     return psource1->value.min_hit_points == psource2->value.min_hit_points;
   case VUT_AGE:
     return psource1->value.age == psource2->value.age;
+  case VUT_MINTECHS:
+    return psource1->value.min_techs == psource2->value.min_techs;
   case VUT_ACTION:
     return (action_number(psource1->value.action)
             == action_number(psource2->value.action));
@@ -3175,6 +3209,10 @@
     fc_snprintf(buffer, sizeof(buffer), "%d", psource->value.age);
 
     return buffer;
+  case VUT_MINTECHS:
+    fc_snprintf(buffer, sizeof(buffer), "%d", psource->value.min_techs);
+
+    return buffer;
   case VUT_ACTION:
     return action_rule_name(psource->value.action);
   case VUT_OTYPE:
@@ -3348,6 +3386,10 @@
     cat_snprintf(buf, bufsz, _("Age %d"),
                  psource->value.age);
     return buf;
+  case VUT_MINTECHS:
+    cat_snprintf(buf, bufsz, _("%d Techs"),
+                 psource->value.min_techs);
+    return buf;
   case VUT_ACTION:
     fc_strlcat(buf, action_name_translation(psource->value.action),
                bufsz);

Modified: trunk/common/research.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/common/research.c?rev=30206&r1=30205&r2=30206&view=diff
==============================================================================
--- trunk/common/research.c     (original)
+++ trunk/common/research.c     Sun Oct 25 09:06:23 2015
@@ -641,8 +641,12 @@
   presearch->inventions[tech].state = value;
 
   if (value == TECH_KNOWN) {
-    game.info.global_advances[tech] = TRUE;
-  }
+    if (!game.info.global_advances[tech]) {
+      game.info.global_advances[tech] = TRUE;
+      game.info.global_advance_count++;
+    }
+  }
+
   return old;
 }
 

Modified: trunk/doc/README.effects
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/doc/README.effects?rev=30206&r1=30205&r2=30206&view=diff
==============================================================================
--- trunk/doc/README.effects    (original)
+++ trunk/doc/README.effects    Sun Oct 25 09:06:23 2015
@@ -46,6 +46,7 @@
 
 Tech:          World, Alliance, Team, Player
 TechFlag:      World, Alliance, Team, Player
+MinTechs:      World, Player
 Achievement:   World, Alliance, Team, Player
 Gov:           Player
 Building:      World, Alliance, Team, Player, Continent, Traderoute, City, 
Local

Modified: trunk/fc_version
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/fc_version?rev=30206&r1=30205&r2=30206&view=diff
==============================================================================
--- trunk/fc_version    (original)
+++ trunk/fc_version    Sun Oct 25 09:06:23 2015
@@ -54,7 +54,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-2015.Oct.14"
+NETWORK_CAPSTRING_MANDATORY="+Freeciv.Devel-3.0-2015.Oct.25"
 NETWORK_CAPSTRING_OPTIONAL=""
 
 FREECIV_DISTRIBUTOR=""

Modified: trunk/server/cityturn.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/cityturn.c?rev=30206&r1=30205&r2=30206&view=diff
==============================================================================
--- trunk/server/cityturn.c     (original)
+++ trunk/server/cityturn.c     Sun Oct 25 09:06:23 2015
@@ -1563,6 +1563,23 @@
                 success = FALSE;
               }
              break;
+            case VUT_MINTECHS:
+              if (preq->present) {
+                notify_player(pplayer, city_tile(pcity),
+                              E_CITY_CANTBUILD, ftc_server,
+                              _("%s can't build %s from the worklist; "
+                                "%d techs must be known. Postponing..."),
+                              city_link(pcity),
+                              city_improvement_name_translation(pcity, 
ptarget),
+                              preq->source.value.min_techs);
+               script_server_signal_emit("building_cant_be_built", 3,
+                                  API_TYPE_BUILDING_TYPE, ptarget,
+                                  API_TYPE_CITY, pcity,
+                                  API_TYPE_STRING, "need_mintechs");
+              } else {
+                success = FALSE;
+              }
+              break;
            case VUT_MAXTILEUNITS:
              if (preq->present) {
                notify_player(pplayer, city_tile(pcity),

Modified: trunk/server/rssanity.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/rssanity.c?rev=30206&r1=30205&r2=30206&view=diff
==============================================================================
--- trunk/server/rssanity.c     (original)
+++ trunk/server/rssanity.c     Sun Oct 25 09:06:23 2015
@@ -215,6 +215,16 @@
     case VUT_AGE:
       /* There can be age of the city, unit, and player */
       if (rc > 3) {
+        log_error("%s: Requirement list has more %s requirements than "
+                  "can ever be fullfilled.", list_for,
+                  universal_type_rule_name(&preq->source));
+        return FALSE;
+      }
+      break;
+
+    case VUT_MINTECHS:
+      /* At ranges 'Player' and 'World' */
+      if (rc > 2) {
         log_error("%s: Requirement list has more %s requirements than "
                   "can ever be fullfilled.", list_for,
                   universal_type_rule_name(&preq->source));


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

Reply via email to