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(¤tUnits) > 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}