Hooks
static bool BeforeCvDealAI_IsDealWithHumanAcceptable(CvDealAI* self, CvDeal* pDeal, PlayerTypes eOtherPlayer, int& iTotalValueToMe, int& iValueImOffering, int& iValueTheyreOffering, int& iAmountOverWeWillRequest, int& iAmountUnderWeWillOffer, bool& bCantMatchOffer, bool& result);static void AfterCvDealAI_IsDealWithHumanAcceptable(CvDealAI* self, CvDeal* pDeal, PlayerTypes eOtherPlayer, int& iTotalValueToMe, int& iValueImOffering, int& iValueTheyreOffering, int& iAmountOverWeWillRequest, int& iAmountUnderWeWillOffer, bool& bCantMatchOffer, bool& result);static bool ReplaceCvDealAI_IsDealWithHumanAcceptable(bool (*original)(CvDealAI*, CvDeal*, PlayerTypes, int&, int&, int&, int&, int&, bool&), CvDealAI* self, CvDeal* pDeal, PlayerTypes eOtherPlayer, int& iTotalValueToMe, int& iValueImOffering, int& iValueTheyreOffering, int& iAmountOverWeWillRequest, int& iAmountUnderWeWillOffer, bool& bCantMatchOffer);CivRegisterBefore<CivHooks::CvDealAI_IsDealWithHumanAcceptable>(host, &BeforeCvDealAI_IsDealWithHumanAcceptable);CivRegisterAfter<CivHooks::CvDealAI_IsDealWithHumanAcceptable>(host, &AfterCvDealAI_IsDealWithHumanAcceptable);CivRegisterReplace<CivHooks::CvDealAI_IsDealWithHumanAcceptable>(host, &ReplaceCvDealAI_IsDealWithHumanAcceptable);
Code
560/// Will this AI accept pDeal? Handles deal from both human and AI players561bool CvDealAI::IsDealWithHumanAcceptable(CvDeal* pDeal, PlayerTypes eOtherPlayer, int& iTotalValueToMe, int& iValueImOffering, int& iValueTheyreOffering, int& iAmountOverWeWillRequest, int& iAmountUnderWeWillOffer, bool& bCantMatchOffer)562{563 CvAssertMsg(GET_PLAYER(eOtherPlayer).isHuman(), "DEAL_AI: Trying to see if AI will accept a deal with human player... but it's not human. Please show Jon.");564565 int iPercentOverWeWillRequest;566 int iPercentUnderWeWillOffer;567568 bCantMatchOffer = false;569570 // Deal leeway with human571 iPercentOverWeWillRequest = GetDealPercentLeewayWithHuman();572 iPercentUnderWeWillOffer = 0;573574 // Now do the valuation575 iTotalValueToMe = GetDealValue(pDeal, iValueImOffering, iValueTheyreOffering, /*bUseEvenValue*/ false);576577 // If no Gold in deal and within value of 1 GPT, then it's close enough578 if (pDeal->GetGoldTrade(eOtherPlayer) == 0 && pDeal->GetGoldTrade(m_pPlayer->GetID()) == 0)579 {580 int iOneGPT = 25;581 int iDiff = abs(iValueTheyreOffering - iValueImOffering);582 if (iDiff < iOneGPT)583 {584 return true;585 }586 }587588 int iDealSumValue = iValueImOffering + iValueTheyreOffering;589590 iAmountOverWeWillRequest = iDealSumValue;591 iAmountOverWeWillRequest *= iPercentOverWeWillRequest;592 iAmountOverWeWillRequest /= 100;593594 iAmountUnderWeWillOffer = iDealSumValue;595 iAmountUnderWeWillOffer *= iPercentUnderWeWillOffer;596 iAmountUnderWeWillOffer /= 100;597598 // We're surrendering599 if(pDeal->GetSurrenderingPlayer() == GetPlayer()->GetID())600 {601 if (iTotalValueToMe >= GetCachedValueOfPeaceWithHuman())602 {603 return true;604 }605 }606607 // Peace deal where we're not surrendering, value must equal cached value608 else if (pDeal->IsPeaceTreatyTrade(eOtherPlayer))609 {610 if (iTotalValueToMe >= GetCachedValueOfPeaceWithHuman())611 {612 return true;613 }614 }615616 // If we've gotten the deal to a point where we're happy, offer it up617 else if(iTotalValueToMe <= iAmountOverWeWillRequest && iTotalValueToMe >= iAmountUnderWeWillOffer)618 {619 return true;620 }621 else if (iTotalValueToMe > iAmountOverWeWillRequest)622 {623 bCantMatchOffer = true;624 }625626 return false;627}