mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-08-13 17:49:10 +00:00
ai
data
docs
lang
makefiledir
media
music
openttd.xcode
os
scenario
scripts
sound
strgen
table
video
yapf
array.hpp
autocopyptr.hpp
binaryheap.hpp
blob.hpp
countedptr.hpp
crc32.hpp
fixedsizearray.hpp
follow_track.cpp
follow_track.hpp
hashtable.hpp
nodelist.hpp
track_dir.hpp
yapf.h
yapf.hpp
yapf_base.hpp
yapf_common.cpp
yapf_common.hpp
yapf_costbase.hpp
yapf_costcache.hpp
yapf_costrail.hpp
yapf_destrail.hpp
yapf_node.hpp
yapf_node_rail.hpp
yapf_node_road.hpp
yapf_rail.cpp
yapf_road.cpp
yapf_settings.h
yapf_ship.cpp
BUGS
COPYING
Doxyfile
Makefile
aircraft.h
aircraft_cmd.c
aircraft_gui.c
airport.c
airport.h
airport_gui.c
airport_movement.h
aystar.c
aystar.h
bmp.c
bmp.h
bridge.h
bridge_gui.c
bridge_map.c
bridge_map.h
build_vehicle_gui.c
callback_table.c
callback_table.h
changelog.txt
clear_cmd.c
clear_map.h
command.c
command.h
configure
console.c
console.h
console_cmds.c
currency.c
currency.h
date.c
date.h
debug.c
debug.h
dedicated.c
depot.c
depot.h
depot_gui.c
direction.h
disaster_cmd.c
dock_gui.c
driver.c
driver.h
dummy_land.c
economy.c
economy.h
elrail.c
endian_check.c
engine.c
engine.h
engine_gui.c
fileio.c
fileio.h
fios.c
fios.h
fontcache.c
fontcache.h
functions.h
genworld.c
genworld.h
genworld_gui.c
gfx.c
gfx.h
gfxinit.c
gfxinit.h
graph_gui.c
gui.h
hal.h
heightmap.c
heightmap.h
helpers.cpp
industry.h
industry_cmd.c
industry_gui.c
industry_map.h
intro_gui.c
known-bugs.txt
landscape.c
langs.vcproj
langs_vs80.vcproj
livery.h
lzoconf.h
macros.h
main_gui.c
mainicon.ico
map.c
map.h
masm64.rules
md5.c
md5.h
mersenne.c
minilzo.c
minilzo.h
misc.c
misc_cmd.c
misc_gui.c
mixer.c
mixer.h
music.c
music.h
music_gui.c
namegen.c
namegen.h
network.c
network.h
network_client.c
network_client.h
network_core.h
network_data.c
network_data.h
network_gamelist.c
network_gamelist.h
network_gui.c
network_gui.h
network_server.c
network_server.h
network_udp.c
network_udp.h
newgrf.c
newgrf.h
newgrf_callbacks.h
newgrf_cargo.c
newgrf_cargo.h
newgrf_engine.c
newgrf_engine.h
newgrf_sound.c
newgrf_sound.h
newgrf_spritegroup.c
newgrf_spritegroup.h
newgrf_station.c
newgrf_station.h
newgrf_text.c
newgrf_text.h
news.h
news_gui.c
npf.c
npf.h
oldloader.c
openttd.c
openttd.h
openttd.ico
openttd.sln
openttd.tgt
openttd.vcproj
openttd_vs80.sln
openttd_vs80.vcproj
order.h
order_cmd.c
order_gui.c
os2.c
os_timer.c
ottdres.rc
pathfind.c
pathfind.h
player.h
player_gui.c
players.c
pool.c
pool.h
queue.c
queue.h
rail.c
rail.h
rail_cmd.c
rail_gui.c
rail_map.h
railtypes.h
readme.txt
resize_window_widgets.h
resource.h
road.h
road_cmd.c
road_cmd.h
road_gui.c
road_map.c
road_map.h
roadveh.h
roadveh_cmd.c
roadveh_gui.c
saveload.c
saveload.h
screenshot.c
screenshot.h
sdl.c
sdl.h
settings.c
settings.h
settings_gui.c
ship.h
ship_cmd.c
ship_gui.c
signs.c
signs.h
slope.h
smallmap_gui.c
sound.c
sound.h
sprite.h
spritecache.c
spritecache.h
station.h
station_cmd.c
station_gui.c
station_map.c
station_map.h
stdafx.h
string.c
string.h
strings.c
strings.h
subsidy_gui.c
svnup.sh
terraform_gui.c
texteff.c
tgp.c
tgp.h
thread.c
thread.h
tile.c
tile.h
town.h
town_cmd.c
town_gui.c
town_map.h
train.h
train_cmd.c
train_gui.c
tree_cmd.c
tree_map.h
tunnel_map.c
tunnel_map.h
tunnelbridge_cmd.c
unix.c
unmovable.h
unmovable_cmd.c
unmovable_map.h
variables.h
vehicle.c
vehicle.h
vehicle_gui.c
vehicle_gui.h
viewport.c
viewport.h
void_map.h
water_cmd.c
water_map.h
waypoint.c
waypoint.h
widget.c
win32.c
win32.h
win64.asm
window.c
window.h
yapf.txt
150 lines
4.4 KiB
C++
150 lines
4.4 KiB
C++
/* $Id$ */
|
|
|
|
#ifndef YAPF_DESTRAIL_HPP
|
|
#define YAPF_DESTRAIL_HPP
|
|
|
|
class CYapfDestinationRailBase
|
|
{
|
|
protected:
|
|
RailTypeMask m_compatible_railtypes;
|
|
|
|
public:
|
|
void SetDestination(Vehicle* v)
|
|
{
|
|
m_compatible_railtypes = v->u.rail.compatible_railtypes;
|
|
}
|
|
|
|
bool IsCompatibleRailType(RailType rt)
|
|
{
|
|
return HASBIT(m_compatible_railtypes, rt);
|
|
}
|
|
};
|
|
|
|
template <class Types>
|
|
class CYapfDestinationAnyDepotRailT
|
|
: public CYapfDestinationRailBase
|
|
{
|
|
public:
|
|
typedef typename Types::Tpf Tpf; ///< the pathfinder class (derived from THIS class)
|
|
typedef typename Types::NodeList::Titem Node; ///< this will be our node type
|
|
typedef typename Node::Key Key; ///< key to hash tables
|
|
|
|
/// to access inherited path finder
|
|
Tpf& Yapf() {return *static_cast<Tpf*>(this);}
|
|
|
|
/// Called by YAPF to detect if node ends in the desired destination
|
|
FORCEINLINE bool PfDetectDestination(Node& n)
|
|
{
|
|
return PfDetectDestination(n.GetLastTile(), n.GetLastTrackdir());
|
|
}
|
|
|
|
/// Called by YAPF to detect if node ends in the desired destination
|
|
FORCEINLINE bool PfDetectDestination(TileIndex tile, Trackdir td)
|
|
{
|
|
bool bDest = IsTileDepotType(tile, TRANSPORT_RAIL);
|
|
return bDest;
|
|
}
|
|
|
|
/** Called by YAPF to calculate cost estimate. Calculates distance to the destination
|
|
* adds it to the actual cost from origin and stores the sum to the Node::m_estimate */
|
|
FORCEINLINE bool PfCalcEstimate(Node& n)
|
|
{
|
|
n.m_estimate = n.m_cost;
|
|
return true;
|
|
}
|
|
};
|
|
|
|
template <class Types>
|
|
class CYapfDestinationTileOrStationRailT
|
|
: public CYapfDestinationRailBase
|
|
{
|
|
public:
|
|
typedef typename Types::Tpf Tpf; ///< the pathfinder class (derived from THIS class)
|
|
typedef typename Types::NodeList::Titem Node; ///< this will be our node type
|
|
typedef typename Node::Key Key; ///< key to hash tables
|
|
|
|
protected:
|
|
TileIndex m_destTile;
|
|
TrackdirBits m_destTrackdirs;
|
|
StationID m_dest_station_id;
|
|
|
|
/// to access inherited path finder
|
|
Tpf& Yapf() {return *static_cast<Tpf*>(this);}
|
|
|
|
static TileIndex CalcStationCenterTile(StationID station)
|
|
{
|
|
const Station* st = GetStation(station);
|
|
|
|
uint x = TileX(st->train_tile) + st->trainst_w / 2;
|
|
uint y = TileY(st->train_tile) + st->trainst_h / 2;
|
|
// return the tile of our target coordinates
|
|
return TileXY(x, y);
|
|
}
|
|
|
|
public:
|
|
void SetDestination(Vehicle* v)
|
|
{
|
|
if (v->current_order.type == OT_GOTO_STATION) {
|
|
m_destTile = CalcStationCenterTile(v->current_order.dest);
|
|
m_dest_station_id = v->current_order.dest;
|
|
m_destTrackdirs = INVALID_TRACKDIR_BIT;
|
|
} else {
|
|
m_destTile = v->dest_tile;
|
|
m_dest_station_id = INVALID_STATION;
|
|
m_destTrackdirs = (TrackdirBits)(GetTileTrackStatus(v->dest_tile, TRANSPORT_RAIL) & TRACKDIR_BIT_MASK);
|
|
}
|
|
CYapfDestinationRailBase::SetDestination(v);
|
|
}
|
|
|
|
/// Called by YAPF to detect if node ends in the desired destination
|
|
FORCEINLINE bool PfDetectDestination(Node& n)
|
|
{
|
|
return PfDetectDestination(n.GetLastTile(), n.GetLastTrackdir());
|
|
}
|
|
|
|
/// Called by YAPF to detect if node ends in the desired destination
|
|
FORCEINLINE bool PfDetectDestination(TileIndex tile, Trackdir td)
|
|
{
|
|
bool bDest;
|
|
if (m_dest_station_id != INVALID_STATION) {
|
|
bDest = IsRailwayStationTile(tile)
|
|
&& (GetStationIndex(tile) == m_dest_station_id)
|
|
&& (GetRailStationTrack(tile) == TrackdirToTrack(td));
|
|
} else {
|
|
bDest = (tile == m_destTile)
|
|
&& ((m_destTrackdirs & TrackdirToTrackdirBits(td)) != TRACKDIR_BIT_NONE);
|
|
}
|
|
return bDest;
|
|
}
|
|
|
|
/** Called by YAPF to calculate cost estimate. Calculates distance to the destination
|
|
* adds it to the actual cost from origin and stores the sum to the Node::m_estimate */
|
|
FORCEINLINE bool PfCalcEstimate(Node& n)
|
|
{
|
|
static int dg_dir_to_x_offs[] = {-1, 0, 1, 0};
|
|
static int dg_dir_to_y_offs[] = {0, 1, 0, -1};
|
|
if (PfDetectDestination(n)) {
|
|
n.m_estimate = n.m_cost;
|
|
return true;
|
|
}
|
|
|
|
TileIndex tile = n.GetLastTile();
|
|
DiagDirection exitdir = TrackdirToExitdir(n.GetLastTrackdir());
|
|
int x1 = 2 * TileX(tile) + dg_dir_to_x_offs[(int)exitdir];
|
|
int y1 = 2 * TileY(tile) + dg_dir_to_y_offs[(int)exitdir];
|
|
int x2 = 2 * TileX(m_destTile);
|
|
int y2 = 2 * TileY(m_destTile);
|
|
int dx = abs(x1 - x2);
|
|
int dy = abs(y1 - y2);
|
|
int dmin = min(dx, dy);
|
|
int dxy = abs(dx - dy);
|
|
int d = dmin * YAPF_TILE_CORNER_LENGTH + (dxy - 1) * (YAPF_TILE_LENGTH / 2);
|
|
n.m_estimate = n.m_cost + d;
|
|
assert(n.m_estimate >= n.m_parent->m_estimate);
|
|
return true;
|
|
}
|
|
};
|
|
|
|
|
|
#endif /* YAPF_DESTRAIL_HPP */
|