void CvPlayer::acquireCity(CvCity* pOldCity, bool bConquest, bool bTrade, bool bUpdatePlotGroups)
{
PROFILE_FUNC();
/************************************************************************************************/
/* REVOLUTION_MOD 01/01/08 jdog5000 */
/* */
/* Copy over city data */
/************************************************************************************************/
std::string scriptData;
int iRevIdx;
int iLocalRevIdx;
/************************************************************************************************/
/* REVOLUTION_MOD END */
/************************************************************************************************/
CLLNode<IDInfo>* pUnitNode;
CvCity* pNewCity;
CvUnit* pLoopUnit;
CvPlot* pCityPlot;
CvPlot* pLoopPlot;
bool* pabHasReligion;
bool* pabHolyCity;
bool* pabHasCorporation;
bool* pabHeadquarters;
int* paiNumRealBuilding;
int* paiBuildingOriginalOwner;
int* paiBuildingOriginalTime;
CvWString szBuffer;
CvWString szName;
bool abEverOwned[MAX_PLAYERS];
int aiCulture[MAX_PLAYERS];
PlayerTypes eOldOwner;
PlayerTypes eOriginalOwner;
PlayerTypes eHighestCulturePlayer;
BuildingTypes eBuilding;
bool bRecapture;
bool bRaze;
bool bGift;
int iRange;
int iCaptureGold;
int iGameTurnFounded;
int iPopulation;
int iHighestPopulation;
int iHurryAngerTimer;
int iConscriptAngerTimer;
int iDefyResolutionAngerTimer;
int iOccupationTimer;
int iTeamCulturePercent;
int iDamage;
int iDX, iDY;
int iI;
CLinkList<IDInfo> oldUnits;
std::vector<int> aeFreeSpecialists;
CvPlotGroup* originalTradeNetworkConnectivity[MAX_PLAYERS];
/************************************************************************************************/
/* Afforess Start 02/15/10 */
/* */
/* */
/************************************************************************************************/
int iOccupationRange = 0;
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
/************************************************************************************************/
/* Afforess Start 06/14/10 */
/* */
/* */
/************************************************************************************************/
int iOccupationTimeModifier = 100;
for (iI = 0; iI < GC.getNumBuildingInfos(); iI++)
{
if (pOldCity->getNumRealBuilding((BuildingTypes)iI) > 0)
{
if (GC.getBuildingInfo((BuildingTypes)iI).getOccupationTimeModifier() != 0)
{
iOccupationTimeModifier += GC.getBuildingInfo((BuildingTypes)iI).getOccupationTimeModifier();
}
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
pCityPlot = pOldCity->plot();
eOldOwner = pOldCity->getOwnerINLINE();
// Whose trade networks was this city relevant to prior to ownership change
if ( bUpdatePlotGroups )
{
for(int iI = 0; iI < MAX_PLAYERS; iI++)
{
originalTradeNetworkConnectivity[iI] = GET_PLAYER((PlayerTypes)iI).isAlive() ? pCityPlot->getPlotGroup((PlayerTypes)iI) : NULL;
}
}
pUnitNode = pCityPlot->headUnitNode();
while (pUnitNode != NULL)
{
oldUnits.insertAtEnd(pUnitNode->m_data);
pUnitNode = pCityPlot->nextUnitNode(pUnitNode);
}
pUnitNode = oldUnits.head();
while (pUnitNode != NULL)
{
pLoopUnit = ::getUnit(pUnitNode->m_data);
pUnitNode = oldUnits.next(pUnitNode);
if (pLoopUnit && pLoopUnit->getTeam() != getTeam())
{
if (pLoopUnit->getDomainType() == DOMAIN_IMMOBILE)
{
pLoopUnit->kill(false, getID());
}
}
}
/************************************************************************************************/
/* Afforess Start 07/21/10 */
/* */
/* */
/************************************************************************************************/
iRange = pOldCity->getMaxCultureLevelAmongPlayers();
iOccupationRange = iRange;
if (hasFixedBorders())
{
pOldCity->clearCultureDistanceCache();
for (iDX = -(iRange); iDX <= iRange; iDX++)
{
for (iDY = -(iRange); iDY <= iRange; iDY++)
{
if (pOldCity->cultureDistance(iDX, iDY) <= iRange)
{
pLoopPlot = plotXY(pOldCity->getX_INLINE(),pOldCity-> getY_INLINE(), iDX, iDY);
if (pLoopPlot != NULL)
{
if (!pLoopPlot->isCity())
{
if ((pLoopPlot->getOwnerINLINE() == pOldCity->getOwnerINLINE()) || (pLoopPlot->getOwnerINLINE() == NO_PLAYER))
{
bool bCultureLevelFound = false;
bool bDoClaim = false;
for (int iJ = 0; iJ < GC.getNumCultureLevelInfos(); ++iJ)
{
int iNumCitiesForRange = pLoopPlot->getCultureRangeCities(pOldCity->getOwnerINLINE(), iJ);
// Occupy the tile if it is within the city's culture range, but not within any other city's range at the same or closer distance
if ((iNumCitiesForRange == 1) && ((pOldCity->getCultureLevel() >= iJ) && (pOldCity->cultureDistance(iDX, iDY) == iJ)))
{
bDoClaim = true;
}
if (iNumCitiesForRange > 0)
{
bCultureLevelFound = true;
break;
}
}
// Occupy the tile if it is NOT within the city's culture range, but is within occupation range
if (!bCultureLevelFound)
{
if (pOldCity->cultureDistance(iDX, iDY) <= pOldCity->getOccupationCultureLevel())
{
bDoClaim = true;
}
}
if (bDoClaim && pLoopPlot->isPotentialCityWorkForArea(pOldCity->area()))
{
pLoopPlot->setClaimingOwner(getID());
pLoopPlot->setForceUnownedTimer(1);
}
}
}
}
}
}
}
}
if (bConquest && !hasFixedBorders())
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
{
iRange = pOldCity->getCultureLevel();
for (iDX = -(iRange); iDX <= iRange; iDX++)
{
for (iDY = -(iRange); iDY <= iRange; iDY++)
{
/************************************************************************************************/
/* Afforess Start 02/15/10 */
/* */
/* */
/************************************************************************************************/
if ((pOldCity->cultureDistance(iDX, iDY) <= iRange) && (pOldCity->cultureDistance(iDX, iDY) > 1))
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
{
pLoopPlot = plotXY(pOldCity->getX_INLINE(),pOldCity-> getY_INLINE(), iDX, iDY);
if (pLoopPlot != NULL)
{
if (pLoopPlot->getOwnerINLINE() == pOldCity->getOwnerINLINE())
{
if (pLoopPlot->getNumCultureRangeCities(pOldCity->getOwnerINLINE()) == 1)
{
bool bForceUnowned = false;
for (iI = 0; iI < MAX_PLAYERS; iI++)
{
if (GET_PLAYER((PlayerTypes)iI).isAlive())
{
if ((GET_PLAYER((PlayerTypes)iI).getTeam() != getTeam()) && (GET_PLAYER((PlayerTypes)iI).getTeam() != pOldCity->getTeam()))
{
if (pLoopPlot->getNumCultureRangeCities((PlayerTypes)iI) > 0)
{
bForceUnowned = true;
break;
}
}
}
}
if (bForceUnowned)
{
pLoopPlot->setForceUnownedTimer(GC.getDefineINT("FORCE_UNOWNED_CITY_TIMER"));
}
}
}
}
}
}
}
}
if (pOldCity->getOriginalOwner() == pOldCity->getOwnerINLINE())
{
GET_PLAYER(pOldCity->getOriginalOwner()).changeCitiesLost(1);
}
/************************************************************************************************/
/* REVOLUTION_MOD 05/30/08 jdog5000 */
/* */
/* For BarbarianCiv */
/************************************************************************************************/
// Added new BarbCiv specfic circumstance for counting a city as lost
else if( !GC.getGame().isOption(GAMEOPTION_NO_BARBARIAN_CIV) && pOldCity->isCapital() && pOldCity->getOriginalOwner() == GC.getBARBARIAN_PLAYER() )
{
GET_PLAYER(pOldCity->getOwnerINLINE()).changeCitiesLost(1);
}
/************************************************************************************************/
/* REVOLUTION_MOD END */
/************************************************************************************************/
else if (pOldCity->getOriginalOwner() == getID())
{
GET_PLAYER(pOldCity->getOriginalOwner()).changeCitiesLost(-1);
}
if (bConquest)
{
{
MEMORY_TRACK_EXEMPT();
szBuffer = gDLL->getText("TXT_KEY_MISC_CAPTURED_CITY", pOldCity->getNameKey()).GetCString();
AddDLLMessage(getID(), true, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_CITYCAPTURE", MESSAGE_TYPE_MAJOR_EVENT, ARTFILEMGR.getInterfaceArtInfo("WORLDBUILDER_CITY_EDIT")->getPath(), (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), pOldCity->getX_INLINE(), pOldCity->getY_INLINE(), true, true);
}
szName.Format(L"%s (%s)", pOldCity->getName().GetCString(), GET_PLAYER(pOldCity->getOwnerINLINE()).getName());
for (iI = 0; iI < MAX_PLAYERS; iI++)
{
if (GET_PLAYER((PlayerTypes)iI).isAlive())
{
if (iI != getID())
{
MEMORY_TRACK_EXEMPT();
if (pOldCity->isRevealed(GET_PLAYER((PlayerTypes)iI).getTeam(), false))
{
szBuffer = gDLL->getText("TXT_KEY_MISC_CITY_CAPTURED_BY", szName.GetCString(), getCivilizationDescriptionKey());
AddDLLMessage(((PlayerTypes)iI), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_CITYCAPTURED", MESSAGE_TYPE_MAJOR_EVENT, ARTFILEMGR.getInterfaceArtInfo("WORLDBUILDER_CITY_EDIT")->getPath(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), pOldCity->getX_INLINE(), pOldCity->getY_INLINE(), true, true);
}
/************************************************************************************************/
/* Afforess Start 12/9/09 */
/* */
/* */
/************************************************************************************************/
else if (GET_TEAM(GET_PLAYER((PlayerTypes)iI).getTeam()).isHasEmbassy(getTeam()))
{
szBuffer = gDLL->getText("TXT_KEY_MISC_CITY_CAPTURED_BY", szName.GetCString(), getCivilizationDescriptionKey());
AddDLLMessage(((PlayerTypes)iI), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_CITYCAPTURED", MESSAGE_TYPE_MAJOR_EVENT, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_RED"));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
}
}
szBuffer = gDLL->getText("TXT_KEY_MISC_CITY_WAS_CAPTURED_BY", szName.GetCString(), getCivilizationDescriptionKey());
GC.getGameINLINE().addReplayMessage(REPLAY_MESSAGE_MAJOR_EVENT, getID(), szBuffer, pOldCity->getX_INLINE(), pOldCity->getY_INLINE(), (ColorTypes)GC.getInfoTypeForString("COLOR_WARNING_TEXT"));
}
iCaptureGold = 0;
if (bConquest)
{
PYTHON_ACCESS_LOCK_SCOPE
long lCaptureGold;
// Use python to determine city capture gold amounts...
lCaptureGold = 0;
CyCity* pyOldCity = new CyCity(pOldCity);
CyArgsList argsList;
argsList.add(gDLL->getPythonIFace()->makePythonObject(pyOldCity)); // pass in plot class
PYTHON_CALL_FUNCTION4(__FUNCTION__, PYGameModule, "doCityCaptureGold", argsList.makeFunctionArgs(),&lCaptureGold);
delete pyOldCity; // python fxn must not hold on to this pointer
iCaptureGold = (int)lCaptureGold;
}
changeGold(iCaptureGold);
pabHasReligion = new bool[GC.getNumReligionInfos()];
pabHolyCity = new bool[GC.getNumReligionInfos()];
pabHasCorporation = new bool[GC.getNumCorporationInfos()];
pabHeadquarters = new bool[GC.getNumCorporationInfos()];
paiNumRealBuilding = new int[GC.getNumBuildingInfos()];
paiBuildingOriginalOwner = new int[GC.getNumBuildingInfos()];
paiBuildingOriginalTime = new int[GC.getNumBuildingInfos()];
for (iI = 0; iI < GC.getNumVoteSourceInfos(); ++iI)
{
pOldCity->processVoteSourceBonus((VoteSourceTypes)iI, false);
}
// Koshling - need to remove bonuses due io old owner's trade network
// else it can feed into yield modifiers which are then incorrectly
// copied over to the new owner
for (iI = 0; iI < GC.getNumBonusInfos(); ++iI)
{
if (pOldCity->hasBonus((BonusTypes)iI))
{
pOldCity->processBonus((BonusTypes)iI, -1);
}
}
eOriginalOwner = pOldCity->getOriginalOwner();
eHighestCulturePlayer = pOldCity->findHighestCulture();
iGameTurnFounded = pOldCity->getGameTurnFounded();
iPopulation = pOldCity->getPopulation();
iHighestPopulation = pOldCity->getHighestPopulation();
iHurryAngerTimer = pOldCity->getHurryAngerTimer();
iConscriptAngerTimer = pOldCity->getConscriptAngerTimer();
iDefyResolutionAngerTimer = pOldCity->getDefyResolutionAngerTimer();
iOccupationTimer = pOldCity->getOccupationTimer();
szName = pOldCity->getNameKey();
/************************************************************************************************/
/* REVOLUTION_MOD 01/01/08 jdog5000 */
/* */
/* */
/************************************************************************************************/
scriptData = pOldCity->getScriptData();
iRevIdx = pOldCity->getRevolutionIndex();
iLocalRevIdx = pOldCity->getLocalRevIndex();
/************************************************************************************************/
/* REVOLUTION_MOD END */
/************************************************************************************************/
iDamage = pOldCity->getDefenseDamage();
int iOldCityId = pOldCity->getID();
/************************************************************************************************/
/* Afforess Start 01/12/10 */
/* */
/* */
/************************************************************************************************/
int iCiv = pOldCity->getCivilizationType();
if (pOldCity->isBarbarian())
{
iCiv = NO_CIVILIZATION;
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
for (iI = 0; iI < GC.getNumSpecialistInfos(); ++iI)
{
aeFreeSpecialists.push_back(pOldCity->getAddedFreeSpecialistCount((SpecialistTypes)iI));
}
for (iI = 0; iI < MAX_PLAYERS; iI++)
{
abEverOwned[iI] = pOldCity->isEverOwned((PlayerTypes)iI);
aiCulture[iI] = pOldCity->getCultureTimes100((PlayerTypes)iI);
}
abEverOwned[getID()] = true;
for (iI = 0; iI < GC.getNumReligionInfos(); iI++)
{
pabHasReligion[iI] = pOldCity->isHasReligion((ReligionTypes)iI);
pabHolyCity[iI] = pOldCity->isHolyCity((ReligionTypes)iI);
}
for (iI = 0; iI < GC.getNumCorporationInfos(); iI++)
{
pabHasCorporation[iI] = pOldCity->isHasCorporation((CorporationTypes)iI);
pabHeadquarters[iI] = pOldCity->isHeadquarters((CorporationTypes)iI);
}
for (iI = 0; iI < GC.getNumBuildingInfos(); iI++)
{
paiNumRealBuilding[iI] = pOldCity->getNumRealBuilding((BuildingTypes)iI);
paiBuildingOriginalOwner[iI] = pOldCity->getBuildingOriginalOwner((BuildingTypes)iI);
paiBuildingOriginalTime[iI] = pOldCity->getBuildingOriginalTime((BuildingTypes)iI);
}
BuildingChangeArray aBuildingHappyChange;
BuildingChangeArray aBuildingHealthChange;
for (iI = 0; iI < GC.getNumBuildingClassInfos(); ++iI)
{
int iChange = pOldCity->getBuildingHappyChange((BuildingClassTypes)iI);
if (0 != iChange)
{
aBuildingHappyChange.push_back(std::make_pair((BuildingClassTypes)iI, iChange));
}
iChange = pOldCity->getBuildingHealthChange((BuildingClassTypes)iI);
if (0 != iChange)
{
aBuildingHealthChange.push_back(std::make_pair((BuildingClassTypes)iI, iChange));
}
}
bRecapture = ((eHighestCulturePlayer != NO_PLAYER) ? (GET_PLAYER(eHighestCulturePlayer).getTeam() == getTeam()) : false);
pOldCity->kill(false, false);
if (bTrade)
{
for (iDX = -1; iDX <= 1; iDX++)
{
for (iDY = -1; iDY <= 1; iDY++)
{
pLoopPlot = plotXY(pCityPlot->getX_INLINE(), pCityPlot->getY_INLINE(), iDX, iDY);
if (pLoopPlot != NULL)
{
pLoopPlot->setCulture(eOldOwner, 0, false, false);
}
}
}
}