empserver/include/path.h
Markus Armbruster ffbbfcb25f Use the new path finder for land paths, drop old A*
This gets rid of the memory leak mentioned in the previous commit.

To get rid of the buffer overruns for long paths mentioned in the
previous commit, make BestLandPath() fail when path length exceeds
1023 characters.

assemble_dist_paths() and move_ground() pass buffers with a different
size.  Eliminate assemble_dist_paths()'s buffer.  Update now works
regardless of distribution distance (the distribute command still
limits to 1023, to be fixed in a later commit).  Enlarge
move_ground()'s buffers.  Doubles the length of paths accepted by
explore, move, and transport.

I use two test cases to benchmark the path finders: "continental" (Hvy
Metal 2 updates) and "island" (Hvy Plastic 2 updates).

The new path finder runs my tests around 3-4 times faster than the old
A* without its caches.  That's enough to meet its cached performance
for "island", but it's only half as fast for "continental".  Not for
long; big speedups are coming.
2011-04-12 21:48:58 +02:00

101 lines
3.1 KiB
C

/*
* Empire - A multi-player, client/server Internet based war game.
* Copyright (C) 1986-2011, Dave Pare, Jeff Bailey, Thomas Ruschak,
* Ken Stevens, Steve McClure, Markus Armbruster
*
* Empire is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* ---
*
* See files README, COPYING and CREDITS in the root of the source
* tree for related information and legal notices. It is expected
* that future projects/authors will amend these files as needed.
*
* ---
*
* path.h: Definitions for directions, paths, etc.
*
* Known contributors to this file:
* Markus Armbruster, 2005-2011
*/
#ifndef PATH_H
#define PATH_H
#include <stddef.h>
#include "types.h"
/* direction indices */
#define DIR_STOP 0
#define DIR_UR 1
#define DIR_R 2
#define DIR_DR 3
#define DIR_DL 4
#define DIR_L 5
#define DIR_UL 6
#define DIR_VIEW 7
#define DIR_MAP 8
#define DIR_FIRST 1
#define DIR_LAST 6
#define MOB_MOVE 0
#define MOB_MARCH 1
#define MOB_RAIL 2
enum p_mode { /* How to find path to destination */
P_NONE, /* don't */
P_FLYING, /* use BestAirPath() */
P_SAILING /* use BestShipPath() */
};
/* src/lib/global/dir.c */
extern signed char dirindex['z'-'a'+1];
extern int diroff[DIR_MAP+1][2];
extern char dirch[DIR_MAP+2];
extern char *routech[DIR_LAST+1];
/* src/lib/common/bestpath.c */
extern char *bestownedpath(char *, char *, int, int, int, int, int);
/* src/lib/common/findpath.c */
extern void path_find_from(coord, coord, natid, int);
extern double path_find_to(coord, coord);
extern double path_find(coord, coord, coord, coord, natid, int);
extern size_t path_find_route(char *, size_t, coord, coord, coord, coord);
/* src/lib/common/path.c */
extern char *BestDistPath(char *, struct sctstr *, struct sctstr *,
double *);
extern char *BestLandPath(char *, struct sctstr *, struct sctstr *,
double *, int);
extern char *BestShipPath(char *, int, int, int, int, int);
extern char *BestAirPath(char *, int, int, int, int);
/* src/lib/subs/paths.c */
extern char *getpath(char *, char *, coord, coord, int, int, enum p_mode);
extern double fcost(struct sctstr *, natid);
extern double ncost(struct sctstr *, natid);
extern double pathtoxy(char *, coord *, coord *,
double (*)(struct sctstr *, natid));
extern int chkdir(char, int, int);
extern int diridx(char);
extern void direrr(char *, char *, char *);
extern void pathrange(coord, coord, char *, int, struct range *);
extern double sector_mcost(struct sctstr *, int);
extern double speed_factor(double, int);
#define MAX_PATH_LEN 1024
#endif