]> git.pond.sub.org Git - empserver/blob - src/lib/common/path.c
Use the new path finder for land paths, drop old A*
[empserver] / src / lib / common / path.c
1 /*
2  *  Empire - A multi-player, client/server Internet based war game.
3  *  Copyright (C) 1986-2011, Dave Pare, Jeff Bailey, Thomas Ruschak,
4  *                Ken Stevens, Steve McClure, Markus Armbruster
5  *
6  *  Empire is free software: you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation, either version 3 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  *
19  *  ---
20  *
21  *  See files README, COPYING and CREDITS in the root of the source
22  *  tree for related information and legal notices.  It is expected
23  *  that future projects/authors will amend these files as needed.
24  *
25  *  ---
26  *
27  *  path.c: Path finding interface code
28  *
29  *  Known contributors to this file:
30  *     Phil Lapsley, 1991
31  *     Dave Pare, 1991
32  *     Thomas Ruschak, 1993
33  *     Steve McClure, 1997
34  *     Markus Armbruster, 2011
35  */
36
37 #include <config.h>
38
39 #include <string.h>
40 #include "file.h"
41 #include "optlist.h"
42 #include "path.h"
43 #include "sect.h"
44 #include "xy.h"
45
46 char *
47 BestLandPath(char *path,
48              struct sctstr *from,
49              struct sctstr *to, double *cost, int mob_type)
50 {
51     double c;
52     size_t len;
53
54     *cost = 0.0;
55     *path = 0;
56
57     /*
58      * Note: passing from->sct_own for actor is funny, but works: its
59      * only effect is to confine the search to that nation's land.  It
60      * doesn't affect mobility costs.  The real actor is different for
61      * marching in allied land, and passing it would break path
62      * finding there.
63      */
64     c = path_find(from->sct_x, from->sct_y, to->sct_x, to->sct_y,
65                   from->sct_own, mob_type);
66     if (c < 0)
67         return NULL;
68     len = path_find_route(path, 1024,
69                           from->sct_x, from->sct_y,
70                           to->sct_x, to->sct_y);
71     if (len + 1 >= 1024)
72         return NULL;
73     strcpy(path + len, "h");
74     *cost = c;
75     return path;
76 }
77
78 char *
79 BestDistPath(char *path,
80              struct sctstr *from,
81              struct sctstr *to, double *cost)
82 {
83     return BestLandPath(path, from, to, cost, MOB_MOVE);
84 }
85
86 char *
87 BestShipPath(char *path, int fx, int fy, int tx, int ty, int owner)
88 {
89     char *map;
90
91     map = ef_ptr(EF_BMAP, owner);
92     if (!map)
93         return NULL;
94     return bestownedpath(path, map, fx, fy, tx, ty, owner);
95 }
96
97 char *
98 BestAirPath(char *path, int fx, int fy, int tx, int ty)
99 {
100     return bestownedpath(path, NULL, fx, fy, tx, ty, -1);
101 }