Bazaar developer reference

CvBarbarians::GetRandomBarbarianUnitType(CvPlot *, UnitAITypes)

Defined in
CvBarbarians.cpp, line 555
Class
CvBarbarians
Hook name
CivHooks::CvBarbarians_GetRandomBarbarianUnitType
Lua events
GameEvents.BarbariansCampGetSpawnUnit

Hooks

static bool BeforeCvBarbarians_GetRandomBarbarianUnitType(CvPlot* pPlot, UnitAITypes eUnitAI, UnitTypes& result);static void AfterCvBarbarians_GetRandomBarbarianUnitType(CvPlot* pPlot, UnitAITypes eUnitAI, UnitTypes& result);static UnitTypes ReplaceCvBarbarians_GetRandomBarbarianUnitType(UnitTypes (*original)(CvPlot*, UnitAITypes), CvPlot* pPlot, UnitAITypes eUnitAI);CivRegisterBefore<CivHooks::CvBarbarians_GetRandomBarbarianUnitType>(host, &BeforeCvBarbarians_GetRandomBarbarianUnitType);CivRegisterAfter<CivHooks::CvBarbarians_GetRandomBarbarianUnitType>(host, &AfterCvBarbarians_GetRandomBarbarianUnitType);CivRegisterReplace<CivHooks::CvBarbarians_GetRandomBarbarianUnitType>(host, &ReplaceCvBarbarians_GetRandomBarbarianUnitType);

Code

554#if defined(MOD_EVENTS_BARBARIANS)555UnitTypes CvBarbarians::GetRandomBarbarianUnitType(CvPlot* pPlot, UnitAITypes eUnitAI)556{557	CvArea* pArea = GC.getMap().getArea(pPlot->getArea());558#else559UnitTypes CvBarbarians::GetRandomBarbarianUnitType(CvArea* pArea, UnitAITypes eUnitAI)560{561#endif562	UnitTypes eBestUnit = NO_UNIT;563	int iBestValue = 0;564	int iValue = 0;565566	CvPlayerAI& kBarbarianPlayer = GET_PLAYER(BARBARIAN_PLAYER);567568	CvGame &kGame = GC.getGame();569570	for(int iUnitClassLoop = 0; iUnitClassLoop < GC.getNumUnitClassInfos(); iUnitClassLoop++)571	{572		bool bValid = false;573		CvUnitClassInfo* pkUnitClassInfo = GC.getUnitClassInfo((UnitClassTypes)iUnitClassLoop);574		if(pkUnitClassInfo == NULL)575			continue;576577		const UnitTypes eLoopUnit = ((UnitTypes)(kBarbarianPlayer.getCivilizationInfo().getCivilizationUnits(iUnitClassLoop)));578		if(eLoopUnit != NO_UNIT)579		{580			CvUnitEntry* pkUnitInfo = GC.getUnitInfo(eLoopUnit);581			if(pkUnitInfo == NULL)582			{583				continue;584			}585586			CvUnitEntry& kUnit = *pkUnitInfo;587588			bValid = (kUnit.GetCombat() > 0);589			if(bValid)590			{591				// Unit has combat strength, make sure it isn't only defensive (and with no ranged combat ability)592				if(kUnit.GetRange() == 0)593				{594					for(int iLoop = 0; iLoop < GC.getNumPromotionInfos(); iLoop++)595					{596						const PromotionTypes ePromotion = static_cast<PromotionTypes>(iLoop);597						CvPromotionEntry* pkPromotionInfo = GC.getPromotionInfo(ePromotion);598						if(pkPromotionInfo)599						{600							if(kUnit.GetFreePromotions(iLoop))601							{602								if(pkPromotionInfo->IsOnlyDefensive())603								{604									bValid = false;605									break;606								}607							}608						}609					}610				}611			}612613			if(bValid)614			{615				if(pArea->isWater() && kUnit.GetDomainType() != DOMAIN_SEA)616				{617					bValid = false;618				}619				else if(!pArea->isWater() && kUnit.GetDomainType() != DOMAIN_LAND)620				{621					bValid = false;622				}623			}624625			if(bValid)626			{627				if(!GET_PLAYER(BARBARIAN_PLAYER).canTrain(eLoopUnit))628				{629					bValid = false;630				}631			}632633			if(bValid)634			{635				bool bFound = false;636				bool bRequires = false;637				for(int i = 0; i < GC.getNUM_UNIT_AND_TECH_PREREQS(); ++i)638				{639					TechTypes eTech = (TechTypes) kUnit.GetPrereqAndTechs(i);640641					if(NO_TECH != eTech)642					{643						bRequires = true;644645						if(GET_TEAM(BARBARIAN_TEAM).GetTeamTechs()->HasTech(eTech))646						{647							bFound = true;648							break;649						}650					}651				}652653				if(bRequires && !bFound)654				{655					bValid = false;656				}657			}658659			if(bValid)660			{661				iValue = (1 + kGame.getJonRandNum(1000, "Barb Unit Selection"));662663				if(kUnit.GetUnitAIType(eUnitAI))664				{665					iValue += 200;666				}667668				if(iValue > iBestValue)669				{670					eBestUnit = eLoopUnit;671					iBestValue = iValue;672				}673			}674		}675	}676677#if defined(MOD_EVENTS_BARBARIANS)678	if (MOD_EVENTS_BARBARIANS) {679		int iValue = 0;680		if (GAMEEVENTINVOKE_VALUE(iValue, GAMEEVENT_BarbariansCampGetSpawnUnit, pPlot->getX(), pPlot->getY(), eBestUnit) == GAMEEVENTRETURN_VALUE) {681			// Defend against modder stupidity!682			UnitTypes eUnitType = (UnitTypes)iValue;683			if (eUnitType != NO_UNIT && GC.getUnitInfo(eUnitType) != NULL) {684				eBestUnit = eUnitType;685			}686		}687	}688#endif689	690	return eBestUnit;691}

Calls

Called by