Bazaar developer reference

CvPlayer::DoSpawnGreatPerson(PlayerTypes, bool)

Defined in
CvPlayer.cpp, line 14794
Class
CvPlayer
Hook name
CivHooks::CvPlayer_DoSpawnGreatPerson

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}

Calls

Called by