[Freeciv-Dev] Re: (PR#3928) Convert client to use PF
[Top] [All Lists]
 
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
 
On Fri, 2 May 2003, Raimar Falke wrote:
> On Sun, Apr 27, 2003 at 02:48:14PM -0700, Gregory Berkolaiko wrote:
> 
> New version attached which doesn't core dump for me and also doesn't
> produce outputs.
Attached is the path_finding.c updates torn out of Raimar's patch plus 
some extra bugfixes.  The summary:
* in TM_WORST_TIME the cost wasn't correctly capped
* upodate pf_print_path format
* remove LOG_NORMAL printouts
* when dealing with waiting, wrong cost was recorded in the path and also 
  "-1" for waiting_dir was put in the wrong place.
Please commit.
> > 2. When there is no path to a tile (say it's inland and we have a
> > ship), moving the mouse around this tile causes repeated calls to
> > reset_last_part.  Not a fatal bug, just CPU burn.
> 
> This should IMHO be done in do_unit_goto.
Raimar: You do not understand. Go, now
In your function update_last_part, instead of
  if (!new_path) {
    freelog(PATH_LOG_LEVEL, "  no path found");
    reset_last_part();
    return;
  }
it should be
  if (!new_path) {
    freelog(PATH_LOG_LEVEL, "  no path found");
    if (!same_pos(p->start_x, p->start_y, p->end_x, p->end_y)) {
      reset_last_part();
    }
    return;
  }
Alternatively, you could put this check in reset_last_part() itself.  Yes, 
I think it would be even better there.
> > 3. Maybe we could do basic sanity checks before calling PF.  We know
> > that a ship cannot go inland and such.  But this could be more
> > trouble than it's worth.
> 
> No. Don't let us duplicate the rules all over the place.
Ok.  But I might put a quick check if the target tile is not TB_DONT_ENTER
in the path_finding.c before we actually search for a path to this tile.  
I believe it's not rule duplication, it's more like a clever use of the
information supplied to us by the user.
G.
Index: common/aicore/path_finding.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/common/aicore/path_finding.c,v
retrieving revision 1.7
diff -u -r1.7 path_finding.c
--- common/aicore/path_finding.c        2003/05/01 21:04:46     1.7
+++ common/aicore/path_finding.c        2003/05/03 12:44:20
@@ -149,6 +149,7 @@
     cost = MIN(cost, pf_map->params->move_rate);
     break;
   case TM_WORST_TIME:
+    cost = MIN(cost, pf_map->params->move_rate);
     {
       int moves_left
          = get_moves_left(pf_map, pf_map->lattice[pf_map->index].cost);
@@ -169,7 +170,7 @@
       break;
     }
   default:
-    die("unknown TC");
+    die("unknown TM");
   }
   return cost;
 }
@@ -653,7 +654,7 @@
 
   for (i = 0; i < path->length; i++) {
     freelog(log_level,
-           "PF:   %2d/%2d: (%2d,%2d) dir=%2s cost=%2d (%2d, %d) EC=%d",
+           "PF:   %2d/%2d: (%2d,%2d) dir=%-2s cost=%2d (%2d, %d) EC=%d",
            i + 1, path->length,
            path->positions[i].x, path->positions[i].y,
            dir_get_name(path->positions[i].dir_to_next_pos),
@@ -955,12 +956,12 @@
 
   if (pf_map->status[pf_map->index] == NS_WAITING) {
     /* We've already returned this node once, skip it */
-    freelog(LOG_NORMAL, "Considering waiting at (%d, %d)", pf_map->x,
+    freelog(LOG_DEBUG, "Considering waiting at (%d, %d)", pf_map->x,
            pf_map->y);
     return danger_iterate_map(pf_map);
   } else if (pf_map->d_lattice[index].is_dangerous) {
     /* We don't return dangerous tiles */
-    freelog(LOG_NORMAL, "Reached dangerous tile (%d, %d)", pf_map->x,
+    freelog(LOG_DEBUG, "Reached dangerous tile (%d, %d)", pf_map->x,
            pf_map->y);
     return danger_iterate_map(pf_map);
   } else {
@@ -996,6 +997,7 @@
   path->length = d_node->step + 1;
 
   for (i = d_node->step; i >= 0; i--) {
+    bool old_waited;
 
     /* 1: Deal with waiting */
     if (!d_node->is_dangerous) {
@@ -1008,9 +1010,12 @@
         path->positions[i].turn = get_turn(pf_map, node->cost) + 1;
         path->positions[i].moves_left = pf_map->params->move_rate;
         path->positions[i].total_MC 
-          = path->positions[i].turn * pf_map->params->move_rate;
-        /* Staying here! */
-        path->positions[i].dir_to_next_pos = -1;
+          = ((path->positions[i].turn - 1) * pf_map->params->move_rate
+             + pf_map->params->moves_left_initially);
+        path->positions[i].dir_to_next_pos = dir_next;
+        /* Set old_waited so that we record -1 as a direction at the step 
+         * we were going to wait */
+        old_waited = TRUE;
         i--;
       }
       /* Update "waited" (d_node->waited means "waited to get here") */
@@ -1034,7 +1039,7 @@
       = get_moves_left(pf_map, path->positions[i].total_MC);
     path->positions[i].total_MC -= pf_map->params->move_rate
       - pf_map->params->moves_left_initially;
-    path->positions[i].dir_to_next_pos = dir_next;
+    path->positions[i].dir_to_next_pos = (old_waited ? -1 : dir_next);
 
     /* 3: Check if we finished */
     if (i == 0) {
 
[Freeciv-Dev] Re: (PR#3928) Convert client to use PF,
Gregory Berkolaiko <=
[Freeciv-Dev] Re: (PR#3928) Convert client to use PF, Gregory Berkolaiko, 2003/05/12
 
 
 | 
 |