Hooks
static bool BeforeCvDealAI_DoHumanOfferDealToThisAI(CvDealAI* self, CvDeal* pDeal, DealOfferResponseTypes& result);static void AfterCvDealAI_DoHumanOfferDealToThisAI(CvDealAI* self, CvDeal* pDeal, DealOfferResponseTypes& result);static DealOfferResponseTypes ReplaceCvDealAI_DoHumanOfferDealToThisAI(DealOfferResponseTypes (*original)(CvDealAI*, CvDeal*), CvDealAI* self, CvDeal* pDeal);CivRegisterBefore<CivHooks::CvDealAI_DoHumanOfferDealToThisAI>(host, &BeforeCvDealAI_DoHumanOfferDealToThisAI);CivRegisterAfter<CivHooks::CvDealAI_DoHumanOfferDealToThisAI>(host, &AfterCvDealAI_DoHumanOfferDealToThisAI);CivRegisterReplace<CivHooks::CvDealAI_DoHumanOfferDealToThisAI>(host, &ReplaceCvDealAI_DoHumanOfferDealToThisAI);
Code
96/// Offer up a deal to this AI, and see if he accepts97DealOfferResponseTypes CvDealAI::DoHumanOfferDealToThisAI(CvDeal* pDeal)98{99 DealOfferResponseTypes eResponse = NO_DEAL_RESPONSE_TYPE;100 DiploUIStateTypes eUIState = NO_DIPLO_UI_STATE;101102 const char* szText = "";103 LeaderheadAnimationTypes eAnimation = NO_LEADERHEAD_ANIM;104#if defined(MOD_DIPLOMACY_STFU)105 DiploMessageTypes eDiploMessage = NO_DIPLO_MESSAGE_TYPE;106#endif107108 PlayerTypes eFromPlayer = GC.getGame().getActivePlayer();109110 bool bFromIsActivePlayer = eFromPlayer == GC.getGame().getActivePlayer();111112 int iDealValueToMe, iValueImOffering, iValueTheyreOffering, iAmountOverWeWillRequest, iAmountUnderWeWillOffer;113 bool bCantMatchOffer;114 bool bDealAcceptable = IsDealWithHumanAcceptable(pDeal, eFromPlayer, /*Passed by reference*/ iDealValueToMe, iValueImOffering, iValueTheyreOffering, iAmountOverWeWillRequest, iAmountUnderWeWillOffer, bCantMatchOffer);115116 // If they're actually giving us more than we're asking for (e.g. a gift) then accept the deal117 if(!bDealAcceptable)118 {119 if(!pDeal->IsPeaceTreatyTrade(eFromPlayer) && iValueTheyreOffering > iValueImOffering)120 {121 bDealAcceptable = true;122 }123 }124125 if(bDealAcceptable)126 {127 CvDeal kDeal = *pDeal;128129 // If it's from a human, send it through the network130 if(GET_PLAYER(eFromPlayer).isHuman())131 {132 GC.GetEngineUserInterface()->SetDealInTransit(true);133 auto_ptr<ICvDeal1> pDllDeal = GC.WrapDealPointer(&kDeal);134 gDLL->sendNetDealAccepted(eFromPlayer, GetPlayer()->GetID(), pDllDeal.get(), iDealValueToMe, iValueImOffering, iValueTheyreOffering);135 }136 // Deal between AI players, we can process it immediately137 else138 {139 DoAcceptedDeal(eFromPlayer, kDeal, iDealValueToMe, iValueImOffering, iValueTheyreOffering);140 }141 }142 // We want more from this Deal143 else if(iDealValueToMe > -75 &&144 iValueImOffering < (iValueTheyreOffering * 5)) // The total value of the deal might not be that bad, but if he's asking for WAY more than he's offering (e.g. something for nothing) then it's not unacceptable, but insulting145 {146 eResponse = DEAL_RESPONSE_UNACCEPTABLE;147 eUIState = DIPLO_UI_STATE_TRADE_AI_REJECTS_OFFER;148149 if(bFromIsActivePlayer)150 {151#if defined(MOD_DIPLOMACY_STFU)152 eDiploMessage = DIPLO_MESSAGE_TRADE_REJECT_UNACCEPTABLE;153#endif154 szText = GetPlayer()->GetDiplomacyAI()->GetDiploStringForMessage(DIPLO_MESSAGE_TRADE_REJECT_UNACCEPTABLE);155 eAnimation = LEADERHEAD_ANIM_NO;156 }157 }158 // Pretty bad deal for us159 else160 {161 eResponse = DEAL_RESPONSE_INSULTING;162 eUIState = DIPLO_UI_STATE_TRADE_AI_REJECTS_OFFER;163164 if(bFromIsActivePlayer)165 {166#if defined(MOD_DIPLOMACY_STFU)167 eDiploMessage = DIPLO_MESSAGE_TRADE_REJECT_INSULTING;168#endif169 szText = GetPlayer()->GetDiplomacyAI()->GetDiploStringForMessage(DIPLO_MESSAGE_TRADE_REJECT_INSULTING);170 eAnimation = LEADERHEAD_ANIM_NO;171 }172 }173174 if(bFromIsActivePlayer)175 {176 // Modify response if the player's offered a deal lot177 if(eResponse >= DEAL_RESPONSE_UNACCEPTABLE)178 {179 int iTimesDealOffered = GC.GetEngineUserInterface()->GetOfferTradeRepeatCount();180181 if(iTimesDealOffered > 4)182 {183#if defined(MOD_DIPLOMACY_STFU)184 eDiploMessage = DIPLO_MESSAGE_REPEAT_TRADE_TOO_MUCH;185#endif186 szText = GetPlayer()->GetDiplomacyAI()->GetDiploStringForMessage(DIPLO_MESSAGE_REPEAT_TRADE_TOO_MUCH);187 }188 else if(iTimesDealOffered > 1)189 {190#if defined(MOD_DIPLOMACY_STFU)191 eDiploMessage = DIPLO_MESSAGE_REPEAT_TRADE;192#endif193 szText = GetPlayer()->GetDiplomacyAI()->GetDiploStringForMessage(DIPLO_MESSAGE_REPEAT_TRADE);194 }195196 GC.GetEngineUserInterface()->ChangeOfferTradeRepeatCount(1);197#if defined(MOD_DIPLOMACY_STFU)198 GET_PLAYER(eFromPlayer).GetDiplomacyAI()->DisplayAILeaderMessage(GetPlayer()->GetID(), eUIState, eDiploMessage, eAnimation);199#else200 gDLL->GameplayDiplomacyAILeaderMessage(GetPlayer()->GetID(), eUIState, szText, eAnimation);201#endif202 }203 }204205 return eResponse;206}