Ejemplo n.º 1
0
void CSkirmishAIHandler::CompleteWithDefaultOptionValues(const size_t skirmishAIId) {

	if (gameInitialized && IsLocalSkirmishAI(skirmishAIId)) {
		IAILibraryManager* aiLibMan = IAILibraryManager::GetInstance();
		const IAILibraryManager::T_skirmishAIInfos& aiInfos = aiLibMan->GetSkirmishAIInfos();
		const SkirmishAIKey* aiKey = GetLocalSkirmishAILibraryKey(skirmishAIId);
		if (aiKey != NULL) {
			const IAILibraryManager::T_skirmishAIInfos::const_iterator inf = aiInfos.find(*aiKey);
			if (inf != aiInfos.end()) {
				const CSkirmishAILibraryInfo* aiInfo = inf->second;
				const std::vector<Option>& options = aiInfo->GetOptions();
				id_ai_t::iterator ai = id_ai.find(skirmishAIId);
				if (ai != id_ai.end()) {
					SkirmishAIData& aiData = ai->second;
					std::vector<Option>::const_iterator oi;
					for (oi = options.begin(); oi != options.end(); ++oi) {
						if ((oi->typeCode != opt_error) &&
								(oi->typeCode != opt_section) &&
								(aiData.options.find(oi->key) == aiData.options.end())) {
							aiData.optionKeys.push_back(oi->key);
							aiData.options[oi->key] = option_getDefString(*oi);
						}
					}
				}
			}
		}
	}
}
Ejemplo n.º 2
0
bool CSkirmishAIWrapper::LoadSkirmishAI(bool postLoad) {

	ai = new CSkirmishAI(skirmishAIId, teamId, key, GetCallback());
	ai->Init();

	// check if initialization went ok
	if (skirmishAIHandler.IsLocalSkirmishAIDieing(skirmishAIId)) {
		return false;
	}

	IAILibraryManager* libManager = IAILibraryManager::GetInstance();
	libManager->FetchSkirmishAILibrary(key);

	const CSkirmishAILibraryInfo* infos = &*libManager->GetSkirmishAIInfos().find(key)->second;
	bool loadSupported = (infos->GetInfo(SKIRMISH_AI_PROPERTY_LOAD_SUPPORTED) == "yes");

	libManager->ReleaseSkirmishAILibrary(key);


	if (postLoad && !loadSupported) {
		// fallback code to help the AI if it
		// doesn't implement load/save support
		Init();
		for (size_t a = 0; a < unitHandler->MaxUnits(); a++) {
			if (!unitHandler->units[a])
				continue;

			if (unitHandler->units[a]->team == teamId) {
				try {
					UnitCreated(a, -1);
				} CATCH_AI_EXCEPTION;
				if (!unitHandler->units[a]->beingBuilt)
					try {
						UnitFinished(a);
					} CATCH_AI_EXCEPTION;
			} else {
				if ((unitHandler->units[a]->allyteam == teamHandler->AllyTeam(teamId))
						|| teamHandler->Ally(teamHandler->AllyTeam(teamId), unitHandler->units[a]->allyteam)) {
					// do nothing
				} else {
					if (unitHandler->units[a]->losStatus[teamHandler->AllyTeam(teamId)] & (LOS_INRADAR | LOS_INLOS)) {
						try {
							EnemyEnterRadar(a);
						} CATCH_AI_EXCEPTION;
					}
					if (unitHandler->units[a]->losStatus[teamHandler->AllyTeam(teamId)] & LOS_INLOS) {
						try {
							EnemyEnterLOS(a);
						} CATCH_AI_EXCEPTION;
					}
				}
			}
		}