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

On 1/25/07, Marko Lindqvist <[EMAIL PROTECTED]> wrote:
>
> On 1/25/07, Marko Lindqvist <[EMAIL PROTECTED]> wrote:
> > On 1/24/07, Marko Lindqvist <[EMAIL PROTECTED]> wrote:
> > >
> > > On 1/24/07, Marko Lindqvist <[EMAIL PROTECTED]> wrote:
> > > >
> > > >  Seen as global observer: Barbarian boats almost never move. If boat
> > > > happens to spawn next to land, it almost never unloads units to land.
> > >
> > >  Barbarian leader is in charge of the boat. He wants to go where other
> > > barbarians protect him. All the other barbarians are sitting in the
> > > same boat - in the same tile - he currently is. So the leader is very
> > > happy not to move the boat.
> >
> >  Fix to that particular bug attached. This alone does not fix the
> > problem, though. Barbarian boat handling is broken in a number of
> > ways.
>
>  Forget that patch. That approach is not working. Patch to
> ai_military_attack_barbarian() is still valid.

 Better barbarian leader patch. Also new version of
ai_military_attack_barbarian() patch, where one compile error is
fixed.


 - ML

diff -Nurd -X.diff_ignore freeciv/ai/aiunit.c freeciv/ai/aiunit.c
--- freeciv/ai/aiunit.c	2007-01-25 21:58:55.000000000 +0200
+++ freeciv/ai/aiunit.c	2007-01-25 23:30:04.000000000 +0200
@@ -2330,6 +2330,39 @@
       handle_unit_activity_request(leader, ACTIVITY_SENTRY);
       return;
   }
+
+  if (leader->transported_by != -1) {
+    /* Leader is at boat */
+    struct unit *boat = find_unit_by_id(leader->transported_by);
+
+    if (boat->ai.passenger == leader->id) {
+      /* We are in charge. Of course, since we are the leader...
+       * But maybe somebody more militaristic should lead our ship to battle! */
+
+      /* First release boat from leaders lead */
+      aiferry_clear_boat(leader);
+
+      unit_list_iterate(leader->tile->units, warrior) {
+        if (!unit_has_role(unit_type(warrior), L_BARBARIAN_LEADER)
+            && get_transporter_capacity(warrior) == 0
+            && warrior->moves_left > 0) {
+          /* This seems like a good warrior to lead us in to conquest! */
+          ai_manage_unit(pplayer, warrior);
+
+          /* If we reached our destination, ferryboat already called
+           * ai_manage_unit() for leader. So no need to continue here.
+           * Leader might even be dead.
+           * If this return is removed, surronding unit_list_iterate()
+           * has to be replaced with unit_list_iterate_safe()*/
+          return;
+        }
+      } unit_list_iterate_end;
+    }
+
+    /* If we are not in charge of the boat, continue as if we
+     * were not in a boat - we may want to leave the ship now. */
+  }
+
   /* the following takes much CPU time and could be avoided */
   generate_warmap(tile_get_city(leader->tile), leader);
 
diff -Nurd -X.diff_ignore freeciv/ai/aiunit.c freeciv/ai/aiunit.c
--- freeciv/ai/aiunit.c	2007-01-25 23:31:33.000000000 +0200
+++ freeciv/ai/aiunit.c	2007-01-25 23:32:03.000000000 +0200
@@ -1628,20 +1628,40 @@
 					 struct unit *punit)
 {
   struct city *pc;
+  bool any_continent = FALSE;
 
-  if ((pc = dist_nearest_city(pplayer, punit->tile, FALSE, TRUE))) {
+  if (punit->transported_by != -1) {
+    /* If we are in transport, we can go to any continent.
+     * Actually, we are not currently in a continent where to stay. */
+    any_continent = TRUE;
+  }
+
+  if ((pc = dist_nearest_city(pplayer, punit->tile, any_continent, TRUE))) {
     if (can_unit_exist_at_tile(punit, punit->tile)) {
       UNIT_LOG(LOG_DEBUG, punit, "Barbarian heading to conquer %s", pc->name);
       (void) ai_gothere(pplayer, punit, pc->tile);
     } else {
       struct unit *ferry = NULL;
 
-      unit_list_iterate(punit->tile->units, aunit) {
-	if (is_boat_free(aunit, punit, 2)) {
-	  ferry = aunit;
-	  break;
-	}
-      } unit_list_iterate_end;
+      if (punit->transported_by != -1) {
+        ferry = find_unit_by_id(punit->transported_by);
+
+        /* We already are in a boat so it needs no
+         * free capacity */
+        if (!is_boat_free(ferry, punit, 0)) {
+          /* We cannot control our ferry. */
+          ferry = NULL;
+        }
+      } else {
+        /* We are not in a boat yet. Search for one. */
+        unit_list_iterate(punit->tile->units, aunit) {
+          if (is_boat_free(aunit, punit, 1)) {
+            ferry = aunit;
+            punit->transported_by = ferry->id;
+            break;
+          }
+        } unit_list_iterate_end;
+      }
       if (ferry) {
 	UNIT_LOG(LOG_DEBUG, punit, "Barbarian sailing to conquer %s",
 		 pc->name);
@@ -1650,6 +1670,8 @@
 	UNIT_LOG(LOG_ERROR, punit, "unable to find barbarian ferry");
       }
     }
+  } else {
+    UNIT_LOG(LOG_DEBUG, punit, "Barbarian find no target city");
   }
 }
 
_______________________________________________
Freeciv-dev mailing list
Freeciv-dev@gna.org
https://mail.gna.org/listinfo/freeciv-dev

Reply via email to