Bazaar developer reference

CvUnitMission::StartMission(UnitHandle)

Defined in
CvUnitMission.cpp, line 1387
Class
CvUnitMission
Hook name
CivHooks::CvUnitMission_StartMission
Lua events
GameEvents.CustomMissionSetActivity, GameEvents.CustomMissionStart

Hooks

static bool BeforeCvUnitMission_StartMission(UnitHandle hUnit);static void AfterCvUnitMission_StartMission(UnitHandle hUnit);static void ReplaceCvUnitMission_StartMission(void (*original)(UnitHandle), UnitHandle hUnit);CivRegisterBefore<CivHooks::CvUnitMission_StartMission>(host, &BeforeCvUnitMission_StartMission);CivRegisterAfter<CivHooks::CvUnitMission_StartMission>(host, &AfterCvUnitMission_StartMission);CivRegisterReplace<CivHooks::CvUnitMission_StartMission>(host, &ReplaceCvUnitMission_StartMission);

Code

1386/// Initiate a mission1387void CvUnitMission::StartMission(UnitHandle hUnit)1388{1389	bool bDelete;1390	bool bAction;1391	bool bNotify;13921393	static int stackDepth = 0;1394	++stackDepth; // JAR debugging13951396	CvAssert(stackDepth < 100);13971398	CvAssert(!hUnit->IsBusy());1399	CvAssert(hUnit->getOwner() != NO_PLAYER);1400	CvAssert(hUnit->HeadMissionQueueNode() != NULL);14011402	CvPlayerAI& kUnitOwner = GET_PLAYER(hUnit->getOwner());140314041405	if(!kUnitOwner.isSimultaneousTurns())1406	{1407		if(!kUnitOwner.isTurnActive())1408		{1409			if(hUnit->getOwner() == GC.getGame().getActivePlayer())1410			{1411				if(hUnit->IsSelected())1412				{1413					GC.GetEngineUserInterface()->changeCycleSelectionCounter(1);1414				}1415			}14161417			--stackDepth; // JAR debugging1418			return;1419		}1420	}14211422	if(hUnit->canMove())1423	{1424		hUnit->SetActivityType(ACTIVITY_MISSION);1425	}1426	else1427	{1428		hUnit->SetActivityType(ACTIVITY_HOLD);1429	}14301431	bDelete = false;1432	bAction = false;1433	bNotify = false;14341435	hUnit->ClearPathCache();14361437	const MissionData* pkQueueData = GetHeadMissionData(hUnit);1438	if(!hUnit->CanStartMission(pkQueueData->eMissionType, pkQueueData->iData1, pkQueueData->iData2, hUnit->plot()))1439	{1440		bDelete = true;1441	}1442	else1443	{1444		CvAssertMsg(kUnitOwner.isTurnActive() || kUnitOwner.isHuman(), "It's expected that either the turn is active for this player or the player is human");14451446		if(pkQueueData->eMissionType == CvTypes::getMISSION_SKIP())1447		{1448			hUnit->SetActivityType(ACTIVITY_HOLD);1449			bDelete = true;1450		}14511452		else if(pkQueueData->eMissionType == CvTypes::getMISSION_SLEEP())1453		{1454			hUnit->SetActivityType(ACTIVITY_SLEEP);1455			bNotify = true;1456			bDelete = true;1457		}14581459		else if(pkQueueData->eMissionType == CvTypes::getMISSION_FORTIFY())1460		{1461			hUnit->SetActivityType(ACTIVITY_SLEEP);1462			bNotify = true;1463			bDelete = true;1464		}14651466		else if(pkQueueData->eMissionType == CvTypes::getMISSION_AIRPATROL())1467		{1468			hUnit->SetActivityType(ACTIVITY_INTERCEPT);1469			bDelete = true;1470		}14711472		else if(pkQueueData->eMissionType == CvTypes::getMISSION_HEAL())1473		{1474			hUnit->SetActivityType(ACTIVITY_HEAL);1475			bNotify = true;1476			bDelete = true;1477		}14781479		else if(pkQueueData->eMissionType == CvTypes::getMISSION_ALERT())1480		{1481			hUnit->SetActivityType(ACTIVITY_SENTRY);1482			bNotify = true;1483			bDelete = true;1484		}14851486#if defined(MOD_EVENTS_CUSTOM_MISSIONS)1487		else if (MOD_EVENTS_CUSTOM_MISSIONS) {1488			int iValue = 0;1489			if (GAMEEVENTINVOKE_VALUE(iValue, GAMEEVENT_CustomMissionSetActivity, hUnit->getOwner(), hUnit->GetID(), pkQueueData->eMissionType, pkQueueData->iData1, pkQueueData->iData2, pkQueueData->iFlags, pkQueueData->iPushTurn) == GAMEEVENTRETURN_VALUE) {1490				if (iValue == CUSTOM_MISSION_ACTION ) {1491					bNotify = true;1492				} else if (iValue == CUSTOM_MISSION_DONE ) {1493					bDelete = true;1494				} else if (iValue == CUSTOM_MISSION_ACTION_AND_DONE ) {1495					bNotify = true;1496					bDelete = true;1497				}1498			}1499		}1500#endif15011502		if(bNotify)1503		{1504			// The entity should not futz with the missions, but...1505			CvAssert(GetHeadMissionData(hUnit) == pkQueueData);1506			pkQueueData = GetHeadMissionData(hUnit);1507		}15081509		if(hUnit->canMove())1510		{1511			if(pkQueueData->eMissionType == CvTypes::getMISSION_FORTIFY())1512			{1513				hUnit->SetFortifiedThisTurn(true);1514			}15151516			else if(pkQueueData->eMissionType == CvTypes::getMISSION_HEAL() ||1517			        pkQueueData->eMissionType == CvTypes::getMISSION_ALERT())1518			{1519				hUnit->SetFortifiedThisTurn(true);1520			}15211522			else if(pkQueueData->eMissionType == CvTypes::getMISSION_SET_UP_FOR_RANGED_ATTACK())1523			{1524				hUnit->setSetUpForRangedAttack(true);1525				bAction = true;1526			}15271528			else if(pkQueueData->eMissionType == CvTypes::getMISSION_EMBARK())1529			{1530				bAction = true;1531			}15321533			else if(pkQueueData->eMissionType == CvTypes::getMISSION_DISEMBARK())1534			{1535				bAction = true;1536			}15371538			else if(pkQueueData->eMissionType == CvTypes::getMISSION_AIRLIFT())1539			{1540				if(hUnit->airlift(pkQueueData->iData1, pkQueueData->iData2))1541				{1542					bAction = true;1543				}1544			}15451546			else if(pkQueueData->eMissionType == CvTypes::getMISSION_NUKE())1547			{1548				MissionData& kMissionData = *hUnit->HeadMissionQueueNode();1549				if(GC.getMap().plot(kMissionData.iData1, kMissionData.iData2) == NULL || !hUnit->canNukeAt(hUnit->plot(), kMissionData.iData1, kMissionData.iData2))1550				{1551					// Invalid, delete the mission1552					bDelete = true;1553				}1554			}15551556			else if(pkQueueData->eMissionType == CvTypes::getMISSION_PARADROP())1557			{1558				if(hUnit->paradrop(pkQueueData->iData1, pkQueueData->iData2))1559				{1560					bAction = true;1561					// The Paradrop needs to have GameplayUnitMissionEnd, so if no mission timer will be started, do it now.1562					if (hUnit->plot()->isActiveVisible() && (!hUnit->isHuman() || !hUnit->plot()->isVisibleToWatchingHuman() || CalculateMissionTimer(hUnit) == 0))1563					{1564						auto_ptr<ICvUnit1> pDllUnit(new CvDllUnit(hUnit.pointer()));1565						gDLL->GameplayUnitMissionEnd(pDllUnit.get());1566					}1567				}1568			}15691570			else if(pkQueueData->eMissionType == CvTypes::getMISSION_AIR_SWEEP())1571			{1572				if(hUnit->airSweep(pkQueueData->iData1, pkQueueData->iData2))1573				{1574					bAction = true;1575				}1576			}15771578			else if(pkQueueData->eMissionType == CvTypes::getMISSION_REBASE())1579			{1580				if(hUnit->rebase(pkQueueData->iData1, pkQueueData->iData2))1581				{1582					bAction = true;1583					// The Rebase needs to have GameplayUnitMissionEnd, so if no mission timer will be started, do it now.1584					if (hUnit->plot()->isActiveVisible() && (!hUnit->isHuman() || !hUnit->plot()->isVisibleToWatchingHuman() || CalculateMissionTimer(hUnit) == 0))1585					{1586						auto_ptr<ICvUnit1> pDllUnit(new CvDllUnit(hUnit.pointer()));1587						gDLL->GameplayUnitMissionEnd(pDllUnit.get());1588					}1589				}1590			}15911592			else if(pkQueueData->eMissionType == CvTypes::getMISSION_RANGE_ATTACK())1593			{1594				MissionData& kMissionData = *hUnit->HeadMissionQueueNode();1595				if(GC.getMap().plot(kMissionData.iData1, kMissionData.iData2) == NULL || !hUnit->canRangeStrikeAt(kMissionData.iData1, kMissionData.iData2))1596				{1597					// Invalid, delete the mission1598					bDelete = true;1599				}1600			}16011602			else if(pkQueueData->eMissionType == CvTypes::getMISSION_PILLAGE())1603			{1604				if(hUnit->pillage())1605				{1606					bAction = true;1607				}1608			}16091610			else if(pkQueueData->eMissionType == CvTypes::getMISSION_FOUND())1611			{1612				if(hUnit->found())1613				{1614					bAction = true;1615				}1616			}16171618			else if(pkQueueData->eMissionType == CvTypes::getMISSION_JOIN())1619			{1620				if(hUnit->join((SpecialistTypes)(hUnit->HeadMissionQueueNode()->iData1)))1621				{1622					bAction = true;1623				}1624			}16251626			else if(pkQueueData->eMissionType == CvTypes::getMISSION_CONSTRUCT())1627			{1628				if(hUnit->construct((BuildingTypes)(hUnit->HeadMissionQueueNode()->iData1)))1629				{1630					bAction = true;1631				}1632			}16331634			else if(pkQueueData->eMissionType == CvTypes::getMISSION_DISCOVER())1635			{1636				if(hUnit->discover())1637				{1638					bAction = true;1639				}1640			}16411642			else if(pkQueueData->eMissionType == CvTypes::getMISSION_HURRY())1643			{1644				//if (hUnit->DoRushBuilding())1645				if(hUnit->hurry())1646				{1647					bAction = true;1648				}1649			}16501651			else if(pkQueueData->eMissionType == CvTypes::getMISSION_TRADE())1652			{1653				if(hUnit->trade())1654				{1655					bAction = true;1656				}1657			}16581659			else if (pkQueueData->eMissionType == CvTypes::getMISSION_BUY_CITY_STATE())1660			{1661				if (hUnit->buyCityState())1662				{1663					bAction = true;1664				}1665			}16661667			else if(pkQueueData->eMissionType == CvTypes::getMISSION_REPAIR_FLEET())1668			{1669				if(hUnit->repairFleet())1670				{1671					bAction = true;1672				}1673			}1674			1675			else if(pkQueueData->eMissionType == CvTypes::getMISSION_SPACESHIP())1676			{1677				if(hUnit->DoBuildSpaceship())1678				{1679					bAction = true;1680				}1681			}16821683			else if(pkQueueData->eMissionType == CvTypes::getMISSION_CULTURE_BOMB())1684			{1685				if(hUnit->DoCultureBomb())1686				{1687					bAction = true;1688				}1689			}16901691			else if(pkQueueData->eMissionType == CvTypes::getMISSION_FOUND_RELIGION())1692			{1693				if(hUnit->DoFoundReligion())1694				{1695					bAction = true;1696				}1697			}16981699			else if(pkQueueData->eMissionType == CvTypes::getMISSION_SPREAD_RELIGION())1700			{1701				if(hUnit->DoSpreadReligion())1702				{1703					bAction = true;1704				}1705			}17061707			else if(pkQueueData->eMissionType == CvTypes::getMISSION_ENHANCE_RELIGION())1708			{1709				if(hUnit->DoEnhanceReligion())1710				{1711					bAction = true;1712				}1713			}17141715			else if(pkQueueData->eMissionType == CvTypes::getMISSION_REMOVE_HERESY())1716			{1717				if(hUnit->DoRemoveHeresy())1718				{1719					bAction = true;1720				}1721			}17221723			else if(pkQueueData->eMissionType == CvTypes::getMISSION_GOLDEN_AGE())1724			{1725				//just play animation, not golden age - JW1726				if(hUnit->HeadMissionQueueNode()->iData1 != -1)1727				{1728					bAction = true;1729				}1730				else1731				{1732					if(hUnit->goldenAge())1733					{1734						bAction = true;1735					}1736				}1737			}17381739			else if (pkQueueData->eMissionType == CvTypes::getMISSION_ESTABLISH_TRADE_ROUTE())1740			{1741				CvPlot* pPlot = GC.getMap().plotByIndex(pkQueueData->iData1);1742				CvAssertMsg(pPlot, "pPlot is null! OH NOES, JOEY!");1743				if (pPlot)1744				{1745					if(hUnit->makeTradeRoute(pPlot->getX(), pPlot->getY(), (TradeConnectionType)pkQueueData->iData2))1746					{1747						bAction = true;1748					}1749				}1750			}1751	1752			else if (pkQueueData->eMissionType == CvTypes::getMISSION_PLUNDER_TRADE_ROUTE())1753			{1754				if (hUnit->plunderTradeRoute())1755				{1756					bAction = true;1757				}1758			}17591760			else if (pkQueueData->eMissionType == CvTypes::getMISSION_GREAT_WORK())1761			{1762				if (hUnit->createGreatWork())1763				{1764					bAction = true;1765				}1766			}17671768			else if (pkQueueData->eMissionType == CvTypes::getMISSION_CHANGE_TRADE_UNIT_HOME_CITY())1769			{1770				if(hUnit->changeTradeUnitHomeCity(pkQueueData->iData1, pkQueueData->iData2))1771				{1772					bAction = true;1773				}1774			}17751776			else if (pkQueueData->eMissionType == CvTypes::getMISSION_SELL_EXOTIC_GOODS())1777			{1778				if (hUnit->sellExoticGoods())1779				{1780					bAction = true;1781				}1782			}17831784			else if(pkQueueData->eMissionType == CvTypes::getMISSION_BUILD())1785			{1786				// Gold cost for Improvement construction1787				kUnitOwner.GetTreasury()->ChangeGold(-(kUnitOwner.getBuildCost(hUnit->plot(), (BuildTypes)(hUnit->HeadMissionQueueNode()->iData1))));17881789				auto_ptr<ICvUnit1> pDllUnit(new CvDllUnit(hUnit.pointer()));1790				gDLL->GameplayUnitWork(pDllUnit.get(), (hUnit->HeadMissionQueueNode()->iData1));1791			}17921793			else if(pkQueueData->eMissionType == CvTypes::getMISSION_ROUTE_TO())1794			{1795				auto_ptr<ICvUnit1> pDllUnit(new CvDllUnit(hUnit.pointer()));1796				gDLL->GameplayUnitWork(pDllUnit.get(), 0);1797			}17981799			else if(pkQueueData->eMissionType == CvTypes::getMISSION_LEAD())1800			{1801				if(hUnit->lead(hUnit->HeadMissionQueueNode()->iData1))1802				{1803					bAction = true;1804				}1805			}18061807			else if(pkQueueData->eMissionType == CvTypes::getMISSION_DIE_ANIMATION())1808			{1809				bAction = true;1810			}18111812			else if(pkQueueData->eMissionType == CvTypes::getMISSION_GIVE_POLICIES())1813			{1814				//just play animation, not golden age - JW1815				if(hUnit->HeadMissionQueueNode()->iData1 != -1)1816				{1817					bAction = true;1818				}1819				else1820				{1821					if(hUnit->givePolicies())1822					{1823						bAction = true;1824					}1825				}1826			}18271828			else if(pkQueueData->eMissionType == CvTypes::getMISSION_ONE_SHOT_TOURISM())1829			{1830				//just play animation, not golden age - JW1831				if(hUnit->HeadMissionQueueNode()->iData1 != -1)1832				{1833					bAction = true;1834				}1835				else1836				{1837					if(hUnit->blastTourism())1838					{1839						bAction = true;1840					}1841				}1842			}18431844			else if (pkQueueData->eMissionType == CvTypes::getMISSION_CHANGE_ADMIRAL_PORT())1845			{1846				if(hUnit->changeAdmiralPort(pkQueueData->iData1, pkQueueData->iData2))1847				{1848					bAction = true;1849				}1850			}18511852#if defined(MOD_EVENTS_CUSTOM_MISSIONS)1853			else if (MOD_EVENTS_CUSTOM_MISSIONS) {1854				int iValue = 0;1855				if (GAMEEVENTINVOKE_VALUE(iValue, GAMEEVENT_CustomMissionStart, hUnit->getOwner(), hUnit->GetID(), pkQueueData->eMissionType, pkQueueData->iData1, pkQueueData->iData2, pkQueueData->iFlags, pkQueueData->iPushTurn) == GAMEEVENTRETURN_VALUE) {1856					if (iValue == CUSTOM_MISSION_ACTION) {1857						bAction = true;1858					}1859				}1860			}1861#endif1862		}1863	}18641865	if(hUnit->HeadMissionQueueNode() != NULL)1866	{1867		if(bAction)1868		{1869			if(hUnit->isHuman())1870			{1871				if(hUnit->plot()->isVisibleToWatchingHuman())1872				{1873					UpdateMissionTimer(hUnit);1874				}1875			}1876		}18771878		if(!hUnit->IsBusy())1879		{1880			if(bDelete)1881			{1882				if(hUnit->getOwner() == GC.getGame().getActivePlayer())1883				{1884					if(hUnit->IsSelected())1885					{1886						GC.GetEngineUserInterface()->changeCycleSelectionCounter(kUnitOwner.isOption(PLAYEROPTION_QUICK_MOVES)? 1 : 2);1887					}1888				}18891890				DeleteMissionQueueNode(hUnit, hUnit->HeadMissionQueueNode());1891			}1892			else if(hUnit->GetActivityType() == ACTIVITY_MISSION)1893			{1894				ContinueMission(hUnit);1895			}1896		}1897	}1898	--stackDepth;1899}

Calls

Called by