Bazaar developer reference

CvUnitMission::CalculateMissionTimer(UnitHandle, int)

Defined in
CvUnitMission.cpp, line 1956
Class
CvUnitMission
Hook name
CivHooks::CvUnitMission_CalculateMissionTimer
Lua events
GameEvents.CustomMissionTimerInc

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}

Calls

Called by