Hooks
static bool BeforeCvBuilderTaskingAI_AddRouteDirectives(CvBuilderTaskingAI* self, CvUnit* pUnit, CvPlot* pPlot, int iMoveTurnsAway);static void AfterCvBuilderTaskingAI_AddRouteDirectives(CvBuilderTaskingAI* self, CvUnit* pUnit, CvPlot* pPlot, int iMoveTurnsAway);static void ReplaceCvBuilderTaskingAI_AddRouteDirectives(void (*original)(CvBuilderTaskingAI*, CvUnit*, CvPlot*, int), CvBuilderTaskingAI* self, CvUnit* pUnit, CvPlot* pPlot, int iMoveTurnsAway);CivRegisterBefore<CivHooks::CvBuilderTaskingAI_AddRouteDirectives>(host, &BeforeCvBuilderTaskingAI_AddRouteDirectives);CivRegisterAfter<CivHooks::CvBuilderTaskingAI_AddRouteDirectives>(host, &AfterCvBuilderTaskingAI_AddRouteDirectives);CivRegisterReplace<CivHooks::CvBuilderTaskingAI_AddRouteDirectives>(host, &ReplaceCvBuilderTaskingAI_AddRouteDirectives);
Code
1311/// Adds a directive if the unit can construct a road in the plot1312void CvBuilderTaskingAI::AddRouteDirectives(CvUnit* pUnit, CvPlot* pPlot, int iMoveTurnsAway)1313{1314 RouteTypes eBestRouteType = m_pPlayer->getBestRoute();13151316 // if the player can't build a route, bail out!1317 if(eBestRouteType == NO_ROUTE)1318 {1319 return;1320 }13211322 if(pPlot->getRouteType() == eBestRouteType && !pPlot->IsRoutePillaged())1323 {1324 return;1325 }13261327 // the plot was not flagged this turn, so ignore1328 bool bShouldRoadThisTile = (pPlot->GetBuilderAIScratchPadTurn() == GC.getGame().getGameTurn()) && (pPlot->GetBuilderAIScratchPadPlayer() == pUnit->getOwner());1329 if(!bShouldRoadThisTile)1330 {1331 return;1332 }13331334 // find the route build1335 BuildTypes eRouteBuild = NO_BUILD;1336 if(pPlot->IsRoutePillaged())1337 {1338 eRouteBuild = m_eRepairBuild;1339 }1340 else1341 {1342 RouteTypes eRoute = pPlot->GetBuilderAIScratchPadRoute();1343 for(int i = 0; i < GC.getNumBuildInfos(); i++)1344 {1345 BuildTypes eBuild = (BuildTypes)i;1346 CvBuildInfo* pkBuild = GC.getBuildInfo(eBuild);1347 if(pkBuild && pkBuild->getRoute() == eRoute)1348 {1349 eRouteBuild = eBuild;1350 break;1351 }1352 }1353 }13541355 if(eRouteBuild == NO_BUILD)1356 {1357 return;1358 }13591360 CvUnitEntry& kUnitInfo = pUnit->getUnitInfo();1361 if(!kUnitInfo.GetBuilds(eRouteBuild))1362 {1363 return;1364 }13651366 if(GET_PLAYER(pUnit->getOwner()).isOption(PLAYEROPTION_LEAVE_FORESTS))1367 {1368 FeatureTypes eFeature = pPlot->getFeatureType();1369 if(eFeature != NO_FEATURE)1370 {1371 CvBuildInfo* pkBuild = GC.getBuildInfo(eRouteBuild);1372 if(pkBuild && pkBuild->isFeatureRemove(eFeature))1373 {1374 return;1375 }1376 }1377 }13781379 int iWeight = GC.getBUILDER_TASKING_BASELINE_BUILD_ROUTES();1380 BuilderDirective::BuilderDirectiveType eDirectiveType = BuilderDirective::BUILD_ROUTE;1381 if(eRouteBuild == m_eRepairBuild)1382 {1383 iWeight = GC.getBUILDER_TASKING_BASELINE_REPAIR();1384 eDirectiveType = BuilderDirective::REPAIR;1385 }13861387 // int iTurnsAway = FindTurnsAway(pUnit, pPlot);1388 iWeight = iWeight / (iMoveTurnsAway/*iTurnsAway*/ + 1);1389 iWeight = GetBuildCostWeight(iWeight, pPlot, eRouteBuild);1390 iWeight += GetBuildTimeWeight(pUnit, pPlot, eRouteBuild, false, iMoveTurnsAway);1391 iWeight *= pPlot->GetBuilderAIScratchPadValue();1392 iWeight = CorrectWeight(iWeight);13931394 BuilderDirective directive;1395 directive.m_eDirective = eDirectiveType;1396 directive.m_eBuild = eRouteBuild;1397 directive.m_eResource = NO_RESOURCE;1398 directive.m_sX = pPlot->getX();1399 directive.m_sY = pPlot->getY();1400 directive.m_sMoveTurnsAway = iMoveTurnsAway;14011402 if(m_bLogging)1403 {1404 CvString strTemp;1405 strTemp.Format("AddRouteDirectives, adding, x: %d y: %d, Weight, %d", pPlot->getX(), pPlot->getY(), iWeight);1406 LogInfo(strTemp, m_pPlayer);1407 }14081409 m_aDirectives.push_back(directive, iWeight);1410}