Bazaar developer reference

CvGameTrade::IsValidTradeRoutePath(CvCity *, CvCity *, DomainTypes)

Defined in
CvTradeClasses.cpp, line 484
Class
CvGameTrade
Hook name
CivHooks::CvGameTrade_IsValidTradeRoutePath

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}

Calls

Called by