Hooks
static bool BeforeCvPlayer_createGreatGeneral(CvPlayer* self, UnitTypes eGreatPersonUnit, int iX, int iY, bool bIsFree);static void AfterCvPlayer_createGreatGeneral(CvPlayer* self, UnitTypes eGreatPersonUnit, int iX, int iY, bool bIsFree);static void ReplaceCvPlayer_createGreatGeneral(void (*original)(CvPlayer*, UnitTypes, int, int, bool), CvPlayer* self, UnitTypes eGreatPersonUnit, int iX, int iY, bool bIsFree);CivRegisterBefore<CivHooks::CvPlayer_createGreatGeneral>(host, &BeforeCvPlayer_createGreatGeneral);CivRegisterAfter<CivHooks::CvPlayer_createGreatGeneral>(host, &AfterCvPlayer_createGreatGeneral);CivRegisterReplace<CivHooks::CvPlayer_createGreatGeneral>(host, &ReplaceCvPlayer_createGreatGeneral);
Code
25857#if defined(MOD_GLOBAL_TRULY_FREE_GP)25858void CvPlayer::createGreatGeneral(UnitTypes eGreatPersonUnit, int iX, int iY, bool bIsFree)25859#else25860void CvPlayer::createGreatGeneral(UnitTypes eGreatPersonUnit, int iX, int iY)25861#endif25862{25863 CvUnit* pGreatPeopleUnit = initUnit(eGreatPersonUnit, iX, iY);25864 if(NULL == pGreatPeopleUnit)25865 {25866 CvAssert(false);25867 return;25868 }2586925870 ChangeNumGreatPeople(1);2587125872#if defined(MOD_GLOBAL_TRULY_FREE_GP)25873 incrementGreatGeneralsCreated(bIsFree);25874#else25875 incrementGreatGeneralsCreated();25876#endif2587725878#if defined(MOD_GLOBAL_TRULY_FREE_GP)25879 changeGreatGeneralsThresholdModifier(/*50*/ GC.getGREAT_GENERALS_THRESHOLD_INCREASE() * ((getGreatGeneralsCreated(bIsFree) / 10) + 1));25880#else25881 changeGreatGeneralsThresholdModifier(/*50*/ GC.getGREAT_GENERALS_THRESHOLD_INCREASE() * ((getGreatGeneralsCreated() / 10) + 1));25882#endif2588325884 for(int iI = 0; iI < MAX_PLAYERS; iI++)25885 {25886 if(GET_PLAYER((PlayerTypes)iI).getTeam() == getTeam())25887 {25888#if defined(MOD_BUGFIX_MINOR)25889#if defined(MOD_GLOBAL_TRULY_FREE_GP)25890 GET_PLAYER((PlayerTypes)iI).changeGreatGeneralsThresholdModifier(/*50*/ GC.getGREAT_GENERALS_THRESHOLD_INCREASE_TEAM() * ((getGreatGeneralsCreated(bIsFree) / 10) + 1));25891#else25892 GET_PLAYER((PlayerTypes)iI).changeGreatGeneralsThresholdModifier(/*50*/ GC.getGREAT_GENERALS_THRESHOLD_INCREASE_TEAM() * ((getGreatGeneralsCreated() / 10) + 1));25893#endif25894#else25895#if defined(MOD_GLOBAL_TRULY_FREE_GP)25896 GET_PLAYER((PlayerTypes)iI).changeGreatGeneralsThresholdModifier(/*50*/ GC.getGREAT_GENERALS_THRESHOLD_INCREASE_TEAM() * ((getGreatPeopleCreated(bIsFree) / 10) + 1));25897#else25898 GET_PLAYER((PlayerTypes)iI).changeGreatGeneralsThresholdModifier(/*50*/ GC.getGREAT_GENERALS_THRESHOLD_INCREASE_TEAM() * ((getGreatPeopleCreated() / 10) + 1));25899#endif25900#endif25901 }25902 }2590325904#if defined(MOD_GLOBAL_LOCAL_GENERALS)25905 CvPlot* pPlot = pGreatPeopleUnit->plot();2590625907 // In rare cases we can gain the general from an embarked unit being attacked, or from a hovering unit over coast25908 // so if this plot is water, relocate the Great General25909 if (pPlot->isWater()) {25910 pGreatPeopleUnit->jumpToNearestValidPlot();25911 }25912#else25913 CvPlot* pPlot = GC.getMap().plot(iX, iY);25914#endif2591525916#if !defined(NO_ACHIEVEMENTS)25917 //Achievements and Stats25918 if(pGreatPeopleUnit->isHuman() && !GC.getGame().isGameMultiPlayer())25919 {25920 gDLL->IncrementSteamStat(ESTEAMSTAT_GREATGENERALS);25921 const char* strLeader = GET_PLAYER(pGreatPeopleUnit->getOwner()).getLeaderTypeKey();25922 if(strLeader && strcmp(strLeader, "LEADER_WU_ZETIAN") == 0)25923 {25924 gDLL->UnlockAchievement(ACHIEVEMENT_SPECIAL_SUNTZU);25925 }2592625927 CvAchievementUnlocker::Check_PSG();25928 }25929#endif2593025931 // Notification25932 if(GetNotifications())25933 {25934 Localization::String strText = Localization::Lookup("TXT_KEY_NOTIFICATION_GREAT_PERSON_ACTIVE_PLAYER");25935 Localization::String strSummary = Localization::Lookup("TXT_KEY_NOTIFICATION_SUMMARY_GREAT_PERSON");25936 GetNotifications()->Add(NOTIFICATION_GREAT_PERSON_ACTIVE_PLAYER, strText.toUTF8(), strSummary.toUTF8(), pPlot->getX(), pPlot->getY(), eGreatPersonUnit);25937 }25938}