public void Use(Agent agent, Globe globe, IDice dice) { globe.LocalitiesCells.TryGetValue(agent.Location, out var currentLocality); var highestBranchs = agent.Skills .Where(x => /*x.Key != BranchType.Politics &&*/ x.Value >= 1) .OrderBy(x => x.Value); if (!highestBranchs.Any()) { return; } var firstBranch = highestBranchs.First(); // Обнаружение свободных узлов для размещения населённого пункта. // Свободные узлы ишутся от текущей локации агента. TerrainCell freeLocaltion = null; var nextCoords = HexHelper.GetOffsetClockwise(); var agentCubeCoords = HexHelper.ConvertToCube(agent.Location.Coords.X, agent.Location.Coords.Y); for (var i = 0; i < nextCoords.Length; i++) { var scanCubeCoords = agentCubeCoords + nextCoords[i]; var scanOffsetCoords = HexHelper.ConvertToOffset(scanCubeCoords); var freeX = scanOffsetCoords.X; var freeY = scanOffsetCoords.Y; // Убеждаемся, что проверяемый узел находится в границах мира. var isPointInside = IsPointInsideWorld(freeX, freeY, globe.Terrain); if (!isPointInside) { continue; } // Проверка, есть ли в найденной локации населённые пункты. var freeLocaltion1 = globe.Terrain[freeX][freeY]; if (!globe.LocalitiesCells.TryGetValue(freeLocaltion1, out var freeCheckLocality)) { freeLocaltion = globe.Terrain[freeX][freeY]; } } if (freeLocaltion != null) { // Свободный узел был найден. // Тогда создаём здесь населённый пункт с доминирующей специаьностью агента. // Популяция нового нас.пункта минимальна. // Одна единица популяци из текущего нас.пункта снимается. // Считается, что часть жителей мигрировали для начала строительства нового нас.пункта. var localityName = globe.GetLocalityName(dice); var createdLocality = new Locality { Name = localityName, Branches = new Dictionary <BranchType, int> { { firstBranch.Key, 1 } }, Cell = freeLocaltion, Population = 1, Owner = currentLocality.Owner }; currentLocality.Population--; globe.Localities.Add(createdLocality); globe.LocalitiesCells[freeLocaltion] = createdLocality; globe.ScanResult.Free.Remove(freeLocaltion); } else { // Если не удалось найти свободный узел, // то агент перемещается в произвольный населённый пункт своего государства. TransportHelper.TransportAgentToRandomLocality(globe, dice, agent, currentLocality); } }