Hooks
static bool BeforeTradeRouteWaterPathCost(CvAStarNode* parent, CvAStarNode* node, int data, const void* pointer, CvAStar* finder, int& result);static void AfterTradeRouteWaterPathCost(CvAStarNode* parent, CvAStarNode* node, int data, const void* pointer, CvAStar* finder, int& result);static int ReplaceTradeRouteWaterPathCost(int (*original)(CvAStarNode*, CvAStarNode*, int, const void*, CvAStar*), CvAStarNode* parent, CvAStarNode* node, int data, const void* pointer, CvAStar* finder);CivRegisterBefore<CivHooks::TradeRouteWaterPathCost>(host, &BeforeTradeRouteWaterPathCost);CivRegisterAfter<CivHooks::TradeRouteWaterPathCost>(host, &AfterTradeRouteWaterPathCost);CivRegisterReplace<CivHooks::TradeRouteWaterPathCost>(host, &ReplaceTradeRouteWaterPathCost);
Code
4100/// slewis's fault4101int TradeRouteWaterPathCost(CvAStarNode* parent, CvAStarNode* node, int data, const void* pointer, CvAStar* finder)4102{4103 CvMap& kMap = GC.getMap();4104 const TradePathCacheData* pCacheData = reinterpret_cast<const TradePathCacheData*>(finder->GetScratchBuffer());41054106 int iFromPlotX = parent->m_iX;4107 int iFromPlotY = parent->m_iY;4108 CvPlot* pFromPlot = kMap.plotUnchecked(iFromPlotX, iFromPlotY);41094110 int iToPlotX = node->m_iX;4111 int iToPlotY = node->m_iY;4112 CvPlot* pToPlot = kMap.plotUnchecked(iToPlotX, iToPlotY);41134114 int iBaseCost = 100;4115 int iCost = iBaseCost;41164117#if defined(MOD_GLOBAL_PASSABLE_FORTS)4118 if (!(pToPlot->isCity() || pToPlot->isPassableImprovement()))4119#else4120 if (!pToPlot->isCity())4121#endif4122 {4123 bool bIsAdjacentToLand = pFromPlot->isAdjacentToLand_Cached() && pToPlot->isAdjacentToLand_Cached();4124 if (!bIsAdjacentToLand)4125 {4126 iCost += 1;4127 }41284129 // if is enemy tile, avoid4130 TeamTypes eToPlotTeam = pToPlot->getTeam();4131 if (eToPlotTeam != NO_TEAM && pCacheData->getTeam().isAtWar(eToPlotTeam))4132 {4133 iCost += 1000; // slewis - is this too prohibitive? Too cheap?4134 }41354136 if (!pToPlot->isWater())4137 {4138#if defined(MOD_BUGFIX_MINOR)4139 // Due to the "times 100", this is only equivalent to 10 tiles, which for a water trade route is too few4140 // iCost += 1000;4141 iCost += 50 * 100;4142#else4143 iCost += 1000;4144#endif4145 }4146 else4147 {4148 if (pToPlot->getTerrainType() != (TerrainTypes) GC.getSHALLOW_WATER_TERRAIN()) // Quicker isShallowWater test, since we already know the plot is water4149 {4150 if (!pCacheData->CanEmbarkAllWaterPassage())4151 {4152 iCost += 1000;4153 }4154 }4155 }41564157 if(pToPlot->isImpassable())4158 {4159 iCost += 1000;4160 }4161 }41624163 FAssert(iCost != MAX_INT);4164 FAssert(iCost > 0);41654166 return iCost;4167}