Bazaar developer reference

CvUnitMission::CanStartMission(UnitHandle, int, int, int, CvPlot *, bool)

Defined in
CvUnitMission.cpp, line 982
Class
CvUnitMission
Hook name
CivHooks::CvUnitMission_CanStartMission
Lua events
GameEvents.CustomMissionPossible, GameEvents.CanStartMission

Hooks

static bool BeforeCvUnitMission_CanStartMission(UnitHandle hUnit, int iMission, int iData1, int iData2, CvPlot* pPlot, bool bTestVisible, bool& result);static void AfterCvUnitMission_CanStartMission(UnitHandle hUnit, int iMission, int iData1, int iData2, CvPlot* pPlot, bool bTestVisible, bool& result);static bool ReplaceCvUnitMission_CanStartMission(bool (*original)(UnitHandle, int, int, int, CvPlot*, bool), UnitHandle hUnit, int iMission, int iData1, int iData2, CvPlot* pPlot, bool bTestVisible);CivRegisterBefore<CivHooks::CvUnitMission_CanStartMission>(host, &BeforeCvUnitMission_CanStartMission);CivRegisterAfter<CivHooks::CvUnitMission_CanStartMission>(host, &AfterCvUnitMission_CanStartMission);CivRegisterReplace<CivHooks::CvUnitMission_CanStartMission>(host, &ReplaceCvUnitMission_CanStartMission);

Code

981/// Eligible to start a new mission?982bool CvUnitMission::CanStartMission(UnitHandle hUnit, int iMission, int iData1, int iData2, CvPlot* pPlot, bool bTestVisible)983{984	UnitHandle pTargetUnit;985986	if(hUnit->IsBusy())987	{988		return false;989	}990991#if defined(MOD_BUGFIX_MINOR)992	// Bail early if the unit has no moves left993	if (hUnit->maxMoves() > 0 && hUnit->getMoves() <= 0)994	{995		return false;996	}997#endif998999	// Prevented by scripting?1000	ICvEngineScriptSystem1* pkScriptSystem = gDLL->GetScriptSystem();1001	if(pkScriptSystem)1002	{1003		CvLuaArgsHandle args;1004		args->Push(hUnit->getOwner());1005		args->Push(hUnit->GetID());1006		args->Push(iMission);10071008		// Attempt to execute the game events.1009		// Will return false if there are no registered listeners.1010		bool bResult = false;1011		if(LuaSupport::CallTestAll(pkScriptSystem, "CanStartMission", args.get(), bResult))1012		{1013			// Check the result.1014			if(bResult == false)1015			{1016				return false;1017			}1018		}1019	}10201021	if(pPlot == NULL)1022	{1023		pPlot = hUnit->plot();1024	}10251026	if(iMission == CvTypes::getMISSION_MOVE_TO() ||1027	        iMission == CvTypes::getMISSION_SWAP_UNITS())1028	{1029		if (hUnit->IsImmobile() && hUnit->getDomainType() != DOMAIN_AIR)	// If immobile, we can't move... unless we are an air unit.1030		{1031			return false;1032		}10331034		if(!(pPlot->at(iData1, iData2)))1035		{1036			return true;1037		}1038	}1039	else if(iMission == CvTypes::getMISSION_ROUTE_TO())1040	{1041		if(!(pPlot->at(iData1, iData2)) || (hUnit->GetBestBuildRoute(pPlot) != NO_ROUTE))1042		{1043			return true;1044		}1045	}1046	else if(iMission == CvTypes::getMISSION_MOVE_TO_UNIT())1047	{1048		CvAssertMsg(iData1 != NO_PLAYER, "iData1 should be a valid Player");1049		CvAssertMsg(iData2 != NO_UNIT, "iData2 should be a valid Unit ID");1050		if (iData1 != NO_PLAYER && iData2 != NO_UNIT)1051		{1052			pTargetUnit = GET_PLAYER((PlayerTypes)iData1).getUnit(iData2);10531054			if (pTargetUnit->IsImmobile())1055			{1056				return false;1057			}10581059			if((pTargetUnit) && !(pTargetUnit->atPlot(*pPlot)))1060			{1061				return true;1062			}1063		}1064		else1065			return false;1066	}1067	else if(iMission == CvTypes::getMISSION_SKIP())1068	{1069		if(hUnit->canHold(pPlot))1070		{1071			return true;1072		}1073	}1074	else if(iMission == CvTypes::getMISSION_SLEEP())1075	{1076		if(hUnit->canSleep(pPlot))1077		{1078			return true;1079		}1080	}1081	else if(iMission == CvTypes::getMISSION_FORTIFY())1082	{1083		if(hUnit->canFortify(pPlot))1084		{1085			return true;1086		}1087	}1088	else if(iMission == CvTypes::getMISSION_SET_UP_FOR_RANGED_ATTACK())1089	{1090		if(hUnit->canSetUpForRangedAttack(pPlot))1091		{1092			return true;1093		}1094	}1095	else if(iMission == CvTypes::getMISSION_EMBARK())1096	{1097		if(hUnit->canEmbark(pPlot))1098		{1099			return true;1100		}1101	}1102	else if(iMission == CvTypes::getMISSION_DISEMBARK())1103	{1104		if(hUnit->canDisembark(pPlot))1105		{1106			return true;1107		}1108	}1109	else if(iMission == CvTypes::getMISSION_AIRPATROL())1110	{1111		if(hUnit->canAirPatrol(pPlot))1112		{1113			return true;1114		}1115	}1116	else if(iMission == CvTypes::getMISSION_HEAL())1117	{1118		if(hUnit->canHeal(pPlot, bTestVisible))1119		{1120			return true;1121		}1122	}1123	else if(iMission == CvTypes::getMISSION_ALERT())1124	{1125		if(hUnit->canSentry(pPlot))1126		{1127			return true;1128		}1129	}1130	else if(iMission == CvTypes::getMISSION_AIRLIFT())1131	{1132		if(hUnit->canAirliftAt(pPlot, iData1, iData2))1133		{1134			return true;1135		}1136	}1137	else if(iMission == CvTypes::getMISSION_NUKE())1138	{1139		if(hUnit->canNukeAt(pPlot, iData1, iData2))1140		{1141			return true;1142		}1143	}1144	else if(iMission == CvTypes::getMISSION_PARADROP())1145	{1146		if(hUnit->canParadropAt(pPlot, iData1, iData2))1147		{1148			return true;1149		}1150	}1151	else if(iMission == CvTypes::getMISSION_AIR_SWEEP())1152	{1153		if(hUnit->canAirSweepAt(iData1, iData2))1154		{1155			return true;1156		}1157	}1158	else if(iMission == CvTypes::getMISSION_REBASE())1159	{1160		if(hUnit->canRebaseAt(pPlot, iData1, iData2))1161		{1162			return true;1163		}1164	}1165	else if(iMission == CvTypes::getMISSION_RANGE_ATTACK())1166	{1167		if(hUnit->canRangeStrikeAt(iData1, iData2))1168		{1169			return true;1170		}1171	}1172	else if(iMission == CvTypes::getMISSION_PILLAGE())1173	{1174		if(hUnit->canPillage(pPlot))1175		{1176			return true;1177		}1178	}1179	else if(iMission == CvTypes::getMISSION_FOUND())1180	{1181		if(hUnit->canFound(pPlot, bTestVisible))1182		{1183			return true;1184		}1185	}1186	else if(iMission == CvTypes::getMISSION_JOIN())1187	{1188		if(hUnit->canJoin(pPlot, ((SpecialistTypes)iData1)))1189		{1190			return true;1191		}1192	}1193	else if(iMission == CvTypes::getMISSION_CONSTRUCT())1194	{1195		if(hUnit->canConstruct(pPlot, ((BuildingTypes)iData1)))1196		{1197			return true;1198		}1199	}1200	else if(iMission == CvTypes::getMISSION_DISCOVER())1201	{1202		if(hUnit->canDiscover(pPlot, bTestVisible))1203		{1204			return true;1205		}1206	}1207	else if(iMission == CvTypes::getMISSION_HURRY())1208	{1209		//if (hUnit->IsCanRushBuilding(pPlot->getPlotCity(), bTestVisible))1210		if(hUnit->canHurry(pPlot, bTestVisible))1211		{1212			return true;1213		}1214	}1215	else if(iMission == CvTypes::getMISSION_TRADE())1216	{1217		if(hUnit->canTrade(pPlot, bTestVisible))1218		{1219			return true;1220		}1221	}1222	else if(iMission == CvTypes::getMISSION_REPAIR_FLEET())1223	{1224		if(hUnit->canRepairFleet(pPlot, bTestVisible))1225		{1226			return true;1227		}1228	}1229	else if (iMission == CvTypes::getMISSION_BUY_CITY_STATE())1230	{1231		if (hUnit->canBuyCityState(pPlot, bTestVisible))1232		{1233			return true;1234		}1235	}1236	else if(iMission == CvTypes::getMISSION_SPACESHIP())1237	{1238		if(hUnit->CanBuildSpaceship(pPlot, bTestVisible))1239		{1240			return true;1241		}1242	}1243	else if(iMission == CvTypes::getMISSION_CULTURE_BOMB())1244	{1245		if(hUnit->CanCultureBomb(pPlot, bTestVisible))1246		{1247			return true;1248		}1249	}1250	else if(iMission == CvTypes::getMISSION_FOUND_RELIGION())1251	{1252		if(hUnit->CanFoundReligion(pPlot))1253		{1254			return true;1255		}1256	}1257	else if(iMission == CvTypes::getMISSION_SPREAD_RELIGION())1258	{1259		if(hUnit->CanSpreadReligion(pPlot))1260		{1261			return true;1262		}1263	}1264	else if(iMission == CvTypes::getMISSION_ENHANCE_RELIGION())1265	{1266		if(hUnit->CanEnhanceReligion(pPlot))1267		{1268			return true;1269		}1270	}1271	else if(iMission == CvTypes::getMISSION_REMOVE_HERESY())1272	{1273		if(hUnit->CanRemoveHeresy(pPlot))1274		{1275			return true;1276		}1277	}1278	else if(iMission == CvTypes::getMISSION_GOLDEN_AGE())1279	{1280		//this means to play the animation only1281		if(iData1 != -1)1282		{1283			return true;1284		}12851286		if(hUnit->canGoldenAge(pPlot, bTestVisible))1287		{1288			return true;1289		}1290	}1291	else if(iMission == CvTypes::getMISSION_BUILD())1292	{1293		CvAssertMsg(((BuildTypes)iData1) < GC.getNumBuildInfos(), "Invalid Build");1294		if(hUnit->canBuild(pPlot, ((BuildTypes)iData1), bTestVisible))1295		{1296			return true;1297		}1298	}1299	else if(iMission == CvTypes::getMISSION_LEAD())1300	{1301		if(hUnit->canLead(pPlot, iData1))1302		{1303			return true;1304		}1305	}1306	else if (iMission == CvTypes::getMISSION_ESTABLISH_TRADE_ROUTE())1307	{1308		if (hUnit->canMakeTradeRoute(pPlot))1309		{1310			return true;1311		}1312	}1313	else if (iMission == CvTypes::getMISSION_PLUNDER_TRADE_ROUTE())1314	{1315		if (hUnit->canPlunderTradeRoute(pPlot, bTestVisible))1316		{1317			return true;1318		}1319	}1320	else if (iMission == CvTypes::getMISSION_GREAT_WORK())1321	{1322		if (hUnit->canCreateGreatWork(pPlot, bTestVisible))1323		{1324			return true;1325		}1326	}1327	else if (iMission == CvTypes::getMISSION_CHANGE_TRADE_UNIT_HOME_CITY())1328	{1329		if (hUnit->canChangeTradeUnitHomeCity(pPlot))1330		{1331			return true;1332		}1333	}1334	else if (iMission == CvTypes::getMISSION_SELL_EXOTIC_GOODS())1335	{1336		if (hUnit->canSellExoticGoods(pPlot, bTestVisible))1337		{1338			return true;1339		}1340	}1341	else if(iMission == CvTypes::getMISSION_GIVE_POLICIES())1342	{1343		//this means to play the animation only1344		if(iData1 != -1)1345		{1346			return true;1347		}13481349		if(hUnit->canGivePolicies(pPlot, bTestVisible))1350		{1351			return true;1352		}1353	}1354	else if(iMission == CvTypes::getMISSION_ONE_SHOT_TOURISM())1355	{1356		//this means to play the animation only1357		if(iData1 != -1)1358		{1359			return true;1360		}13611362		if(hUnit->canBlastTourism(pPlot, bTestVisible))1363		{1364			return true;1365		}1366	}1367	else if (iMission == CvTypes::getMISSION_CHANGE_ADMIRAL_PORT())1368	{1369		if (hUnit->canChangeAdmiralPort(pPlot))1370		{1371			return true;1372		}1373	}1374#if defined(MOD_EVENTS_CUSTOM_MISSIONS)1375	else if (MOD_EVENTS_CUSTOM_MISSIONS) {1376		if (GAMEEVENTINVOKE_TESTANY(GAMEEVENT_CustomMissionPossible, hUnit->getOwner(), hUnit->GetID(), iMission, iData1, iData2, 0, -1, pPlot->getX(), pPlot->getY(), bTestVisible) == GAMEEVENTRETURN_TRUE) {1377			return true;1378		}1379	}1380#endif13811382	return false;1383}

Calls

Called by