Hooks
static bool BeforeCvHomelandAI_ExecuteWorkerMove(CvHomelandAI* self, CvUnit* pUnit, bool bSecondary, bool& result);static void AfterCvHomelandAI_ExecuteWorkerMove(CvHomelandAI* self, CvUnit* pUnit, bool bSecondary, bool& result);static bool ReplaceCvHomelandAI_ExecuteWorkerMove(bool (*original)(CvHomelandAI*, CvUnit*, bool), CvHomelandAI* self, CvUnit* pUnit, bool bSecondary);CivRegisterBefore<CivHooks::CvHomelandAI_ExecuteWorkerMove>(host, &BeforeCvHomelandAI_ExecuteWorkerMove);CivRegisterAfter<CivHooks::CvHomelandAI_ExecuteWorkerMove>(host, &AfterCvHomelandAI_ExecuteWorkerMove);CivRegisterReplace<CivHooks::CvHomelandAI_ExecuteWorkerMove>(host, &ReplaceCvHomelandAI_ExecuteWorkerMove);
Code
5968#if defined(MOD_AI_SECONDARY_WORKERS)5969bool CvHomelandAI::ExecuteWorkerMove(CvUnit* pUnit, bool bSecondary)5970#else5971bool CvHomelandAI::ExecuteWorkerMove(CvUnit* pUnit)5972#endif5973{5974#if defined(MOD_AI_SECONDARY_WORKERS)5975 // if (bSecondary) CUSTOMLOG("ExecuteWorkerMove(secondary) for %s at (%i, %i)", pUnit->getName().c_str(), pUnit->plot()->getX(), pUnit->plot()->getY());5976#endif5977 const UINT ciDirectiveSize = 1;5978 BuilderDirective aDirective[ ciDirectiveSize ];59795980 // evaluator5981#if defined(MOD_AI_SECONDARY_WORKERS)5982 bool bHasDirective = m_pPlayer->GetBuilderTaskingAI()->EvaluateBuilder(pUnit, aDirective, ciDirectiveSize, false, false, bSecondary);5983#else5984 bool bHasDirective = m_pPlayer->GetBuilderTaskingAI()->EvaluateBuilder(pUnit, aDirective, ciDirectiveSize);5985#endif5986 if(bHasDirective)5987 {5988 switch(aDirective[0].m_eDirective)5989 {5990 case BuilderDirective::BUILD_IMPROVEMENT_ON_RESOURCE:5991 case BuilderDirective::BUILD_IMPROVEMENT:5992 case BuilderDirective::REPAIR:5993 case BuilderDirective::BUILD_ROUTE:5994 case BuilderDirective::CHOP:5995 case BuilderDirective::REMOVE_ROAD:5996 {5997 CvPlot* pPlot = GC.getMap().plot(aDirective[0].m_sX, aDirective[0].m_sY);5998 MissionTypes eMission = NO_MISSION;5999 if(pUnit->getX() == aDirective[0].m_sX && pUnit->getY() == aDirective[0].m_sY)6000 {6001#if defined(MOD_AI_SECONDARY_WORKERS)6002 // if (bSecondary) CUSTOMLOG(" ... build %i", ((int) aDirective[0].m_eDirective));6003#endif6004 eMission = CvTypes::getMISSION_BUILD();6005 }6006 else6007 {6008#if defined(MOD_AI_SECONDARY_WORKERS)6009 // if (bSecondary) CUSTOMLOG(" ... move to (%i, %i)", ((int) aDirective[0].m_sX), ((int) aDirective[0].m_sY));6010#endif6011 eMission = CvTypes::getMISSION_MOVE_TO();6012 }60136014 if(GC.getLogging() && GC.GetBuilderAILogging())6015 {6016 // Open the log file6017 CvString strFileName = "BuilderTaskingLog.csv";6018 FILogFile* pLog;6019 pLog = LOGFILEMGR.GetLog(strFileName, FILogFile::kDontTimeStamp);60206021 // write in data6022 CvString strLog;6023 CvString strTemp;60246025 CvString strPlayerName;6026 strPlayerName = m_pPlayer->getCivilizationShortDescription();6027 strLog += strPlayerName;6028 strLog += ",";60296030 strTemp.Format("%d,", GC.getGame().getGameTurn()); // turn6031 strLog += strTemp;60326033 strTemp.Format("%d,", pUnit->GetID()); // unit id6034 strLog += strTemp;60356036 switch(aDirective[0].m_eDirective)6037 {6038 case BuilderDirective::BUILD_IMPROVEMENT_ON_RESOURCE:6039 strLog += "On resource,";6040 break;6041 case BuilderDirective::BUILD_IMPROVEMENT:6042 strLog += "On plot,";6043 break;6044 case BuilderDirective::REPAIR:6045 strLog += "Repairing,";6046 break;6047 case BuilderDirective::BUILD_ROUTE:6048 strLog += "Building route,";6049 break;6050 case BuilderDirective::CHOP:6051 strLog += "Removing resource for production,";6052 break;6053 case BuilderDirective::REMOVE_ROAD:6054 strLog += "Removing road,";6055 break;6056 }60576058 if(eMission == CvTypes::getMISSION_BUILD())6059 {6060 if(aDirective[0].m_eDirective == BuilderDirective::REPAIR)6061 {6062 if(pPlot->IsImprovementPillaged())6063 {6064 strLog += "Repairing improvement";6065 }6066 else6067 {6068 strLog += "Repairing route";6069 }6070 }6071 else if(aDirective[0].m_eDirective == BuilderDirective::BUILD_ROUTE)6072 {6073 strLog += "Building route,";6074 }6075 else if(aDirective[0].m_eDirective == BuilderDirective::BUILD_IMPROVEMENT || aDirective[0].m_eDirective == BuilderDirective::BUILD_IMPROVEMENT_ON_RESOURCE)6076 {6077 strLog += "Building improvement,";6078 }6079 else if(aDirective[0].m_eDirective == BuilderDirective::CHOP)6080 {6081 strLog += "Removing feature for production,";6082 }6083 else6084 {6085 strLog += "Removing road,";6086 }6087 }6088 else6089 {6090 strLog += "Moving to location,";6091 }60926093 pLog->Msg(strLog);6094 }60956096 if(eMission == CvTypes::getMISSION_BUILD())6097 {6098 // check to see if we already have this mission as the unit's head mission6099 bool bPushMission = true;6100 const MissionData* pkMissionData = pUnit->GetHeadMissionData();6101 if(pkMissionData != NULL)6102 {6103 if(pkMissionData->eMissionType == eMission && pkMissionData->iData1 == aDirective[0].m_eBuild)6104 {6105 bPushMission = false;6106 }6107 }61086109 if(bPushMission)6110 {6111 pUnit->PushMission(CvTypes::getMISSION_BUILD(), aDirective[0].m_eBuild, -1, 0, (pUnit->GetLengthMissionQueue() > 0), false, MISSIONAI_BUILD, pPlot);6112 }61136114 CvAssertMsg(!pUnit->ReadyToMove(), "Worker did not do their mission this turn. Could cause game to hang.");6115 if(pUnit->ReadyToMove())6116 {6117 pUnit->finishMoves();6118 }6119 UnitProcessed(pUnit->GetID());6120 }6121 else6122 {6123 pUnit->PushMission(CvTypes::getMISSION_MOVE_TO(), aDirective[0].m_sX, aDirective[0].m_sY, 0, false, false, MISSIONAI_BUILD, pPlot);6124 pUnit->finishMoves();6125 UnitProcessed(pUnit->GetID());6126 }61276128 return true;6129 }6130 break;6131 }6132 }6133 else6134 {6135 if(GC.getLogging() && GC.GetBuilderAILogging())6136 {6137 CvString strFileName = "BuilderTaskingLog.csv";6138 FILogFile* pLog;6139 pLog = LOGFILEMGR.GetLog(strFileName, FILogFile::kDontTimeStamp);6140 pLog->Msg("builder has no directive");6141 }6142 }61436144 return false;6145}