Hooks
static bool BeforeCvDiplomacyAI_WantAILeaderMessage(CvDiplomacyAI* self, DiploMessageTypes eDiploMessage, PlayerTypes eFromPlayer, DiploUIStateTypes eDiploUIState, LeaderheadAnimationTypes eAction, int iExtraData, bool& result);static void AfterCvDiplomacyAI_WantAILeaderMessage(CvDiplomacyAI* self, DiploMessageTypes eDiploMessage, PlayerTypes eFromPlayer, DiploUIStateTypes eDiploUIState, LeaderheadAnimationTypes eAction, int iExtraData, bool& result);static bool ReplaceCvDiplomacyAI_WantAILeaderMessage(bool (*original)(CvDiplomacyAI*, DiploMessageTypes, PlayerTypes, DiploUIStateTypes, LeaderheadAnimationTypes, int), CvDiplomacyAI* self, DiploMessageTypes eDiploMessage, PlayerTypes eFromPlayer, DiploUIStateTypes eDiploUIState, LeaderheadAnimationTypes eAction, int iExtraData);CivRegisterBefore<CivHooks::CvDiplomacyAI_WantAILeaderMessage>(host, &BeforeCvDiplomacyAI_WantAILeaderMessage);CivRegisterAfter<CivHooks::CvDiplomacyAI_WantAILeaderMessage>(host, &AfterCvDiplomacyAI_WantAILeaderMessage);CivRegisterReplace<CivHooks::CvDiplomacyAI_WantAILeaderMessage>(host, &ReplaceCvDiplomacyAI_WantAILeaderMessage);
Code
28721#if defined(MOD_DIPLOMACY_STFU)28722bool CvDiplomacyAI::WantAILeaderMessage(DiploMessageTypes eDiploMessage, PlayerTypes eFromPlayer, DiploUIStateTypes eDiploUIState, LeaderheadAnimationTypes eAction, int iExtraData)28723{28724 bool bWant = true;28725 int iResponseType = 0;2872628727 const char* szResponseKey = GetResponseKeyForMessage(eDiploMessage);28728 28729 if (szResponseKey) {28730 // CUSTOMLOG("STFU@%i: Diplo message %s (%i) from player %i", GC.getGame().getGameTurn(), szResponseKey, eDiploMessage, eFromPlayer);2873128732 if (m_pStfuResponseQuery == NULL)28733 {28734 const char* szSQL = "SELECT r.ID, s.SendEvent, s.Ignore, s.Respond, s.ResponseEvent, s.ResponseAI, s.ResponseData1, s.ResponseData2 FROM Diplomacy_Stfu s, Responses r, Diplomacy_StfuResponses sr WHERE sr.ResponseType=? AND sr.StfuType=s.Type AND sr.ResponseType=r.Type";28735 m_pStfuResponseQuery = new Database::Results();28736 if (!GC.GetGameDatabase()->Execute(*m_pStfuResponseQuery, szSQL, strlen(szSQL)))28737 {28738 // CUSTOMLOG("STFU: Failed to generate response query.");28739 }28740 }2874128742 bool bSendEvent = false;28743 bool bIgnore = false;28744 bool bRespond = false;28745 FromUIDiploEventTypes eResponseEvent = NO_FROM_UI_DIPLO_EVENT;28746 PlayerTypes eResponseFrom = NO_PLAYER;28747 int iResponseData1 = 0;28748 int iResponseData2 = 0;2874928750 m_pStfuResponseQuery->Bind(1, szResponseKey);28751 while (m_pStfuResponseQuery->Step())28752 {28753 iResponseType = m_pStfuResponseQuery->GetInt(0);28754 if (m_pStfuResponseQuery->GetInt(1) == 1) bSendEvent = true;28755 if (m_pStfuResponseQuery->GetInt(2) == 1) bIgnore = true;28756 if (bRespond == false && m_pStfuResponseQuery->GetInt(3) == 1) {28757 bRespond = true;28758 eResponseEvent = (FromUIDiploEventTypes)m_pStfuResponseQuery->GetInt(4);28759 if (m_pStfuResponseQuery->GetInt(5) == 1) {28760 eResponseFrom = eFromPlayer;28761 }28762 iResponseData1 = m_pStfuResponseQuery->GetInt(6);28763 iResponseData2 = m_pStfuResponseQuery->GetInt(7);28764 }28765 }2876628767 m_pStfuResponseQuery->Reset();2876828769 if (bSendEvent) {28770 // CUSTOMLOG("STFU: GameEvents.DiplomacyStfu(%i, %i, %i, %i, %i, %i)", eFromPlayer, iResponseType, eDiploMessage, eDiploUIState, eAction, iExtraData);2877128772 int iValue = 0;28773 if (GAMEEVENTINVOKE_VALUE(iValue, GAMEEVENT_DiplomacyStfu, eFromPlayer, iResponseType, eDiploMessage, eDiploUIState, eAction, iExtraData) == GAMEEVENTRETURN_VALUE) {28774 // CUSTOMLOG("STFU: Received %i", iValue);28775 if (iValue != 0) {28776 // Process the return code as the ID of the STFU_ action to execute28777 if (m_pStfuQuery == NULL) {28778 const char* szSQL = "SELECT ID, SendEvent, Ignore, Respond, ResponseEvent, ResponseAI, ResponseData1, ResponseData2 FROM Diplomacy_Stfu WHERE ID=?";28779 m_pStfuQuery = new Database::Results();28780 if (!GC.GetGameDatabase()->Execute(*m_pStfuQuery, szSQL, strlen(szSQL))) {28781 // CUSTOMLOG("STFU: Failed to generate stfu query.");28782 }28783 }2878428785 m_pStfuQuery->Bind(1, iValue);28786 while (m_pStfuQuery->Step())28787 {28788 if (m_pStfuQuery->GetInt(2) == 1) bIgnore = true;28789 if (m_pStfuQuery->GetInt(3) == 1) {28790 bRespond = true;28791 eResponseEvent = (FromUIDiploEventTypes)m_pStfuQuery->GetInt(4);28792 if (m_pStfuQuery->GetInt(5) == 1) {28793 eResponseFrom = eFromPlayer;28794 } else {28795 eResponseFrom = NO_PLAYER;28796 }28797 iResponseData1 = m_pStfuQuery->GetInt(6);28798 iResponseData2 = m_pStfuQuery->GetInt(7);28799 }28800 }2880128802 m_pStfuQuery->Reset();28803 }28804 }28805 }2880628807 if (bIgnore) {28808 // CUSTOMLOG("STFU: Ignore");28809 bWant = false;28810 } else if (bRespond) {28811 // CUSTOMLOG("STFU: Game.DoFromUIDiploEvent(%i, %i, %i, %i)", eResponseEvent, eResponseFrom, iResponseData1, iResponseData2);28812 GC.getGame().DoFromUIDiploEvent(eResponseEvent, eResponseFrom, iResponseData1, iResponseData2);28813 bWant = false;28814 }28815 }28816 else28817 {28818 CUSTOMLOG("STFU@%i: WARNING: Cannot find response key for message %i from player %i", GC.getGame().getGameTurn(), eDiploMessage, eFromPlayer);28819 }2882028821 if (bWant) {28822 // CUSTOMLOG("STFU: Want");28823 } else {28824 // Need to close the leader screen if it's open28825 // In Lua this is UI.RequestLeaveLeader(), but it's not in the API, so we'll have to send a GameEvent and do it in Lua ... YUCK!!!28826 GAMEEVENTINVOKE_HOOK(GAMEEVENT_DiplomacyStfuLeaveLeader, iResponseType);28827 }2882828829 return bWant;28830}