Hooks
static bool BeforeCvPlayer_DoSpawnGreatPerson(CvPlayer* self, PlayerTypes eMinor, bool bIsFree);static void AfterCvPlayer_DoSpawnGreatPerson(CvPlayer* self, PlayerTypes eMinor, bool bIsFree);static void ReplaceCvPlayer_DoSpawnGreatPerson(void (*original)(CvPlayer*, PlayerTypes, bool), CvPlayer* self, PlayerTypes eMinor, bool bIsFree);CivRegisterBefore<CivHooks::CvPlayer_DoSpawnGreatPerson>(host, &BeforeCvPlayer_DoSpawnGreatPerson);CivRegisterAfter<CivHooks::CvPlayer_DoSpawnGreatPerson>(host, &AfterCvPlayer_DoSpawnGreatPerson);CivRegisterReplace<CivHooks::CvPlayer_DoSpawnGreatPerson>(host, &ReplaceCvPlayer_DoSpawnGreatPerson);
Code
14792/// Create a GreatPeople14793#if defined(MOD_GLOBAL_TRULY_FREE_GP)14794void CvPlayer::DoSpawnGreatPerson(PlayerTypes eMinor, bool bIsFree)14795#else14796void CvPlayer::DoSpawnGreatPerson(PlayerTypes eMinor)14797#endif14798{14799 CvAssertMsg(eMinor >= MAX_MAJOR_CIVS, "eMinor is expected to be non-negative (invalid Index)");14800 CvAssertMsg(eMinor < MAX_CIV_PLAYERS, "eMinor is expected to be within maximum bounds (invalid Index)");1480114802 // Minor must have Capital14803 CvCity* pMinorCapital = GET_PLAYER(eMinor).getCapitalCity();14804 if(pMinorCapital == NULL)14805 {14806 FAssertMsg(false, "MINOR CIV AI: Trying to spawn a GreatPeople for a major civ but the minor has no capital. Please send Jon this with your last 5 autosaves and what changelist # you're playing.");14807 return;14808 }14809 // Capital must have a plot14810 CvPlot* pMinorPlot = pMinorCapital->plot();14811 if(pMinorPlot == NULL)14812 {14813 CvAssertMsg(false, "Plot for minor civ's capital not found! Please send Anton your save file and version.");14814 return;14815 }1481614817 // Note: this is the same transport method (though without a delay) as a Militaristic city-state gifting a unit1481814819 CvCity* pMajorCity = GetClosestFriendlyCity(*pMinorPlot, MAX_INT);1482014821 int iX = pMinorCapital->getX();14822 int iY = pMinorCapital->getY();14823 if(pMajorCity != NULL)14824 {14825 iX = pMajorCity->getX();14826 iY = pMajorCity->getY();14827 }1482814829 // Pick Great Person type14830 UnitTypes eBestUnit = NO_UNIT;14831 int iBestScore = -1;14832 SpecialUnitTypes eSpecialUnitGreatPerson = (SpecialUnitTypes) GC.getInfoTypeForString("SPECIALUNIT_PEOPLE");1483314834 for(int iUnitLoop = 0; iUnitLoop < GC.getNumUnitInfos(); iUnitLoop++)14835 {14836 UnitTypes eLoopUnit = (UnitTypes)iUnitLoop;14837 CvUnitEntry* pkUnitEntry = GC.getUnitInfo(eLoopUnit);1483814839 if(pkUnitEntry && pkUnitEntry->GetSpecialUnitType() == eSpecialUnitGreatPerson)14840 {14841 // No prophets14842 if(!pkUnitEntry->IsFoundReligion())14843 {14844 int iScore = GC.getGame().getJonRandNum(100, "Rand");1484514846 if(iScore > iBestScore)14847 {14848 iBestScore = iScore;14849 eBestUnit = eLoopUnit;14850 }14851 }14852 }14853 }1485414855 // Spawn GreatPeople14856 if(eBestUnit != NO_UNIT)14857 {14858 CvUnit* pNewGreatPeople = initUnit(eBestUnit, iX, iY);14859 CvAssert(pNewGreatPeople);1486014861 if (pNewGreatPeople)14862 {14863 // Bump up the count14864 if(pNewGreatPeople->IsGreatGeneral())14865 {14866#if defined(MOD_GLOBAL_TRULY_FREE_GP)14867 incrementGreatGeneralsCreated(bIsFree);14868#else14869 incrementGreatGeneralsCreated();14870#endif14871 }14872 else if(pNewGreatPeople->IsGreatAdmiral())14873 {14874#if defined(MOD_GLOBAL_TRULY_FREE_GP)14875 incrementGreatAdmiralsCreated(bIsFree);14876#else14877 incrementGreatAdmiralsCreated();14878#endif14879 }14880 else if (pNewGreatPeople->getUnitInfo().GetUnitClassType() == GC.getInfoTypeForString("UNITCLASS_WRITER"))14881 {14882#if defined(MOD_GLOBAL_TRULY_FREE_GP)14883 incrementGreatWritersCreated(bIsFree);14884#else14885 incrementGreatWritersCreated();14886#endif14887 } 14888 else if (pNewGreatPeople->getUnitInfo().GetUnitClassType() == GC.getInfoTypeForString("UNITCLASS_ARTIST"))14889 {14890#if defined(MOD_GLOBAL_TRULY_FREE_GP)14891 incrementGreatArtistsCreated(bIsFree);14892#else14893 incrementGreatArtistsCreated();14894#endif14895 } 14896 else if (pNewGreatPeople->getUnitInfo().GetUnitClassType() == GC.getInfoTypeForString("UNITCLASS_MUSICIAN"))14897 {14898#if defined(MOD_GLOBAL_TRULY_FREE_GP)14899 incrementGreatMusiciansCreated(bIsFree);14900#else14901 incrementGreatMusiciansCreated();14902#endif14903 }14904 else14905 {14906#if defined(MOD_GLOBAL_SEPARATE_GP_COUNTERS)14907 if (MOD_GLOBAL_SEPARATE_GP_COUNTERS) {14908 if (pNewGreatPeople->getUnitInfo().GetUnitClassType() == GC.getInfoTypeForString("UNITCLASS_MERCHANT")) {14909#if defined(MOD_GLOBAL_TRULY_FREE_GP)14910 incrementGreatMerchantsCreated(bIsFree);14911#else14912 incrementGreatMerchantsCreated();14913#endif14914 } else if (pNewGreatPeople->getUnitInfo().GetUnitClassType() == GC.getInfoTypeForString("UNITCLASS_SCIENTIST")) {14915#if defined(MOD_GLOBAL_TRULY_FREE_GP)14916 incrementGreatScientistsCreated(bIsFree);14917#else14918 incrementGreatScientistsCreated();14919#endif14920 } else {14921#if defined(MOD_GLOBAL_TRULY_FREE_GP)14922 incrementGreatEngineersCreated(bIsFree);14923#else14924 incrementGreatEngineersCreated();14925#endif14926 }14927 } else14928#endif14929#if defined(MOD_GLOBAL_TRULY_FREE_GP)14930 incrementGreatPeopleCreated(bIsFree);14931#else14932 incrementGreatPeopleCreated();14933#endif14934 }1493514936 if (pNewGreatPeople->IsGreatAdmiral())14937 {14938 CvPlot* pSpawnPlot = GetGreatAdmiralSpawnPlot(pNewGreatPeople);14939 if (pNewGreatPeople->plot() != pSpawnPlot && pSpawnPlot != NULL)14940 {14941 pNewGreatPeople->setXY(pSpawnPlot->getX(), pSpawnPlot->getY());14942 }14943 }14944 else14945 {14946 if (!pNewGreatPeople->jumpToNearestValidPlot())14947 pNewGreatPeople->kill(false); // Could not find a spot!14948 }1494914950 CvNotifications* pNotifications = GetNotifications();14951 if(pNotifications)14952 {14953 Localization::String strMessage = Localization::Lookup("TXT_KEY_NOTIFICATION_CITY_STATE_UNIT_SPAWN");14954 strMessage << GET_PLAYER(eMinor).getNameKey();14955 Localization::String strSummary = Localization::Lookup("TXT_KEY_NOTIFICATION_SUMMARY_CITY_STATE_UNIT_SPAWN");14956 strSummary << GET_PLAYER(eMinor).getNameKey();14957 pNotifications->Add(NOTIFICATION_MINOR, strMessage.toUTF8(), strSummary.toUTF8(), iX, iY, eMinor);14958 }14959 }14960 }14961}