/// Add in any temporary dominance zones from tactical AI void CvTacticalAnalysisMap::AddTemporaryZones() { CvTemporaryZone* pZone; CvTacticalAI* pTacticalAI = GET_PLAYER(m_ePlayer).GetTacticalAI(); if(pTacticalAI) { pTacticalAI->DropObsoleteZones(); pZone = pTacticalAI->GetFirstTemporaryZone(); while(pZone) { // Can't be a city zone (which is just used to boost priority but not establish a new zone) if(pZone->GetTargetType() != AI_TACTICAL_TARGET_CITY) { CvPlot* pPlot = GC.getMap().plot(pZone->GetX(), pZone->GetY()); if(pPlot) { CvTacticalDominanceZone newZone; newZone.SetDominanceZoneID(m_DominanceZones.size()); newZone.SetTerritoryType(TACTICAL_TERRITORY_TEMP_ZONE); newZone.SetOwner(NO_PLAYER); newZone.SetAreaID(pPlot->getArea()); newZone.SetWater(pPlot->isWater()); newZone.Extend(pPlot); newZone.SetNavalInvasion(pZone->IsNavalInvasion()); m_DominanceZones.push_back(newZone); } } pZone = pTacticalAI->GetNextTemporaryZone(); } } }
/// Add data for this cell into dominance zone information void CvTacticalAnalysisMap::AddToDominanceZones(int iIndex, CvTacticalAnalysisCell* pCell) { TeamTypes ourTeam = GET_PLAYER(m_ePlayer).getTeam(); CvPlot* pPlot = GC.getMap().plotByIndex(iIndex); // Compute zone data for this cell CvTacticalDominanceZone newZone; newZone.SetAreaID(pPlot->getArea()); newZone.SetWater(pPlot->isWater()); int iCityDistance = GC.getGame().GetClosestCityDistanceInTurns(pPlot); CvCity* pCity = GC.getGame().GetClosestCityByEstimatedTurns(pPlot); PlayerTypes eOwnerPlayer = NO_PLAYER; TeamTypes eOwnerTeam = NO_TEAM; //for plots far away from a city, check the owner if (iCityDistance>2) { eOwnerTeam = pPlot->getTeam(); eOwnerPlayer = pPlot->getOwner(); //there is almost always a closest city, but we're not always interested if (pCity && eOwnerPlayer!=pCity->getOwner()) pCity = NULL; } else if (pCity) //look at the city { eOwnerTeam = pCity->getTeam(); eOwnerPlayer = pCity->getOwner(); } newZone.SetOwner(eOwnerPlayer); newZone.SetZoneCity(pCity); newZone.Extend(pPlot); if(eOwnerTeam==NO_TEAM) { newZone.SetTerritoryType(TACTICAL_TERRITORY_NO_OWNER); } else if(eOwnerTeam == ourTeam) { newZone.SetTerritoryType(TACTICAL_TERRITORY_FRIENDLY); } else if(GET_TEAM(ourTeam).isAtWar(eOwnerTeam)) { newZone.SetTerritoryType(TACTICAL_TERRITORY_ENEMY); } else { newZone.SetTerritoryType(TACTICAL_TERRITORY_NEUTRAL); } // Now see if we already have a matching zone CvTacticalDominanceZone* pZone = MergeWithExistingZone(&newZone); if(!pZone) { // Data populated, now add to vector newZone.SetDominanceZoneID(m_DominanceZones.size()); m_DominanceZones.push_back(newZone); pZone = &m_DominanceZones[m_DominanceZones.size() - 1]; } // Set zone for this cell pCell->SetDominanceZone(pZone->GetDominanceZoneID()); pZone->Extend(pPlot); }