From: sam+civ@hotaru.chaosring.org
To: freeciv-dev@complete.org
Subject: [PATCH] Improved patch which makes tech handiap a parameter
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: 8bit

Hello there,

With the help of Vallimar, I now have a FreeCiv patch which makes the
tech handicap a user-adjustable parameter.  In addition, the patch also
allows the AI's city growth to be slowed down.

I understand there is sone controversey with this patch among the FreeCiv
community.  It is my sincere hope that, by making this an adjustable 
parameter, we can satisfy the desires of both those who want to make 
the game easier for newbies, and the desires of those who enjoy a 
challenge from the AI, even at the easy skill level.

If there are any objections to this patch, please voice them here on
the list.  I feel very strongly that this needs to be part of the
FreeCiv tree; almost every time people discuss FreeCiv in a public forum,
people complain that the AI is too difficult to defeat.  In fact, I am
helping someone who is frustrated with the AI, even at "easy" level,
to compile and install FreeCiv with the earlier version of the tech 
handicap patch.

While I have gotten good enough to defeat the AI, even at hard level (I
was up to 6am last night defeating two "hard" AI opponents on a tiny
40x32 map [1]), I would never have stayed interested in FreeCiv to become
this good without the "training wheels" of a tech handicap.

I also appreciate the interest in the Tectonic plate patch; I personlly
feel this will be ready for inclusion in to the main tree when there
is some way of giving the client a progress bar showing the time it will
take to generate the map.  

I also like the idea of pluggable map generators; there are a number of
ideas I would like to see become map generators, such as John Beale's
gforge, but the present method of having them hard-wired in the source
can quickly cause the source to become unwieldly if we add too many
generators.

There are a number of fractal generators out there which use fractals
to generate maps; these generators should generate maps almost as 
satisfatory as the tectonic generator at a fraction of the computational
cost of the tectonic generator.

Again, Vallimar did a lot of work making this a changable parameter;
I really appreciate his help.

- Sam

[1] I did disable fog of war, since the AI can always see the entire map

diff -ur freeciv-1.14.0/common/game.c freeciv-1.14.0-handicap/common/game.c
--- freeciv-1.14.0/common/game.c	Fri Oct 11 16:35:13 2002
+++ freeciv-1.14.0-handicap/common/game.c	Mon Apr  7 16:57:41 2003
@@ -714,6 +714,9 @@
   game.watchtower_extra_vision=GAME_DEFAULT_WATCHTOWER_EXTRA_VISION,
   game.allowed_city_names = GAME_DEFAULT_ALLOWED_CITY_NAMES;
 
+  game.slowai_tech = GAME_DEFAULT_SLOWAI_TECH;
+  game.slowai_grow = GAME_DEFAULT_SLOWAI_GROW;
+
   sz_strlcpy(game.rulesetdir, GAME_DEFAULT_RULESETDIR);
 
   game.firepower_factor = 1;
diff -ur freeciv-1.14.0/common/game.h freeciv-1.14.0-handicap/common/game.h
--- freeciv-1.14.0/common/game.h	Fri Oct 11 16:35:13 2002
+++ freeciv-1.14.0-handicap/common/game.h	Mon Apr  7 17:02:02 2003
@@ -217,6 +217,9 @@
     bool load_private_map; /* Only makes sense if the players are loaded. */
     bool load_settings;
   } load_options;
+
+  int slowai_tech;
+  int slowai_grow;
 };
 
 /* Unused? */
@@ -455,4 +458,11 @@
 
 #define GAME_START_YEAR -4000
 
+#define GAME_DEFAULT_SLOWAI_TECH 100
+#define GAME_MIN_SLOWAI_TECH 50
+#define GAME_MAX_SLOWAI_TECH 400
+#define GAME_DEFAULT_SLOWAI_GROW 100
+#define GAME_MIN_SLOWAI_GROW 25
+#define GAME_MAX_SLOWAI_GROW 100
+
 #endif  /* FC__GAME_H */
diff -ur freeciv-1.14.0/common/tech.c freeciv-1.14.0-handicap/common/tech.c
--- freeciv-1.14.0/common/tech.c	Fri Oct 11 16:35:13 2002
+++ freeciv-1.14.0-handicap/common/tech.c	Mon Apr  7 17:07:35 2003
@@ -457,6 +457,17 @@
     exit(EXIT_FAILURE);
   }
 
+  /* For casual players, the AI gets tech far too fast.  This
+     slows down how fast the AI gets tech by the value in 
+     game.slowai_tech */
+  if (!game.is_new_game && pplayer->ai.control && game.slowai_tech != 100) {
+      float fcost, factor;
+      fcost = cost;
+      factor = game.slowai_tech;
+      fcost *= (factor / 100);
+      cost = fcost;
+      }
+
   /* If we have many players, tech cost may drop to 0.  */
   if (cost == 0) {
     cost = 1;
diff -ur freeciv-1.14.0/server/savegame.c freeciv-1.14.0-handicap/server/savegame.c
--- freeciv-1.14.0/server/savegame.c	Sun Dec  8 15:32:30 2002
+++ freeciv-1.14.0-handicap/server/savegame.c	Mon Apr  7 17:10:13 2003
@@ -1862,6 +1862,12 @@
 	secfile_lookup_int_default(file, game.allowed_city_names,
 				   "game.allowed_city_names"); 
 
+    game.slowai_tech = secfile_lookup_int_default(file,
+        GAME_DEFAULT_SLOWAI_TECH, "game.slowai_tech");
+
+    game.slowai_grow = secfile_lookup_int_default(file,
+        GAME_DEFAULT_SLOWAI_GROW, "game.slowai_grow");
+
     if(game.civstyle == 1) {
       string = "civ1";
     } else {
@@ -2184,6 +2190,8 @@
   secfile_insert_int(file, game.watchtower_vision, "game.watchtower_vision");
   secfile_insert_int(file, game.watchtower_extra_vision, "game.watchtower_extra_vision");
   secfile_insert_int(file, game.allowed_city_names, "game.allowed_city_names");
+  secfile_insert_int(file, game.slowai_tech, "game.slowai_tech");
+  secfile_insert_int(file, game.slowai_grow, "game.slowai_grow");
 
   if (TRUE) {
     /* Now always save these, so the server options reflect the
diff -ur freeciv-1.14.0/server/settlers.c freeciv-1.14.0-handicap/server/settlers.c
--- freeciv-1.14.0/server/settlers.c	Fri Nov 15 19:14:22 2002
+++ freeciv-1.14.0-handicap/server/settlers.c	Mon Apr  7 17:01:55 2003
@@ -34,6 +34,7 @@
 #include "aiunit.h"
 #include "aidata.h"
 
+#include "rand.h"
 #include "settlers.h"
 
 /* negative: in_city_radius, 0: unassigned, positive: city_des */
@@ -1262,8 +1263,8 @@
   /* Decide whether to build a new city:
    * if so, modify: gx, gy, best_newv, best_act
    */
-  if (unit_flag(punit, F_CITIES) &&
-      pplayer->ai.control) {
+  if (unit_flag(punit, F_CITIES) && pplayer->ai.control &&
+      (myrand(101) <= game.slowai_grow)) {
     int nx, ny;
     int want = evaluate_city_building(punit, &nx, &ny, &ferryboat);
 
diff -ur freeciv-1.14.0/server/stdinhand.c freeciv-1.14.0-handicap/server/stdinhand.c
--- freeciv-1.14.0/server/stdinhand.c	Fri Nov 15 19:14:22 2002
+++ freeciv-1.14.0-handicap/server/stdinhand.c	Mon Apr  7 17:15:40 2003
@@ -820,6 +820,24 @@
 	     "40=debuging logging."), NULL, 
 	  0, 40, 20)
 
+  GEN_INT("slowaitech", game.slowai_tech, SSET_RULES_FLEXIBLE, 
+          SSET_SERVER_ONLY, N_("Adjust AI tech advancement by %"),
+	  N_("This value determines how much slower the AI will learn "
+	     "new technologies compared to human players. Setting this to "
+	     "a value greater than 100 will slow their advancement.  For "
+	     "example, giving this a value of 200 slows down the AI's tech "
+	     "advancment by half."), NULL, GAME_MIN_SLOWAI_TECH, 
+	  GAME_MAX_SLOWAI_TECH, GAME_DEFAULT_SLOWAI_TECH)
+
+  GEN_INT("slowaigrowth", game.slowai_grow, SSET_RULES_FLEXIBLE, 
+          SSET_SERVER_ONLY, N_("Adjust city growth by %"),
+	  N_("This value determines how much slower the AI will expand in "
+	  "relation to human players. Setting a percent value under "
+	  "100 will cause them to expand at about the specified rate "
+	  "as compared to normal AI expansion."), NULL, 
+	  GAME_MIN_SLOWAI_GROW, GAME_MAX_SLOWAI_GROW, GAME_DEFAULT_SLOWAI_GROW)
+
+
   GEN_END
 };
 
