Hooks
static bool BeforeCvPlayerEspionage_SetOutcome(CvPlayerEspionage* self, uint uiSpyIndex, uint uiSpyResult, bool bAffectsDiplomacy);static void AfterCvPlayerEspionage_SetOutcome(CvPlayerEspionage* self, uint uiSpyIndex, uint uiSpyResult, bool bAffectsDiplomacy);static void ReplaceCvPlayerEspionage_SetOutcome(void (*original)(CvPlayerEspionage*, uint, uint, bool), CvPlayerEspionage* self, uint uiSpyIndex, uint uiSpyResult, bool bAffectsDiplomacy);CivRegisterBefore<CivHooks::CvPlayerEspionage_SetOutcome>(host, &BeforeCvPlayerEspionage_SetOutcome);CivRegisterAfter<CivHooks::CvPlayerEspionage_SetOutcome>(host, &AfterCvPlayerEspionage_SetOutcome);CivRegisterReplace<CivHooks::CvPlayerEspionage_SetOutcome>(host, &ReplaceCvPlayerEspionage_SetOutcome);
Code
1638/// SetOutcome - Forces the outcome of an (external) espionage activity1639void CvPlayerEspionage::SetOutcome(uint uiSpyIndex, uint uiSpyResult, bool bAffectsDiplomacy) {1640 CvEspionageSpy* pSpy = &(m_aSpyList[uiSpyIndex]);1641 PlayerTypes eCityOwner = NO_PLAYER;1642 CvPlot* pCityPlot = GC.getMap().plot(pSpy->m_iCityX, pSpy->m_iCityY);1643 if (pCityPlot) {1644 CvCity* pCity = pCityPlot->getPlotCity();1645 if (pCity) {1646 eCityOwner = pCity->getOwner();1647 }1648 }16491650 switch(uiSpyResult) {1651 case SPY_RESULT_UNDETECTED:1652 // Nothing much happening here1653 break;1654 case SPY_RESULT_DETECTED:1655 // The defended will be mad, but not know who to be mad at!1656 break;1657 case SPY_RESULT_IDENTIFIED:1658 if (bAffectsDiplomacy && eCityOwner != NO_PLAYER) {1659 CvEspionageAI* pDefenderEspionageAI = GET_PLAYER(eCityOwner).GetEspionageAI();1660 CvAssertMsg(pDefenderEspionageAI, "pDefenderEspionageAI is null");1661 if (pDefenderEspionageAI) {1662 pDefenderEspionageAI->m_aiTurnLastSpyCaught[m_pPlayer->GetID()] = GC.getGame().getGameTurn();1663 pDefenderEspionageAI->m_aiNumSpiesCaught[m_pPlayer->GetID()]++;1664 }1665 }1666 break;1667 case SPY_RESULT_KILLED:1668 case SPY_RESULT_ELIMINATED:1669 ExtractSpyFromCity(uiSpyIndex); // move the dead body out so that someone else can move in1670#if defined(MOD_API_ESPIONAGE)1671 pSpy->SetSpyState(m_pPlayer->GetID(), uiSpyIndex, (uiSpyResult == SPY_RESULT_KILLED) ? SPY_STATE_DEAD : SPY_STATE_TERMINATED);1672#else1673 pSpy->m_eSpyState = (uiSpyResult == SPY_RESULT_KILLED) ? SPY_STATE_DEAD : SPY_STATE_TERMINATED;1674#endif16751676 if (bAffectsDiplomacy && eCityOwner != NO_PLAYER) {1677 CvEspionageAI* pDefenderEspionageAI = GET_PLAYER(eCityOwner).GetEspionageAI();1678 CvAssertMsg(pDefenderEspionageAI, "pDefenderEspionageAI is null");1679 if (pDefenderEspionageAI) {1680 pDefenderEspionageAI->m_aiTurnLastSpyKilled[m_pPlayer->GetID()] = GC.getGame().getGameTurn();1681 pDefenderEspionageAI->m_aiNumSpiesKilled[m_pPlayer->GetID()]++;1682 }16831684 CvEspionageAI* pEspionageAI = m_pPlayer->GetEspionageAI();1685 CvAssertMsg(pEspionageAI, "pEspionageAI is null");1686 if (pEspionageAI) {1687 pEspionageAI->m_aiTurnLastSpyDied[eCityOwner] = GC.getGame().getGameTurn();1688 pEspionageAI->m_aiNumSpiesDied[eCityOwner]++;1689 }1690 }1691 break;1692 }1693}