Exemplo n.º 1
0
/// Update the settle target information when a city grows
/// \param city The city
void SettleMap::HandleCityGrowth(const Unit & city)
{
	Assert(city.IsValid());
	MapPoint        cityPos     = city.RetPos();
	CityData *      citydata    = city.GetCityData();
	PLAYER_INDEX    playerId    = city.GetOwner();
	sint32          radius      = g_theCitySizeDB->Get(citydata->GetSizeIndex())->GetIntRadius();
	/// @todo Check functionality. Using "2 * current radius + 1" looks arbitrary.
	/// This does not account for future growth (city spacing may become too tight), but it also
	/// prevents any overlap.
	radius += radius + 1;
	
	// Mark tiles near to the grown city as not worth to settle at all
	RadiusIterator it(cityPos, radius);
	for (it.Start(); !it.End(); it.Next()) 
	{
		MapPoint    clearPos = it.Pos();
		m_invalidCells.Set(clearPos.x, clearPos.y, TRUE);
	}

	
	const StrategyRecord & strategy = Diplomat::GetDiplomat(playerId).GetCurrentStrategy();
	sint32                  min_settle_distance = 0;
	strategy.GetMinSettleDistance(min_settle_distance);

	// Mark tiles further away as having only half the usual value
	/// \todo Optimise using CircleIterator, to skip computing values for the already invalidated tiles.
	RadiusIterator settleIt(cityPos, min_settle_distance);
	for (settleIt.Start(); !settleIt.End(); settleIt.Next()) 
	{
		MapPoint        claimPos    = settleIt.Pos();
		double const    new_value   = ComputeSettleValue(claimPos) * 0.5;
		m_settleValues.SetGridValue(claimPos, new_value);
	}
	
	MapAnalysis::GetMapAnalysis().UpdateBoundingRectangle(city);
}