Bazaar developer reference

CvTechAI::ChooseNextTech(CvPlayer *, bool)

Defined in
CvTechAI.cpp, line 150
Class
CvTechAI
Hook name
CivHooks::CvTechAI_ChooseNextTech

Hooks

static bool BeforeCvTechAI_ChooseNextTech(CvTechAI* self, CvPlayer * pPlayer, bool bFreeTech, TechTypes& result);static void AfterCvTechAI_ChooseNextTech(CvTechAI* self, CvPlayer * pPlayer, bool bFreeTech, TechTypes& result);static TechTypes ReplaceCvTechAI_ChooseNextTech(TechTypes (*original)(CvTechAI*, CvPlayer *, bool), CvTechAI* self, CvPlayer * pPlayer, bool bFreeTech);CivRegisterBefore<CivHooks::CvTechAI_ChooseNextTech>(host, &BeforeCvTechAI_ChooseNextTech);CivRegisterAfter<CivHooks::CvTechAI_ChooseNextTech>(host, &AfterCvTechAI_ChooseNextTech);CivRegisterReplace<CivHooks::CvTechAI_ChooseNextTech>(host, &ReplaceCvTechAI_ChooseNextTech);

Code

149/// Choose a player's next tech research project150TechTypes CvTechAI::ChooseNextTech(CvPlayer *pPlayer, bool bFreeTech)151{152	RandomNumberDelegate fcn;153	TechTypes rtnValue = NO_TECH;154	int iTechLoop;155156	// Use the synchronous random number generate157	// Asynchronous one would be:158	//	fcn = MakeDelegate (&GC.getGame(), &CvGame::getAsyncRandNum);159	fcn = MakeDelegate(&GC.getGame(), &CvGame::getJonRandNum);160161	// Create a new vector holding only techs we can currently research162	m_ResearchableTechs.clear();163164	// Loop through adding the researchable techs165	for(iTechLoop = 0; iTechLoop < m_pCurrentTechs->GetTechs()->GetNumTechs(); iTechLoop++)166	{167		if(m_pCurrentTechs->CanResearch((TechTypes)iTechLoop))168		{169			// For free techs, need an additional check170			if(bFreeTech)171			{172				if(m_pCurrentTechs->CanResearchForFree((TechTypes)iTechLoop))173				{174					m_ResearchableTechs.push_back(iTechLoop, m_TechAIWeights.GetWeight(iTechLoop));175				}176			}177			else178			{179				m_ResearchableTechs.push_back(iTechLoop, m_TechAIWeights.GetWeight(iTechLoop));180			}181		}182	}183184	// Reweight our possible choices by their cost, but only if cost is actually a factor!185#if defined(MOD_AI_SMART_V3)186	if (MOD_AI_SMART_V3)187		ReweightByCost(pPlayer, bFreeTech);188	else189#endif190	if(!bFreeTech)191		ReweightByCost(pPlayer);192193	m_ResearchableTechs.SortItems();194	LogPossibleResearch();195196	// If total weight is above 0, choose one above a threshold197	if(m_ResearchableTechs.GetTotalWeight() > 0)198	{199		int iNumChoices =GC.getGame().getHandicapInfo().GetTechNumOptions();200		rtnValue = (TechTypes) m_ResearchableTechs.ChooseFromTopChoices(iNumChoices, &fcn, "Choosing tech from Top Choices");201		LogResearchChoice(rtnValue);202	}203204	return rtnValue;205}

Calls

Called by