예제 #1
0
    /**
     * 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
     */
    inline bool PfCalcEstimate(Node& n)
    {
        static const int dg_dir_to_x_offs[] = {-1, 0, 1, 0};
        static const int dg_dir_to_y_offs[] = {0, 1, 0, -1};
        if (PfDetectDestination(n)) {
            n.m_estimate = n.m_cost;
            return true;
        }

        TileIndex tile = n.m_segment_last_tile;
        DiagDirection exitdir = TrackdirToExitdir(n.m_segment_last_td);
        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;
    }
예제 #2
0
	/** Called by YAPF to detect if node ends in the desired destination */
	FORCEINLINE bool PfDetectDestination(Node& n)
	{
		return PfDetectDestination(n.GetLastTile(), n.GetLastTrackdir());
	}