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); } } } } } } }
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; } } } }