Bazaar developer reference

CvPlayerTechs::CanResearch(TechTypes, bool) const

Defined in
CvTechClasses.cpp, line 1180
Class
CvPlayerTechs
Hook name
CivHooks::CvPlayerTechs_CanResearch
Lua events
GameEvents.PlayerCanResearch

Hooks

static bool BeforeCvPlayerTechs_CanResearch(const CvPlayerTechs* self, TechTypes eTech, bool bTrade, bool& result);static void AfterCvPlayerTechs_CanResearch(const CvPlayerTechs* self, TechTypes eTech, bool bTrade, bool& result);static bool ReplaceCvPlayerTechs_CanResearch(bool (*original)(const CvPlayerTechs*, TechTypes, bool), const CvPlayerTechs* self, TechTypes eTech, bool bTrade);CivRegisterBefore<CivHooks::CvPlayerTechs_CanResearch>(host, &BeforeCvPlayerTechs_CanResearch);CivRegisterAfter<CivHooks::CvPlayerTechs_CanResearch>(host, &AfterCvPlayerTechs_CanResearch);CivRegisterReplace<CivHooks::CvPlayerTechs_CanResearch>(host, &ReplaceCvPlayerTechs_CanResearch);

Code

1179/// Accessor: Is it possible to research this tech?1180bool CvPlayerTechs::CanResearch(TechTypes eTech, bool bTrade) const1181{1182	bool bFoundPossible;1183	bool bFoundValid;1184	int iI;11851186	CvTechEntry* pkTechEntry = GC.getTechInfo(eTech);1187	if(pkTechEntry == NULL)1188		return false;11891190	if(!IsResearch() && m_pPlayer->getAdvancedStartPoints() < 0)1191	{1192		return false;1193	}11941195	// Do we already have this tech?1196	if(GET_TEAM(m_pPlayer->getTeam()).GetTeamTechs()->HasTech(eTech))1197	{1198		return false;1199	}12001201	bFoundPossible = false;1202	bFoundValid = false;12031204	// See if it is possible based on OR prereqs1205	for(iI = 0; iI < GC.getNUM_OR_TECH_PREREQS(); iI++)1206	{1207		TechTypes ePrereq = (TechTypes)pkTechEntry->GetPrereqOrTechs(iI);1208		if(ePrereq != NO_TECH)1209		{1210			bFoundPossible = true;12111212			if(GET_TEAM(m_pPlayer->getTeam()).GetTeamTechs()->HasTech(ePrereq))1213			{1214				if(!bTrade || !GET_TEAM(m_pPlayer->getTeam()).GetTeamTechs()->IsNoTradeTech(ePrereq))1215				{1216					bFoundValid = true;1217					break;1218				}1219			}1220		}1221	}12221223	if(bFoundPossible && !bFoundValid)1224	{1225		return false;1226	}12271228	// See if it is possible based on AND prereqs1229	for(iI = 0; iI < GC.getNUM_AND_TECH_PREREQS(); iI++)1230	{1231		TechTypes ePrereq = (TechTypes)pkTechEntry->GetPrereqAndTechs(iI);1232		if(ePrereq != NO_TECH)1233		{1234			if(!GET_TEAM(m_pPlayer->getTeam()).GetTeamTechs()->HasTech(ePrereq))1235			{1236				return false;1237			}12381239			if(bTrade && GET_TEAM(m_pPlayer->getTeam()).GetTeamTechs()->IsNoTradeTech(ePrereq))1240			{1241				return false;1242			}1243		}1244	}12451246	// Is it disabled for some reason?1247	if(!CanEverResearch(eTech))1248	{1249		return false;1250	}12511252	ICvEngineScriptSystem1* pkScriptSystem = gDLL->GetScriptSystem();1253	if(pkScriptSystem)1254	{1255		CvLuaArgsHandle args;1256		args->Push(m_pPlayer->GetID());1257		args->Push(eTech);12581259		// Attempt to execute the game events.1260		// Will return false if there are no registered listeners.1261		bool bResult = false;1262		if(LuaSupport::CallTestAll(pkScriptSystem, "PlayerCanResearch", args.get(), bResult))1263		{1264			// Check the result.1265			if(bResult == false)1266			{1267				return false;1268			}1269		}1270	}12711272	return true;1273}

Calls

Called by