Re: [Freeciv-Dev] (PR#34463) [Bug] Sea barbarians inactive

2007-01-25 Thread Marko Lindqvist

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

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.

 Rewritten ai_military_attack_barbarian() for fixing several boat
handling bugs. Now barbarian boats move at least sometimes.
 Main remaining issue is that barbarians do not explore. If they don't
already know proper attack target (which is case quite often) they do
absolutely nothing.


 - ML

diff -Nurd -X.diff_ignore freeciv/ai/aiunit.c freeciv/ai/aiunit.c
--- freeciv/ai/aiunit.c	2007-01-25 12:08:09.0 +0200
+++ freeciv/ai/aiunit.c	2007-01-25 13:59:31.0 +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, Barbarian find no target city);
   }
 }
 
___
Freeciv-dev mailing list
Freeciv-dev@gna.org
https://mail.gna.org/listinfo/freeciv-dev


Re: [Freeciv-Dev] (PR#34463) [Bug] Sea barbarians inactive

2007-01-25 Thread Marko Lindqvist

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.0 +0200
+++ freeciv/ai/aiunit.c	2007-01-25 23:30:04.0 +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.0 +0200
+++ freeciv/ai/aiunit.c	2007-01-25 23:32:03.0 +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


Re: [Freeciv-Dev] (PR#34463) [Bug] Sea barbarians inactive

2007-01-25 Thread Marko Lindqvist

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/25/07, Marko Lindqvist [EMAIL PROTECTED] wrote:
   On 1/24/07, Marko Lindqvist [EMAIL PROTECTED] wrote:
   
 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.

 One more change to ai_military_attack_barbarian() patch. Changed one
error level log in to debug level, since it is not error at all.


 - ML

diff -Nurd -X.diff_ignore freeciv/ai/aiunit.c freeciv/ai/aiunit.c
--- freeciv/ai/aiunit.c	2007-01-25 23:31:33.0 +0200
+++ freeciv/ai/aiunit.c	2007-01-25 23:58:05.0 +0200
@@ -1628,28 +1628,52 @@
 	 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);
 	(void)aiferry_goto_amphibious(ferry, punit, pc-tile);
   } else {
-	UNIT_LOG(LOG_ERROR, punit, unable to find barbarian ferry);
+/* This is not an error. Somebody else might be in charge
+ * of the ferry. */
+	UNIT_LOG(LOG_DEBUG, 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