Bazaar developer reference

CvPlayer::canCreate(ProjectTypes, bool, bool) const

Defined in
CvPlayer.cpp, line 8248
Class
CvPlayer
Hook name
CivHooks::CvPlayer_canCreate
Lua events
GameEvents.PlayerCanCreate

Hooks

static bool BeforeCvPlayer_canCreate(const CvPlayer* self, ProjectTypes eProject, bool bContinue, bool bTestVisible, bool& result);static void AfterCvPlayer_canCreate(const CvPlayer* self, ProjectTypes eProject, bool bContinue, bool bTestVisible, bool& result);static bool ReplaceCvPlayer_canCreate(bool (*original)(const CvPlayer*, ProjectTypes, bool, bool), const CvPlayer* self, ProjectTypes eProject, bool bContinue, bool bTestVisible);CivRegisterBefore<CivHooks::CvPlayer_canCreate>(host, &BeforeCvPlayer_canCreate);CivRegisterAfter<CivHooks::CvPlayer_canCreate>(host, &AfterCvPlayer_canCreate);CivRegisterReplace<CivHooks::CvPlayer_canCreate>(host, &ReplaceCvPlayer_canCreate);

Code

8248bool CvPlayer::canCreate(ProjectTypes eProject, bool bContinue, bool bTestVisible) const8249{8250	CvProjectEntry* pkProjectInfo = GC.getProjectInfo(eProject);8251	if(!pkProjectInfo)8252	{8253		return false;8254	}82558256	CvProjectEntry& pProjectInfo = *pkProjectInfo;82578258	int iI;82598260	// No projects for barbs8261	if(isBarbarian())8262	{8263		return false;8264	}82658266	// no minors either8267	if(isMinorCiv())8268	{8269		return false;8270	}82718272	// If cost is -1 then that means it can't be built8273	if(pProjectInfo.GetProductionCost() == -1)8274	{8275		return false;8276	}82778278	// Tech requirement8279	if(!(GET_TEAM(getTeam()).GetTeamTechs()->HasTech((TechTypes)(pProjectInfo.GetTechPrereq()))))8280	{8281		return false;8282	}82838284	// Policy branch requirement?8285	if(pProjectInfo.GetCultureBranchesRequired() > 0)8286	{8287		if(GetPlayerPolicies()->GetNumPolicyBranchesFinished() < pProjectInfo.GetCultureBranchesRequired())8288		{8289			return false;8290		}8291	}82928293	// Requires a particular victory condition to be enabled?8294	if(pProjectInfo.GetVictoryPrereq() != NO_VICTORY)8295	{8296		if(!(GC.getGame().isVictoryValid((VictoryTypes)(pProjectInfo.GetVictoryPrereq()))))8297		{8298			return false;8299		}83008301		if(isMinorCiv())8302		{8303			return false;8304		}83058306		if(GET_TEAM(getTeam()).getVictoryCountdown((VictoryTypes)pProjectInfo.GetVictoryPrereq()) >= 0)8307		{8308			return false;8309		}8310	}83118312	if(GC.getGame().isProjectMaxedOut(eProject))8313	{8314		return false;8315	}83168317	if(GET_TEAM(getTeam()).isProjectMaxedOut(eProject))8318	{8319		return false;8320	}83218322	if(!bTestVisible)8323	{8324		// Resource Requirements8325		ResourceTypes eResource;8326		int iNumResource;8327		for(int iResourceLoop = 0; iResourceLoop < GC.getNumResourceInfos(); iResourceLoop++)8328		{8329			eResource = (ResourceTypes) iResourceLoop;8330			iNumResource = pProjectInfo.GetResourceQuantityRequirement(eResource);83318332			if(iNumResource > 0)8333			{8334				if(getNumResourceAvailable(eResource) < iNumResource)8335				{8336					return false;8337				}8338			}8339		}83408341		if(GC.getGame().isProjectMaxedOut(eProject, (GET_TEAM(getTeam()).getProjectMaking(eProject) + ((bContinue) ? -1 : 0))))8342		{8343			return false;8344		}83458346		if(GET_TEAM(getTeam()).isProjectMaxedOut(eProject, (GET_TEAM(getTeam()).getProjectMaking(eProject) + ((bContinue) ? -1 : 0))))8347		{8348			return false;8349		}83508351		// Nukes disabled? (by UN or something)8352		if(GC.getGame().isNoNukes())8353		{8354			if(pProjectInfo.IsAllowsNukes())8355			{8356				for(iI = 0; iI < GC.getNumUnitInfos(); iI++)8357				{8358					CvUnitEntry* pkUnitEntry = GC.getUnitInfo((UnitTypes)iI);8359					if(pkUnitEntry && pkUnitEntry->GetNukeDamageLevel() != -1)8360					{8361						return false;8362					}8363				}8364			}8365		}83668367		if(pProjectInfo.GetAnyoneProjectPrereq() != NO_PROJECT)8368		{8369			if(GC.getGame().getProjectCreatedCount((ProjectTypes)(pProjectInfo.GetAnyoneProjectPrereq())) == 0)8370			{8371				return false;8372			}8373		}83748375		for(iI = 0; iI < GC.getNumProjectInfos(); iI++)8376		{8377			if(GET_TEAM(getTeam()).getProjectCount((ProjectTypes)iI) < pProjectInfo.GetProjectsNeeded(iI))8378			{8379				return false;8380			}8381		}8382	}83838384	ICvEngineScriptSystem1* pkScriptSystem = gDLL->GetScriptSystem();8385	if(pkScriptSystem)8386	{8387		CvLuaArgsHandle args;8388		args->Push(GetID());8389		args->Push(eProject);83908391		// Attempt to execute the game events.8392		// Will return false if there are no registered listeners.8393		bool bResult = false;8394		if(LuaSupport::CallTestAll(pkScriptSystem, "PlayerCanCreate", args.get(), bResult))8395		{8396			// Check the result.8397			if(bResult == false)8398			{8399				return false;8400			}8401		}8402	}84038404	return true;8405}

Calls

Called by