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}