Hooks
static bool BeforeCvAINavalEscortedOperation_ArmyInPosition(CvAINavalEscortedOperation* self, CvArmyAI* pArmy, bool& result);static void AfterCvAINavalEscortedOperation_ArmyInPosition(CvAINavalEscortedOperation* self, CvArmyAI* pArmy, bool& result);static bool ReplaceCvAINavalEscortedOperation_ArmyInPosition(bool (*original)(CvAINavalEscortedOperation*, CvArmyAI*), CvAINavalEscortedOperation* self, CvArmyAI* pArmy);CivRegisterBefore<CivHooks::CvAINavalEscortedOperation_ArmyInPosition>(host, &BeforeCvAINavalEscortedOperation_ArmyInPosition);CivRegisterAfter<CivHooks::CvAINavalEscortedOperation_ArmyInPosition>(host, &AfterCvAINavalEscortedOperation_ArmyInPosition);CivRegisterReplace<CivHooks::CvAINavalEscortedOperation_ArmyInPosition>(host, &ReplaceCvAINavalEscortedOperation_ArmyInPosition);
Code
5205/// If at target, found city; if at muster point, merge settler and escort and move out5206bool CvAINavalEscortedOperation::ArmyInPosition(CvArmyAI* pArmy)5207{5208 int iUnitID = 0;5209 bool bStateChanged = false;5210 CvUnit* pSettler = 0, *pEscort = 0;5211 CvString strMsg;52125213 switch(m_eCurrentState)5214 {5215 case AI_OPERATION_STATE_MOVING_TO_TARGET:5216 case AI_OPERATION_STATE_AT_TARGET:52175218 // Call base class version and see if it thinks we're done5219 bStateChanged = CvAIOperation::ArmyInPosition(pArmy);52205221 // Now get the settler5222 iUnitID = pArmy->GetFirstUnitID();5223 if(iUnitID != -1)5224 {5225 pSettler = GET_PLAYER(m_eOwner).getUnit(iUnitID);5226 }52275228 if(pSettler != NULL)5229 {5230 CvPlot* pTargetPlot = GetTargetPlot();5231 const PlayerTypes pTargetPlotOwner = pTargetPlot->getOwner();52325233 CvPlot* pSettlerPlot = pSettler->plot();52345235 if((pTargetPlotOwner != NO_PLAYER && pTargetPlotOwner != m_eOwner) || pTargetPlot->IsAdjacentOwnedByOtherTeam(pSettler->getTeam()))5236 {5237 if(GC.getLogging() && GC.getAILogging())5238 {5239 strMsg.Format("Not at target but can no longer settle here. Target was (X=%d Y=%d)", pTargetPlot->getX(), pTargetPlot->getY());5240 LogOperationSpecialMessage(strMsg);5241 }5242 RetargetCivilian(pSettler, pArmy);5243 pSettler->finishMoves();5244 iUnitID = pArmy->GetNextUnitID();5245 if(iUnitID != -1)5246 {5247 pEscort = GET_PLAYER(m_eOwner).getUnit(iUnitID);5248 pEscort->finishMoves();5249 }5250 }5251 // If the settler made it, we don't care about the entire army5252 else if(pSettlerPlot == pTargetPlot && pSettler->canMove() && pSettler->canFound(pSettlerPlot))5253 {5254 pSettler->PushMission(CvTypes::getMISSION_FOUND());5255 if(GC.getLogging() && GC.getAILogging())5256 {5257 strMsg.Format("City founded, At X=%d, At Y=%d", pSettlerPlot->getX(), pSettlerPlot->getY());5258 LogOperationSpecialMessage(strMsg);5259 }5260 m_eCurrentState = AI_OPERATION_STATE_SUCCESSFUL_FINISH;5261 }52625263 // If we're at our target but can no longer found a city, might be someone else beat us to this area5264 // So move back out, picking a new target5265 else if(pSettlerPlot == GetTargetPlot() && !pSettler->canFound(pSettlerPlot))5266 {5267 if(GC.getLogging() && GC.getAILogging())5268 {5269 strMsg.Format("At target but can no longer settle here. Target was (X=%d Y=%d)", pTargetPlot->getX(), pTargetPlot->getY());5270 LogOperationSpecialMessage(strMsg);5271 }5272 RetargetCivilian(pSettler, pArmy);5273 pSettler->finishMoves();5274 iUnitID = pArmy->GetNextUnitID();5275 if(iUnitID != -1)5276 {5277 pEscort = GET_PLAYER(m_eOwner).getUnit(iUnitID);5278 pEscort->finishMoves();5279 }5280 }5281 }5282 break;52835284 // In all other cases use base class version5285 case AI_OPERATION_STATE_GATHERING_FORCES:5286 case AI_OPERATION_STATE_ABORTED:5287 case AI_OPERATION_STATE_RECRUITING_UNITS:5288 return CvAIOperation::ArmyInPosition(pArmy);5289 break;5290 };52915292 return bStateChanged;5293}