Hooks
static bool BeforeCvGameTrade_IsValidTradeRoutePath(CvGameTrade* self, CvCity* pOriginCity, CvCity* pDestCity, DomainTypes eDomain, bool& result);static void AfterCvGameTrade_IsValidTradeRoutePath(CvGameTrade* self, CvCity* pOriginCity, CvCity* pDestCity, DomainTypes eDomain, bool& result);static bool ReplaceCvGameTrade_IsValidTradeRoutePath(bool (*original)(CvGameTrade*, CvCity*, CvCity*, DomainTypes), CvGameTrade* self, CvCity* pOriginCity, CvCity* pDestCity, DomainTypes eDomain);CivRegisterBefore<CivHooks::CvGameTrade_IsValidTradeRoutePath>(host, &BeforeCvGameTrade_IsValidTradeRoutePath);CivRegisterAfter<CivHooks::CvGameTrade_IsValidTradeRoutePath>(host, &AfterCvGameTrade_IsValidTradeRoutePath);CivRegisterReplace<CivHooks::CvGameTrade_IsValidTradeRoutePath>(host, &ReplaceCvGameTrade_IsValidTradeRoutePath);
Code
484bool CvGameTrade::IsValidTradeRoutePath (CvCity* pOriginCity, CvCity* pDestCity, DomainTypes eDomain)485{486 // AI_PERF_FORMAT("Trade-route-perf.csv", ("CvGameTrade::IsValidTradeRoutePath, Turn %03d, %s, %s, %d, %d, %s, %d, %d", GC.getGame().getElapsedGameTurns(), pOriginCity->GetPlayer()->getCivilizationShortDescription(), pOriginCity->getName().c_str(), pOriginCity->getX(), pOriginCity->getY(), pDestCity->getName().c_str(), pDestCity->getX(), pDestCity->getY()) );487488 PlayerTypes eOriginPlayer = pOriginCity->getOwner();489490 int iOriginX = pOriginCity->getX();491 int iOriginY = pOriginCity->getY();492 int iDestX = pDestCity->getX();493 int iDestY = pDestCity->getY();494495 bool bSuccess = false;496 CvAStarNode* pPathfinderNode = NULL;497 if (eDomain == DOMAIN_SEA)498 {499 if (pOriginCity->isCoastal(0) && pDestCity->isCoastal(0)) // Both must be on the coast (a lake is ok) A better check would be to see if they are adjacent to the same water body.500 {501 bSuccess = GC.GetInternationalTradeRouteWaterFinder().GeneratePath(iOriginX, iOriginY, iDestX, iDestY, eOriginPlayer, false);502 pPathfinderNode = GC.GetInternationalTradeRouteWaterFinder().GetLastNode();503 }504 }505 else if (eDomain == DOMAIN_LAND)506 {507 bSuccess = GC.GetInternationalTradeRouteLandFinder().GeneratePath(iOriginX, iOriginY, iDestX, iDestY, eOriginPlayer, false);508 pPathfinderNode = GC.GetInternationalTradeRouteLandFinder().GetLastNode();509 }510511 if (!bSuccess)512 {513 return false;514 }515516 CvAssertMsg(pPathfinderNode, "pPathfinderNode is null. Whaa?");517 if (pPathfinderNode == NULL)518 {519 return false;520 }521522 // beyond the origin player's trade range523 int iPathDistance = pPathfinderNode->m_iTotalCost;524 int iRange = GET_PLAYER(eOriginPlayer).GetTrade()->GetTradeRouteRange(eDomain, pOriginCity) * 100 + 99; // adding 99 so that any movement penalties are ignored525 if (iPathDistance > iRange)526 {527 return false;528 }529530 return true;531}