Index: src/yapf/follow_track.cpp =================================================================== --- src/yapf/follow_track.cpp (revision 12187) +++ src/yapf/follow_track.cpp (working copy) @@ -4,44 +4,21 @@ #include "yapf.hpp" #include "follow_track.hpp" -void FollowTrackInit(FollowTrack_t *This, const Vehicle* v) +FollowTrack_t* FollowTrackAlloc(const Vehicle* v, bool forbid_90deg_turns) { - CFollowTrackWater& F = *(CFollowTrackWater*) This; - F.Init(v, NULL); -} + switch (v->type) { + case VEH_TRAIN: + if (forbid_90deg_turns) return new CFollowTrackRailNo90(v); + else return new CFollowTrackRail(v); + case VEH_ROAD: + if (forbid_90deg_turns) return new CFollowTrackRoadNo90(v); + else return new CFollowTrackRoad(v); + case VEH_SHIP: + if (forbid_90deg_turns) return new CFollowTrackWaterNo90(v); + else return new CFollowTrackWater(v); + default: + NOT_REACHED(); + } -bool FollowTrackWater(FollowTrack_t *This, TileIndex old_tile, Trackdir old_td) -{ - CFollowTrackWater& F = *(CFollowTrackWater*) This; - return F.Follow(old_tile, old_td); + return NULL; } - -bool FollowTrackRoad(FollowTrack_t *This, TileIndex old_tile, Trackdir old_td) -{ - CFollowTrackRoad& F = *(CFollowTrackRoad*) This; - return F.Follow(old_tile, old_td); -} - -bool FollowTrackRail(FollowTrack_t *This, TileIndex old_tile, Trackdir old_td) -{ - CFollowTrackRail& F = *(CFollowTrackRail*) This; - return F.Follow(old_tile, old_td); -} - -bool FollowTrackWaterNo90(FollowTrack_t *This, TileIndex old_tile, Trackdir old_td) -{ - CFollowTrackWaterNo90& F = *(CFollowTrackWaterNo90*) This; - return F.Follow(old_tile, old_td); -} - -bool FollowTrackRoadNo90(FollowTrack_t *This, TileIndex old_tile, Trackdir old_td) -{ - CFollowTrackRoadNo90& F = *(CFollowTrackRoadNo90*) This; - return F.Follow(old_tile, old_td); -} - -bool FollowTrackRailNo90(FollowTrack_t *This, TileIndex old_tile, Trackdir old_td) -{ - CFollowTrackRailNo90& F = *(CFollowTrackRailNo90*) This; - return F.Follow(old_tile, old_td); -} Index: src/yapf/follow_track.hpp =================================================================== --- src/yapf/follow_track.hpp (revision 12187) +++ src/yapf/follow_track.hpp (working copy) @@ -9,7 +9,7 @@ /** Track follower helper template class (can serve pathfinders and vehicle * controllers). See 6 different typedefs below for 3 different transport - * types w/ of w/o 90-deg turns allowed */ + * types w/ or w/o 90-deg turns allowed */ template struct CFollowTrackT : public FollowTrack_t { @@ -87,6 +87,12 @@ return true; } + /** Helper so YAPF doesn't have to call a virtual function. */ + virtual bool FollowTrack(TileIndex old_tile, Trackdir old_td) + { + return Follow(old_tile, old_td); + } + protected: /** Follow the m_exitdir from m_old_tile and fill m_new_tile and m_tiles_skipped */ FORCEINLINE void FollowTileExit() Index: src/yapf/yapf.h =================================================================== --- src/yapf/yapf.h (revision 12187) +++ src/yapf/yapf.h (working copy) @@ -108,19 +108,15 @@ bool m_is_station; ///< last turn passed station int m_tiles_skipped; ///< number of skipped tunnel or station tiles ErrorCode m_err; -}; -/** Initializes FollowTrack_t structure */ -void FollowTrackInit(FollowTrack_t *This, const Vehicle* v); + virtual ~FollowTrack_t() {} -/** Main track follower routines */ -bool FollowTrackWater (FollowTrack_t *This, TileIndex old_tile, Trackdir old_td); -bool FollowTrackRoad (FollowTrack_t *This, TileIndex old_tile, Trackdir old_td); -bool FollowTrackRail (FollowTrack_t *This, TileIndex old_tile, Trackdir old_td); -bool FollowTrackWaterNo90(FollowTrack_t *This, TileIndex old_tile, Trackdir old_td); -bool FollowTrackRoadNo90 (FollowTrack_t *This, TileIndex old_tile, Trackdir old_td); -bool FollowTrackRailNo90 (FollowTrack_t *This, TileIndex old_tile, Trackdir old_td); + virtual bool FollowTrack(TileIndex old_tile, Trackdir old_td) = 0; +}; +/** Allocates a FollowTrack_t structure */ +FollowTrack_t* FollowTrackAlloc(const Vehicle* v, bool forbid_90deg_turns = false); + /** Base tile length units */ enum { YAPF_TILE_LENGTH = 100,