Bazaar developer reference

CvMinorCivAI::GetGoodTechPlayerDoesntHave(PlayerTypes, int) const

Defined in
CvMinorCivAI.cpp, line 10602
Class
CvMinorCivAI
Hook name
CivHooks::CvMinorCivAI_GetGoodTechPlayerDoesntHave

Hooks

static bool BeforeCvMinorCivAI_GetGoodTechPlayerDoesntHave(const CvMinorCivAI* self, PlayerTypes ePlayer, int iRoughTechValue, TechTypes& result);static void AfterCvMinorCivAI_GetGoodTechPlayerDoesntHave(const CvMinorCivAI* self, PlayerTypes ePlayer, int iRoughTechValue, TechTypes& result);static TechTypes ReplaceCvMinorCivAI_GetGoodTechPlayerDoesntHave(TechTypes (*original)(const CvMinorCivAI*, PlayerTypes, int), const CvMinorCivAI* self, PlayerTypes ePlayer, int iRoughTechValue);CivRegisterBefore<CivHooks::CvMinorCivAI_GetGoodTechPlayerDoesntHave>(host, &BeforeCvMinorCivAI_GetGoodTechPlayerDoesntHave);CivRegisterAfter<CivHooks::CvMinorCivAI_GetGoodTechPlayerDoesntHave>(host, &AfterCvMinorCivAI_GetGoodTechPlayerDoesntHave);CivRegisterReplace<CivHooks::CvMinorCivAI_GetGoodTechPlayerDoesntHave>(host, &ReplaceCvMinorCivAI_GetGoodTechPlayerDoesntHave);

Code

10601/// Helper function which returns a "Good" Tech that a Player doesn't have but CAN currently research10602TechTypes CvMinorCivAI::GetGoodTechPlayerDoesntHave(PlayerTypes ePlayer, int iRoughTechValue) const10603{10604	CvAssertMsg(ePlayer >= 0, "ePlayer is expected to be non-negative (invalid Index)");10605	CvAssertMsg(ePlayer < MAX_MAJOR_CIVS, "ePlayer is expected to be within maximum bounds (invalid Index)");1060610607	CvWeightedVector<int, SAFE_ESTIMATE_NUM_XML_WIDGETS, true> TechVector;10608	int iValue, iProgress;106091061010611	CvPlayerAI& kPlayer = GET_PLAYER(ePlayer);10612#if defined(MOD_BUGFIX_MINOR)10613	CvTeam& kTeam = GET_TEAM(kPlayer.getTeam());10614#else10615	CvTeam kTeam = GET_TEAM(kPlayer.getTeam());10616#endif1061710618	for(int iTechLoop = 0; iTechLoop < GC.getNumTechInfos(); iTechLoop++)10619	{10620		const TechTypes eTech = static_cast<TechTypes>(iTechLoop);10621		CvTechEntry* pkTechInfo = GC.getTechInfo(eTech);10622		if(pkTechInfo == NULL)10623			continue;1062410625		// Player doesn't already have Tech10626		if(!kTeam.GetTeamTechs()->HasTech(eTech))10627		{10628			// Player can research this Tech10629			if(kPlayer.GetPlayerTechs()->CanResearch(eTech))10630			{10631				iValue = pkTechInfo->GetResearchCost();1063210633				// Reduce value of a Tech if it's already in progress10634				iProgress = kTeam.GetTeamTechs()->GetResearchProgress(eTech);1063510636				if(iProgress > 0)10637				{10638					iValue -= iProgress;10639				}1064010641				// Random factor so that the same thing isn't always picked10642				iValue += GC.getGame().getJonRandNum(iValue / 4, "Minor Civ Quest Reward: Tech - Adding random weight to Tech Reward");1064310644				TechVector.push_back(iTechLoop, iValue);10645			}10646		}10647	}1064810649	// If there's only one option return it... this will help prevent divide by zero stuff later10650	if(TechVector.size() == 1)10651	{10652		return (TechTypes) TechVector.GetElement(0);10653	}10654	else if(TechVector.size() == 0)10655	{10656		return NO_TECH;10657	}1065810659	TechVector.SortItems();1066010661	// Our rough estimate is that 20 is a good ceiling for the max Tech value10662	if(iRoughTechValue > 20)10663	{10664		iRoughTechValue = 20;10665	}1066610667	int iIndex = (TechVector.size() - 1) * iRoughTechValue / 20;1066810669	return (TechTypes) TechVector.GetElement(iIndex);10670}

Calls