<URL: http://bugs.freeciv.org/Ticket/Display.html?id=15416 >

 Untested patch for S2_1 and TRUNK.

 Usually we choose best defender from those costing less than
limit_cost. If all units cost more than limit_cost, cheapest is
selected.

 - ML

diff -Nurd -X.diff_ignore freeciv/ai/advmilitary.c freeciv/ai/advmilitary.c
--- freeciv/ai/advmilitary.c	2006-07-17 14:28:36.000000000 +0300
+++ freeciv/ai/advmilitary.c	2007-01-11 04:42:54.000000000 +0200
@@ -663,6 +663,7 @@
   /* Our favourite unit. */
   int best = -1;
   struct unit_type *best_unit_type = NULL;
+  int best_unit_cost = 1;
 
   memset(tech_desire, 0, sizeof(tech_desire));
   
@@ -695,18 +696,26 @@
     if (can_build_unit(pcity, punittype)) {
       /* We can build the unit now... */
 
+      int build_cost = unit_build_shield_cost(punittype);
+      int limit_cost = pcity->shield_stock + 40;
+
       if (walls && move_type == LAND_MOVING) {
 	desire *= pcity->ai.wallvalue;
 	/* TODO: More use of POWER_FACTOR ! */
 	desire /= POWER_FACTOR;
       }
 
-      if ((desire > best ||
-	   (desire == best && unit_build_shield_cost(punittype) <=
-	    unit_build_shield_cost(best_unit_type)))
-	  && unit_build_shield_cost(punittype) <= pcity->shield_stock + 40) {
+
+      if ((best_unit_cost > limit_cost
+           && build_cost < best_unit_cost)
+          || ((desire > best ||
+               (desire == best && build_cost <= best_unit_cost))
+              && (best_unit_type == NULL
+                  /* In case all units are more expensive than limit_cost */
+                  || limit_cost <= pcity->shield_stock + 40))) {
 	best = desire;
 	best_unit_type = punittype;
+	best_unit_cost = build_cost;
       }
     } else if (can_eventually_build_unit(pcity, punittype)) {
       /* We first need to develop the tech required by the unit... */
_______________________________________________
Freeciv-dev mailing list
Freeciv-dev@gna.org
https://mail.gna.org/listinfo/freeciv-dev

Reply via email to