(PR#10216) AI Builds Too Many Transports

"Gregory Berkolaiko" <[email protected]>
Newsgroups gmane.games.freeciv.ai
Message-ID <[email protected]>
<URL: http://rt.freeciv.org/Ticket/Display.html?id=10216 >

> [[email protected] - Mon Oct 04 01:19:11 2004]:
> 
> 3) That code (kill_something_with)) then checks whether there is a path 
> from the city (were the attacker will begin) and the target (the enemy 
> land unit to be bombarded), using function goto_is_sane. That call is 
> used to decide whether a land attacker needs a ferry; a land attacker 
> will need a ferry if there is no valid (land) path from the city to the 
> target. However, the function is also used for sea attackers. For those 
> units, the kill_something_with function incorrectly concludes that the 
> (naval!) attack unit will need a ferry (go_by_boat becomes TRUE). I 
> guess it is not handling the 'overlap' needed for shore bombardment 
> properly.

Actually, goto_is_sane is innocent, the culprit is WARMAP_COST which for
sea units should be WARMAP_SEACOST.

Two fixes attached.  A short (but equally effective) one is just making
sure that sea attackers don't try to go by boat.  A long one move some
code around so it doesn't get called neelessly.

The reason I bothered about short fix is to try to avoid conflicts with
other patches I was making.  But by the time I get round to finishing
them, there would be conflicts anyway...
many_boats_fix_short.diff (text/plain, 851 B)
? core.10423
? core.10618
Index: ai/advmilitary.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/ai/advmilitary.c,v
retrieving revision 1.174
diff -u -r1.174 advmilitary.c
--- ai/advmilitary.c	29 Sep 2004 02:24:18 -0000	1.174
+++ ai/advmilitary.c	4 Oct 2004 04:13:23 -0000
@@ -1055,8 +1055,10 @@
       return;
     }
 
-    go_by_boat = !(goto_is_sane(myunit, acity->tile, TRUE) 
-                  && WARMAP_COST(ptile) <= (MIN(6, move_rate) * THRESHOLD));
+    go_by_boat = (is_ground_unit(myunit)
+                  && !(WARMAP_COST(ptile) <= (MIN(6, move_rate) * THRESHOLD)
+                       && goto_is_sane(myunit, acity->tile, TRUE)));
+
     move_time = turns_to_enemy_city(myunit->type, acity, move_rate, 
                                     go_by_boat, ferryboat, boattype);
many_boats_fix.diff (text/plain, 2.5 KB)
? core.10423
? core.10618
Index: ai/advmilitary.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/ai/advmilitary.c,v
retrieving revision 1.174
diff -u -r1.174 advmilitary.c
--- ai/advmilitary.c	29 Sep 2004 02:24:18 -0000	1.174
+++ ai/advmilitary.c	4 Oct 2004 04:08:51 -0000
@@ -984,7 +984,7 @@
   struct tile *boat_tile = NULL;
   /* Type of the boat (real or a future one) */
   Unit_Type_id boattype = U_LAST;
-  bool go_by_boat;
+  bool go_by_boat = FALSE;
   /* Is the defender veteran? */
   int def_vet;
   struct ai_choice best_choice;
@@ -1007,21 +1007,6 @@
     return;
   }
 
-  if (is_ground_unit(myunit)) {
-    int boatid = find_boat(pplayer, &boat_tile, 2);
-    ferryboat = player_find_unit_by_id(pplayer, boatid);
-  }
-
-  if (ferryboat) {
-    boattype = ferryboat->type;
-  } else {
-    boattype = best_role_unit_for_player(pplayer, L_FERRYBOAT);
-    if (boattype == U_LAST) {
-      /* We pretend that we can have the simplest boat -- to stimulate tech */
-      boattype = get_role_unit(L_FERRYBOAT, 0);
-    }
-  }
-
   best_choice.want = find_something_to_kill(pplayer, myunit, &ptile);
 
   acity = map_get_city(ptile);
@@ -1055,8 +1040,24 @@
       return;
     }
 
-    go_by_boat = !(goto_is_sane(myunit, acity->tile, TRUE) 
-                  && WARMAP_COST(ptile) <= (MIN(6, move_rate) * THRESHOLD));
+    if (is_ground_unit(myunit)) {
+      int boatid = find_boat(pplayer, &boat_tile, 2);
+
+      ferryboat = player_find_unit_by_id(pplayer, boatid);
+      if (ferryboat) {
+        boattype = ferryboat->type;
+      } else {
+        boattype = best_role_unit_for_player(pplayer, L_FERRYBOAT);
+        if (boattype == U_LAST) {
+          /* Pretend that we can have the simplest boat 
+           * so that we stimulate tech */
+          boattype = get_role_unit(L_FERRYBOAT, 0);
+        }
+      }
+      go_by_boat = !(WARMAP_COST(ptile) <= (MIN(6, move_rate) * THRESHOLD)
+                     && goto_is_sane(myunit, acity->tile, TRUE));
+    }
+
     move_time = turns_to_enemy_city(myunit->type, acity, move_rate, 
                                     go_by_boat, ferryboat, boattype);
 
@@ -1110,6 +1111,7 @@
                           &best_choice, NULL, U_LAST);
   } else { 
     /* Attract a boat to our city or retain the one that's already here */
+    assert(is_ground_unit(myunit));
     best_choice.need_boat = TRUE;
     process_attacker_want(pcity, benefit, def_type, def_vet, ptile, 
                           &best_choice, ferryboat, boattype);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.