Hooks
static bool BeforeCvMinorCivAI_GetBestCityStateTarget(CvMinorCivAI* self, PlayerTypes eForPlayer, PlayerTypes& result);static void AfterCvMinorCivAI_GetBestCityStateTarget(CvMinorCivAI* self, PlayerTypes eForPlayer, PlayerTypes& result);static PlayerTypes ReplaceCvMinorCivAI_GetBestCityStateTarget(PlayerTypes (*original)(CvMinorCivAI*, PlayerTypes), CvMinorCivAI* self, PlayerTypes eForPlayer);CivRegisterBefore<CivHooks::CvMinorCivAI_GetBestCityStateTarget>(host, &BeforeCvMinorCivAI_GetBestCityStateTarget);CivRegisterAfter<CivHooks::CvMinorCivAI_GetBestCityStateTarget>(host, &AfterCvMinorCivAI_GetBestCityStateTarget);CivRegisterReplace<CivHooks::CvMinorCivAI_GetBestCityStateTarget>(host, &ReplaceCvMinorCivAI_GetBestCityStateTarget);
Code
5821/// Anyone that this City State would want to kill?5822/// NOTE: This makes a random choice, and is not guaranteed to return the same target if called multiple times.5823/// It will, however, return NO_PLAYER reliably if there are no valid targets for eForPlayer.5824PlayerTypes CvMinorCivAI::GetBestCityStateTarget(PlayerTypes eForPlayer)5825{5826 CvAssertMsg(eForPlayer >= 0, "eForPlayer is expected to be non-negative (invalid Index)");5827 CvAssertMsg(eForPlayer < MAX_MAJOR_CIVS, "eForPlayer is expected to be within maximum bounds (invalid Index)");58285829 PlayerTypes eBestCityStateTarget = NO_PLAYER;58305831 PlayerProximityTypes eClosestProximity = PLAYER_PROXIMITY_DISTANT;58325833 // First, loop through the Minors in the game to what the closest proximity is to any of the players5834 int iTargetLoop;5835 PlayerTypes eTarget;5836 for(iTargetLoop = MAX_MAJOR_CIVS; iTargetLoop < MAX_CIV_PLAYERS; iTargetLoop++)5837 {5838 eTarget = (PlayerTypes) iTargetLoop;58395840 if(!GET_PLAYER(eTarget).isAlive())5841 continue;58425843 if(GetPlayer()->getTeam() == GET_PLAYER(eTarget).getTeam())5844 continue;58455846 if(GetPlayer()->GetProximityToPlayer(eTarget) > eClosestProximity)5847 {5848 eClosestProximity = GetPlayer()->GetProximityToPlayer(eTarget);5849 }5850 }58515852 // Found nobody, or only people far away5853 if(eClosestProximity == PLAYER_PROXIMITY_DISTANT)5854 {5855 return NO_PLAYER;5856 }58575858 FStaticVector<PlayerTypes, MAX_CIV_PLAYERS, true, c_eCiv5GameplayDLL, 0> veValidTargets;58595860 // Now loop through and come up with a list of valid players based on the proximity we found out earlier5861 for(iTargetLoop = MAX_MAJOR_CIVS; iTargetLoop < MAX_CIV_PLAYERS; iTargetLoop++)5862 {5863 eTarget = (PlayerTypes) iTargetLoop;58645865 if(!GET_PLAYER(eTarget).isAlive())5866 continue;58675868 if(GetPlayer()->getTeam() == GET_PLAYER(eTarget).getTeam())5869 continue;58705871 if(!GET_TEAM(GET_PLAYER(eForPlayer).getTeam()).isHasMet(GET_PLAYER(eTarget).getTeam()))5872 continue;58735874 if(GetPlayer()->GetProximityToPlayer(eTarget) == eClosestProximity)5875 {5876 veValidTargets.push_back(eTarget);5877 }5878 }58795880 // Didn't find any valid Target players5881 if(veValidTargets.size() == 0)5882 return NO_PLAYER;58835884 int iRandIndex = GC.getGame().getJonRandNum(veValidTargets.size(), "Finding random City State Target for Minor to give out a quest to kill.");5885 eBestCityStateTarget = veValidTargets[iRandIndex];58865887 return eBestCityStateTarget;5888}