Files
@ r12162:c4894f5339c3
Branch filter:
Location: cpp/openttd-patchpack/source/src/pathfind.h - annotation
r12162:c4894f5339c3
3.5 KiB
text/x-c
(svn r16583) -Update: the order of the language files so it's in sync with english.txt. Normally WT2 would do this, but only with activity for those languages. Now we'd like to the order to match so we can more easily spot import bugs while developing WT3.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r9111:983de9c5a848 r6352:af9fc661a26d r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r8100:d1eb5523ede7 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r6248:b940b09d7ab8 r8611:9e34d4e85f51 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r6248:b940b09d7ab8 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r6248:b940b09d7ab8 r5475:3f5cd13d1b63 r6248:b940b09d7ab8 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r8611:9e34d4e85f51 r6248:b940b09d7ab8 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5587:034e5e185dc2 r5475:3f5cd13d1b63 r8263:00e828e1ab1f r6683:4204f114c4c0 r6683:4204f114c4c0 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r6352:af9fc661a26d r5475:3f5cd13d1b63 r6352:af9fc661a26d r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r8800:8018237d8279 r8800:8018237d8279 r8800:8018237d8279 r8800:8018237d8279 r8800:8018237d8279 r8800:8018237d8279 r8800:8018237d8279 r8800:8018237d8279 r10647:62911ec68e89 r10647:62911ec68e89 r5475:3f5cd13d1b63 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11917:612c11f7ab47 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r11168:ee680a6c63f8 r5475:3f5cd13d1b63 | /* $Id$ */
/** @file pathfind.h The oldest pathfinder that's supported. */
#ifndef PATHFIND_H
#define PATHFIND_H
#include "direction_type.h"
enum {
STR_FACTOR = 2,
DIAG_FACTOR = 3
};
//#define PF_BENCH // perform simple benchmarks on the train pathfinder (not
//supported on all archs)
struct TrackPathFinder;
typedef bool TPFEnumProc(TileIndex tile, void *data, Trackdir trackdir, uint length);
typedef void TPFAfterProc(TrackPathFinder *tpf);
typedef bool NTPEnumProc(TileIndex tile, void *data, int track, uint length);
#define PATHFIND_GET_LINK_OFFS(tpf, link) ((byte*)(link) - (byte*)tpf->links)
#define PATHFIND_GET_LINK_PTR(tpf, link_offs) (TrackPathFinderLink*)((byte*)tpf->links + (link_offs))
/* y7 y6 y5 y4 y3 y2 y1 y0 x7 x6 x5 x4 x3 x2 x1 x0
* y7 y6 y5 y4 y3 y2 y1 y0 x4 x3 x2 x1 x0 0 0 0
* 0 0 y7 y6 y5 y4 y3 y2 y1 y0 x4 x3 x2 x1 x0 0
* 0 0 0 0 y5 y4 y3 y2 y1 y0 x4 x3 x2 x1 x0 0
*/
#define PATHFIND_HASH_TILE(tile) (TileX(tile) & 0x1F) + ((TileY(tile) & 0x1F) << 5)
struct TrackPathFinderLink {
TileIndex tile;
uint16 flags;
uint16 next;
};
struct RememberData {
uint16 cur_length;
byte depth;
Track last_choosen_track;
};
struct TrackPathFinder {
int num_links_left;
TrackPathFinderLink *new_link;
TPFEnumProc *enum_proc;
void *userdata;
RememberData rd;
TrackdirByte the_dir;
TransportType tracktype;
uint sub_type;
bool disable_tile_hash;
uint16 hash_head[0x400];
TileIndex hash_tile[0x400]; ///< stores the link index when multi link.
TrackPathFinderLink links[0x400]; ///< hopefully, this is enough.
};
/** Some flags to modify the behaviour of original pathfinder */
enum PathfindFlags {
PATHFIND_FLAGS_NONE = 0,
PATHFIND_FLAGS_SHIP_MODE = 0x0800, ///< pathfinder with some optimizations for ships, but does not work for other types.
PATHFIND_FLAGS_DISABLE_TILE_HASH = 0x1000, ///< do not check for searching in circles
};
DECLARE_ENUM_AS_BIT_SET(PathfindFlags)
void FollowTrack(TileIndex tile, PathfindFlags flags, TransportType tt, uint sub_type, DiagDirection direction, TPFEnumProc *enum_proc, TPFAfterProc *after_proc, void *data);
void NewTrainPathfind(TileIndex tile, TileIndex dest, RailTypes railtypes, DiagDirection direction, NTPEnumProc *enum_proc, void *data);
/**
* Calculates the tile of given station that is closest to a given tile
* for this we assume the station is a rectangle,
* as defined by its top tile (st->train_tile) and its width/height (st->trainst_w, st->trainst_h)
* @param station The station to calculate the distance to
* @param tile The tile from where to calculate the distance
* @return The closest station tile to the given tile.
*/
static inline TileIndex CalcClosestStationTile(StationID station, TileIndex tile)
{
const Station *st = Station::Get(station);
/* If the rail station is (temporarily) not present, use the station sign to drive near the station */
if (st->train_tile == INVALID_TILE) return st->xy;
uint minx = TileX(st->train_tile); // topmost corner of station
uint miny = TileY(st->train_tile);
uint maxx = minx + st->trainst_w - 1; // lowermost corner of station
uint maxy = miny + st->trainst_h - 1;
/* we are going the aim for the x coordinate of the closest corner
* but if we are between those coordinates, we will aim for our own x coordinate */
uint x = ClampU(TileX(tile), minx, maxx);
/* same for y coordinate, see above comment */
uint y = ClampU(TileY(tile), miny, maxy);
/* return the tile of our target coordinates */
return TileXY(x, y);
}
#endif /* PATHFIND_H */
|