Bazaar developer reference

CvUnit::canAcquirePromotion(PromotionTypes) const

Defined in
CvUnit.cpp, line 20567
Class
CvUnit
Hook name
CivHooks::CvUnit_canAcquirePromotion
Lua events
GameEvents.CanHavePromotion, GameEvents.UnitCanHavePromotion

Hooks

static bool BeforeCvUnit_canAcquirePromotion(const CvUnit* self, PromotionTypes ePromotion, bool& result);static void AfterCvUnit_canAcquirePromotion(const CvUnit* self, PromotionTypes ePromotion, bool& result);static bool ReplaceCvUnit_canAcquirePromotion(bool (*original)(const CvUnit*, PromotionTypes), const CvUnit* self, PromotionTypes ePromotion);CivRegisterBefore<CivHooks::CvUnit_canAcquirePromotion>(host, &BeforeCvUnit_canAcquirePromotion);CivRegisterAfter<CivHooks::CvUnit_canAcquirePromotion>(host, &AfterCvUnit_canAcquirePromotion);CivRegisterReplace<CivHooks::CvUnit_canAcquirePromotion>(host, &ReplaceCvUnit_canAcquirePromotion);

Code

20567bool CvUnit::canAcquirePromotion(PromotionTypes ePromotion) const20568{20569	VALIDATE_OBJECT20570	CvAssertMsg(ePromotion >= 0, "ePromotion is expected to be non-negative (invalid Index)");20571	CvAssertMsg(ePromotion < GC.getNumPromotionInfos(), "ePromotion is expected to be within maximum bounds (invalid Index)");2057220573	CvPromotionEntry* pkPromotionInfo = GC.getPromotionInfo(ePromotion);20574	if(pkPromotionInfo == NULL)20575	{20576		return false;20577	}2057820579	if(isHasPromotion(ePromotion))20580	{20581		return false;20582	}2058320584	// AND prereq20585	if(pkPromotionInfo->GetPrereqPromotion() != NO_PROMOTION)20586	{20587		if(!isHasPromotion((PromotionTypes)(pkPromotionInfo->GetPrereqPromotion())))20588		{20589			return false;20590		}20591	}2059220593	// OR prereqs20594	bool bLacksOrPrereq = false;2059520596	PromotionTypes ePromotion1 = (PromotionTypes) pkPromotionInfo->GetPrereqOrPromotion1();20597	if(ePromotion1 != NO_PROMOTION)20598	{20599		if(!isHasPromotion(ePromotion1))20600			bLacksOrPrereq = true;20601	}2060220603	// OR Promotion 220604	if(bLacksOrPrereq)20605	{20606		PromotionTypes ePromotion2 = (PromotionTypes) pkPromotionInfo->GetPrereqOrPromotion2();20607		if(ePromotion2 != NO_PROMOTION)20608		{20609			if(isHasPromotion(ePromotion2))20610				bLacksOrPrereq = false;20611		}20612	}2061320614	// OR Promotion 320615	if(bLacksOrPrereq)20616	{20617		PromotionTypes ePromotion3 = (PromotionTypes) pkPromotionInfo->GetPrereqOrPromotion3();20618		if(ePromotion3 != NO_PROMOTION)20619		{20620			if(isHasPromotion(ePromotion3))20621				bLacksOrPrereq = false;20622		}20623	}2062420625	// OR Promotion 420626	if(bLacksOrPrereq)20627	{20628		PromotionTypes ePromotion4 = (PromotionTypes) pkPromotionInfo->GetPrereqOrPromotion4();20629		if(ePromotion4 != NO_PROMOTION)20630		{20631			if(isHasPromotion(ePromotion4))20632				bLacksOrPrereq = false;20633		}20634	}2063520636	// OR Promotion 520637	if(bLacksOrPrereq)20638	{20639		PromotionTypes ePromotion5 = (PromotionTypes) pkPromotionInfo->GetPrereqOrPromotion5();20640		if(ePromotion5 != NO_PROMOTION)20641		{20642			if(isHasPromotion(ePromotion5))20643				bLacksOrPrereq = false;20644		}20645	}2064620647	// OR Promotion 620648	if(bLacksOrPrereq)20649	{20650		PromotionTypes ePromotion6 = (PromotionTypes) pkPromotionInfo->GetPrereqOrPromotion6();20651		if(ePromotion6 != NO_PROMOTION)20652		{20653			if(isHasPromotion(ePromotion6))20654				bLacksOrPrereq = false;20655		}20656	}2065720658	// OR Promotion 720659	if(bLacksOrPrereq)20660	{20661		PromotionTypes ePromotion7 = (PromotionTypes) pkPromotionInfo->GetPrereqOrPromotion7();20662		if(ePromotion7 != NO_PROMOTION)20663		{20664			if(isHasPromotion(ePromotion7))20665				bLacksOrPrereq = false;20666		}20667	}2066820669	// OR Promotion 820670	if(bLacksOrPrereq)20671	{20672		PromotionTypes ePromotion8 = (PromotionTypes) pkPromotionInfo->GetPrereqOrPromotion8();20673		if(ePromotion8 != NO_PROMOTION)20674		{20675			if(isHasPromotion(ePromotion8))20676				bLacksOrPrereq = false;20677		}20678	}2067920680	// OR Promotion 920681	if(bLacksOrPrereq)20682	{20683		PromotionTypes ePromotion9 = (PromotionTypes) pkPromotionInfo->GetPrereqOrPromotion9();20684		if(ePromotion9 != NO_PROMOTION)20685		{20686			if(isHasPromotion(ePromotion9))20687				bLacksOrPrereq = false;20688		}20689	}2069020691	if(bLacksOrPrereq)20692	{20693		return false;20694	}2069520696	if(pkPromotionInfo->GetTechPrereq() != NO_TECH)20697	{20698		if(!(GET_TEAM(getTeam()).GetTeamTechs()->HasTech((TechTypes)(pkPromotionInfo->GetTechPrereq()))))20699		{20700			return false;20701		}20702	}2070320704	if(!isPromotionValid(ePromotion))20705	{20706		return false;20707	}20708	20709#if defined(MOD_EVENTS_UNIT_UPGRADES)20710	if (MOD_EVENTS_UNIT_UPGRADES) {20711		if (GAMEEVENTINVOKE_TESTALL(GAMEEVENT_CanHavePromotion, getOwner(), GetID(), ePromotion) == GAMEEVENTRETURN_FALSE) {20712			return false;20713		}2071420715		if (GAMEEVENTINVOKE_TESTALL(GAMEEVENT_UnitCanHavePromotion, getOwner(), GetID(), ePromotion) == GAMEEVENTRETURN_FALSE) {20716			return false;20717		}20718	} else {20719#endif20720	ICvEngineScriptSystem1* pkScriptSystem = gDLL->GetScriptSystem();20721	if (pkScriptSystem) 20722	{20723		CvLuaArgsHandle args;20724		args->Push(((int)getOwner()));20725		args->Push(GetID());20726		args->Push(ePromotion);2072720728		bool bResult = false;20729		if (LuaSupport::CallTestAll(pkScriptSystem, "CanHavePromotion", args.get(), bResult))20730		{20731			if (bResult == false) 20732			{20733				return false;20734			}20735		}20736	}20737#if defined(MOD_EVENTS_UNIT_UPGRADES)20738	}20739#endif2074020741	return true;20742}

Calls

Called by