Hooks
static bool BeforeCvDiplomacyAI_DoRenewExpiredDeal(CvDiplomacyAI* self, PlayerTypes ePlayer, DiploStatementTypes& eStatement, CvDeal* pDeal);static void AfterCvDiplomacyAI_DoRenewExpiredDeal(CvDiplomacyAI* self, PlayerTypes ePlayer, DiploStatementTypes& eStatement, CvDeal* pDeal);static void ReplaceCvDiplomacyAI_DoRenewExpiredDeal(void (*original)(CvDiplomacyAI*, PlayerTypes, DiploStatementTypes&, CvDeal*), CvDiplomacyAI* self, PlayerTypes ePlayer, DiploStatementTypes& eStatement, CvDeal* pDeal);CivRegisterBefore<CivHooks::CvDiplomacyAI_DoRenewExpiredDeal>(host, &BeforeCvDiplomacyAI_DoRenewExpiredDeal);CivRegisterAfter<CivHooks::CvDiplomacyAI_DoRenewExpiredDeal>(host, &AfterCvDiplomacyAI_DoRenewExpiredDeal);CivRegisterReplace<CivHooks::CvDiplomacyAI_DoRenewExpiredDeal>(host, &ReplaceCvDiplomacyAI_DoRenewExpiredDeal);
Code
14770// Possible Contact Statement - Renew Recently Expired Deal14771void CvDiplomacyAI::DoRenewExpiredDeal(PlayerTypes ePlayer, DiploStatementTypes& eStatement, CvDeal* pDeal)14772{14773 CvAssertMsg(ePlayer >= 0, "DIPLOMACY_AI: Invalid Player Index. Please send Jon this with your last 5 autosaves and what changelist # you're playing.");14774 CvAssertMsg(ePlayer < MAX_MAJOR_CIVS, "DIPLOMACY_AI: Invalid Player Index. Please send Jon this with your last 5 autosaves and what changelist # you're playing.");1477514776 if(eStatement == NO_DIPLO_STATEMENT_TYPE)14777 {14778 if (GetGlobalCoopWarAcceptedState(ePlayer) >= COOP_WAR_STATE_SOON)14779 {14780 return;14781 }1478214783 CvDeal* pTargetDeal = NULL;14784 CvGameDeals* pGameDeals = GC.getGame().GetGameDeals();1478514786 for(int iDealTypes = 0; iDealTypes < 2; iDealTypes++)14787 {14788 int iNumDeals = 0;14789 if(iDealTypes == 0)14790 {14791 iNumDeals = pGameDeals->GetNumHistoricDeals(ePlayer);14792 }14793 else14794 {14795 iNumDeals = pGameDeals->GetNumCurrentDeals(ePlayer);14796 }1479714798 for(int iDeal = 0; iDeal < iNumDeals; iDeal++)14799 {14800 CvDeal* pCurrentDeal = NULL;14801 if(iDealTypes == 0)14802 {14803 pCurrentDeal = pGameDeals->GetHistoricDeal(ePlayer, iDeal);14804 }14805 else14806 {14807 pCurrentDeal = pGameDeals->GetCurrentDeal(ePlayer, iDeal);14808 }1480914810 // if this deal has already been renewed or cancelled, then move along14811 if(pCurrentDeal->m_bConsideringForRenewal || pCurrentDeal->m_bDealCancelled || pCurrentDeal->m_bCheckedForRenewal)14812 {14813 continue;14814 }1481514816 // if they don't involve the player, bail14817 if(!(pCurrentDeal->m_eFromPlayer == m_pPlayer->GetID() || pCurrentDeal->m_eToPlayer == m_pPlayer->GetID()))14818 {14819 continue;14820 }1482114822 // if the deal can be renewed (no peace treaties, etc)14823 if(!pCurrentDeal->IsPotentiallyRenewable())14824 {14825 continue;14826 }1482714828 // Check to see if the deal is still active14829 if(pCurrentDeal->m_iFinalTurn > GC.getGame().getElapsedGameTurns())14830 {14831 continue;14832 }1483314834 bool bCanTradeItems = true;1483514836 // if the deal can be fully renewed14837 TradedItemList::iterator it;14838 CvDeal kTempDeal;14839 // only evaluate renewed deals if we're looking at current deals14840 if (iDealTypes == 1) 14841 {14842 pCurrentDeal->m_bConsideringForRenewal = true;14843 }14844 for(it = pCurrentDeal->m_TradedItems.begin(); it != pCurrentDeal->m_TradedItems.end(); ++it)14845 {14846 PlayerTypes eOtherPlayer;14847 if (it->m_eFromPlayer == pCurrentDeal->m_eFromPlayer)14848 {14849 eOtherPlayer = pCurrentDeal->m_eToPlayer;14850 }14851 else14852 {14853 eOtherPlayer = pCurrentDeal->m_eFromPlayer;14854 }1485514856 if(!kTempDeal.IsPossibleToTradeItem(it->m_eFromPlayer, eOtherPlayer, it->m_eItemType, it->m_iData1, it->m_iData2, it->m_iData3, it->m_bFlag1))14857 {14858 bCanTradeItems = false;14859 break;14860 }14861 }14862 if (iDealTypes == 1)14863 {14864 pCurrentDeal->m_bConsideringForRenewal = false;14865 }1486614867 if(!bCanTradeItems)14868 {14869 continue;14870 }1487114872 pTargetDeal = pCurrentDeal;14873 break;14874 }1487514876 if (pTargetDeal)14877 {14878 break;14879 }14880 }1488114882 if (pTargetDeal)14883 {14884 // copy the target deal into the new deal14885 *pDeal = *pTargetDeal;14886 pTargetDeal->m_bConsideringForRenewal = true;14887 pDeal->m_iFinalTurn = -1;1488814889 if(!GET_PLAYER(ePlayer).isHuman())14890 {14891 bool bAbleToEqualize = m_pPlayer->GetDealAI()->DoEqualizeDealWithAI(pDeal, ePlayer);14892 if(!bAbleToEqualize)14893 {14894 pDeal->ClearItems();14895 ClearDealToRenew();14896 return;14897 }14898 }1489914900#if defined(MOD_AI_MP_DIPLOMACY)14901 if (!MOD_AI_MP_DIPLOMACY)14902#endif14903 eStatement = DIPLO_STATEMENT_RENEW_DEAL;14904 }14905 else14906 {14907 pDeal->ClearItems();14908 }14909 }14910}