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
- CustomMods::eventAccumulator(int &, const char *, const char *, ...)
- CustomMods::isEVENTS_BARBARIANS()
- CvArea::isWater() const
- CvCivilizationInfo::getCivilizationUnits(int) const
- CvGame::getJonRandNum(int, const char *)
- CvGlobals::getGame()
- CvGlobals::getMap()
- CvGlobals::getNUM_UNIT_AND_TECH_PREREQS()
- CvGlobals::getNumPromotionInfos()
- CvGlobals::getNumUnitClassInfos()
- CvGlobals::getPromotionInfo(PromotionTypes)
- CvGlobals::getUnitClassInfo(UnitClassTypes)
- CvGlobals::getUnitInfo(UnitTypes)
- CvMap::getArea(int)
- CvPlayer::canTrain(UnitTypes, bool, bool, bool, bool, CvString *) const
- CvPlayer::getCivilizationInfo() const
- CvPlayerAI::getPlayer(PlayerTypes)
- CvPlot::getArea() const
- CvPlot::getX() const
- CvPlot::getY() const
- CvPromotionEntry::IsOnlyDefensive() const
- CvTeam::getTeam(TeamTypes)
- CvTeam::GetTeamTechs() const
- CvTeamTechs::HasTech(TechTypes) const
- CvUnitEntry::GetCombat() const
- CvUnitEntry::GetDomainType() const
- CvUnitEntry::GetFreePromotions(int) const
- CvUnitEntry::GetPrereqAndTechs(int) const
- CvUnitEntry::GetRange() const
- CvUnitEntry::GetUnitAIType(int) const