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}