本文整理汇总了C++中CvPlot::isVisible方法的典型用法代码示例。如果您正苦于以下问题:C++ CvPlot::isVisible方法的具体用法?C++ CvPlot::isVisible怎么用?C++ CvPlot::isVisible使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CvPlot
的用法示例。
在下文中一共展示了CvPlot::isVisible方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: TEMPOnHexUnitChangedAttack
//------------------------------------------------------------------------------
void CvDllGameContext::TEMPOnHexUnitChangedAttack(ICvUnit1* pUnit)
{
CvUnit* pkUnit = GC.UnwrapUnitPointer(pUnit);
SPathFinderUserData data(pkUnit,CvUnit::MOVEFLAG_DECLARE_WAR|CvUnit::MOVEFLAG_ATTACK,1);
data.ePathType = PT_UNIT_REACHABLE_PLOTS;
//potential deadlock - need to use special pathfinder instance
ReachablePlots plots = GC.GetPathFinder().GetPlotsInReach(pkUnit->getX(),pkUnit->getY(),data);
for (ReachablePlots::iterator it = plots.begin(); it != plots.end(); ++it)
{
CvPlot* pPlot = GC.getMap().plotByIndexUnchecked(it->iPlotIndex);
if(pPlot && pPlot->isVisible(pkUnit->getTeam()) && (pPlot->isVisibleEnemyUnit(pkUnit) || pPlot->isEnemyCity(*pkUnit)))
{
auto_ptr<ICvPlot1> pDllPlot = GC.WrapPlotPointer(pPlot);
GC.GetEngineUserInterface()->AddHexToUIRange(pDllPlot.get());
}
}
}
示例2: TEMPOnHexUnitChangedAttack
//------------------------------------------------------------------------------
void CvDllGameContext::TEMPOnHexUnitChangedAttack(ICvUnit1* pUnit)
{
CvUnit* pkUnit = GC.UnwrapUnitPointer(pUnit);
CvTwoLayerPathFinder& thePathfinder = GC.GetInterfacePathFinder();
SPathFinderUserData data(pkUnit,CvUnit::MOVEFLAG_NO_INTERMEDIATE_STOPS|CvUnit::MOVEFLAG_DECLARE_WAR|CvUnit::MOVEFLAG_ATTACK,1);
data.ePathType = PT_UNIT_REACHABLE_PLOTS;
ReachablePlots plots = GC.GetInterfacePathFinder().GetPlotsInReach(pkUnit->getX(),pkUnit->getY(),data,0);
for (ReachablePlots::iterator it = plots.begin(); it != plots.end(); ++it)
{
CvPlot* pPlot = GC.getMap().plotByIndexUnchecked(it->first);
if(pPlot && pPlot->isVisible(pkUnit->getTeam()) && (pPlot->isVisibleEnemyUnit(pkUnit) || pPlot->isEnemyCity(*pkUnit)))
{
auto_ptr<ICvPlot1> pDllPlot = GC.WrapPlotPointer(pPlot);
GC.GetEngineUserInterface()->AddHexToUIRange(pDllPlot.get());
}
}
}
示例3: CalculateMilitaryStrengths
/// Calculate military presences in each owned dominance zone
void CvTacticalAnalysisMap::CalculateMilitaryStrengths()
{
TeamTypes eTeam = GET_PLAYER(m_ePlayer).getTeam();
// Loop through the dominance zones
for(unsigned int iI = 0; iI < m_DominanceZones.size(); iI++)
{
CvTacticalDominanceZone* pZone = &m_DominanceZones[iI];
CvCity *pClosestCity = pZone->GetZoneCity();
if(pClosestCity)
{
// Start with strength of the city itself
int iCityHitPoints = pClosestCity->GetMaxHitPoints() - pClosestCity->getDamage();
int iStrength = pClosestCity->getStrengthValue() * iCityHitPoints / GC.getMAX_CITY_HIT_POINTS();
if(pZone->GetTerritoryType() == TACTICAL_TERRITORY_FRIENDLY)
{
pZone->AddFriendlyMeleeStrength(iStrength);
pZone->AddFriendlyRangedStrength(pClosestCity->getStrengthValue(true));
}
else if(pZone->GetTerritoryType() == TACTICAL_TERRITORY_ENEMY)
{
pZone->AddEnemyMeleeStrength(iStrength);
pZone->AddEnemyRangedStrength(pClosestCity->getStrengthValue(true));
}
else
{
pZone->AddNeutralStrength(iStrength);
}
}
// check all units in the world
for(int iPlayerLoop = 0; iPlayerLoop < MAX_PLAYERS; iPlayerLoop++)
{
CvPlayer& kPlayer = GET_PLAYER((PlayerTypes) iPlayerLoop);
bool bEnemy = GET_TEAM(eTeam).isAtWar(kPlayer.getTeam());
bool bFriendly = (eTeam==kPlayer.getTeam());
int iLoop;
for(CvUnit* pLoopUnit = kPlayer.firstUnit(&iLoop); pLoopUnit != NULL; pLoopUnit = kPlayer.nextUnit(&iLoop))
{
if(!pLoopUnit->IsCombatUnit())
continue;
bool bUnitMayBeRelevant = (pLoopUnit->getDomainType() == DOMAIN_AIR ||
pLoopUnit->isRanged() || //ranged power is cross-domain!
(pLoopUnit->getDomainType() == DOMAIN_LAND && !pZone->IsWater()) ||
((pLoopUnit->getDomainType() == DOMAIN_SEA || (pLoopUnit->isEmbarked() && pClosestCity) && pZone->IsWater())));
//embarked melee still count in water zone if there's a city to attack/defend
if (!bUnitMayBeRelevant)
continue;
CvPlot* pPlot = pLoopUnit->plot();
if(!pPlot)
continue;
//a little cheating for AI - invisible units still count with reduced strength
bool bVisible = pPlot->isVisible(eTeam) || pPlot->isAdjacentVisible(eTeam, false);
bool bZoneTypeMismatch = (pLoopUnit->getDomainType() == DOMAIN_LAND && pZone->IsWater()) || (pLoopUnit->getDomainType() == DOMAIN_SEA && !pZone->IsWater());
//embarked units and crossdomain count only partially
bool bReducedStrength = pLoopUnit->isEmbarked() || bZoneTypeMismatch;
//if there is a city, units in adjacent zones can also count
int iDistance = 0;
if (pClosestCity)
{
iDistance = plotDistance(pLoopUnit->getX(), pLoopUnit->getY(), pClosestCity->getX(), pClosestCity->getY());
if (iDistance > m_iTacticalRange)
continue;
else if (iDistance > (m_iTacticalRange / 2))
{
if (bZoneTypeMismatch)
continue;
else
bReducedStrength = true;
}
else
{
//if on another continent, they can't easily take part in the fight
if (!pClosestCity->isMatchingArea(pLoopUnit->plot()))
bReducedStrength = true;
}
}
else
{
//if there is no city, the unit must be in the zone itself
if ( GetCell(pLoopUnit->plot()->GetPlotIndex())->GetDominanceZone() != pZone->GetDominanceZoneID() )
continue;
}
int iMultiplier = m_iTacticalRange + MIN(3 - iDistance, 0); // 3 because action may still be spread out over the zone
if(iMultiplier > 0)
{
int iUnitStrength = pLoopUnit->GetBaseCombatStrengthConsideringDamage();
//unit might disembark ... so don't count it for water zone, but for adjacent land
if(iUnitStrength == 0 && pLoopUnit->isEmbarked() && !pZone->IsWater())
//.........这里部分代码省略.........
示例4: CalculateMilitaryStrengths
//.........这里部分代码省略.........
SetIgnoreLOS(true);
}
pZone->AddFriendlyUnitCount(1);
if(pLoopUnit->isRanged())
{
pZone->AddFriendlyRangedUnitCount(1);
}
}
}
}
}
}
// Repeat for all visible enemy units (or adjacent to visible)
for(int iPlayerLoop = 0; iPlayerLoop < MAX_CIV_PLAYERS; iPlayerLoop++)
{
CvPlayer& kPlayer = GET_PLAYER((PlayerTypes) iPlayerLoop);
if(GET_TEAM(eTeam).isAtWar(kPlayer.getTeam()))
{
for(pLoopUnit = kPlayer.firstUnit(&iLoop); pLoopUnit != NULL; pLoopUnit = kPlayer.nextUnit(&iLoop))
{
if(pLoopUnit->IsCombatUnit())
{
if(pLoopUnit->getDomainType() == DOMAIN_AIR ||
#if defined(MOD_AI_SMART_V3)
//ranged power is cross-domain!
(MOD_AI_SMART_V3 && pLoopUnit->isRanged()) ||
#endif
(pLoopUnit->getDomainType() == DOMAIN_LAND && !pZone->IsWater()) ||
(pLoopUnit->getDomainType() == DOMAIN_SEA && pZone->IsWater()))
{
CvPlot* pPlot;
pPlot = pLoopUnit->plot();
if(pPlot)
{
bool bVisible = true;
iDistance = plotDistance(pLoopUnit->getX(), pLoopUnit->getY(), pClosestCity->getX(), pClosestCity->getY());
if (iDistance <= m_iTacticalRange)
{
#if defined(MOD_AI_SMART_V3)
int iRange = MOD_AI_SMART_V3 ? MIN(4 - iDistance, 0) : 4 - iDistance;
iMultiplier = m_iTacticalRange + iRange; // 4 because action may still be spread out over the zone
#else
iMultiplier = (m_iTacticalRange + 4 - iDistance); // "4" so unit strength isn't totally dominated by proximity to city
#endif
if(!pPlot->isVisible(eTeam) && !pPlot->isAdjacentVisible(eTeam, false))
{
bVisible = false;
}
if(iMultiplier > 0)
{
int iUnitStrength = pLoopUnit->GetBaseCombatStrengthConsideringDamage();
if(iUnitStrength == 0 && pLoopUnit->isEmbarked() && !pZone->IsWater())
{
iUnitStrength = pLoopUnit->GetBaseCombatStrength(true);
}
if(!bVisible)
{
iUnitStrength /= 2;
}
pZone->AddEnemyStrength(iUnitStrength * iMultiplier * m_iUnitStrengthMultiplier);
int iRangedStrength = pLoopUnit->GetMaxRangedCombatStrength(NULL, /*pCity*/ NULL, true, true);
if(!bVisible)
{
iRangedStrength /= 2;
}
pZone->AddEnemyRangedStrength(iRangedStrength);
if(bVisible)
{
pZone->AddEnemyUnitCount(1);
if(iDistance < pZone->GetRangeClosestEnemyUnit())
{
pZone->SetRangeClosestEnemyUnit(iDistance);
}
if(pLoopUnit->isRanged())
{
pZone->AddEnemyRangedUnitCount(1);
}
if(pLoopUnit->getDomainType() == DOMAIN_SEA)
{
pZone->AddEnemyNavalUnitCount(1);
}
}
}
}
}
}
}
}
}
}
}
}
}