Re: [Freeciv-Dev] (PR#34463) [Bug] Sea barbarians inactive
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
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
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