diff -Nur -X/home/free/zip/diff.ignore.freeciv freeciv/client/agents/cma_core.c my_freeciv/client/agents/cma_core.c
--- freeciv/client/agents/cma_core.c	2004-05-29 16:34:31.000000000 -0400
+++ my_freeciv/client/agents/cma_core.c	2004-07-04 22:59:02.265611205 -0400
@@ -78,7 +78,7 @@
 
 #define my_city_map_iterate(pcity, cx, cy) {                           \
   city_map_checked_iterate(pcity->x, pcity->y, cx, cy, map_x, map_y) { \
-    if(!is_city_center(cx, cy)) {
+    if(!(is_city_center(cx, cy) && game.rgame.has_free_city_center)) {
 
 #define my_city_map_iterate_end \
     }                                \
diff -Nur -X/home/free/zip/diff.ignore.freeciv freeciv/client/packhand.c my_freeciv/client/packhand.c
--- freeciv/client/packhand.c	2004-07-04 22:57:55.000000000 -0400
+++ my_freeciv/client/packhand.c	2004-07-04 22:59:02.269610128 -0400
@@ -2710,6 +2710,7 @@
   game.rgame.min_city_center_food = packet->min_city_center_food;
   game.rgame.min_city_center_shield = packet->min_city_center_shield;
   game.rgame.min_city_center_trade = packet->min_city_center_trade;
+  game.rgame.has_free_city_center = packet->has_free_city_center;
   game.rgame.min_dist_bw_cities = packet->min_dist_bw_cities;
   game.rgame.init_vis_radius_sq = packet->init_vis_radius_sq;
   game.rgame.hut_overflight = packet->hut_overflight;
diff -Nur -X/home/free/zip/diff.ignore.freeciv freeciv/common/aicore/cm.c my_freeciv/common/aicore/cm.c
--- freeciv/common/aicore/cm.c	2004-07-04 22:57:56.000000000 -0400
+++ my_freeciv/common/aicore/cm.c	2004-07-04 22:59:02.273609050 -0400
@@ -149,7 +149,7 @@
 #define DISABLE_CACHE3                                  FALSE
 
 #define NUM_SPECIALISTS_ROLES				3
-#define MAX_FIELDS_USED	       	                        (CITY_TILES - 1)
+#define MAX_FIELDS_USED	       	                        (CITY_TILES)
 #define MAX_COMBINATIONS				150
 
 /*
@@ -220,7 +220,7 @@
 
 #define my_city_map_iterate(pcity, cx, cy) {                           \
   city_map_checked_iterate(pcity->x, pcity->y, cx, cy, map_x, map_y) { \
-    if(!is_city_center(cx, cy)) {
+    if(!(is_city_center(cx, cy) && game.rgame.has_free_city_center)) {
 
 #define my_city_map_iterate_end \
     }                                \
@@ -578,6 +578,11 @@
 static void clear_cache(void)
 {
   int i, j;
+
+  if (MAX_FIELDS_USED == 0) {
+    return;
+  }
+
   for (i = 0; i < MAX_FIELDS_USED + 1; i++) {
     for (j = 0; j < MAX_COMBINATIONS; j++) {
       if (!cache3.results[i].combinations[j].is_valid) {
@@ -1179,15 +1184,21 @@
    * cache3.fields_available_total. Fill tile_stats.
    */
   root_combination.worker = 0;
-  root_combination.production2[FOOD] =
+  if (game.rgame.has_free_city_center) {
+    root_combination.production2[FOOD] =
       base_city_get_food_tile(CITY_MAP_RADIUS, CITY_MAP_RADIUS,
 			      pcity, is_celebrating);
-  root_combination.production2[SHIELD] =
+    root_combination.production2[SHIELD] =
       base_city_get_shields_tile(CITY_MAP_RADIUS, CITY_MAP_RADIUS, 
-			      pcity, is_celebrating);
-  root_combination.production2[TRADE] =
+				 pcity, is_celebrating);
+    root_combination.production2[TRADE] =
       base_city_get_trade_tile(CITY_MAP_RADIUS, CITY_MAP_RADIUS, 
-			     pcity, is_celebrating);
+			       pcity, is_celebrating);
+  } else {
+    root_combination.production2[FOOD] = 0;
+    root_combination.production2[SHIELD] = 0;
+    root_combination.production2[TRADE] = 0;
+  }
 
   total_tile_trade = root_combination.production2[TRADE];
 
diff -Nur -X/home/free/zip/diff.ignore.freeciv freeciv/common/city.c my_freeciv/common/city.c
--- freeciv/common/city.c	2004-07-04 22:57:55.000000000 -0400
+++ my_freeciv/common/city.c	2004-07-04 22:59:02.277607973 -0400
@@ -836,6 +836,7 @@
   struct tile_type *type = get_tile_type(tile_t);
   int f;
   const bool auto_water = (pcity && is_city_center(city_x, city_y)
+			   && game.rgame.has_free_city_center
 			   && tile_t == type->irrigation_result
 			   && terrain_control.may_irrigate);
 
@@ -893,6 +894,10 @@
   }
 
   if (pcity && is_city_center(city_x, city_y)) {
+    /* if no free city center, center tile gets bonus food */
+    if (!game.rgame.has_free_city_center) {
+      f += 1;
+    }
     f = MAX(f, game.rgame.min_city_center_food);
   }
 
diff -Nur -X/home/free/zip/diff.ignore.freeciv freeciv/common/game.h my_freeciv/common/game.h
--- freeciv/common/game.h	2004-07-04 22:57:56.000000000 -0400
+++ my_freeciv/common/game.h	2004-07-04 22:59:02.278607703 -0400
@@ -198,6 +198,7 @@
     int min_city_center_food;
     int min_city_center_shield;
     int min_city_center_trade;
+    bool has_free_city_center;
     int min_dist_bw_cities;
     int init_vis_radius_sq;
     int hut_overflight;
diff -Nur -X/home/free/zip/diff.ignore.freeciv freeciv/common/packets.def my_freeciv/common/packets.def
--- freeciv/common/packets.def	2004-06-21 16:25:19.000000000 -0400
+++ my_freeciv/common/packets.def	2004-07-04 22:59:02.280607164 -0400
@@ -971,6 +971,7 @@
   UINT8 min_city_center_food;
   UINT8 min_city_center_shield;
   UINT8 min_city_center_trade;
+  BOOL has_free_city_center;
   UINT8 min_dist_bw_cities;
   UINT8 init_vis_radius_sq;
   UINT8 hut_overflight;
diff -Nur -X/home/free/zip/diff.ignore.freeciv freeciv/data/default/game.ruleset my_freeciv/data/default/game.ruleset
--- freeciv/data/default/game.ruleset	2004-04-19 08:17:15.000000000 -0400
+++ my_freeciv/data/default/game.ruleset	2004-07-04 22:59:02.281606895 -0400
@@ -22,6 +22,11 @@
 min_city_center_shield	= 1
 min_city_center_trade	= 0
 
+;Whether city center is worked for free
+;  0 = No
+;  1 = Yes (default)
+has_free_city_center    = 0
+
 ; Minimum distance between cities (move distance).
 ; (Minimum value for this is 1, which means adjacent is okay.)
 min_dist_bw_cities	= 2
@@ -49,7 +54,7 @@
 ;     city_granary_size = (granary_food_ini[num_inis] * foodbox) +
 ;        (granary_food_inc * (city_size - num_inis)) * foodbox / 100
 granary_food_ini	= 2
-granary_food_inc	= 100
+granary_food_inc	= 50
 
 ; Method of calculating technology costs
 ;   0 - Civ (I|II) style. Every new tech add researchcost to cost of next tech.
diff -Nur -X/home/free/zip/diff.ignore.freeciv freeciv/data/default/governments.ruleset my_freeciv/data/default/governments.ruleset
--- freeciv/data/default/governments.ruleset	2003-08-14 17:17:58.000000000 -0400
+++ my_freeciv/data/default/governments.ruleset	2004-07-04 22:59:02.282606626 -0400
@@ -237,7 +237,7 @@
 
 production_trade_penalty  = 2, 0
 production_shield_penalty = 2, 0
-production_food_penalty   = 2, 0
+production_food_penalty   = 3, 0
 
 ruler_male_title = _("Emperor")
 ruler_female_title = _("Empress")
diff -Nur -X/home/free/zip/diff.ignore.freeciv freeciv/data/default/units.ruleset my_freeciv/data/default/units.ruleset
--- freeciv/data/default/units.ruleset	2004-07-04 22:57:56.000000000 -0400
+++ my_freeciv/data/default/units.ruleset	2004-07-04 22:59:02.285605818 -0400
@@ -202,7 +202,7 @@
 sound_move_alt = "m_generic"
 sound_fight   = "f_settlers"
 sound_fight_alt = "f_generic"
-build_cost    = 40
+build_cost    = 60
 pop_cost      = 1
 attack        = 0
 defense       = 1
@@ -238,7 +238,7 @@
 [unit_worker]
 name          = _("Workers")
 move_type     = "Land"
-tech_req      = "Pottery"
+tech_req      = "None"
 obsolete_by   = "Engineers"
 graphic       = "u.worker"
 graphic_alt   = "u.engineers" ; for compatibility
diff -Nur -X/home/free/zip/diff.ignore.freeciv freeciv/server/cityhand.c my_freeciv/server/cityhand.c
--- freeciv/server/cityhand.c	2004-06-02 18:54:15.000000000 -0400
+++ my_freeciv/server/cityhand.c	2004-07-04 22:59:02.286605548 -0400
@@ -99,7 +99,8 @@
   if (!pcity) {
     return;
   }
-  if (is_city_center(worker_x, worker_y)) {
+  if (is_city_center(worker_x, worker_y) 
+      && game.rgame.has_free_city_center) {
     auto_arrange_workers(pcity);
     sync_cities();
     return;
@@ -135,7 +136,8 @@
     return;
   }
 
-  if (is_city_center(worker_x, worker_y)) {
+  if (is_city_center(worker_x, worker_y)
+      && game.rgame.has_free_city_center) {
     auto_arrange_workers(pcity);
     sync_cities();
     return;
diff -Nur -X/home/free/zip/diff.ignore.freeciv freeciv/server/citytools.c my_freeciv/server/citytools.c
--- freeciv/server/citytools.c	2004-06-21 16:25:21.000000000 -0400
+++ my_freeciv/server/citytools.c	2004-07-04 22:59:02.289604740 -0400
@@ -500,7 +500,7 @@
 {
   int worst = 0, tmp;
   city_map_iterate(x, y) {
-    if (is_city_center(x, y))
+    if (is_city_center(x, y) && game.rgame.has_free_city_center)
       continue;
     if (get_worker_city(pcity, x, y) == C_TILE_WORKER) {
       tmp = city_tile_value(pcity, x, y, 0, 0);
@@ -517,7 +517,7 @@
 {
   int best = 0, tmp;
   city_map_iterate(x, y) {
-    if (is_city_center(x, y) ||
+    if ((is_city_center(x, y) && game.rgame.has_free_city_center) ||
 	(get_worker_city(pcity, x, y) == C_TILE_WORKER) ||
 	can_place_worker_here(pcity, x, y)) {
       tmp = city_tile_value(pcity, x, y, 0, 0);
@@ -1113,7 +1113,9 @@
    * status and so must be done after the above. */
   map_update_borders_city_change(pcity);
 
-  server_set_tile_city(pcity, CITY_MAP_SIZE/2, CITY_MAP_SIZE/2, C_TILE_WORKER);
+  if (game.rgame.has_free_city_center) {
+    server_set_tile_city(pcity, CITY_MAP_SIZE/2, CITY_MAP_SIZE/2, C_TILE_WORKER);
+  }
   auto_arrange_workers(pcity);
 
   city_refresh(pcity);
diff -Nur -X/home/free/zip/diff.ignore.freeciv freeciv/server/cityturn.c my_freeciv/server/cityturn.c
--- freeciv/server/cityturn.c	2004-05-29 16:34:31.000000000 -0400
+++ my_freeciv/server/cityturn.c	2004-07-04 22:59:02.291604201 -0400
@@ -247,12 +247,12 @@
   /* Now apply results */
   city_map_checked_iterate(pcity->x, pcity->y, x, y, mapx, mapy) {
     if (pcity->city_map[x][y] == C_TILE_WORKER
-	&& !is_city_center(x, y)
+	&& !(is_city_center(x, y) && game.rgame.has_free_city_center)
 	&& !cmr.worker_positions_used[x][y]) {
       server_remove_worker_city(pcity, x, y);
     }
     if (pcity->city_map[x][y] != C_TILE_WORKER
-	&& !is_city_center(x, y)
+	&& !(is_city_center(x, y) && game.rgame.has_free_city_center)
 	&& cmr.worker_positions_used[x][y]) {
       server_set_worker_city(pcity, x, y);
     }
@@ -413,7 +413,9 @@
     /* Take it out on workers */
     city_map_iterate(x, y) {
       if (get_worker_city(pcity, x, y) == C_TILE_WORKER
-          && !is_city_center(x, y) && pop_loss > 0) {
+          && !(is_city_center(x, y) 
+	       && game.rgame.has_free_city_center)
+	  && pop_loss > 0) {
         server_remove_worker_city(pcity, x, y);
         pop_loss--;
       }
diff -Nur -X/home/free/zip/diff.ignore.freeciv freeciv/server/ruleset.c my_freeciv/server/ruleset.c
--- freeciv/server/ruleset.c	2004-06-21 16:25:21.000000000 -0400
+++ my_freeciv/server/ruleset.c	2004-07-04 22:59:02.295603124 -0400
@@ -2596,6 +2596,10 @@
   game.rgame.min_city_center_trade =
     secfile_lookup_int(&file, "civstyle.min_city_center_trade");
 
+  game.rgame.has_free_city_center =
+    secfile_lookup_bool_default(&file, TRUE, 
+				"civstyle.has_free_city_center");
+
   /* if the server variable citymindist is set (!= 0) the ruleset
      setting is overwritten by citymindist */
   if (game.citymindist == 0) {
@@ -3111,6 +3115,7 @@
   misc_p.min_city_center_food = game.rgame.min_city_center_food;
   misc_p.min_city_center_shield = game.rgame.min_city_center_shield;
   misc_p.min_city_center_trade = game.rgame.min_city_center_trade;
+  misc_p.has_free_city_center = game.rgame.has_free_city_center;
   misc_p.min_dist_bw_cities = game.rgame.min_dist_bw_cities;
   misc_p.init_vis_radius_sq = game.rgame.init_vis_radius_sq;
   misc_p.hut_overflight = game.rgame.hut_overflight;
diff -Nur -X/home/free/zip/diff.ignore.freeciv freeciv/server/sanitycheck.c my_freeciv/server/sanitycheck.c
--- freeciv/server/sanitycheck.c	2004-07-04 22:58:02.000000000 -0400
+++ my_freeciv/server/sanitycheck.c	2004-07-04 22:59:02.297602585 -0400
@@ -228,11 +228,17 @@
       workers++;
     }
   } city_map_iterate_end;
-  if (workers + city_specialists(pcity) != pcity->size + 1) {
+  if (workers + city_specialists(pcity) != pcity->size + 1 && game.rgame.has_free_city_center) {
     die("%s is illegal (size%d w%d e%d t%d s%d) in %s line %d",
-        pcity->name, pcity->size, workers, pcity->specialists[SP_ELVIS],
-        pcity->specialists[SP_TAXMAN], pcity->specialists[SP_SCIENTIST], file, line);
+      pcity->name, pcity->size, workers, pcity->specialists[SP_ELVIS],
+      pcity->specialists[SP_TAXMAN], pcity->specialists[SP_SCIENTIST], file, line);
   }
+  if (workers + city_specialists(pcity) != pcity->size && !game.rgame.has_free_city_center) {
+    die("%s is illegal (size%d w%d e%d t%d s%d) in %s line %d",
+      pcity->name, pcity->size, workers, pcity->specialists[SP_ELVIS],
+      pcity->specialists[SP_TAXMAN], pcity->specialists[SP_SCIENTIST], file, line);
+  }
+
 }
 
 /**************************************************************************
