Bazaar developer reference

CvTechAI::ReweightByCost(CvPlayer *, bool)

Defined in
CvTechAI.cpp, line 400
Class
CvTechAI
Hook name
CivHooks::CvTechAI_ReweightByCost

Hooks

static bool BeforeCvTechAI_ReweightByCost(CvTechAI* self, CvPlayer * pPlayer, bool bWantsExpensive);static void AfterCvTechAI_ReweightByCost(CvTechAI* self, CvPlayer * pPlayer, bool bWantsExpensive);static void ReplaceCvTechAI_ReweightByCost(void (*original)(CvTechAI*, CvPlayer *, bool), CvTechAI* self, CvPlayer * pPlayer, bool bWantsExpensive);CivRegisterBefore<CivHooks::CvTechAI_ReweightByCost>(host, &BeforeCvTechAI_ReweightByCost);CivRegisterAfter<CivHooks::CvTechAI_ReweightByCost>(host, &AfterCvTechAI_ReweightByCost);CivRegisterReplace<CivHooks::CvTechAI_ReweightByCost>(host, &ReplaceCvTechAI_ReweightByCost);

Code

398/// Recompute weights taking into account tech cost399#if defined(MOD_AI_SMART_V3)400void CvTechAI::ReweightByCost(CvPlayer *pPlayer, bool bWantsExpensive)401#else402void CvTechAI::ReweightByCost(CvPlayer *pPlayer)403#endif404{405	TechTypes eTech;406407	// April 2014 Balance Patch: if lots of science overflow, want to pick an expensive tech408	bool bNeedExpensiveTechs = pPlayer->getOverflowResearchTimes100() > (pPlayer->GetScienceTimes100() * 2);409410#if defined(MOD_AI_SMART_V3)411	if (MOD_AI_SMART_V3 && bWantsExpensive)412	{413		bNeedExpensiveTechs = true;414	}415#endif416417	for(int iI = 0; iI < m_ResearchableTechs.size(); iI++)418	{419		eTech = (TechTypes) m_ResearchableTechs.GetElement(iI);420		int iTurnsLeft = 0;421422		iTurnsLeft = m_pCurrentTechs->GetResearchTurnsLeft(eTech, true);423424		double fWeightDivisor;425426		// 10 turns will add 0.02; 80 turns will add 0.16427		double fAdditionalTurnCostFactor = GC.getAI_RESEARCH_WEIGHT_MOD_PER_TURN_LEFT() * iTurnsLeft;	// 0.015428		double fTotalCostFactor = GC.getAI_RESEARCH_WEIGHT_BASE_MOD() + fAdditionalTurnCostFactor;	// 0.15429430		fWeightDivisor = pow((double) iTurnsLeft, fTotalCostFactor);431432		int iNewWeight;433		if (bNeedExpensiveTechs)434		{435			iNewWeight = int(double(m_ResearchableTechs.GetWeight(iI)) * fWeightDivisor);436		}437		else438		{439			iNewWeight = int(double(m_ResearchableTechs.GetWeight(iI)) / fWeightDivisor);440		}441442		// Now actually change the weight443		m_ResearchableTechs.SetWeight(iI, iNewWeight);444	}445}

Calls

Called by