Hooks
static bool BeforeCvTacticalAI_AssignTacticalMove(CvTacticalAI* self, CvTacticalMove move);static void AfterCvTacticalAI_AssignTacticalMove(CvTacticalAI* self, CvTacticalMove move);static void ReplaceCvTacticalAI_AssignTacticalMove(void (*original)(CvTacticalAI*, CvTacticalMove), CvTacticalAI* self, CvTacticalMove move);CivRegisterBefore<CivHooks::CvTacticalAI_AssignTacticalMove>(host, &BeforeCvTacticalAI_AssignTacticalMove);CivRegisterAfter<CivHooks::CvTacticalAI_AssignTacticalMove>(host, &AfterCvTacticalAI_AssignTacticalMove);CivRegisterReplace<CivHooks::CvTacticalAI_AssignTacticalMove>(host, &ReplaceCvTacticalAI_AssignTacticalMove);
Code
1717/// Choose which tactics to run and assign units to it1718void CvTacticalAI::AssignTacticalMove(CvTacticalMove move)1719{1720#pragma warning ( push )1721#pragma warning ( disable : 6011 ) // Dereferencing NULL pointer1722 AI_PERF_FORMAT("AI-perf-tact.csv", ("Move Type: %s (%d), Turn %03d, %s", GC.getTacticalMoveInfo(move.m_eMoveType)->GetType(), (int)move.m_eMoveType, GC.getGame().getElapsedGameTurns(), m_pPlayer->getCivilizationShortDescription()) );1723#pragma warning ( pop )17241725 if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_MOVE_NONCOMBATANTS_TO_SAFETY])1726 {1727 PlotMovesToSafety(false /*bCombatUnits*/);1728 }1729 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_CAPTURE_CITY])1730 {1731 PlotCaptureCityMoves();1732 }1733 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_DAMAGE_CITY])1734 {1735 PlotDamageCityMoves();1736 }1737 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_DESTROY_HIGH_UNIT])1738 {1739 PlotDestroyUnitMoves(AI_TACTICAL_TARGET_HIGH_PRIORITY_UNIT, true);1740 }1741 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_DESTROY_MEDIUM_UNIT])1742 {1743 PlotDestroyUnitMoves(AI_TACTICAL_TARGET_MEDIUM_PRIORITY_UNIT, true);1744 }1745 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_DESTROY_LOW_UNIT])1746 {1747 PlotDestroyUnitMoves(AI_TACTICAL_TARGET_LOW_PRIORITY_UNIT, true);1748 }1749 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_TO_SAFETY])1750 {1751 PlotMovesToSafety(true /*bCombatUnits*/);1752 }1753 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_ATTRIT_HIGH_UNIT])1754 {1755 PlotDestroyUnitMoves(AI_TACTICAL_TARGET_HIGH_PRIORITY_UNIT, false);1756 }1757 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_ATTRIT_MEDIUM_UNIT])1758 {1759 PlotDestroyUnitMoves(AI_TACTICAL_TARGET_MEDIUM_PRIORITY_UNIT, false);1760 }1761 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_ATTRIT_LOW_UNIT])1762 {1763 PlotDestroyUnitMoves(AI_TACTICAL_TARGET_LOW_PRIORITY_UNIT, false);1764 }1765 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_REPOSITION])1766 {1767 PlotRepositionMoves();1768 }1769 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_BARBARIAN_CAMP])1770 {1771 PlotBarbarianCampMoves();1772 }1773 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_PILLAGE_CITADEL])1774 {1775 PlotPillageMoves(AI_TACTICAL_TARGET_CITADEL, true /*bFirstPass*/);1776 }1777 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_PILLAGE_RESOURCE])1778 {1779 PlotPillageMoves(AI_TACTICAL_TARGET_IMPROVEMENT_RESOURCE, true /*bFirstPass*/);1780 }1781 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_PILLAGE])1782 {1783 PlotPillageMoves(AI_TACTICAL_TARGET_IMPROVEMENT, true /*bFirstPass*/);1784 }1785 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_PILLAGE_CITADEL_NEXT_TURN])1786 {1787 PlotPillageMoves(AI_TACTICAL_TARGET_CITADEL, false /*bFirstPass*/);1788 }1789 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_PILLAGE_RESOURCE_NEXT_TURN])1790 {1791 PlotPillageMoves(AI_TACTICAL_TARGET_IMPROVEMENT_RESOURCE, false /*bFirstPass*/);1792 }1793 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_PILLAGE_NEXT_TURN])1794 {1795 PlotPillageMoves(AI_TACTICAL_TARGET_IMPROVEMENT, false /*bFirstPass*/);1796 }1797 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_PLUNDER_TRADE_UNIT])1798 {1799 PlotPlunderTradeUnitMoves(DOMAIN_LAND);1800 PlotPlunderTradeUnitMoves(DOMAIN_SEA);1801 }1802 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_PARK_ON_TRADE_ROUTE])1803 {1804 PlotPlunderTradePlotMoves(DOMAIN_LAND);1805 PlotPlunderTradePlotMoves(DOMAIN_SEA);1806 }1807 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_ATTACK_VERY_HIGH_PRIORITY_CIVILIAN])1808 {1809 PlotCivilianAttackMoves(AI_TACTICAL_TARGET_VERY_HIGH_PRIORITY_CIVILIAN);1810 }1811 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_ATTACK_HIGH_PRIORITY_CIVILIAN])1812 {1813 PlotCivilianAttackMoves(AI_TACTICAL_TARGET_HIGH_PRIORITY_CIVILIAN);1814 }1815 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_ATTACK_MEDIUM_PRIORITY_CIVILIAN])1816 {1817 PlotCivilianAttackMoves(AI_TACTICAL_TARGET_MEDIUM_PRIORITY_CIVILIAN);1818 }1819 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_ATTACK_LOW_PRIORITY_CIVILIAN])1820 {1821 PlotCivilianAttackMoves(AI_TACTICAL_TARGET_LOW_PRIORITY_CIVILIAN);1822 }1823 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_SAFE_BOMBARDS])1824 {1825 PlotSafeBombardMoves();1826 }1827 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_HEAL])1828 {1829 PlotHealMoves();1830 }1831 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_ANCIENT_RUINS])1832 {1833 PlotAncientRuinMoves(1);1834 }1835 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_GARRISON_TO_ALLOW_BOMBARD])1836 {1837 PlotGarrisonMoves(1, true /*bMustAllowRangedAttack*/);1838 }1839 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_GARRISON_ALREADY_THERE])1840 {1841 PlotGarrisonMoves(0);1842 }1843 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_BASTION_ALREADY_THERE])1844 {1845 PlotBastionMoves(0);1846 }1847 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_GUARD_IMPROVEMENT_ALREADY_THERE])1848 {1849 PlotGuardImprovementMoves(0);1850 }1851 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_GARRISON_1_TURN])1852 {1853 PlotGarrisonMoves(1);1854 }1855 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_BASTION_1_TURN])1856 {1857 PlotBastionMoves(1);1858 }1859 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_GUARD_IMPROVEMENT_1_TURN])1860 {1861 PlotGuardImprovementMoves(1);1862 }1863 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_AIR_INTERCEPT])1864 {1865 PlotAirInterceptMoves();1866 }1867 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_AIR_SWEEP])1868 {1869#if defined(MOD_AI_SMART_V3)1870 if (!MOD_AI_SMART_V3)1871#endif1872 PlotAirSweepMoves();1873 }1874 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_POSTURE_SIT_AND_BOMBARD])1875 {1876 PlotSitAndBombardMoves();1877 }1878 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_POSTURE_ATTRIT_FROM_RANGE])1879 {1880 PlotAttritFromRangeMoves();1881 }1882 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_POSTURE_EXPLOIT_FLANKS])1883 {1884 PlotExploitFlanksMoves();1885 }1886 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_POSTURE_STEAMROLL])1887 {1888 PlotSteamrollMoves();1889 }1890 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_POSTURE_SURGICAL_CITY_STRIKE])1891 {1892 PlotSurgicalCityStrikeMoves();1893 }1894 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_POSTURE_HEDGEHOG])1895 {1896 PlotHedgehogMoves();1897 }1898 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_POSTURE_COUNTERATTACK])1899 {1900 PlotCounterattackMoves();1901 }1902 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_POSTURE_WITHDRAW])1903 {1904 PlotWithdrawMoves();1905 }1906 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_POSTURE_SHORE_BOMBARDMENT])1907 {1908 PlotShoreBombardmentMoves();1909 }1910 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_CLOSE_ON_TARGET])1911 {1912 PlotCloseOnTarget(true /*bCheckDominance*/);1913 }1914 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_MOVE_OPERATIONS])1915 {1916 PlotOperationalArmyMoves();1917 }1918 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_EMERGENCY_PURCHASES])1919 {1920 PlotEmergencyPurchases();1921 }1922 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_DEFENSIVE_AIRLIFT])1923 {1924 PlotDefensiveAirlifts();1925 }1926 else if(move.m_eMoveType == (TacticalAIMoveTypes)m_CachedInfoTypes[eTACTICAL_ESCORT_EMBARKED_UNIT])1927 {1928 PlotEscortEmbarkedMoves();1929 }1930}