Bazaar developer reference

CvGameCulture::SwapGreatWorks(PlayerTypes, int, PlayerTypes, int)

Defined in
CvCultureClasses.cpp, line 493
Class
CvGameCulture
Hook name
CivHooks::CvGameCulture_SwapGreatWorks

Hooks

static bool BeforeCvGameCulture_SwapGreatWorks(CvGameCulture* self, PlayerTypes ePlayer1, int iWork1, PlayerTypes ePlayer2, int iWork2, bool& result);static void AfterCvGameCulture_SwapGreatWorks(CvGameCulture* self, PlayerTypes ePlayer1, int iWork1, PlayerTypes ePlayer2, int iWork2, bool& result);static bool ReplaceCvGameCulture_SwapGreatWorks(bool (*original)(CvGameCulture*, PlayerTypes, int, PlayerTypes, int), CvGameCulture* self, PlayerTypes ePlayer1, int iWork1, PlayerTypes ePlayer2, int iWork2);CivRegisterBefore<CivHooks::CvGameCulture_SwapGreatWorks>(host, &BeforeCvGameCulture_SwapGreatWorks);CivRegisterAfter<CivHooks::CvGameCulture_SwapGreatWorks>(host, &AfterCvGameCulture_SwapGreatWorks);CivRegisterReplace<CivHooks::CvGameCulture_SwapGreatWorks>(host, &ReplaceCvGameCulture_SwapGreatWorks);

Code

492/// Swap the great works!493bool CvGameCulture::SwapGreatWorks (PlayerTypes ePlayer1, int iWork1, PlayerTypes ePlayer2, int iWork2)494{495	if (ePlayer1 == NO_PLAYER || ePlayer2 == NO_PLAYER)496	{497		return false;498	}499500	if (iWork1 == -1 || iWork2 == -1)501	{502		return false;503	}504	505	if (!GET_PLAYER(ePlayer1).isAlive() || !GET_PLAYER(ePlayer2).isAlive())506	{507		return false;508	}509510	CvPlayerCulture* pCulture1 = GET_PLAYER(ePlayer1).GetCulture();511	CvPlayerCulture* pCulture2 = GET_PLAYER(ePlayer2).GetCulture();512513	GreatWorkClass eWritingClass = (GreatWorkClass)GC.getInfoTypeForString("GREAT_WORK_LITERATURE");514	GreatWorkClass eArtClass = (GreatWorkClass)GC.getInfoTypeForString("GREAT_WORK_ART");515	GreatWorkClass eArtifactsClass = (GreatWorkClass)GC.getInfoTypeForString("GREAT_WORK_ARTIFACT");516	GreatWorkClass eMusicClass = (GreatWorkClass)GC.getInfoTypeForString("GREAT_WORK_MUSIC");517518	GreatWorkClass eClass1 = GetGreatWorkClass(iWork1);519	GreatWorkClass eClass2 = GetGreatWorkClass(iWork2);520521	if (eClass1 != eClass2)522	{523		return false;524	}525	526	// We can't trade things that aren't in our swappable slots527	bool bFoundSwappable = false;528	if (eClass1 == eWritingClass)529	{530		if (pCulture1->GetSwappableWritingIndex() == iWork1)531		{532			pCulture1->SetSwappableWritingIndex(-1);533			bFoundSwappable = true;534		}535	}536	else if (eClass1 == eArtClass)537	{538		if (pCulture1->GetSwappableArtIndex() == iWork1)539		{540			pCulture1->SetSwappableArtIndex(-1);541			bFoundSwappable = true;542		}543	}544	else if (eClass1 == eArtifactsClass)545	{546		if (pCulture1->GetSwappableArtifactIndex() == iWork1)547		{548			pCulture1->SetSwappableArtifactIndex(-1);549			bFoundSwappable = true;550		}551	}552	else if (eClass1 == eMusicClass)553	{554		if (pCulture1->GetSwappableMusicIndex() == iWork1)555		{556			pCulture1->SetSwappableMusicIndex(-1);557			bFoundSwappable = true;558		}559	}560561	if (!bFoundSwappable)562	{563		return false;564	}565566	bFoundSwappable = false;567	if (eClass2 == eWritingClass)568	{569		if (pCulture2->GetSwappableWritingIndex() == iWork2)570		{571			pCulture2->SetSwappableWritingIndex(-1);572			bFoundSwappable = true;573		}574	}575	else if (eClass2 == eArtClass)576	{577		if (pCulture2->GetSwappableArtIndex() == iWork2)578		{579			pCulture2->SetSwappableArtIndex(-1);580			bFoundSwappable = true;581		}582	}583	else if (eClass2 == eArtifactsClass)584	{585		if (pCulture2->GetSwappableArtifactIndex() == iWork2)586		{587			pCulture2->SetSwappableArtifactIndex(-1);588			bFoundSwappable = true;589		}590	}591	else if (eClass2 == eMusicClass)592	{593		if (pCulture2->GetSwappableMusicIndex() == iWork2)594		{595			pCulture2->SetSwappableMusicIndex(-1);596			bFoundSwappable = true;597		}598	}599600	if (!bFoundSwappable)601	{602		return false;603	}604605	CvCity* pCity1 = NULL;606	BuildingClassTypes eBuildingClass1 = NO_BUILDINGCLASS;607	int iSwapIndex1 = -1;608609	CvCity* pCity2 = NULL;610	BuildingClassTypes eBuildingClass2 = NO_BUILDINGCLASS;611	int iSwapIndex2 = -1;612613	int iCityLoop;614	CvCity* pCity = NULL;615	for (uint ui = 0; ui < 2; ui++)616	{617		PlayerTypes eTempPlayer = NO_PLAYER;618		switch (ui)619		{620		case 0:621			eTempPlayer = ePlayer1;622			break;623		case 1:624			eTempPlayer = ePlayer2;625			break;626		}627628		for (pCity = GET_PLAYER(eTempPlayer).firstCity(&iCityLoop); pCity != NULL; pCity = GET_PLAYER(eTempPlayer).nextCity(&iCityLoop))629		{630			for(int iBuildingClassLoop = 0; iBuildingClassLoop < GC.getNumBuildingClassInfos(); iBuildingClassLoop++)631			{632				CvCivilizationInfo& playerCivilizationInfo = GET_PLAYER(eTempPlayer).getCivilizationInfo();633				BuildingTypes eBuilding = (BuildingTypes)playerCivilizationInfo.getCivilizationBuildings((BuildingClassTypes)iBuildingClassLoop);634				if (eBuilding != NO_BUILDING)635				{636					CvBuildingEntry *pkBuilding = GC.getBuildingInfo(eBuilding);637					if (pkBuilding)638					{639						if (pCity->GetCityBuildings()->GetNumBuilding(eBuilding) > 0)640						{641							int iNumSlots = pkBuilding->GetGreatWorkCount();642							for (int iI = 0; iI < iNumSlots; iI++)643							{644								int iGreatWorkIndex = pCity->GetCityBuildings()->GetBuildingGreatWork((BuildingClassTypes)iBuildingClassLoop, iI);645								if (ui == 0)646								{647									if (iGreatWorkIndex == iWork1)648									{649										pCity1 = pCity;650										eBuildingClass1 = (BuildingClassTypes)iBuildingClassLoop;651										iSwapIndex1 = iI;652										break;653									}654								}655								else if (ui == 1)656								{657									if (iGreatWorkIndex == iWork2)658									{659										pCity2 = pCity;660										eBuildingClass2 = (BuildingClassTypes)iBuildingClassLoop;661										iSwapIndex2 = iI;662										break;663									}664								}665							}666						}667					}668				}669			}670		}671	}672673	if (pCity1 == NULL || pCity2 == NULL)674	{675		return false;676	}677678	if (eBuildingClass1 == NO_BUILDINGCLASS || eBuildingClass2 == NO_BUILDINGCLASS)679	{680		return false;681	}682683	if (iSwapIndex1 == -1 || iSwapIndex2 == -1)684	{685		return false;686	}687688	// remove existing great works689	pCity1->GetCityBuildings()->SetBuildingGreatWork(eBuildingClass1, iSwapIndex1, NO_GREAT_WORK);690	pCity2->GetCityBuildings()->SetBuildingGreatWork(eBuildingClass2, iSwapIndex2, NO_GREAT_WORK);691692	// add in new works693	pCity1->GetCityBuildings()->SetBuildingGreatWork(eBuildingClass1, iSwapIndex1, iWork2);694	pCity2->GetCityBuildings()->SetBuildingGreatWork(eBuildingClass2, iSwapIndex2, iWork1);695	696	GC.GetEngineUserInterface()->setDirty(GreatWorksScreen_DIRTY_BIT, true);697698	return true;699}

Calls

Called by