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
- CustomMods::isAI_SMART_V3()
- CvGlobals::getAI_RESEARCH_WEIGHT_BASE_MOD()
- CvGlobals::getAI_RESEARCH_WEIGHT_MOD_PER_TURN_LEFT()
- CvPlayer::getOverflowResearchTimes100() const
- CvPlayer::GetScienceTimes100() const
- CvPlayerTechs::GetResearchTurnsLeft(TechTypes, bool) const
CvWeightedVector::GetElementCvWeightedVector::GetWeightCvWeightedVector::SetWeightCvWeightedVector::sizepow