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}