[Freeciv-Dev] Re: warmap patch and gotohand
[Top] [All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
On Fri, 05 May 2000, Nicolas BRUNEL wrote:
> > But what abouT such places in the code as (advmillitary.c)
> >
> > c = (warmap.cost[bx][by] + m - 1) / m + 1 +
> > warmap.seacost[x][y] / boatspeed; /* kluge */
> >
> > Here the ai clearly have a movecostmap for both a boat and a unit at the
> > same time.
>
> You're rigth it is used. But, is it initialized ?
> I changed the code a long time ago. Here the original code :
>
> Index: gotohand.c
> ===================================================================
> RCS file: /home/freeciv/CVS/freeciv/server/gotohand.c,v
> retrieving revision 1.27
> retrieving revision 1.28
> diff -u -r1.27 -r1.28
> --- gotohand.c 1999/01/28 17:26:10 1.27
> +++ gotohand.c 1999/02/03 18:46:32 1.28
> @@ -65,25 +65,11 @@
>
> void init_warmap(int orig_x, int orig_y, enum unit_move_type which)
> {
> - int x, y, i, j;
> - int maxcost = THRESHOLD * 6 + 2; /* should be big enough without being TOO
> big */
> - for (x = 0; x < map.xsize; x++) {
> - if (x > orig_x)
> - i = MIN(x - orig_x, orig_x + map.xsize - x);
> - else
> - i = MIN(orig_x - x, x + map.xsize - orig_x);
> - for (y = 0; y < map.ysize; y++) {
> - if (y > orig_y)
> - j = MAX(y - orig_y, i);
> - else
> - j = MAX(orig_y - y, i);
> - j *= 3; /* can be speed up */
> - if (j < maxcost) j = maxcost;
> - if (j > 255) j = 255;
> - if (which == LAND_MOVING) warmap.cost[x][y] = j; /* one if by land */
> - else warmap.seacost[x][y] = j;
> - }
> - }
> + int x, y;
> + for (x = 0; x < map.xsize; x++)
> + for (y = 0; y < map.ysize; y++)
> + if (which == LAND_MOVING) warmap.cost[x][y] = 255; /* one if by land */
> + else warmap.seacost[x][y] = 255;
> if (which == LAND_MOVING) warmap.cost[orig_x][orig_y] = 0;
> else warmap.seacost[orig_x][orig_y] = 0;
> }
>
> There was at the middle a square with value maxcost. Then, it was
> real_map_distance * 3. It couldn't get bigger than 255. I though it was
> faster to set it to 255.
>
> As you see for a land moving unit, the sea cost isn't initialized !
Well, thats the trick I guess. if you wanted to have a warmap of a
seaunit and a land unit at the same time, you would generate the warmap
for them one at a time. So you would
generate_warmap(seaunit)
generate_warmap((landunit)
If the seacost was initialized when the warmap for the land unit was
created the seaunit warmap would be deleted.
> Well, it isn't initialized here. Between generate_warmap and
> really_generate_warmap, seacost and cost is initialized. Usually, generate
> warmap is called for a unit. Then really_generate_warmap is called for a
> ferryboat. It is done in find_something_to_kill and
> auto_settler_findwork. Many lines are shared between gotohand.c settlers.c
> and the ai code. So, yes, it's better to keep warmap.seacost
> untouched. With global variables, there is alway the risk to have a side
> effect.
>
> To try to optimize the shortest path algorithm have a look at dijkstra
> shortest path algorithm.
>
> Bye and happy coding,
-Thue
|
|