Bazaar developer reference

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

Called by