CultureHelpers::GetThemingBonusIndex(PlayerTypes, CvBuildingEntry *, vector<int> &)
- Defined in
- CvCultureClasses.cpp, line 5602
- Hook name
CivHooks::CultureHelpers_GetThemingBonusIndex
Hooks
static bool BeforeCultureHelpers_GetThemingBonusIndex(PlayerTypes eOwner, CvBuildingEntry * pkEntry, vector<int> & aGreatWorkIndices, int& result);static void AfterCultureHelpers_GetThemingBonusIndex(PlayerTypes eOwner, CvBuildingEntry * pkEntry, vector<int> & aGreatWorkIndices, int& result);static int ReplaceCultureHelpers_GetThemingBonusIndex(int (*original)(PlayerTypes, CvBuildingEntry *, vector<int> &), PlayerTypes eOwner, CvBuildingEntry * pkEntry, vector<int> & aGreatWorkIndices);CivRegisterBefore<CivHooks::CultureHelpers_GetThemingBonusIndex>(host, &BeforeCultureHelpers_GetThemingBonusIndex);CivRegisterAfter<CivHooks::CultureHelpers_GetThemingBonusIndex>(host, &AfterCultureHelpers_GetThemingBonusIndex);CivRegisterReplace<CivHooks::CultureHelpers_GetThemingBonusIndex>(host, &ReplaceCultureHelpers_GetThemingBonusIndex);
Code
5602int CultureHelpers::GetThemingBonusIndex(PlayerTypes eOwner, CvBuildingEntry *pkEntry, vector<int> &aGreatWorkIndices)5603{5604 int iCountArt = 0;5605 int iCountArtifact = 0;5606 vector<EraTypes> aErasSeen;5607 vector<PlayerTypes> aPlayersSeen;56085609 CvGameCulture *pCulture = GC.getGame().GetGameCulture();5610 GreatWorkClass eArtifactClass = (GreatWorkClass)GC.getInfoTypeForString("GREAT_WORK_ARTIFACT");5611 GreatWorkClass eArtClass = (GreatWorkClass)GC.getInfoTypeForString("GREAT_WORK_ART");56125613 if (pkEntry)5614 {5615 int iNumSlots = pkEntry->GetGreatWorkCount();5616 if (aGreatWorkIndices.size() != iNumSlots)5617 {5618 return -1; // No theming bonus if some slots still empty or too many entries5619 }56205621#if defined(MOD_API_EXTENSIONS)5622 EraTypes eFirstEra = (EraTypes) GC.getNumEraInfos();5623 EraTypes eLastEra = NO_ERA;5624#endif56255626 // Store info on the attributes of all our Great Works5627 for (int iI = 0; iI < iNumSlots; iI++)5628 {5629 int iGreatWork = aGreatWorkIndices[iI];5630 CvGreatWork work = pCulture->m_CurrentGreatWorks[iGreatWork];56315632 // Check Great Work class5633 if (work.m_eClassType == eArtifactClass)5634 {5635 iCountArtifact++;5636 }5637 else if (work.m_eClassType == eArtClass)5638 {5639 iCountArt++;5640 }56415642 // Store era and player5643 aErasSeen.push_back(work.m_eEra);5644 aPlayersSeen.push_back(work.m_ePlayer);56455646#if defined(MOD_API_EXTENSIONS)5647 if (work.m_eEra < eFirstEra) {5648 eFirstEra = work.m_eEra;5649 }5650 if (work.m_eEra > eLastEra) {5651 eLastEra = work.m_eEra;5652 }5653#endif5654 }56555656 // Now see if we match a theme bonus5657 int iNumThemes = pkEntry->GetNumThemingBonuses();5658 for (int jJ = 0; jJ < iNumThemes; jJ++)5659 {5660 bool bValid = true;56615662 // Can we rule this out based on type?5663 CvThemingBonusInfo *bonusInfo = pkEntry->GetThemingBonusInfo(jJ);5664 if (bValid && bonusInfo->IsMustBeArt() && iCountArtifact > 0)5665 {5666 bValid = false;5667 }5668 if (bValid && bonusInfo->IsMustBeArtifact() && iCountArt > 0)5669 {5670 bValid = false;5671 }5672 if (bValid && bonusInfo->IsMustBeEqualArtArtifact() && iCountArt != iCountArtifact)5673 {5674 bValid = false;5675 }56765677 // Can we rule this out based on era?5678 if (bValid && bonusInfo->IsSameEra())5679 {5680 int eFirstEra = aErasSeen[0];5681 for (unsigned int kK = 1; kK < aErasSeen.size(); kK++)5682 {5683 if (aErasSeen[kK] != eFirstEra)5684 {5685 bValid = false;5686 }5687 }5688 }5689 if (bValid && bonusInfo->IsUniqueEras())5690 {5691 vector<EraTypes> aProcessedEras;5692 aProcessedEras.push_back(aErasSeen[0]);5693 for (unsigned int kK = 1; kK < aErasSeen.size(); kK++)5694 {5695 EraTypes eEra = aErasSeen[kK];5696 if (std::find(aProcessedEras.begin(), aProcessedEras.end(), eEra) != aProcessedEras.end())5697 {5698 bValid = false;5699 }5700 else5701 {5702 aProcessedEras.push_back(eEra);5703 }5704 }5705 }5706#if defined(MOD_API_EXTENSIONS)5707 if (bValid && bonusInfo->IsConsecutiveEras())5708 {5709 if ((eLastEra - eFirstEra + 1) != iNumSlots)5710 {5711 bValid = false;5712 }5713 }5714#endif57155716 // Can we rule this out based on player?5717 if (bValid && bonusInfo->IsRequiresOwner())5718 {5719 for (unsigned int kK = 0; kK < aPlayersSeen.size(); kK++)5720 {5721 if (aPlayersSeen[kK] != eOwner)5722 {5723 bValid = false;5724 }5725 }5726 }5727 if (bValid && bonusInfo->IsRequiresSamePlayer())5728 {5729 int eFirstPlayer = aPlayersSeen[0];5730 for (unsigned int kK = 1; kK < aPlayersSeen.size(); kK++)5731 {5732 if (aPlayersSeen[kK] != eFirstPlayer)5733 {5734 bValid = false;5735 }5736 }5737 }5738 if (bValid && bonusInfo->IsRequiresUniquePlayers())5739 {5740 vector<PlayerTypes> aProcessedPlayers;5741 aProcessedPlayers.push_back(aPlayersSeen[0]);5742 for (unsigned int kK = 1; kK < aPlayersSeen.size(); kK++)5743 {5744 PlayerTypes ePlayer = aPlayersSeen[kK];5745 if (std::find(aProcessedPlayers.begin(), aProcessedPlayers.end(), ePlayer) != aProcessedPlayers.end())5746 {5747 bValid = false;5748 }5749 else5750 {5751 aProcessedPlayers.push_back(ePlayer);5752 }5753 }5754 }5755 if (bValid && bonusInfo->IsRequiresAnyButOwner())5756 {5757 for (unsigned int kK = 0; kK < aPlayersSeen.size(); kK++)5758 {5759 if (aPlayersSeen[kK] == eOwner)5760 {5761 bValid = false;5762 }5763 }5764 }57655766 // Haven't ruled it out? Then this is it (ASSUMES THEMING BONUSES FOR A BUILDING ARE IN SORTED ORDER IN DB!)5767 if (bValid)5768 {5769 return jJ;5770 }5771 }5772 }5773 return -1;5774}
Calls
BaseVector::operator[]- CvBuildingEntry::GetGreatWorkCount() const
- CvBuildingEntry::GetNumThemingBonuses() const
- CvBuildingEntry::GetThemingBonusInfo(int) const
- CvGame::GetGameCulture()
- CvGlobals::getGame()
- CvGlobals::getInfoTypeForString(const char *, bool) const
- CvGlobals::getNumEraInfos()
CvGreatWork::CvGreatWork- CvThemingBonusInfo::IsConsecutiveEras()
- CvThemingBonusInfo::IsMustBeArt()
- CvThemingBonusInfo::IsMustBeArtifact()
- CvThemingBonusInfo::IsMustBeEqualArtArtifact()
- CvThemingBonusInfo::IsRequiresAnyButOwner()
- CvThemingBonusInfo::IsRequiresOwner()
- CvThemingBonusInfo::IsRequiresSamePlayer()
- CvThemingBonusInfo::IsRequiresUniquePlayers()
- CvThemingBonusInfo::IsSameEra()
- CvThemingBonusInfo::IsUniqueEras()
std::_Vector_const_iterator::operator!=std::_Vector_const_iterator::operator!=std::findstd::findstd::vector::beginstd::vector::beginstd::vector::endstd::vector::endstd::vector::operator[]std::vector::operator[]std::vector::operator[]std::vector::push_backstd::vector::push_backstd::vector::sizestd::vector::sizestd::vector::sizestd::vector::vectorstd::vector::vector
Called by
- CvCityCulture::GetThemingBonusIndex(BuildingClassTypes) const
- CvPlayerCulture::ThemeBuilding(vector<CvGreatWorkBuildingInMyEmpire>::const_iterator, vector<CvGreatWorkInMyEmpire> &, vector<CvGreatWorkInMyEmpire> &, bool)
- CvPlayerCulture::ThemeEqualArtArtifact(CvGreatWorkBuildingInMyEmpire, int, int, vector<CvGreatWorkInMyEmpire> &, vector<CvGreatWorkInMyEmpire> &, bool)