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
- CvGame::getJonRandNum(int, const char *)
- CvGlobals::getGame()
- CvGlobals::getNumTechInfos()
- CvGlobals::getTechInfo(TechTypes)
- CvPlayer::GetPlayerTechs() const
- CvPlayer::getTeam() const
- CvPlayerAI::getPlayer(PlayerTypes)
- CvPlayerTechs::CanResearch(TechTypes, bool) const
- CvTeam::getTeam(TeamTypes)
- CvTeam::GetTeamTechs() const
- CvTeamTechs::GetResearchProgress(TechTypes) const
- CvTeamTechs::HasTech(TechTypes) const
- CvTechEntry::GetResearchCost() const
CvWeightedVector::CvWeightedVectorCvWeightedVector::GetElementCvWeightedVector::push_backCvWeightedVector::sizeCvWeightedVector::SortItems