Bazaar developer reference

CvPlayer::DoLiberatePlayer(PlayerTypes, int)

Defined in
CvPlayer.cpp, line 3425
Class
CvPlayer
Hook name
CivHooks::CvPlayer_DoLiberatePlayer
Lua events
GameEvents.PlayerLiberated

Hooks

static bool BeforeCvPlayer_DoLiberatePlayer(CvPlayer* self, PlayerTypes ePlayer, int iOldCityID);static void AfterCvPlayer_DoLiberatePlayer(CvPlayer* self, PlayerTypes ePlayer, int iOldCityID);static void ReplaceCvPlayer_DoLiberatePlayer(void (*original)(CvPlayer*, PlayerTypes, int), CvPlayer* self, PlayerTypes ePlayer, int iOldCityID);CivRegisterBefore<CivHooks::CvPlayer_DoLiberatePlayer>(host, &BeforeCvPlayer_DoLiberatePlayer);CivRegisterAfter<CivHooks::CvPlayer_DoLiberatePlayer>(host, &AfterCvPlayer_DoLiberatePlayer);CivRegisterReplace<CivHooks::CvPlayer_DoLiberatePlayer>(host, &ReplaceCvPlayer_DoLiberatePlayer);

Code

3424/// This player liberates iOldCityID and gives it back to ePlayer3425void CvPlayer::DoLiberatePlayer(PlayerTypes ePlayer, int iOldCityID)3426{3427	CvCity* pCity = getCity(iOldCityID);3428	CvAssert(pCity);3429	if (!pCity)3430		return;34313432	PlayerTypes eOldOwner = pCity->getOwner();3433	CvPlot* pPlot = pCity->plot();34343435	// Set that this team has been liberated3436	TeamTypes eTeam = getTeam();3437	TeamTypes eLiberatedTeam = GET_PLAYER(ePlayer).getTeam();34383439	// Who originally took out this team?3440	TeamTypes eConquerorTeam = GET_TEAM(eLiberatedTeam).GetKilledByTeam();34413442	if (!GET_PLAYER(ePlayer).isAlive())3443	{3444		GET_PLAYER(ePlayer).setBeingResurrected(true);3445		GET_TEAM(eLiberatedTeam).SetLiberatedByTeam(eTeam);34463447		// Put everyone at peace with this guy3448		for(int iOtherTeamLoop = 0; iOtherTeamLoop < MAX_CIV_TEAMS; iOtherTeamLoop++)3449		{3450			if(eLiberatedTeam != iOtherTeamLoop)3451			{3452#if defined(MOD_EVENTS_WAR_AND_PEACE)3453				GET_TEAM(eLiberatedTeam).makePeace((TeamTypes) iOtherTeamLoop, /*bBumpUnits*/false, /*bSuppressNotification*/true, GetID());3454#else3455				GET_TEAM(eLiberatedTeam).makePeace((TeamTypes) iOtherTeamLoop, /*bBumpUnits*/false, /*bSuppressNotification*/true);3456#endif3457			}3458		}3459	3460		if (!GET_PLAYER(ePlayer).isMinorCiv())3461		{3462			// add notification3463			Localization::String strMessage = Localization::Lookup("TXT_KEY_NOTIFICATION_CIV_RESURRECTED");3464			strMessage << getCivilizationShortDescriptionKey(); // LIBERATING CIV NAME3465			strMessage << pCity->getNameKey(); // CITY NAME3466			strMessage << GET_PLAYER(ePlayer).getCivilizationAdjectiveKey(); // LIBERATED CIV NAME3467			strMessage << GET_PLAYER(ePlayer).getCivilizationDescriptionKey();// LIBERATED CIV NAME3468			Localization::String strSummary = Localization::Lookup("TXT_KEY_NOTIFICATION_CIV_RESURRECTED_SHORT");3469			if(GC.getGame().isGameMultiPlayer() && GET_PLAYER(ePlayer).isHuman())3470			{3471				strSummary << GET_PLAYER(ePlayer).getNickName();3472			}3473			else3474			{3475				strSummary << GET_PLAYER(ePlayer).getNameKey();3476			}3477			if(GC.getGame().isGameMultiPlayer() && GET_PLAYER(m_eID).isHuman())3478			{3479				strSummary << GET_PLAYER(m_eID).getNickName();3480			}3481			else3482			{3483				strSummary << GET_PLAYER(m_eID).getNameKey();3484			}			34853486			for(int iI = 0; iI < MAX_PLAYERS; iI++)3487			{3488				const PlayerTypes eOtherPlayer = static_cast<PlayerTypes>(iI);3489				CvPlayerAI& kOtherPlayer = GET_PLAYER(eOtherPlayer);3490				if(kOtherPlayer.isAlive() && kOtherPlayer.GetNotifications() && iI != m_eID)3491				{3492					kOtherPlayer.GetNotifications()->Add(NOTIFICATION_RESURRECTED_MAJOR_CIV, strMessage.toUTF8(), strSummary.toUTF8(), pCity->getX(), pCity->getY(), -1);3493				}3494			}34953496			CvString temp = strMessage.toUTF8();3497			GC.getGame().addReplayMessage(REPLAY_MESSAGE_MAJOR_EVENT, m_eID, temp);3498		}3499	}3500	else3501	{3502		GET_PLAYER(ePlayer).GetDiplomacyAI()->ChangeNumCitiesLiberated(m_eID, 1);35033504		if (!GET_PLAYER(ePlayer).isMinorCiv())3505		{3506			// add notification3507			Localization::String strMessage = Localization::Lookup("TXT_KEY_NOTIFICATION_CITY_LIBERATED");3508			if(GC.getGame().isGameMultiPlayer() && isHuman())3509			{3510				strMessage << getNickName();3511			}3512			else3513			{3514				strMessage << getNameKey();3515			}3516			strMessage << pCity->getNameKey(); // CITY NAME3517			strMessage << GET_PLAYER(ePlayer).getCivilizationShortDescriptionKey();// RESTORED CIV NAME3518			Localization::String strSummary = Localization::Lookup("TXT_KEY_NOTIFICATION_CIV_LIBERATED_SHORT");3519			strSummary << pCity->getNameKey();3520			if(GC.getGame().isGameMultiPlayer() && GET_PLAYER(ePlayer).isHuman())3521			{3522				strSummary << GET_PLAYER(ePlayer).getNickName();3523			}3524			else3525			{3526				strSummary << GET_PLAYER(ePlayer).getNameKey();3527			}35283529			for(int iI = 0; iI < MAX_PLAYERS; iI++)3530			{3531				const PlayerTypes eOtherPlayer = static_cast<PlayerTypes>(iI);3532				CvPlayerAI& kOtherPlayer = GET_PLAYER(eOtherPlayer);3533				if(kOtherPlayer.isAlive() && kOtherPlayer.GetNotifications() && iI != m_eID)3534				{3535					kOtherPlayer.GetNotifications()->Add(NOTIFICATION_LIBERATED_MAJOR_CITY, strMessage.toUTF8(), strSummary.toUTF8(), pCity->getX(), pCity->getY(), -1);3536				}3537			}3538		}3539	}35403541	// Give the city back to the liberated player3542#if defined(MOD_API_EXTENSIONS)3543	CvCity* pNewCity = GET_PLAYER(ePlayer).acquireCity(pCity, false, true);3544#else3545	GET_PLAYER(ePlayer).acquireCity(pCity, false, true);3546#endif35473548	if (!GET_PLAYER(ePlayer).isMinorCiv())3549	{3550		// slewis - if the player we're liberating the city for is dead, give the liberating player a resurrection mark in the once-defeated player's book3551		if (!GET_PLAYER(ePlayer).isAlive())3552		{3553			CvDiplomacyAI* pDiploAI = GET_PLAYER(ePlayer).GetDiplomacyAI();3554			PlayerTypes eMePlayer = GetID();3555			pDiploAI->SetResurrectedBy(eMePlayer, true);3556			pDiploAI->SetLandDisputeLevel(eMePlayer, DISPUTE_LEVEL_NONE);3557			pDiploAI->SetWonderDisputeLevel(eMePlayer, DISPUTE_LEVEL_NONE);3558			pDiploAI->SetMinorCivDisputeLevel(eMePlayer, DISPUTE_LEVEL_NONE);3559			pDiploAI->SetWarmongerThreat(eMePlayer, THREAT_NONE);35603561			pDiploAI->SetPlayerNoSettleRequestCounter(eMePlayer, -1);3562			pDiploAI->SetPlayerStopSpyingRequestCounter(eMePlayer, -1);3563			pDiploAI->SetDemandCounter(eMePlayer, -1);3564			pDiploAI->ChangeNumTimesCultureBombed(eMePlayer, -pDiploAI->GetNumTimesCultureBombed(eMePlayer));3565			pDiploAI->ChangeNegativeReligiousConversionPoints(eMePlayer, -pDiploAI->GetNegativeReligiousConversionPoints(eMePlayer));3566			pDiploAI->ChangeNegativeArchaeologyPoints(eMePlayer, -pDiploAI->GetNegativeArchaeologyPoints(eMePlayer));35673568			pDiploAI->ChangeNumTimesRobbedBy(eMePlayer, -pDiploAI->GetNumTimesRobbedBy(eMePlayer));3569			pDiploAI->SetPlayerBrokenMilitaryPromise(eMePlayer, false);3570			pDiploAI->SetPlayerIgnoredMilitaryPromise(eMePlayer, false);3571			pDiploAI->SetBrokenBorderPromiseValue(eMePlayer, 0);3572			pDiploAI->SetIgnoredBorderPromiseValue(eMePlayer, 0);3573			pDiploAI->SetBrokenExpansionPromiseValue(eMePlayer, 0);3574			pDiploAI->SetIgnoredExpansionPromiseValue(eMePlayer, 0);35753576			pDiploAI->SetPlayerBrokenAttackCityStatePromise(eMePlayer, false);3577			pDiploAI->SetPlayerIgnoredAttackCityStatePromise(eMePlayer, false);3578			pDiploAI->SetPlayerBrokenBullyCityStatePromise(eMePlayer, false);3579			pDiploAI->SetPlayerIgnoredBullyCityStatePromise(eMePlayer, false);35803581			pDiploAI->SetPlayerBrokenNoConvertPromise(eMePlayer, false);3582			pDiploAI->SetPlayerIgnoredNoConvertPromise(eMePlayer, false);35833584			pDiploAI->SetPlayerBrokenNoDiggingPromise(eMePlayer, false);3585			pDiploAI->SetPlayerIgnoredNoDiggingPromise(eMePlayer, false);35863587			pDiploAI->SetPlayerBrokenSpyPromise(eMePlayer, false);3588			pDiploAI->SetPlayerIgnoredSpyPromise(eMePlayer, false);35893590			pDiploAI->SetPlayerBrokenCoopWarPromise(eMePlayer, false);35913592			pDiploAI->SetOtherPlayerNumProtectedMinorsKilled(eMePlayer, 0);3593			pDiploAI->SetOtherPlayerNumProtectedMinorsAttacked(eMePlayer, 0);3594			pDiploAI->SetOtherPlayerNumProtectedMinorsBullied(eMePlayer, 0);3595			pDiploAI->SetOtherPlayerTurnsSinceSidedWithProtectedMinor(eMePlayer, -1);35963597			pDiploAI->SetFriendDenouncedUs(eMePlayer, false);3598			pDiploAI->SetDenouncedPlayer(eMePlayer, false); // forget any denouncing3599			GetDiplomacyAI()->SetDenouncedPlayer(ePlayer, false); // forget any denouncing3600			pDiploAI->SetFriendDeclaredWarOnUs(eMePlayer, false);36013602			pDiploAI->ChangeNumTimesNuked(eMePlayer, -pDiploAI->GetNumTimesNuked(eMePlayer));3603		}3604	}36053606	// Now verify the player is alive3607	GET_PLAYER(ePlayer).verifyAlive();3608	GET_PLAYER(ePlayer).setBeingResurrected(false);36093610	// Is this a Minor we have liberated?3611	if(GET_PLAYER(ePlayer).isMinorCiv())3612	{3613		GET_PLAYER(ePlayer).GetMinorCivAI()->DoLiberationByMajor(eOldOwner, eConquerorTeam);3614	}36153616	// slewis3617	// negate warmonger3618	for(int iMajorLoop = 0; iMajorLoop < MAX_MAJOR_CIVS; iMajorLoop++)3619	{3620		PlayerTypes eMajor = (PlayerTypes)iMajorLoop;3621		if(GetID() != eMajor && GET_PLAYER(eMajor).isAlive())3622		{3623			// Have I met the player who conquered the city?3624			if(GET_TEAM(GET_PLAYER(eMajor).getTeam()).isHasMet(getTeam()))3625			{3626#if defined(MOD_CONFIG_AI_IN_XML)3627				int iWarmongerOffset = CvDiplomacyAIHelpers::GetWarmongerOffset(ePlayer, pNewCity->isCapital());3628				int iWarmongerModifier = 100;3629				GET_PLAYER(eMajor).GetDiplomacyAI()->ChangeOtherPlayerWarmongerAmountTimes100(GetID(), -iWarmongerOffset * iWarmongerModifier);3630#else3631				int iNumCities = max(GET_PLAYER(ePlayer).getNumCities(), 1);3632				int iWarmongerOffset = CvDiplomacyAIHelpers::GetWarmongerOffset(iNumCities, GET_PLAYER(ePlayer).isMinorCiv());3633				GET_PLAYER(eMajor).GetDiplomacyAI()->ChangeOtherPlayerWarmongerAmount(GetID(), -iWarmongerOffset);3634#endif3635			}3636		}3637	}36383639	// Move Units from player that don't belong here3640	if(pPlot->getNumUnits() > 0)3641	{3642		// Get the current list of units because we will possibly be moving them out of the plot's list3643		IDInfoVector currentUnits;3644		if (pPlot->getUnits(&currentUnits) > 0)3645		{3646			for(IDInfoVector::const_iterator itr = currentUnits.begin(); itr != currentUnits.end(); ++itr)3647			{3648				CvUnit* pLoopUnit = (CvUnit*)GetPlayerUnit(*itr);36493650				if(pLoopUnit && pLoopUnit->getOwner() == eOldOwner)3651				{3652					pLoopUnit->finishMoves();3653					if (!pLoopUnit->jumpToNearestValidPlot())3654						pLoopUnit->kill(false);3655				}3656			}3657		}3658	}36593660#if defined(MOD_EVENTS_LIBERATION)3661	if (MOD_EVENTS_LIBERATION) {3662		GAMEEVENTINVOKE_HOOK(GAMEEVENT_PlayerLiberated, GetID(), ePlayer, pNewCity->GetID());3663	}3664#endif36653666}

Calls

Called by