Bazaar developer reference

CvGameTrade::CreateTradeRoute(CvCity *, CvCity *, DomainTypes, TradeConnectionType, int &)

Defined in
CvTradeClasses.cpp, line 317
Class
CvGameTrade
Hook name
CivHooks::CvGameTrade_CreateTradeRoute

Hooks

static bool BeforeCvGameTrade_CreateTradeRoute(CvGameTrade* self, CvCity* pOriginCity, CvCity* pDestCity, DomainTypes eDomain, TradeConnectionType eConnectionType, int& iRouteID, bool& result);static void AfterCvGameTrade_CreateTradeRoute(CvGameTrade* self, CvCity* pOriginCity, CvCity* pDestCity, DomainTypes eDomain, TradeConnectionType eConnectionType, int& iRouteID, bool& result);static bool ReplaceCvGameTrade_CreateTradeRoute(bool (*original)(CvGameTrade*, CvCity*, CvCity*, DomainTypes, TradeConnectionType, int&), CvGameTrade* self, CvCity* pOriginCity, CvCity* pDestCity, DomainTypes eDomain, TradeConnectionType eConnectionType, int& iRouteID);CivRegisterBefore<CivHooks::CvGameTrade_CreateTradeRoute>(host, &BeforeCvGameTrade_CreateTradeRoute);CivRegisterAfter<CivHooks::CvGameTrade_CreateTradeRoute>(host, &AfterCvGameTrade_CreateTradeRoute);CivRegisterReplace<CivHooks::CvGameTrade_CreateTradeRoute>(host, &ReplaceCvGameTrade_CreateTradeRoute);

Code

317bool CvGameTrade::CreateTradeRoute(CvCity* pOriginCity, CvCity* pDestCity, DomainTypes eDomain, TradeConnectionType eConnectionType, int& iRouteID)318{319	iRouteID = -1;320321	if (!CanCreateTradeRoute(pOriginCity, pDestCity, eDomain, eConnectionType, false))322	{323		return false;324	}325326	PlayerTypes eOriginPlayer = pOriginCity->getOwner();327	PlayerTypes eDestPlayer = pDestCity->getOwner();328329	int iOriginX = pOriginCity->getX();330	int iOriginY = pOriginCity->getY();331	int iDestX = pDestCity->getX();332	int iDestY = pDestCity->getY();333334	bool bSuccess = false;335	CvAStarNode* pPathfinderNode = NULL;336	if (eDomain == DOMAIN_SEA)337	{338		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.339		{340			bSuccess = GC.GetInternationalTradeRouteWaterFinder().GeneratePath(iOriginX, iOriginY, iDestX, iDestY, eOriginPlayer, false);341			pPathfinderNode = GC.GetInternationalTradeRouteWaterFinder().GetLastNode();342		}343	}344	else if (eDomain == DOMAIN_LAND)345	{346		bSuccess = GC.GetInternationalTradeRouteLandFinder().GeneratePath(iOriginX, iOriginY, iDestX, iDestY, eOriginPlayer, false);347		pPathfinderNode = GC.GetInternationalTradeRouteLandFinder().GetLastNode();348	}349350	if (!bSuccess)351	{352		return false;353	}354355	CvAssertMsg(pPathfinderNode, "pPathfinderNode is null. Whaa?");356	if (pPathfinderNode == NULL)357	{358		return false;359	}360361	int iNewTradeRouteIndex = GetEmptyTradeRouteIndex();362	CvAssertMsg(iNewTradeRouteIndex < (int)m_aTradeConnections.size(), "iNewTradeRouteIndex out of bounds");363364	// couldn't find valid connection, bail out365	if (iNewTradeRouteIndex < 0)366	{367		TradeConnection kNewTradeConnection;368		m_aTradeConnections.push_back(kNewTradeConnection);369		iNewTradeRouteIndex = m_aTradeConnections.size() - 1;370	}371372	iRouteID = m_iNextID;373	m_aTradeConnections[iNewTradeRouteIndex].m_iID = m_iNextID;374	m_aTradeConnections[iNewTradeRouteIndex].m_iOriginX = pOriginCity->getX();375	m_aTradeConnections[iNewTradeRouteIndex].m_iOriginY = pOriginCity->getY();376	m_aTradeConnections[iNewTradeRouteIndex].m_eOriginOwner = pOriginCity->getOwner();377	m_aTradeConnections[iNewTradeRouteIndex].m_iDestX = pDestCity->getX();378	m_aTradeConnections[iNewTradeRouteIndex].m_iDestY = pDestCity->getY();379	m_aTradeConnections[iNewTradeRouteIndex].m_eDestOwner = pDestCity->getOwner();380	m_aTradeConnections[iNewTradeRouteIndex].m_eDomain = eDomain;381	m_aTradeConnections[iNewTradeRouteIndex].m_eConnectionType = eConnectionType;382	m_aTradeConnections[iNewTradeRouteIndex].m_unitID = -1;383384	// increment m_iNextID for the next connection385	m_iNextID += 1;386387	CopyPathIntoTradeConnection(pPathfinderNode, &(m_aTradeConnections[iNewTradeRouteIndex]));388389	// reveal all plots to the player who created the trade route390	TeamTypes eOriginTeam = GET_PLAYER(eOriginPlayer).getTeam();391	for (uint ui = 0; ui < m_aTradeConnections[iNewTradeRouteIndex].m_aPlotList.size(); ui++)392	{393#if defined(MOD_API_EXTENSIONS)394		GC.getMap().plot(m_aTradeConnections[iNewTradeRouteIndex].m_aPlotList[ui].m_iX, m_aTradeConnections[iNewTradeRouteIndex].m_aPlotList[ui].m_iY)->setRevealed(eOriginTeam, true, NULL, true);395#else396		GC.getMap().plot(m_aTradeConnections[iNewTradeRouteIndex].m_aPlotList[ui].m_iX, m_aTradeConnections[iNewTradeRouteIndex].m_aPlotList[ui].m_iY)->setRevealed(eOriginTeam, true, true);397#endif398	}399400	m_aTradeConnections[iNewTradeRouteIndex].m_iTradeUnitLocationIndex = 0;401	m_aTradeConnections[iNewTradeRouteIndex].m_bTradeUnitMovingForward = true;402403	int iRouteSpeed = GET_PLAYER(pOriginCity->getOwner()).GetTrade()->GetTradeRouteSpeed(eDomain);404	int iTurnsPerCircuit = 1;405	if (iRouteSpeed != 0)406	{407		iTurnsPerCircuit = ((m_aTradeConnections[iNewTradeRouteIndex].m_aPlotList.size() - 1) * 2) / iRouteSpeed;408	}409	410#if defined(MOD_TRADE_ROUTE_SCALING)411	int iTargetTurns = GD_INT_GET(TRADE_ROUTE_BASE_TARGET_TURNS); // how many turns do we want the cycle to consume412	iTargetTurns = iTargetTurns * GC.getGame().getGameSpeedInfo().getTradeRouteSpeedMod() / 100;413#else414	int iTargetTurns = 30; // how many turns do we want the cycle to consume415#endif416	int iCircuitsToComplete = 1; // how many circuits do we want this trade route to run to reach the target turns417	if (iTurnsPerCircuit != 0)418	{419		iCircuitsToComplete = max(iTargetTurns / iTurnsPerCircuit, 2);420	}421422	m_aTradeConnections[iNewTradeRouteIndex].m_iCircuitsCompleted = 0;423	m_aTradeConnections[iNewTradeRouteIndex].m_iCircuitsToComplete = iCircuitsToComplete;424	m_aTradeConnections[iNewTradeRouteIndex].m_iTurnRouteComplete = (iTurnsPerCircuit * iCircuitsToComplete) + GC.getGame().getGameTurn();425#if defined(MOD_API_TRADEROUTES)426	m_aTradeConnections[iNewTradeRouteIndex].m_bTradeUnitRecalled = false;427#endif428429	GET_PLAYER(eOriginPlayer).GetTrade()->UpdateTradeConnectionValues();430	if (eDestPlayer != eOriginPlayer)431	{432		GET_PLAYER(eDestPlayer).GetTrade()->UpdateTradeConnectionValues();433	}434435	pOriginCity->GetCityReligions()->UpdateNumTradeRouteConnections(pDestCity);436	pDestCity->GetCityReligions()->UpdateNumTradeRouteConnections(pOriginCity);437438	CreateVis(iNewTradeRouteIndex);439	MoveUnit(iNewTradeRouteIndex);440441	if(GC.getLogging())442	{443		CvString strMsg;444		CvString strDomain;445		switch (eDomain)446		{447		case DOMAIN_LAND:448			strDomain = "land";449			break;450		case DOMAIN_SEA:451			strDomain = "sea";452			break;453		}454455		CvString strTRType;456		switch (eConnectionType)457		{458		case TRADE_CONNECTION_FOOD:459			strTRType = "food";460			break;461		case TRADE_CONNECTION_PRODUCTION:462			strTRType = "production";463			break;464#if defined(MOD_TRADE_WONDER_RESOURCE_ROUTES)465		case TRADE_CONNECTION_WONDER_RESOURCE:466			strTRType = "wonder resource";467			break;468#endif469		case TRADE_CONNECTION_INTERNATIONAL:470			strTRType = "international";471			break;472		}473474		strMsg.Format("%s, New Trade Route, %s, %s, %s, %i, %s", GET_PLAYER(pOriginCity->getOwner()).getCivilizationShortDescription(), strDomain.c_str(), pOriginCity->getName().c_str(), pDestCity->getName().c_str(), m_aTradeConnections[iNewTradeRouteIndex].m_aPlotList.size(), strTRType.c_str());475		LogTradeMsg(strMsg);476	}477478	479480	return true;481}

Calls

Called by