Hooks
static bool BeforeCvUnitMission_CalculateMissionTimer(UnitHandle hUnit, int iSteps, int& result);static void AfterCvUnitMission_CalculateMissionTimer(UnitHandle hUnit, int iSteps, int& result);static int ReplaceCvUnitMission_CalculateMissionTimer(int (*original)(UnitHandle, int), UnitHandle hUnit, int iSteps);CivRegisterBefore<CivHooks::CvUnitMission_CalculateMissionTimer>(host, &BeforeCvUnitMission_CalculateMissionTimer);CivRegisterAfter<CivHooks::CvUnitMission_CalculateMissionTimer>(host, &AfterCvUnitMission_CalculateMissionTimer);CivRegisterReplace<CivHooks::CvUnitMission_CalculateMissionTimer>(host, &ReplaceCvUnitMission_CalculateMissionTimer);
Code
1948// Update the mission timer to a new value based on the mission (or lack thereof) in the queue1949// KWG: The mission timer controls when the next time the unit's mission will be checked, not1950// in absolute time, but in passes through the Game Core update loop. Previously,1951// this was used to delay processing so that the user could see the visualization of1952// units. The Game Core no longer deals with visualization timing, but this system is1953// still used to keep the units sequencing their missions with each other.1954// i.e. each unit will get a chance to complete a mission segment, rather than a unit1955// exhausting its mission queue all in one go.1956int CvUnitMission::CalculateMissionTimer(UnitHandle hUnit, int iSteps)1957{1958 UnitHandle pTargetUnit;1959 CvPlot* pTargetPlot;1960 int iTime = 0;19611962 MissionQueueNode* pkMissionNode;1963 if(!hUnit->isHuman() && !hUnit->ShowMoves())1964 {1965 iTime = 0;1966 }1967 else if((pkMissionNode = HeadMissionQueueNode(hUnit->m_missionQueue)) != NULL)1968 {1969 MissionData& kMissionData = *pkMissionNode;19701971 iTime = 1;19721973 if((kMissionData.eMissionType == CvTypes::getMISSION_MOVE_TO()) ||1974 (kMissionData.eMissionType == CvTypes::getMISSION_ROUTE_TO()) ||1975 (kMissionData.eMissionType == CvTypes::getMISSION_MOVE_TO_UNIT()))1976 {1977 if(kMissionData.eMissionType == CvTypes::getMISSION_MOVE_TO_UNIT())1978 {1979 pTargetUnit = GET_PLAYER((PlayerTypes)kMissionData.iData1).getUnit(kMissionData.iData2);1980 if(pTargetUnit)1981 {1982 pTargetPlot = pTargetUnit->plot();1983 }1984 else1985 {1986 pTargetPlot = NULL;1987 }1988 }1989 else1990 {1991 pTargetPlot = GC.getMap().plot(kMissionData.iData1, kMissionData.iData2);1992 }19931994 if(pTargetPlot && hUnit->atPlot(*pTargetPlot))1995 {1996 iTime += iSteps;1997 }1998 else1999 {2000 iTime = std::min(iTime, 2);2001 }2002 }2003#if defined(MOD_EVENTS_CUSTOM_MISSIONS)2004 else if (MOD_EVENTS_CUSTOM_MISSIONS) {2005 int iValue = 0;2006 if (GAMEEVENTINVOKE_VALUE(iValue, GAMEEVENT_CustomMissionTimerInc, hUnit->getOwner(), hUnit->GetID(), kMissionData.eMissionType, kMissionData.iData1, kMissionData.iData2, kMissionData.iFlags, kMissionData.iPushTurn) == GAMEEVENTRETURN_VALUE) {2007 if (iValue != 0) {2008 iTime += iValue;2009 }2010 }2011 }2012#endif20132014 if(hUnit->isHuman() && (hUnit->IsAutomated() /*|| (GET_PLAYER((GC.getGame().isNetworkMultiPlayer()) ? hUnit->getOwner() : GC.getGame().getActivePlayer()).isOption(PLAYEROPTION_QUICK_MOVES))*/))2015 {2016 iTime = std::min(iTime, 1);2017 }2018 }2019 else2020 {2021 iTime = 0;2022 }20232024 return iTime;2025}