[freeciv-ai] Re: (PR#6278) Problems in ai_military_gothere
[Top] [All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
Two small patches that might be somewhat related. More comin'.
- Per
Index: ai/aiunit.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/ai/aiunit.c,v
retrieving revision 1.289
diff -u -r1.289 aiunit.c
--- ai/aiunit.c 21 Sep 2003 09:06:43 -0000 1.289
+++ ai/aiunit.c 25 Sep 2003 15:15:57 -0000
@@ -1323,14 +1323,11 @@
}
/**************************************************************************
- Return values:
- -1: died
- 0: didn't move
- 1: moved
- TODO: Convert to bool.
+ Return values: FALSE if died or stuck, TRUE otherwise. (This function
+ is not server-side autoattack safe.)
**************************************************************************/
-static int ai_military_gothere(struct player *pplayer, struct unit *punit,
- int dest_x, int dest_y)
+static bool ai_military_gothere(struct player *pplayer, struct unit *punit,
+ int dest_x, int dest_y)
{
int id, x, y, boatid = 0, bx = -1, by = -1;
struct unit *ferryboat = NULL;
@@ -1344,7 +1341,7 @@
if (same_pos(dest_x, dest_y, x, y)) {
/* Nowhere to go */
- return 0;
+ return FALSE;
}
if (is_ground_unit(punit)) {
@@ -1353,6 +1350,7 @@
ferryboat = unit_list_find(&(map_get_tile(x, y)->units), boatid);
}
+ /* See if we need a bodyguard at our destination */
ai_gothere_bodyguard(punit, dest_x, dest_y);
if (!goto_is_sane(punit, dest_x, dest_y, TRUE)
@@ -1365,7 +1363,7 @@
/* FIXME: this can lose bodyguard */
if (!ai_unit_goto(punit, bx, by)) {
/* Died. */
- return -1;
+ return FALSE;
}
}
ptile = map_get_tile(punit->x, punit->y);
@@ -1399,7 +1397,7 @@
}
} unit_list_iterate_end; /* passengers are safely stowed away */
if (!ai_unit_goto(ferryboat, dest_x, dest_y)) {
- return -1; /* died */
+ return FALSE; /* died */
}
handle_unit_activity_request(punit, ACTIVITY_IDLE);
} /* else wait, we can GOTO when more passengers come. */
@@ -1421,36 +1419,11 @@
set_goto_dest(punit, dest_x, dest_y);
- /* The following code block is supposed to stop units from running away
- * from their bodyguards, and not interfere with those that don't have
- * bodyguards nearby -- Syela */
- /* The case where the bodyguard has moves left and could meet us en route
- * is not handled properly. There should be a way to do it with dir_ok
- * but I'm tired now. -- Syela */
- if (punit->ai.bodyguard == BODYGUARD_WANTED) {
- adjc_iterate(punit->x, punit->y, i, j) {
- unit_list_iterate(map_get_tile(i, j)->units, aunit) {
- if (aunit->ai.charge != punit->id || punit->owner != aunit->owner) {
- continue;
- }
- freelog(LOG_DEBUG, "Bodyguard at (%d, %d) is adjacent to (%d, %d)",
- i, j, punit->x, punit->y);
- /* FIXME: What is happening here? */
- if (aunit->moves_left > 0) {
- return 0;
- } else {
- return (ai_unit_move(punit, i, j) ? 1 : 0);
- }
- } unit_list_iterate_end;
- } adjc_iterate_end;
- }
- /* end 'short leash' subroutine */
-
freelog(LOG_DEBUG, "GOTHERE: %s#%d@(%d,%d)->(%d,%d)",
unit_type(punit)->name, punit->id,
punit->x, punit->y, dest_x, dest_y);
if (!ai_unit_goto(punit, dest_x, dest_y)) {
- return -1; /* died */
+ return FALSE; /* died */
}
/* liable to bump into someone that will kill us. Should avoid? */
} else {
@@ -1463,9 +1436,9 @@
CHECK_UNIT(punit);
if (!same_pos(punit->x, punit->y, x, y)) {
- return 1; /* moved */
+ return TRUE; /* moved */
} else {
- return 0; /* didn't move, didn't die */
+ return FALSE; /* didn't move, didn't die */
}
}
@@ -2330,7 +2303,7 @@
* on a ferry. This fixes the problem (usually). */
UNIT_LOG(LOG_DEBUG, punit, "mil att gothere -> %d, %d",
dest_x, dest_y);
- if (ai_military_gothere(pplayer, punit, dest_x, dest_y) <= 0) {
+ if (!ai_military_gothere(pplayer, punit, dest_x, dest_y)) {
/* Died or got stuck */
return;
}
@@ -2374,14 +2347,14 @@
if ((pc = dist_nearest_city(pplayer, punit->x, punit->y, FALSE, TRUE))) {
if (!is_ocean(map_get_terrain(punit->x, punit->y))) {
UNIT_LOG(LOG_DEBUG, punit, "Barbarian marching to conquer %s",
pc->name);
- ai_military_gothere(pplayer, punit, pc->x, pc->y);
+ (void) ai_military_gothere(pplayer, punit, pc->x, pc->y);
} else {
/* sometimes find_beachhead is not enough */
if (!find_beachhead(punit, pc->x, pc->y, &fx, &fy)) {
find_city_beach(pc, punit, &fx, &fy);
}
UNIT_LOG(LOG_DEBUG, punit, "Barbarian sailing to %s", pc->name);
- ai_military_gothere(pplayer, punit, fx, fy);
+ (void) ai_military_gothere(pplayer, punit, fx, fy);
}
}
}
Index: ai/aitools.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/ai/aitools.c,v
retrieving revision 1.88
diff -u -r1.88 aitools.c
--- ai/aitools.c 2003/08/08 22:11:41 1.88
+++ ai/aitools.c 2003/09/25 14:39:33
@@ -148,6 +180,16 @@
{
struct unit *charge = find_unit_by_id(punit->ai.charge);
struct unit *bodyguard = find_unit_by_id(punit->ai.bodyguard);
+
+ /* Free our ferry */
+ if (task == AIUNIT_NONE || task == AIUNIT_DEFEND_HOME) {
+ struct unit *ferryboat = find_unit_by_id(punit->ai.ferryboat);
+
+ punit->ai.ferryboat = 0;
+ if (ferryboat) {
+ ferryboat->ai.passenger = 0;
+ }
+ }
if (punit->activity == ACTIVITY_GOTO) {
/* It would indicate we're going somewhere otherwise */
Index: ai/aiunit.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/ai/aiunit.c,v
retrieving revision 1.290
diff -u -r1.290 aiunit.c
--- ai/aiunit.c 2003/09/23 18:57:39 1.290
+++ ai/aiunit.c 2003/09/25 14:39:33
@@ -60,6 +60,7 @@
#include "aiunit.h"
#define LOGLEVEL_RECOVERY LOG_DEBUG
+#define LOGLEVEL_FSTK LOG_DEBUG
static void ai_manage_military(struct player *pplayer,struct unit *punit);
static void ai_manage_caravan(struct player *pplayer, struct unit *punit);
@@ -2522,10 +2528,10 @@
}
if (aunit->ai.bodyguard == BODYGUARD_NONE || bodyguard ||
(pcity && pcity->ai.invasion >= 2)) {
- if (pcity) {
- UNIT_LOG(LOG_DEBUG, punit, "Ferrying to %s to %s, invasion = %d, body
= %d",
+ if (pcity) {
+ UNIT_LOG(LOGLEVEL_FSTK, punit, "Ferrying ->%s, invasion = %d",
unit_name(aunit->type), pcity->name,
- pcity->ai.invasion, aunit->ai.bodyguard);
+ pcity->ai.invasion);
}
n++;
handle_unit_activity_request(aunit, ACTIVITY_SENTRY);
@@ -2556,8 +2562,8 @@
return; /* oops! */
}
send_unit_info(pplayer, punit); /* to get the crosshairs right -- Syela
*/
- } else {
- UNIT_LOG(LOG_DEBUG, punit, "Ferryboat %d@(%d,%d) stalling.",
+ } else {
+ UNIT_LOG(LOGLEVEL_FSTK, punit, "Ferryboat %d@(%d,%d) stalling.",
punit->id, punit->x, punit->y);
if(is_barbarian(pplayer)) /* just in case */
(void) ai_manage_explorer(punit);
@@ -2573,7 +2579,7 @@
/* ok, not carrying anyone, even the ferryman */
punit->ai.passenger = 0;
- UNIT_LOG(LOG_DEBUG, punit, "Ferryboat is lonely.");
+ UNIT_LOG(LOGLEVEL_FSTK, punit, "Ferryboat is lonely.");
handle_unit_activity_request(punit, ACTIVITY_IDLE);
/* Release bodyguard and let it roam */
- [freeciv-ai] Re: (PR#6278) Problems in ai_military_gothere,
Per I. Mathisen <=
|
|