/// Should this city be ignored when creating the danger plots? bool CvDangerPlots::ShouldIgnoreCitadel (CvPlot* pCitadelPlot, bool bIgnoreVisibility) { // ignore unseen cities if (!pCitadelPlot->isRevealed(GET_PLAYER(m_ePlayer).getTeam()) && !bIgnoreVisibility) { return true; } PlayerTypes eOwner = pCitadelPlot->getOwner(); if (eOwner != NO_PLAYER) { // Our own citadels aren't dangerous if (eOwner == m_ePlayer) { return true; } if (!atWar(GET_PLAYER(m_ePlayer).getTeam(), GET_PLAYER(eOwner).getTeam())) { return true; } } return false; }
bool PUF_isEnemy(const CvUnit* pUnit, int iData1, int iData2) { CvAssertMsg(iData1 != -1, "Invalid data argument, should be >= 0"); CvAssertMsg(iData2 != -1, "Invalid data argument, should be >= 0"); TeamTypes eOtherTeam = GET_PLAYER((PlayerTypes)iData1).getTeam(); TeamTypes eOurTeam = GET_PLAYER(pUnit->getCombatOwner(eOtherTeam, *(pUnit->plot()))).getTeam(); if(pUnit->canCoexistWithEnemyUnit(eOtherTeam)) { return false; } return (iData2 ? eOtherTeam != eOurTeam : atWar(eOtherTeam, eOurTeam)); }
///TKs Med CvCity* CvMap::findCity(int iX, int iY, PlayerTypes eOwner, TeamTypes eTeam, bool bSameArea, bool bCoastalOnly, TeamTypes eTeamAtWarWith, DirectionTypes eDirection, CvCity* pSkipCity, bool bRandom) { int iBestValue = MAX_INT; CvCity* pBestCity = NULL; std::vector<CvCity*> aCitys; for (int iI = 0; iI < MAX_PLAYERS; iI++) { if (GET_PLAYER((PlayerTypes)iI).isAlive()) { if ((eOwner == NO_PLAYER) || (iI == eOwner)) { if ((eTeam == NO_TEAM) || (GET_PLAYER((PlayerTypes)iI).getTeam() == eTeam)) { int iLoop; for (CvCity* pLoopCity = GET_PLAYER((PlayerTypes)iI).firstCity(&iLoop); pLoopCity != NULL; pLoopCity = GET_PLAYER((PlayerTypes)iI).nextCity(&iLoop)) { if (!bSameArea || (pLoopCity->area() == plotINLINE(iX, iY)->area()) || (bCoastalOnly && (pLoopCity->waterArea() == plotINLINE(iX, iY)->area()))) { if (!bCoastalOnly || pLoopCity->isCoastal(GC.getMIN_WATER_SIZE_FOR_OCEAN())) { if ((eTeamAtWarWith == NO_TEAM) || atWar(GET_PLAYER((PlayerTypes)iI).getTeam(), eTeamAtWarWith)) { if ((eDirection == NO_DIRECTION) || (estimateDirection(dxWrap(pLoopCity->getX_INLINE() - iX), dyWrap(pLoopCity->getY_INLINE() - iY)) == eDirection)) { if ((pSkipCity == NULL) || (pLoopCity != pSkipCity)) { if (!bRandom) { int iValue = plotDistance(iX, iY, pLoopCity->getX_INLINE(), pLoopCity->getY_INLINE()); if (iValue < iBestValue) { iBestValue = iValue; pBestCity = pLoopCity; } } else { aCitys.push_back(pLoopCity); } } } } } } } } } } } if (bRandom) { int iRandom = aCitys.size(); if (iRandom >= 1) { iRandom = GC.getGameINLINE().getSorenRandNum(iRandom, "Random Find City"); return aCitys[iRandom]; } else { return NULL; } } return pBestCity; }
bool cyAtWar(int /*TeamTypes*/ eTeamA, int /*TeamTypes*/ eTeamB) { return atWar((TeamTypes)eTeamA, (TeamTypes)eTeamB); }
// Indicate the plots we might want to move to that the enemy can attack void CvTacticalAnalysisMap::MarkCellsNearEnemy() { int iDistance; // Look at every cell on the map for(int iI = 0; iI < GC.getMap().numPlots(); iI++) { bool bMarkedIt = false; // Set true once we've found one that enemy can move past (worst case) CvPlot* pPlot = GC.getMap().plotByIndexUnchecked(iI); if(m_pPlots[iI].IsRevealed() && !m_pPlots[iI].IsImpassableTerrain() && !m_pPlots[iI].IsImpassableTerritory()) { // Friendly cities always safe if(!m_pPlots[iI].IsFriendlyCity()) { if(!pPlot->isVisibleToEnemyTeam(m_pPlayer->getTeam())) { m_pPlots[iI].SetNotVisibleToEnemy(true); } else { for(unsigned int iUnitIndex = 0; iUnitIndex < m_EnemyUnits.size() && !bMarkedIt; iUnitIndex++) { CvUnit* pUnit = m_EnemyUnits[iUnitIndex]; if(pUnit->getArea() == pPlot->getArea()) { // Distance check before hitting pathfinder iDistance = plotDistance(pUnit->getX(), pUnit->getY(), pPlot->getX(), pPlot->getY()); if(iDistance == 0) { m_pPlots[iI].SetSubjectToAttack(true); m_pPlots[iI].SetEnemyCanMovePast(true); bMarkedIt = true; } // TEMPORARY OPTIMIZATION: Assumes can't use roads or RR else if(iDistance <= pUnit->baseMoves()) { int iTurnsToReach; iTurnsToReach = TurnsToReachTarget(pUnit, pPlot, true /*bReusePaths*/, true /*bIgnoreUnits*/); // Its ok to reuse paths because when ignoring units, we don't use the tactical analysis map (which we are building) if(iTurnsToReach <= 1) { m_pPlots[iI].SetSubjectToAttack(true); } if(iTurnsToReach == 0) { m_pPlots[iI].SetEnemyCanMovePast(true); bMarkedIt = true; } } } } // Check adjacent plots for enemy citadels if(!m_pPlots[iI].IsSubjectToAttack()) { CvPlot* pAdjacentPlot; for(int jJ = 0; jJ < NUM_DIRECTION_TYPES; jJ++) { pAdjacentPlot = plotDirection(pPlot->getX(), pPlot->getY(), ((DirectionTypes)jJ)); if(pAdjacentPlot != NULL && pAdjacentPlot->getOwner() != NO_PLAYER) { if(atWar(m_pPlayer->getTeam(), GET_PLAYER(pAdjacentPlot->getOwner()).getTeam())) { ImprovementTypes eImprovement = pAdjacentPlot->getImprovementType(); if(eImprovement != NO_IMPROVEMENT && GC.getImprovementInfo(eImprovement)->GetNearbyEnemyDamage() > 0) { m_pPlots[iI].SetSubjectToAttack(true); break; } } } } } } } } } }