DWORD CTeleportPath::FindTeleportPath(POINT ptStart, POINT ptEnd, LPPOINT lpBuffer, DWORD dwMaxCount) { if (lpBuffer == NULL || dwMaxCount == 0 || m_nCX <= 0 || m_nCY <= 0 || m_ppTable == NULL) return 0; memset(lpBuffer, 0, sizeof(POINT) * dwMaxCount); m_ptStart = ptStart; m_ptEnd = ptEnd; //GameInfof("start %d %d End %d %d", ptStart.x, ptStart.y, ptEnd.x, ptEnd.y); MakeDistanceTable(); lpBuffer[0] = ptStart; // start point DWORD dwFound = 0; POINT pos = ptStart; BOOL bOK = FALSE; int nRes = GetBestMove(pos); while (nRes != PATH_FAIL && dwFound < dwMaxCount) { // Reached? if (nRes == PATH_REACHED) { bOK = TRUE; lpBuffer[dwFound] = ptEnd; dwFound++; break; // Finished } // Perform a redundancy check int nRedundancy = GetRedundancy(lpBuffer, dwFound, pos); if (nRedundancy == -1) { // no redundancy lpBuffer[dwFound] = pos; dwFound++; } else { // redundancy found, discard all redundant steps dwFound = nRedundancy + 1; lpBuffer[dwFound] = pos; } nRes = GetBestMove(pos); } if (!bOK) dwFound = 0; return dwFound; }
virtual void MakeResponse(const std::pair<std::vector<EdgeDuration>, std::vector<EdgeDistance>> &tables, const std::vector<PhantomNode> &phantoms, const std::vector<TableCellRef> &fallback_speed_cells, util::json::Object &response) const { auto number_of_sources = parameters.sources.size(); auto number_of_destinations = parameters.destinations.size(); // symmetric case if (parameters.sources.empty()) { response.values["sources"] = MakeWaypoints(phantoms); number_of_sources = phantoms.size(); } else { response.values["sources"] = MakeWaypoints(phantoms, parameters.sources); } if (parameters.destinations.empty()) { response.values["destinations"] = MakeWaypoints(phantoms); number_of_destinations = phantoms.size(); } else { response.values["destinations"] = MakeWaypoints(phantoms, parameters.destinations); } if (parameters.annotations & TableParameters::AnnotationsType::Duration) { response.values["durations"] = MakeDurationTable(tables.first, number_of_sources, number_of_destinations); } if (parameters.annotations & TableParameters::AnnotationsType::Distance) { response.values["distances"] = MakeDistanceTable(tables.second, number_of_sources, number_of_destinations); } if (parameters.fallback_speed != INVALID_FALLBACK_SPEED && parameters.fallback_speed > 0) { response.values["fallback_speed_cells"] = MakeEstimatesTable(fallback_speed_cells); } response.values["code"] = "Ok"; }