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}