[freeciv-ai] Re: stop infinite loops in ai_unit_rampage()
[Top] [All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
I think is not enough.
What happens when an ai wants to enter in a city this a military
unit, but that civilization is in Neutral state with the other?
Just check if the unit has moved.
Proposed function:
static struct unit *ai_military_rampage(struct unit *punit, int threshold)
{
int x, y, id = punit->id;
int last_moves_left;
while (punit && punit->moves_left > 0
&& ai_military_findvictim(punit, &x, &y) >= threshold) {
last_moves_left = punit->moves_left;
ai_unit_attack(punit, x, y);
punit = find_unit_by_id(id);
/* ai do a movement that can't do, aaaaahhhhh!!! */
if ( punit) {
if ( last_moves_left == punit->moves_left ) {
freelog(LOG_DEBUG, "%s#%d@(%d,%d) can't do that movement so give
up!",
unit_type(punit)->name, punit->id, punit->x, punit->y);
break;
}
}
}
return punit;
}
En/na Per I. Mathisen ha escrit:
In very rare circumstances, ai_unit_rampage() can go into an endless loop
because we find a good target which is not a unit (hut or city) but are
unable to enter it because we are not in the right activity to move.
This patch fixes it. It may be desirable to put a better failsafe into the
aforementioned function, as well, to prevent future infinite loops from
happening, since their causes are rather hard to track down.
- Per
Index: ai/aitools.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/ai/aitools.c,v
retrieving revision 1.63
diff -u -r1.63 aitools.c
--- ai/aitools.c 2 Dec 2002 22:48:13 -0000 1.63
+++ ai/aitools.c 4 Dec 2002 22:27:59 -0000
@@ -281,6 +281,7 @@
pmove.x = x;
pmove.y = y;
pmove.unid = punit->id;
+ handle_unit_activity_request(punit, ACTIVITY_IDLE);
handle_move_unit(unit_owner(punit), &pmove);
if (find_unit_by_id(sanity) && same_pos(x, y, punit->x, punit->y)) {
|
|